ffaker 1.15.0 → 1.16.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.
- 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
|