ffakerer 1.0.1
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 +15 -0
- data/Changelog.md +154 -0
- data/Gemfile +2 -0
- data/LICENSE +22 -0
- data/README.md +88 -0
- data/Rakefile +138 -0
- data/ffakerer.gemspec +266 -0
- data/lib/ffakerer.rb +31 -0
- data/lib/ffakerer/address.rb +99 -0
- data/lib/ffakerer/address_au.rb +106 -0
- data/lib/ffakerer/address_ca.rb +28 -0
- data/lib/ffakerer/address_da.rb +56 -0
- data/lib/ffakerer/address_de.rb +42 -0
- data/lib/ffakerer/address_mx.rb +505 -0
- data/lib/ffakerer/address_se.rb +48 -0
- data/lib/ffakerer/address_sn.rb +25 -0
- data/lib/ffakerer/address_uk.rb +27 -0
- data/lib/ffakerer/address_us.rb +30 -0
- data/lib/ffakerer/bacon_ipsum.rb +21 -0
- data/lib/ffakerer/company.rb +45 -0
- data/lib/ffakerer/company_se.rb +24 -0
- data/lib/ffakerer/conference.rb +12 -0
- data/lib/ffakerer/data/address/city_suffixes +19 -0
- data/lib/ffakerer/data/address/country +242 -0
- data/lib/ffakerer/data/address/neighborhood +49 -0
- data/lib/ffakerer/data/address/street_suffix +195 -0
- data/lib/ffakerer/data/address_ca/province +13 -0
- data/lib/ffakerer/data/address_da/city +592 -0
- data/lib/ffakerer/data/address_da/kommune +92 -0
- data/lib/ffakerer/data/address_da/street +657 -0
- data/lib/ffakerer/data/address_de/city +1666 -0
- data/lib/ffakerer/data/address_de/state +15 -0
- data/lib/ffakerer/data/address_mx/state +32 -0
- data/lib/ffakerer/data/address_mx/state_abbr +32 -0
- data/lib/ffakerer/data/address_se/city +154 -0
- data/lib/ffakerer/data/address_se/countries +250 -0
- data/lib/ffakerer/data/address_se/street +2887 -0
- data/lib/ffakerer/data/address_sn/arrondissements +47 -0
- data/lib/ffakerer/data/address_sn/departements +43 -0
- data/lib/ffakerer/data/address_sn/regions +14 -0
- data/lib/ffakerer/data/address_uk/uk_county +70 -0
- data/lib/ffakerer/data/address_us/state +50 -0
- data/lib/ffakerer/data/address_us/state_abbr +51 -0
- data/lib/ffakerer/data/address_us/state_and_territories_abbr +62 -0
- data/lib/ffakerer/data/bacon_ipsum/bacon_words +60 -0
- data/lib/ffakerer/data/company/bs_mid +65 -0
- data/lib/ffakerer/data/company/bs_pos +44 -0
- data/lib/ffakerer/data/company/bs_pre +60 -0
- data/lib/ffakerer/data/company/catch_mid +101 -0
- data/lib/ffakerer/data/company/catch_pos +104 -0
- data/lib/ffakerer/data/company/catch_pre +100 -0
- data/lib/ffakerer/data/company/position_areas +11 -0
- data/lib/ffakerer/data/conference/conference_list +40 -0
- data/lib/ffakerer/data/dizzle_ipsum/dizzle_words +69 -0
- data/lib/ffakerer/data/education/major_noun +13 -0
- data/lib/ffakerer/data/education/school_suffix +13 -0
- data/lib/ffakerer/data/healthcare_ipsum/healthcare_words +193 -0
- data/lib/ffakerer/data/hipster_ipsum/hipster_words +101 -0
- data/lib/ffakerer/data/job/job_adj +37 -0
- data/lib/ffakerer/data/job/job_noun +25 -0
- data/lib/ffakerer/data/job/job_prefix +22 -0
- data/lib/ffakerer/data/job_fr/job_nouns +14 -0
- data/lib/ffakerer/data/job_fr/job_prefixes +15 -0
- data/lib/ffakerer/data/lorem/characters +36 -0
- data/lib/ffakerer/data/lorem/words +249 -0
- data/lib/ffakerer/data/lorem_ar/words +911 -0
- data/lib/ffakerer/data/lorem_cn/words +706 -0
- data/lib/ffakerer/data/lorem_fr/words +10379 -0
- data/lib/ffakerer/data/movie/adj_and_adv +20 -0
- data/lib/ffakerer/data/movie/nouns +36 -0
- data/lib/ffakerer/data/movie/prefixes +17 -0
- data/lib/ffakerer/data/name/first_names +3008 -0
- data/lib/ffakerer/data/name/last_names +475 -0
- data/lib/ffakerer/data/name_cn/first_names +1000 -0
- data/lib/ffakerer/data/name_cn/last_names +1057 -0
- data/lib/ffakerer/data/name_cs/prefixes +16 -0
- data/lib/ffakerer/data/name_da/female_first_names +492 -0
- data/lib/ffakerer/data/name_da/last_names +187 -0
- data/lib/ffakerer/data/name_da/male_first_names +390 -0
- data/lib/ffakerer/data/name_de/first_names +1166 -0
- data/lib/ffakerer/data/name_de/last_names +100 -0
- data/lib/ffakerer/data/name_fr/first_names +220 -0
- data/lib/ffakerer/data/name_fr/last_names +408 -0
- data/lib/ffakerer/data/name_ga/first_names_female +225 -0
- data/lib/ffakerer/data/name_ga/first_names_male +306 -0
- data/lib/ffakerer/data/name_ja/first_names +397 -0
- data/lib/ffakerer/data/name_ja/last_names +1078 -0
- data/lib/ffakerer/data/name_kr/first_names +1317 -0
- data/lib/ffakerer/data/name_kr/last_names +197 -0
- data/lib/ffakerer/data/name_mx/female_first_names +216 -0
- data/lib/ffakerer/data/name_mx/last_names +352 -0
- data/lib/ffakerer/data/name_mx/male_first_names +211 -0
- data/lib/ffakerer/data/name_ph/autochthonous_surnames +217 -0
- data/lib/ffakerer/data/name_ph/spanish_surnames +300 -0
- data/lib/ffakerer/data/name_se/first_names_female +110 -0
- data/lib/ffakerer/data/name_se/first_names_male +110 -0
- data/lib/ffakerer/data/name_se/last_names +100 -0
- data/lib/ffakerer/data/name_sn/first_names_female +225 -0
- data/lib/ffakerer/data/name_sn/first_names_male +304 -0
- data/lib/ffakerer/data/name_sn/last_names +243 -0
- data/lib/ffakerer/data/name_vn/first_names +6 -0
- data/lib/ffakerer/data/name_vn/last_names +67 -0
- data/lib/ffakerer/data/name_vn/middle_names +89 -0
- data/lib/ffakerer/data/phone_number_se/phone_prefix +265 -0
- data/lib/ffakerer/data/product/adj +19 -0
- data/lib/ffakerer/data/product/b1 +19 -0
- data/lib/ffakerer/data/product/noun +16 -0
- data/lib/ffakerer/data/skill/specialty_end +14 -0
- data/lib/ffakerer/data/skill/specialty_start +18 -0
- data/lib/ffakerer/data/skill/tech_skills +52 -0
- data/lib/ffakerer/data/venue/venue_list +33 -0
- data/lib/ffakerer/dizzle_ipsum.rb +21 -0
- data/lib/ffakerer/education.rb +48 -0
- data/lib/ffakerer/geolocation.rb +50 -0
- data/lib/ffakerer/healthcare_ipsum.rb +20 -0
- data/lib/ffakerer/hipster_ipsum.rb +21 -0
- data/lib/ffakerer/html_ipsum.rb +160 -0
- data/lib/ffakerer/identification.rb +27 -0
- data/lib/ffakerer/identification_es.rb +15 -0
- data/lib/ffakerer/identification_es_cl.rb +26 -0
- data/lib/ffakerer/identification_es_co.rb +40 -0
- data/lib/ffakerer/internet.rb +72 -0
- data/lib/ffakerer/internet_se.rb +106 -0
- data/lib/ffakerer/job.rb +12 -0
- data/lib/ffakerer/job_fr.rb +14 -0
- data/lib/ffakerer/lorem.rb +44 -0
- data/lib/ffakerer/lorem_ar.rb +40 -0
- data/lib/ffakerer/lorem_cn.rb +41 -0
- data/lib/ffakerer/lorem_fr.rb +39 -0
- data/lib/ffakerer/movie.rb +63 -0
- data/lib/ffakerer/name.rb +35 -0
- data/lib/ffakerer/name_cn.rb +24 -0
- data/lib/ffakerer/name_cs.rb +90 -0
- data/lib/ffakerer/name_da.rb +68 -0
- data/lib/ffakerer/name_de.rb +33 -0
- data/lib/ffakerer/name_fr.rb +37 -0
- data/lib/ffakerer/name_ga.rb +47 -0
- data/lib/ffakerer/name_ja.rb +24 -0
- data/lib/ffakerer/name_kr.rb +24 -0
- data/lib/ffakerer/name_mx.rb +103 -0
- data/lib/ffakerer/name_ph.rb +29 -0
- data/lib/ffakerer/name_ru.rb +92 -0
- data/lib/ffakerer/name_se.rb +47 -0
- data/lib/ffakerer/name_sn.rb +65 -0
- data/lib/ffakerer/name_vn.rb +28 -0
- data/lib/ffakerer/phone_number.rb +34 -0
- data/lib/ffakerer/phone_number_au.rb +77 -0
- data/lib/ffakerer/phone_number_da.rb +45 -0
- data/lib/ffakerer/phone_number_de.rb +51 -0
- data/lib/ffakerer/phone_number_mx.rb +58 -0
- data/lib/ffakerer/phone_number_se.rb +90 -0
- data/lib/ffakerer/phone_number_sg.rb +81 -0
- data/lib/ffakerer/phone_number_sn.rb +78 -0
- data/lib/ffakerer/product.rb +45 -0
- data/lib/ffakerer/skill.rb +24 -0
- data/lib/ffakerer/ssn.rb +17 -0
- data/lib/ffakerer/ssn_se.rb +109 -0
- data/lib/ffakerer/string.rb +92 -0
- data/lib/ffakerer/time.rb +30 -0
- data/lib/ffakerer/unit.rb +50 -0
- data/lib/ffakerer/unit_english.rb +114 -0
- data/lib/ffakerer/unit_metric.rb +105 -0
- data/lib/ffakerer/utils/array_utils.rb +44 -0
- data/lib/ffakerer/utils/module_utils.rb +29 -0
- data/lib/ffakerer/venue.rb +12 -0
- data/scripts/benchmark.rb +21 -0
- data/scripts/profile.sh +2 -0
- data/scripts/profiling.rb +7 -0
- data/test/helper.rb +2 -0
- data/test/test_address.rb +73 -0
- data/test/test_address_au.rb +58 -0
- data/test/test_address_ca.rb +17 -0
- data/test/test_address_de.rb +25 -0
- data/test/test_address_mx.rb +26 -0
- data/test/test_address_se.rb +36 -0
- data/test/test_address_sn.rb +25 -0
- data/test/test_address_uk.rb +17 -0
- data/test/test_address_us.rb +25 -0
- data/test/test_array_utils.rb +52 -0
- data/test/test_bacon_ipsum.rb +30 -0
- data/test/test_company.rb +23 -0
- data/test/test_company_se.rb +14 -0
- data/test/test_conference.rb +10 -0
- data/test/test_dizzle_ipsum.rb +30 -0
- data/test/test_education.rb +34 -0
- data/test/test_faker.rb +30 -0
- data/test/test_faker_internet.rb +60 -0
- data/test/test_faker_internet_se.rb +67 -0
- data/test/test_faker_job.rb +14 -0
- data/test/test_faker_job_fr.rb +22 -0
- data/test/test_faker_name.rb +21 -0
- data/test/test_faker_name_cn.rb +13 -0
- data/test/test_faker_name_cs.rb +65 -0
- data/test/test_faker_name_de.rb +21 -0
- data/test/test_faker_name_fr.rb +48 -0
- data/test/test_faker_name_ga.rb +56 -0
- data/test/test_faker_name_ja.rb +13 -0
- data/test/test_faker_name_kr.rb +13 -0
- data/test/test_faker_name_mx.rb +180 -0
- data/test/test_faker_name_ph.rb +17 -0
- data/test/test_faker_name_ru.rb +80 -0
- data/test/test_faker_name_se.rb +38 -0
- data/test/test_faker_name_sn.rb +98 -0
- data/test/test_geolocation.rb +34 -0
- data/test/test_healthcare_ipsum.rb +27 -0
- data/test/test_hipster_ipsum.rb +29 -0
- data/test/test_html_ipsum.rb +91 -0
- data/test/test_identification.rb +27 -0
- data/test/test_identification_co.rb +38 -0
- data/test/test_identification_es.rb +13 -0
- data/test/test_identification_es_cl.rb +13 -0
- data/test/test_lorem.rb +44 -0
- data/test/test_lorem_ar.rb +37 -0
- data/test/test_lorem_cn.rb +47 -0
- data/test/test_lorem_fr.rb +37 -0
- data/test/test_module_utils.rb +14 -0
- data/test/test_movie.rb +9 -0
- data/test/test_phone_number.rb +13 -0
- data/test/test_phone_number_au.rb +50 -0
- data/test/test_phone_number_de.rb +46 -0
- data/test/test_phone_number_mx.rb +43 -0
- data/test/test_phone_number_se.rb +60 -0
- data/test/test_phone_number_sg.rb +44 -0
- data/test/test_phone_number_sn.rb +34 -0
- data/test/test_skill.rb +24 -0
- data/test/test_ssn.rb +11 -0
- data/test/test_ssn_se.rb +43 -0
- data/test/test_string.rb +71 -0
- data/test/test_time.rb +19 -0
- data/test/test_units.rb +32 -0
- data/test/test_units_english.rb +62 -0
- data/test/test_units_metric.rb +61 -0
- data/test/test_venue.rb +9 -0
- metadata +372 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Faker
|
|
4
|
+
module Product
|
|
5
|
+
extend ModuleUtils
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
def brand
|
|
9
|
+
case rand(12)
|
|
10
|
+
when (0..4) then B1.rand + B2.rand
|
|
11
|
+
when (5..10) then "#{START.rand}#{VOWELS.rand}#{SUFFIX.rand}#{ADDON.rand if rand(2)==0}".capitalize
|
|
12
|
+
when 11 then "#{letters(2..3)}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def product_name
|
|
17
|
+
case rand(2)
|
|
18
|
+
when 0 then "#{ADJ.rand} #{NOUN.rand}"
|
|
19
|
+
when 1 then "#{[ADJ.rand, ADJ.rand].uniq.join(" ")} #{NOUN.rand}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def product
|
|
24
|
+
"#{brand} #{product_name}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def letters(n)
|
|
28
|
+
max = n.is_a?(Range) ? n.to_a.shuffle.first : n
|
|
29
|
+
(0...max).map { LETTERS.rand.upcase }.join
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def model
|
|
33
|
+
case rand(2)
|
|
34
|
+
when 0 then "#{LETTERS.rand.upcase}#{rand(90)}" # N90
|
|
35
|
+
when 1 then "#{letters(1..rand(1..2))}-#{rand(9900)}" # N-9400
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
B2 = k %w(nix cell sync func balt sche pod)
|
|
40
|
+
VOWELS = k %w(a e i o u ou ie y io)
|
|
41
|
+
START = k %w(tr br p ph)
|
|
42
|
+
SUFFIX = k %w(ck ns nce nt st ne re ffe ph)
|
|
43
|
+
ADDON = k %w(wood forge func)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Faker
|
|
4
|
+
module Skill
|
|
5
|
+
extend ModuleUtils
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
def tech_skill
|
|
9
|
+
TECH_SKILLS.rand
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def tech_skills(num = 3)
|
|
13
|
+
TECH_SKILLS.random_pick(num)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def specialty
|
|
17
|
+
"%s %s" % [SPECIALTY_START.rand, SPECIALTY_END.rand]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def specialties(num = 3)
|
|
21
|
+
(1..num).map { specialty }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/ffakerer/ssn.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Faker
|
|
4
|
+
module SSN
|
|
5
|
+
extend ModuleUtils
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
# The Social Security number is a nine-digit number in the format
|
|
9
|
+
# "AAA-GG-SSSS". More info here:
|
|
10
|
+
#
|
|
11
|
+
# http://en.wikipedia.org/wiki/Social_Security_number
|
|
12
|
+
#
|
|
13
|
+
def ssn
|
|
14
|
+
Faker.numerify('###-##-####')
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'date'
|
|
4
|
+
|
|
5
|
+
module Faker
|
|
6
|
+
|
|
7
|
+
# The Social Security number is a 12-digit number in the format:
|
|
8
|
+
# "YYYYDDMM-XXXX'
|
|
9
|
+
#
|
|
10
|
+
# http://sv.wikipedia.org/wiki/Personnummer_i_Sverige
|
|
11
|
+
#
|
|
12
|
+
# The 4 last digits (XXXX) are generated based on what region the person are
|
|
13
|
+
# born # in, the gender and the last one is a check digit using the luhn
|
|
14
|
+
# algorithm.
|
|
15
|
+
#
|
|
16
|
+
# http://en.wikipedia.org/wiki/Luhn_algorithm
|
|
17
|
+
#
|
|
18
|
+
# Usage:
|
|
19
|
+
# ssn(from: Time.local(1980, 2, 28),
|
|
20
|
+
# to: Time.local(2000, 2, 28),
|
|
21
|
+
# gender: :male)
|
|
22
|
+
#
|
|
23
|
+
module SSNSE
|
|
24
|
+
extend ModuleUtils
|
|
25
|
+
extend self
|
|
26
|
+
|
|
27
|
+
def ssn(opts = {})
|
|
28
|
+
from = opts[:from] || ::Time.local(1940, 1, 1)
|
|
29
|
+
to = opts[:to] || ::Time.now
|
|
30
|
+
gender = (opts[:gender] || GENDERS.rand).to_s
|
|
31
|
+
|
|
32
|
+
raise_error_on_bad_arguments(from, to, gender)
|
|
33
|
+
|
|
34
|
+
generate_ssn(from, to, gender)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def generate_ssn(from, to, gender)
|
|
40
|
+
birth_date = random_birth_time_between(from, to)
|
|
41
|
+
birth_date_str = birth_date.strftime("%Y%m%d") # "19800228"
|
|
42
|
+
region = get_random_region_for(gender) # "413"
|
|
43
|
+
ssn_without_check_digit = birth_date_str + region # "19800228413"
|
|
44
|
+
check_digit = luhn_check(ssn_without_check_digit) # "9"
|
|
45
|
+
ssn_without_check_digit + check_digit # "198002284139"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def raise_error_on_bad_arguments(from, to, gender)
|
|
49
|
+
raise ArgumentError, "Invalid from argument: from" unless to.is_a? ::Time
|
|
50
|
+
raise ArgumentError, "Invalid from argument: from" unless from.is_a? ::Time
|
|
51
|
+
raise ArgumentError, "Invalid argument: from > to" if from > to
|
|
52
|
+
raise ArgumentError, "Invalid argument: gender" unless GENDERS.include?(gender.to_s)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
GENDERS = k ["female", "male"]
|
|
56
|
+
|
|
57
|
+
def random_birth_time_between(from=::Time.local(1940, 1, 1), to=::Time.now)
|
|
58
|
+
::Time.at(from + rand * (to.to_f - from.to_f))
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_random_region_for(gender)
|
|
62
|
+
region_number = case gender
|
|
63
|
+
when "female" then get_random_region_even
|
|
64
|
+
when "male" then get_random_region_odd
|
|
65
|
+
end
|
|
66
|
+
three_character_string(region_number)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def get_random_region_even
|
|
70
|
+
rand(499) * 2
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def get_random_region_odd
|
|
74
|
+
rand(499) * 2 + 1
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def three_character_string(number)
|
|
78
|
+
"%03d" % number
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# http://en.wikipedia.org/wiki/Luhn_algorithm
|
|
82
|
+
def luhn_check(number)
|
|
83
|
+
multiplications = []
|
|
84
|
+
|
|
85
|
+
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
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
sum = 0
|
|
94
|
+
multiplications.each do |num|
|
|
95
|
+
num.to_s.each_byte do |character|
|
|
96
|
+
sum += character.chr.to_i
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if sum % 10 == 0
|
|
101
|
+
control_digit = 0
|
|
102
|
+
else
|
|
103
|
+
control_digit = (sum / 10 + 1) * 10 - sum
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
control_digit.to_s
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Faker
|
|
4
|
+
module String
|
|
5
|
+
extend ModuleUtils
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
BACKSLASH = '\\'
|
|
9
|
+
|
|
10
|
+
LOWERS = k(('a'..'z').to_a)
|
|
11
|
+
UPPERS = k(('A'..'Z').to_a)
|
|
12
|
+
LETTERS = k(LOWERS + UPPERS)
|
|
13
|
+
NUMBERS = k(('0'..'9').to_a)
|
|
14
|
+
WORD_CHARS = k(LETTERS + NUMBERS + ['_'])
|
|
15
|
+
SPACES = k([" ", "\t"])
|
|
16
|
+
ESCAPEABLE_CHARS = '\\', '/', '.', '(', ')', '[', ']', '{', '}'
|
|
17
|
+
|
|
18
|
+
def from_regexp(exp)
|
|
19
|
+
result = ''
|
|
20
|
+
@last_token = nil
|
|
21
|
+
|
|
22
|
+
# Drop surrounding /'s and split into characters
|
|
23
|
+
tokens = exp.inspect[1...-1].split(//)
|
|
24
|
+
until tokens.empty?
|
|
25
|
+
result << process_token(tokens)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def join_escapes(tokens)
|
|
34
|
+
result = []
|
|
35
|
+
while tokens.any?
|
|
36
|
+
token = tokens.shift
|
|
37
|
+
token << tokens.shift if token == BACKSLASH
|
|
38
|
+
result << token
|
|
39
|
+
end
|
|
40
|
+
result
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def process_token(tokens)
|
|
44
|
+
return '' if tokens.empty?
|
|
45
|
+
|
|
46
|
+
token = tokens.shift
|
|
47
|
+
|
|
48
|
+
case token
|
|
49
|
+
when '?' then
|
|
50
|
+
# TODO: Let ? generate nothong
|
|
51
|
+
return '' # We already printed its target
|
|
52
|
+
when '+' then
|
|
53
|
+
tokens.unshift(token) if rand(2) == 1 # Leave the `+` on to run again
|
|
54
|
+
return process_token(@last_token) # Run the last one at least once
|
|
55
|
+
when '*' then
|
|
56
|
+
tokens.unshift(token) if rand(2) == 1 # Leave the `*` on to run again
|
|
57
|
+
return '' if rand(2) == 1 # Or maybe do nothing
|
|
58
|
+
return process_token(@last_token) # Else run the last one again
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
generate_token token, tokens
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def generate_token(token, tokens)
|
|
65
|
+
case token
|
|
66
|
+
when /\w/ then
|
|
67
|
+
@last_token = [token]
|
|
68
|
+
token
|
|
69
|
+
when BACKSLASH then
|
|
70
|
+
token = tokens.shift
|
|
71
|
+
@last_token = ['\\', token]
|
|
72
|
+
special(token)
|
|
73
|
+
when '[' then
|
|
74
|
+
set = []
|
|
75
|
+
while (ch = tokens.shift) != ']'
|
|
76
|
+
set << ch
|
|
77
|
+
end
|
|
78
|
+
@last_token = ['['] + set + [']']
|
|
79
|
+
process_token([ArrayUtils.rand(join_escapes(set))])
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def special(token)
|
|
84
|
+
case token
|
|
85
|
+
when 'w' then WORD_CHARS.rand
|
|
86
|
+
when 'd' then NUMBERS.rand
|
|
87
|
+
when 's' then SPACES.rand
|
|
88
|
+
when *ESCAPEABLE_CHARS then token
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Faker
|
|
4
|
+
module Time
|
|
5
|
+
extend ModuleUtils
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
def month
|
|
9
|
+
MONTHS.rand
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def date(params={})
|
|
13
|
+
years_back = params[:year_range] || 5
|
|
14
|
+
latest_year = params [:year_latest] || 0
|
|
15
|
+
year = (rand * (years_back)).ceil + (::Time.now.year - latest_year - years_back)
|
|
16
|
+
month = (rand * 12).ceil
|
|
17
|
+
day = (rand * 31).ceil
|
|
18
|
+
series = [date = ::Time.local(year, month, day)]
|
|
19
|
+
if params[:series]
|
|
20
|
+
params[:series].each do |some_time_after|
|
|
21
|
+
series << series.last + (rand * some_time_after).ceil
|
|
22
|
+
end
|
|
23
|
+
return series
|
|
24
|
+
end
|
|
25
|
+
date.strftime "%Y-%m-%d %T %z"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
MONTHS = k %w(January February March April May June July August September October November December)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'ostruct'
|
|
4
|
+
|
|
5
|
+
module Faker
|
|
6
|
+
module Unit
|
|
7
|
+
extend ModuleUtils
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
def time_name
|
|
11
|
+
time.name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def time_abbr
|
|
15
|
+
time.abbreviation
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def temperature_name
|
|
19
|
+
temperature.name
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def temperature_abbr
|
|
23
|
+
temperature.abbreviation
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def time
|
|
29
|
+
OpenStruct.new TIME_UNITS.rand
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def temperature
|
|
33
|
+
OpenStruct.new TEMPERATURE_UNITS.rand
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
TIME_UNITS = k [
|
|
37
|
+
{:name => 'Years', :abbreviation => 'yr'},
|
|
38
|
+
{:name => 'Days', :abbreviation => 'd'},
|
|
39
|
+
{:name => 'Hours', :abbreviation => 'Minutes'},
|
|
40
|
+
{:name => 'Seconds', :abbreviation => 's'},
|
|
41
|
+
{:name => 'Milliseconds', :abbreviation => 'msec'}
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
TEMPERATURE_UNITS = k [
|
|
45
|
+
{:name => 'Kelvin', :abbreviation => 'K'},
|
|
46
|
+
{:name => 'Celsius', :abbreviation => 'C'},
|
|
47
|
+
{:name => 'Fahrenheit', :abbreviation => 'F'}
|
|
48
|
+
]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'ffakerer/unit'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
|
|
6
|
+
module Faker
|
|
7
|
+
module UnitEnglish
|
|
8
|
+
include Faker::Unit
|
|
9
|
+
|
|
10
|
+
extend ModuleUtils
|
|
11
|
+
extend self
|
|
12
|
+
|
|
13
|
+
def mass_name
|
|
14
|
+
mass.name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def mass_abbr
|
|
18
|
+
mass.abbreviation
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def length_name
|
|
22
|
+
length.name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def length_abbr
|
|
26
|
+
length.abbreviation
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def liquid_name
|
|
30
|
+
liquid.name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def liquid_abbr
|
|
34
|
+
liquid.abbreviation
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def volume_name
|
|
38
|
+
volume.name
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def volume_abbr
|
|
42
|
+
volume.abbreviation
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def area_name
|
|
46
|
+
area.name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def area_abbr
|
|
50
|
+
area.abbreviation
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
def length
|
|
56
|
+
OpenStruct.new LENGTH_UNITS.rand
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def mass
|
|
60
|
+
OpenStruct.new MASS_UNITS.rand
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def liquid
|
|
64
|
+
OpenStruct.new LIQUID_UNITS.rand
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def volume
|
|
68
|
+
OpenStruct.new VOLUME_UNITS.rand
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def area
|
|
72
|
+
OpenStruct.new AREA_UNITS.rand
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
LENGTH_UNITS = k [
|
|
76
|
+
{ :name =>"inch", :abbreviation => "in"},
|
|
77
|
+
{ :name =>"foot", :abbreviation => "ft"},
|
|
78
|
+
{ :name =>"yard", :abbreviation => "yd"},
|
|
79
|
+
{ :name =>"furlong", :abbreviation => "fur"},
|
|
80
|
+
{ :name =>"mile", :abbreviation => "m"}
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
MASS_UNITS = k [
|
|
84
|
+
{ :name => "grains", :abbreviation => "gr"},
|
|
85
|
+
{ :name => "ounces", :abbreviation => "oz"},
|
|
86
|
+
{ :name => "pounds", :abbreviation => "lb" },
|
|
87
|
+
{ :name => "hundredweight", :abbreviation => "cwt"},
|
|
88
|
+
{ :name => "ton", :abbreviation => "t" }
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
LIQUID_UNITS = k [
|
|
92
|
+
{ :name => "fluid ounce", :abbreviation => "fl oz"},
|
|
93
|
+
{ :name => "gill", :abbreviation => "gi"},
|
|
94
|
+
{ :name => "pint", :abbreviation => "pt"},
|
|
95
|
+
{ :name => "quart", :abbreviation => "qt"}
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
VOLUME_UNITS = k [
|
|
99
|
+
{ :name =>"cubic inch", :abbreviation => "CI"},
|
|
100
|
+
{ :name =>"cubic foot", :abbreviation => "CFT"},
|
|
101
|
+
{ :name =>"cubic yard", :abbreviation => "CY"}
|
|
102
|
+
]
|
|
103
|
+
|
|
104
|
+
AREA_UNITS = k [
|
|
105
|
+
{ :name =>"square inch", :abbreviation => "sq. in"},
|
|
106
|
+
{ :name =>"square foot", :abbreviation => "sq ft"},
|
|
107
|
+
{ :name =>"square yard", :abbreviation => "sq yd"},
|
|
108
|
+
{ :name =>"acre", :abbreviation => "ac"},
|
|
109
|
+
{ :name =>"section", :abbreviation => "s"},
|
|
110
|
+
{ :name =>"square mile", :abbreviation => "sq mi"},
|
|
111
|
+
{ :name =>"township", :abbreviation => "Twp"}
|
|
112
|
+
]
|
|
113
|
+
end
|
|
114
|
+
end
|