ffaker 1.15.0 → 1.16.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.rdoc +4 -1
- data/Gemfile +2 -0
- data/README.rdoc +1 -1
- data/ffaker.gemspec +43 -2
- data/lib/ffaker.rb +31 -5
- data/lib/ffaker/address.rb +57 -4
- data/lib/ffaker/address_au.rb +41 -42
- data/lib/ffaker/address_de.rb +16 -0
- data/lib/ffaker/address_mx.rb +448 -0
- data/lib/ffaker/address_se.rb +1074 -0
- data/lib/ffaker/company_se.rb +24 -0
- data/lib/ffaker/conference.rb +52 -0
- data/lib/ffaker/dizzle_ipsum.rb +30 -0
- data/lib/ffaker/identification.rb +25 -0
- data/lib/ffaker/internet_se.rb +105 -0
- data/lib/ffaker/lorem.rb +1 -1
- data/lib/ffaker/lorem_ar.rb +45 -0
- data/lib/ffaker/lorem_cn.rb +6 -6
- data/lib/ffaker/movie.rb +64 -0
- data/lib/ffaker/name_ga.rb +57 -0
- data/lib/ffaker/name_mx.rb +198 -0
- data/lib/ffaker/name_ph.rb +91 -0
- data/lib/ffaker/name_se.rb +97 -0
- data/lib/ffaker/name_sn.rb +1 -1
- data/lib/ffaker/phone_number_mx.rb +57 -0
- data/lib/ffaker/phone_number_se.rb +111 -0
- data/lib/ffaker/ssn.rb +15 -0
- data/lib/ffaker/ssn_se.rb +111 -0
- data/lib/ffaker/string.rb +90 -0
- data/lib/ffaker/time.rb +28 -0
- data/lib/ffaker/venue.rb +45 -0
- data/test/test_address.rb +15 -7
- data/test/test_address_au.rb +10 -14
- data/test/test_address_de.rb +8 -0
- data/test/test_address_mx.rb +25 -0
- data/test/test_address_se.rb +36 -0
- data/test/test_company_se.rb +14 -0
- data/test/test_conference.rb +8 -0
- data/test/test_dizzle_ipsum.rb +28 -0
- data/test/test_faker.rb +20 -4
- data/test/test_faker_internet_se.rb +66 -0
- data/test/test_faker_name_ga.rb +54 -0
- data/test/test_faker_name_mx.rb +177 -0
- data/test/test_faker_name_ph.rb +15 -0
- data/test/test_faker_name_se.rb +37 -0
- data/test/test_faker_name_sn.rb +1 -0
- data/test/test_identification.rb +25 -0
- data/test/test_lorem_ar.rb +35 -0
- data/test/test_movie.rb +7 -0
- data/test/test_phone_number_mx.rb +42 -0
- data/test/test_phone_number_se.rb +58 -0
- data/test/test_ssn.rb +9 -0
- data/test/test_ssn_se.rb +43 -0
- data/test/test_string.rb +69 -0
- data/test/test_time.rb +17 -0
- data/test/test_venue.rb +8 -0
- metadata +64 -4
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Faker
|
4
|
+
|
5
|
+
# Format for swedish numbers, from here
|
6
|
+
# from http://sv.wikipedia.org/wiki/Telefonnummer
|
7
|
+
#
|
8
|
+
# All area codes are from this list
|
9
|
+
# http://sv.wikipedia.org/wiki/Lista_%C3%B6ver_svenska_riktnummer
|
10
|
+
#
|
11
|
+
# - Length 9
|
12
|
+
# 08-xxx xxx xx, 0xx-xxx xx xx, 0xxx-xx xx xx
|
13
|
+
# - Length 8
|
14
|
+
# 08-xxx xx xx, 0xx-xx xx xx, 0xxx-xxx xx
|
15
|
+
# - Length 7
|
16
|
+
# 08-xx xx xx, 0xx-xxx xx
|
17
|
+
#
|
18
|
+
module PhoneNumberSE
|
19
|
+
extend ModuleUtils
|
20
|
+
extend self
|
21
|
+
|
22
|
+
def phone_number
|
23
|
+
case rand(2)
|
24
|
+
when 0 then home_work_phone_number
|
25
|
+
when 1 then mobile_phone_number
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def home_work_phone_number
|
30
|
+
Faker.numerify("0#{phone_number_format}")
|
31
|
+
end
|
32
|
+
|
33
|
+
def mobile_phone_number
|
34
|
+
Faker.numerify("0#{mobile_phone_number_format}")
|
35
|
+
end
|
36
|
+
|
37
|
+
def international_phone_number
|
38
|
+
case rand(2)
|
39
|
+
when 0 then international_mobile_phone_number
|
40
|
+
when 1 then international_home_work_phone_number
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def country_prefix
|
45
|
+
COUNTRY_PREFIX.rand
|
46
|
+
end
|
47
|
+
|
48
|
+
def international_mobile_phone_number
|
49
|
+
Faker.numerify("#{country_prefix} (0)#{mobile_phone_number_format}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def international_home_work_phone_number
|
53
|
+
Faker.numerify("#{country_prefix} (0)#{phone_number_format}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def area_prefix
|
57
|
+
PHONE_PREFIX.rand
|
58
|
+
end
|
59
|
+
|
60
|
+
def phone_number_format
|
61
|
+
prefix = area_prefix
|
62
|
+
case prefix.length
|
63
|
+
when 1 then PHONE_FORMAT_PREFIX_2.rand
|
64
|
+
when 2 then PHONE_FORMAT_PREFIX_3.rand
|
65
|
+
when 3 then PHONE_FORMAT_PREFIX_4.rand
|
66
|
+
end % prefix
|
67
|
+
end
|
68
|
+
|
69
|
+
def mobile_prefix
|
70
|
+
MOBILE_PHONE_PREFIX.rand
|
71
|
+
end
|
72
|
+
|
73
|
+
def mobile_phone_number_format
|
74
|
+
MOBILE_PHONE_FORMAT.rand % mobile_prefix
|
75
|
+
end
|
76
|
+
|
77
|
+
PHONE_FORMAT_PREFIX_2 = k ["%s-### ### ##",
|
78
|
+
"%s-### ## ##",
|
79
|
+
"%s-## ## ##"]
|
80
|
+
PHONE_FORMAT_PREFIX_3 = k ["%s-### ## ##",
|
81
|
+
"%s-## ## ##",
|
82
|
+
"%s-## ###"]
|
83
|
+
PHONE_FORMAT_PREFIX_4 = k ["%s-## ## ##",
|
84
|
+
"%s-### ##"]
|
85
|
+
|
86
|
+
MOBILE_PHONE_FORMAT = k ["%s#-## ## ##", "%s#-######"]
|
87
|
+
COUNTRY_PREFIX = k ["+46", "0046"]
|
88
|
+
MOBILE_PHONE_PREFIX = k %w(70 72 73 76 74)
|
89
|
+
|
90
|
+
PHONE_PREFIX = k %w(8 11 120 121 122 123 125 13 140 141 142 143 144 150 151
|
91
|
+
152 155 156 157 158 159 16 171 173 174 175 176 18 19 21
|
92
|
+
220 221 222 223 224 225 226 227 23 240 241 243 246 247
|
93
|
+
248 250 251 253 258 26 270 271 278 280 281 290 291 292
|
94
|
+
293 294 295 297 300 301 302 303 304 31 320 321 322 325
|
95
|
+
33 340 345 346 35 36 370 371 372 380 381 382 383 390
|
96
|
+
392 393 40 410 411 413 414 415 416 417 418 42 430 431
|
97
|
+
433 435 44 451 454 455 456 457 459 46 470 471 472 474
|
98
|
+
476 477 478 479 480 481 485 486 490 491 492 493 494 495
|
99
|
+
496 498 499 500 501 502 503 504 505 506 510 511 512 513
|
100
|
+
514 515 520 521 522 523 524 525 526 528 530 531 532 533
|
101
|
+
534 54 550 551 552 553 554 555 560 563 564 565 570 571
|
102
|
+
573 580 581 582 583 584 585 586 587 589 590 591 60 611
|
103
|
+
612 613 620 621 622 623 624 63 640 642 643 644 645 647
|
104
|
+
650 651 652 653 657 660 661 662 663 670 671 672 680 682
|
105
|
+
684 687 690 691 692 693 695 696 8 90 910 911 912 913
|
106
|
+
914 915 916 918 920 921 922 923 924 925 926 927 928 929
|
107
|
+
930 932 933 934 935 940 941 942 943 950 951 952 953 954
|
108
|
+
960 961 970 971 973 975 976 977 978 980 981)
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
data/lib/ffaker/ssn.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Faker
|
2
|
+
module SSN
|
3
|
+
extend ModuleUtils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
# The Social Security number is a nine-digit number in the format
|
7
|
+
# "AAA-GG-SSSS". More info here:
|
8
|
+
#
|
9
|
+
# http://en.wikipedia.org/wiki/Social_Security_number
|
10
|
+
#
|
11
|
+
def ssn
|
12
|
+
Faker.numerify('###-##-####')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module Faker
|
5
|
+
|
6
|
+
# The Social Security number is a 12-digit number in the format:
|
7
|
+
# "YYYYDDMM-XXXX'
|
8
|
+
#
|
9
|
+
# http://sv.wikipedia.org/wiki/Personnummer_i_Sverige
|
10
|
+
#
|
11
|
+
# The 4 last digits (XXXX) are generated based on what region the person are
|
12
|
+
# born # in, the gender and the last one is a check digit using the luhn
|
13
|
+
# algorithm.
|
14
|
+
#
|
15
|
+
# http://en.wikipedia.org/wiki/Luhn_algorithm
|
16
|
+
#
|
17
|
+
# Usage:
|
18
|
+
# ssn(from: Time.local(1980, 2, 28),
|
19
|
+
# to: Time.local(2000, 2, 28),
|
20
|
+
# gender: :male)
|
21
|
+
#
|
22
|
+
module SSNSE
|
23
|
+
extend ModuleUtils
|
24
|
+
extend self
|
25
|
+
|
26
|
+
def ssn(opts = {})
|
27
|
+
from = opts[:from] || ::Time.local(1940, 1, 1)
|
28
|
+
to = opts[:to] || ::Time.now
|
29
|
+
gender = opts[:gender] || genders.sample
|
30
|
+
|
31
|
+
raise_error_on_bad_arguments(from, to, gender)
|
32
|
+
|
33
|
+
generate_ssn(from, to, gender)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def generate_ssn(from, to, gender)
|
39
|
+
birth_date = random_birth_time_between(from, to)
|
40
|
+
birth_date_str = birth_date.strftime("%Y%m%d") # "19800228"
|
41
|
+
region = get_random_region_for(gender) # "413"
|
42
|
+
ssn_without_check_digit = birth_date_str + region # "19800228413"
|
43
|
+
check_digit = luhn_check(ssn_without_check_digit) # "9"
|
44
|
+
ssn_without_check_digit + check_digit # "198002284139"
|
45
|
+
end
|
46
|
+
|
47
|
+
def raise_error_on_bad_arguments(from, to, gender)
|
48
|
+
raise ArgumentError, "Invalid from argument: from" unless to.is_a? ::Time
|
49
|
+
raise ArgumentError, "Invalid from argument: from" unless from.is_a? ::Time
|
50
|
+
raise ArgumentError, "Invalid argument: from > to" if from > to
|
51
|
+
raise ArgumentError, "Invalid argument: gender" unless genders.include?(gender)
|
52
|
+
end
|
53
|
+
|
54
|
+
def genders
|
55
|
+
# XXX Don't like this def.
|
56
|
+
[:female, :male]
|
57
|
+
end
|
58
|
+
|
59
|
+
def random_birth_time_between(from=::Time.local(1940, 1, 1), to=::Time.now)
|
60
|
+
::Time.at(from + rand * (to.to_f - from.to_f))
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_random_region_for(gender)
|
64
|
+
region_number = case gender
|
65
|
+
when :female then get_random_region_even
|
66
|
+
when :male then get_random_region_odd
|
67
|
+
end
|
68
|
+
three_character_string(region_number)
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_random_region_even
|
72
|
+
(0..998).step(2).to_a.sample
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_random_region_odd
|
76
|
+
get_random_region_even + 1
|
77
|
+
end
|
78
|
+
|
79
|
+
def three_character_string(number)
|
80
|
+
"%03d" % number
|
81
|
+
end
|
82
|
+
|
83
|
+
# http://en.wikipedia.org/wiki/Luhn_algorithm
|
84
|
+
def luhn_check(number)
|
85
|
+
multiplications = []
|
86
|
+
|
87
|
+
number.split(//).each_with_index do |digit, i|
|
88
|
+
if i % 2 == 0
|
89
|
+
multiplications << digit.to_i * 2
|
90
|
+
else
|
91
|
+
multiplications << digit.to_i
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
sum = 0
|
96
|
+
multiplications.each do |num|
|
97
|
+
num.to_s.each_byte do |character|
|
98
|
+
sum += character.chr.to_i
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
if sum % 10 == 0
|
103
|
+
control_digit = 0
|
104
|
+
else
|
105
|
+
control_digit = (sum / 10 + 1) * 10 - sum
|
106
|
+
end
|
107
|
+
|
108
|
+
control_digit.to_s
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Faker
|
2
|
+
module String
|
3
|
+
extend ModuleUtils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
BACKSLASH = '\\'
|
7
|
+
|
8
|
+
LOWERS = k(('a'..'z').to_a)
|
9
|
+
UPPERS = k(('A'..'Z').to_a)
|
10
|
+
LETTERS = k(LOWERS + UPPERS)
|
11
|
+
NUMBERS = k(('0'..'9').to_a)
|
12
|
+
WORD_CHARS = k(LETTERS + NUMBERS + ['_'])
|
13
|
+
SPACES = k([" ", "\t"])
|
14
|
+
ESCAPEABLE_CHARS = '\\', '/', '.', '(', ')', '[', ']', '{', '}'
|
15
|
+
|
16
|
+
def from_regexp(exp)
|
17
|
+
result = ''
|
18
|
+
@last_token = nil
|
19
|
+
|
20
|
+
# Drop surrounding /'s and split into characters
|
21
|
+
tokens = exp.inspect[1...-1].split(//)
|
22
|
+
until tokens.empty?
|
23
|
+
result << process_token(tokens)
|
24
|
+
end
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def join_escapes(tokens)
|
32
|
+
result = []
|
33
|
+
while tokens.any?
|
34
|
+
token = tokens.shift
|
35
|
+
token << tokens.shift if token == BACKSLASH
|
36
|
+
result << token
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_token(tokens)
|
42
|
+
return '' if tokens.empty?
|
43
|
+
|
44
|
+
token = tokens.shift
|
45
|
+
|
46
|
+
case token
|
47
|
+
when '?' then
|
48
|
+
# TODO: Let ? generate nothong
|
49
|
+
return '' # We already printed its target
|
50
|
+
when '+' then
|
51
|
+
tokens.unshift(token) if rand(2) == 1 # Leave the `+` on to run again
|
52
|
+
return process_token(@last_token) # Run the last one at least once
|
53
|
+
when '*' then
|
54
|
+
tokens.unshift(token) if rand(2) == 1 # Leave the `*` on to run again
|
55
|
+
return '' if rand(2) == 1 # Or maybe do nothing
|
56
|
+
return process_token(@last_token) # Else run the last one again
|
57
|
+
end
|
58
|
+
|
59
|
+
generate_token token, tokens
|
60
|
+
end
|
61
|
+
|
62
|
+
def generate_token(token, tokens)
|
63
|
+
case token
|
64
|
+
when /\w/ then
|
65
|
+
@last_token = [token]
|
66
|
+
token
|
67
|
+
when BACKSLASH then
|
68
|
+
token = tokens.shift
|
69
|
+
@last_token = ['\\', token]
|
70
|
+
special(token)
|
71
|
+
when '[' then
|
72
|
+
set = []
|
73
|
+
while (ch = tokens.shift) != ']'
|
74
|
+
set << ch
|
75
|
+
end
|
76
|
+
@last_token = ['['] + set + [']']
|
77
|
+
process_token([ArrayUtils.rand(join_escapes(set))])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def special(token)
|
82
|
+
case token
|
83
|
+
when 'w' then WORD_CHARS.rand
|
84
|
+
when 'd' then NUMBERS.rand
|
85
|
+
when 's' then SPACES.rand
|
86
|
+
when *ESCAPEABLE_CHARS then token
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/ffaker/time.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Faker
|
2
|
+
module Time
|
3
|
+
extend ModuleUtils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def month
|
7
|
+
MONTHS.rand
|
8
|
+
end
|
9
|
+
|
10
|
+
def date(params={})
|
11
|
+
years_back = params[:year_range] || 5
|
12
|
+
latest_year = params [:year_latest] || 0
|
13
|
+
year = (rand * (years_back)).ceil + (Object::Time.now.year - latest_year - years_back)
|
14
|
+
month = (rand * 12).ceil
|
15
|
+
day = (rand * 31).ceil
|
16
|
+
series = [date = Object::Time.local(year, month, day)]
|
17
|
+
if params[:series]
|
18
|
+
params[:series].each do |some_time_after|
|
19
|
+
series << series.last + (rand * some_time_after).ceil
|
20
|
+
end
|
21
|
+
return series
|
22
|
+
end
|
23
|
+
date
|
24
|
+
end
|
25
|
+
|
26
|
+
MONTHS = k %w(January February March April May June July August September October November December)
|
27
|
+
end
|
28
|
+
end
|
data/lib/ffaker/venue.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Faker
|
2
|
+
# thanks to http://hipsteripsum.me
|
3
|
+
module Venue
|
4
|
+
extend ModuleUtils
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def name
|
8
|
+
VENUE_LIST.rand
|
9
|
+
end
|
10
|
+
|
11
|
+
VENUE_LIST = k ["Barcelona Business Center",
|
12
|
+
"Business Planet",
|
13
|
+
"Can Domenge. Centre Tecnologic",
|
14
|
+
"Casapiedra",
|
15
|
+
"Centro de Convenciones Puebla William O. Jenkins",
|
16
|
+
"Centro de Convenciones Torreon",
|
17
|
+
"Centro de Eventos Castillo Hidalgo",
|
18
|
+
"Centro de Exposiciones y Convenciones Las Americas",
|
19
|
+
"Centro de Exposiciones y Convenciones del World Trade Center",
|
20
|
+
"Centro de Exposiciones y Convenciones de Chihuahua",
|
21
|
+
"Chez Moi",
|
22
|
+
"Expo CenterNet de Argentina",
|
23
|
+
"Expotrade",
|
24
|
+
"Expourense",
|
25
|
+
"Feria de Muestras de Navarra, S.L.",
|
26
|
+
"Feria de Zaragoza",
|
27
|
+
"Feria Internacional de Bilbao",
|
28
|
+
"Feria Internacional de Galicia",
|
29
|
+
"Feria Internacional de Muestras de Asturias",
|
30
|
+
"Ferias y Congresos de Baleares",
|
31
|
+
"Fundacion de Ferias y Exposiciones de Lugo",
|
32
|
+
"Institucion Ferial de Calamocha",
|
33
|
+
"Los Almendros de Huechuraba",
|
34
|
+
"Oficina de Convenciones y Visitantes de Monterrey",
|
35
|
+
"Oficina de Convenciones y Visitantes de Acapulco",
|
36
|
+
"Palacio de Congresos de Cadiz",
|
37
|
+
"Palacio de Congresos de Galicia",
|
38
|
+
"Palacio de Congresos de La Coruna",
|
39
|
+
"Palacio de Exposiciones y Congresos de Sevilla",
|
40
|
+
"Palau de Congressos de Catalunya",
|
41
|
+
"Parque Ferial On Line",
|
42
|
+
"World Trade Center Barcelona",
|
43
|
+
"World Trade Center Sevilla"]
|
44
|
+
end
|
45
|
+
end
|
data/test/test_address.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestAddress < Test::Unit::TestCase
|
4
|
+
def test_building_number
|
5
|
+
assert_match /\A\d{3,5}\z/, Faker::Address.building_number
|
6
|
+
end
|
7
|
+
|
4
8
|
def test_city
|
5
9
|
assert_match /[ a-z]+/, Faker::Address.city
|
6
10
|
end
|
@@ -30,34 +34,38 @@ class TestAddress < Test::Unit::TestCase
|
|
30
34
|
end
|
31
35
|
|
32
36
|
def test_uk_country
|
33
|
-
assert_match /[ a-z]/, Faker::
|
37
|
+
assert_match /[ a-z]/, Faker::AddressUK.country
|
34
38
|
end
|
35
39
|
|
36
40
|
def test_uk_county
|
37
|
-
assert_match /[ a-z]/, Faker::
|
41
|
+
assert_match /[ a-z]/, Faker::AddressUK.county
|
38
42
|
end
|
39
43
|
|
40
44
|
def test_uk_postcode
|
41
|
-
assert_match /[ a-z]/, Faker::
|
45
|
+
assert_match /[ a-z]/, Faker::AddressUK.postcode
|
42
46
|
end
|
43
47
|
|
44
48
|
def test_us_state
|
45
|
-
assert_match /[ a-z]/, Faker::
|
49
|
+
assert_match /[ a-z]/, Faker::AddressUS.state
|
46
50
|
end
|
47
51
|
|
48
52
|
def test_us_state_abbr
|
49
|
-
assert_match /[A-Z]/, Faker::
|
53
|
+
assert_match /[A-Z]/, Faker::AddressUS.state_abbr
|
50
54
|
end
|
51
55
|
|
52
56
|
def test_zip_code
|
53
|
-
assert_match /[0-9]/, Faker::
|
57
|
+
assert_match /[0-9]/, Faker::AddressUS.zip_code
|
54
58
|
end
|
55
59
|
|
56
60
|
def test_zip_code_frozen
|
57
|
-
assert Faker::
|
61
|
+
assert Faker::AddressUS.zip_code.frozen? == false
|
58
62
|
end
|
59
63
|
|
60
64
|
def test_neighborhood
|
61
65
|
assert_match /[ a-z]+/, Faker::Address::neighborhood
|
62
66
|
end
|
67
|
+
|
68
|
+
def test_country
|
69
|
+
assert_match /[ a-z]+/, Faker::Address::country
|
70
|
+
end
|
63
71
|
end
|