forgery 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/LICENSE +20 -0
- data/README.markdown +13 -13
- data/Rakefile +50 -0
- data/VERSION.yml +3 -2
- data/forgery.gemspec +120 -0
- data/init.rb +1 -0
- data/lib/forgery.rb +14 -28
- data/lib/forgery/dictionaries.rb +24 -0
- data/lib/{dictionaries → forgery/dictionaries}/cities +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/colors +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/company_names +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/countries +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/female_first_names +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/frequencies +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/genders +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/languages +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/last_names +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/lorem_ipsum +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/male_first_names +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/name_suffixes +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/name_titles +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/province_abbrevs +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/provinces +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/races +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/shirt_sizes +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/state_abbrevs +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/states +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/street_suffixes +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/streets +0 -0
- data/lib/{dictionaries → forgery/dictionaries}/top_level_domains +0 -0
- data/lib/{extensions → forgery/extensions}/array.rb +0 -0
- data/lib/{extensions → forgery/extensions}/hash.rb +0 -0
- data/lib/{extensions → forgery/extensions}/range.rb +0 -0
- data/lib/{extensions → forgery/extensions}/string.rb +1 -0
- data/lib/forgery/file_reader.rb +69 -0
- data/lib/forgery/forgery.rb +23 -0
- data/lib/{forgeries/address_forgery.rb → forgery/forgery/address.rb} +27 -25
- data/lib/{forgeries/basic_forgery.rb → forgery/forgery/basic.rb} +41 -1
- data/lib/{forgeries/internet_forgery.rb → forgery/forgery/internet.rb} +4 -2
- data/lib/{forgeries/lorem_ipsum_forgery.rb → forgery/forgery/lorem_ipsum.rb} +1 -2
- data/lib/{forgeries/monetary_forgery.rb → forgery/forgery/monetary.rb} +3 -1
- data/lib/{forgeries/name_forgery.rb → forgery/forgery/name.rb} +2 -1
- data/lib/{forgeries/personal_forgery.rb → forgery/forgery/personal.rb} +2 -1
- data/lib/forgery/forgery_api.rb +9 -0
- data/lib/forgery/formats.rb +24 -0
- data/lib/{formats → forgery/formats}/phone +0 -0
- data/lib/{formats → forgery/formats}/street_number +0 -0
- data/lib/{formats → forgery/formats}/zip +0 -0
- data/spec/dictionaries_spec.rb +4 -4
- data/spec/file_reader_spec.rb +3 -3
- data/spec/{forgeries/address_forgery_spec.rb → forgery/address_spec.rb} +13 -13
- data/spec/{forgeries/basic_forgery_spec.rb → forgery/basic_spec.rb} +51 -51
- data/spec/{forgeries/internet_forgery_spec.rb → forgery/internet_spec.rb} +6 -6
- data/spec/{forgeries/lorem_ipsum_forgery_spec.rb → forgery/lorem_ipsum_spec.rb} +26 -26
- data/spec/{forgeries/monetary_forgery_spec.rb → forgery/monetary_spec.rb} +1 -1
- data/spec/{forgeries/name_forgery_spec.rb → forgery/name_spec.rb} +1 -1
- data/spec/{forgeries/personal_forgery_spec.rb → forgery/personal_spec.rb} +3 -3
- data/spec/forgery_spec.rb +33 -6
- data/spec/formats_spec.rb +4 -4
- metadata +78 -57
- data/lib/dictionaries.rb +0 -24
- data/lib/file_reader.rb +0 -53
- data/lib/formats.rb +0 -24
@@ -0,0 +1,23 @@
|
|
1
|
+
class Forgery
|
2
|
+
|
3
|
+
def self.dictionaries
|
4
|
+
@@dictionaries ||= Dictionaries.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.formats
|
8
|
+
@@formats ||= Formats.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.rails_root
|
12
|
+
if defined?(RAILS_ROOT)
|
13
|
+
RAILS_ROOT
|
14
|
+
elsif defined?(Rails)
|
15
|
+
Rails.root.to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.rails?
|
20
|
+
!rails_root.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# Generates random address information.
|
2
|
-
class
|
2
|
+
class Forgery::Address < Forgery
|
3
|
+
|
3
4
|
# Gets a random street name out of the 'streets' dictionary.
|
4
5
|
#
|
5
|
-
#
|
6
|
+
# Forgery(:address).street_name
|
6
7
|
# # => "Atwood"
|
7
8
|
#
|
8
|
-
#
|
9
|
+
# Forgery(:address).street_name
|
9
10
|
# # => "Fordem"
|
10
11
|
def self.street_name
|
11
12
|
dictionaries[:streets].random
|
@@ -14,10 +15,10 @@ class AddressForgery < Forgery
|
|
14
15
|
# Gets one of the formats from 'street_number_formats' and converts it to
|
15
16
|
# numbers.
|
16
17
|
#
|
17
|
-
#
|
18
|
+
# Forgery(:address).street_number
|
18
19
|
# # => 1
|
19
20
|
#
|
20
|
-
#
|
21
|
+
# Forgery(:address).street_number
|
21
22
|
# # => 1234
|
22
23
|
def self.street_number
|
23
24
|
formats[:street_number].random.to_numbers
|
@@ -25,10 +26,10 @@ class AddressForgery < Forgery
|
|
25
26
|
|
26
27
|
# Gets a random street suffix out of the 'street_suffixes' dictionary.
|
27
28
|
#
|
28
|
-
#
|
29
|
+
# Forgery(:address).street_suffix
|
29
30
|
# # => "Street"
|
30
31
|
#
|
31
|
-
#
|
32
|
+
# Forgery(:address).street_suffix
|
32
33
|
# # => "Parkway"
|
33
34
|
def self.street_suffix
|
34
35
|
dictionaries[:street_suffixes].random
|
@@ -37,10 +38,10 @@ class AddressForgery < Forgery
|
|
37
38
|
# Gets a full street address, including street number, street name, and
|
38
39
|
# street suffix.
|
39
40
|
#
|
40
|
-
#
|
41
|
+
# Forgery(:address).street_address
|
41
42
|
# # => "92 West Circle"
|
42
43
|
#
|
43
|
-
#
|
44
|
+
# Forgery(:address).street_address
|
44
45
|
# # => "93265 Harper Lane"
|
45
46
|
def self.street_address
|
46
47
|
"#{street_number} #{street_name} #{street_suffix}"
|
@@ -48,10 +49,10 @@ class AddressForgery < Forgery
|
|
48
49
|
|
49
50
|
# Gets a random city out of the 'cities' dictionary.
|
50
51
|
#
|
51
|
-
#
|
52
|
+
# Forgery(:address).city
|
52
53
|
# # => "Anaheim"
|
53
54
|
#
|
54
|
-
#
|
55
|
+
# Forgery(:address).city
|
55
56
|
# # => "Sacramento"
|
56
57
|
def self.city
|
57
58
|
dictionaries[:cities].random
|
@@ -59,10 +60,10 @@ class AddressForgery < Forgery
|
|
59
60
|
|
60
61
|
# Gets a random state out of the 'states' dictionary.
|
61
62
|
#
|
62
|
-
#
|
63
|
+
# Forgery(:address).state
|
63
64
|
# # => "Mississippi"
|
64
65
|
#
|
65
|
-
#
|
66
|
+
# Forgery(:address).state
|
66
67
|
# # => "Minnesota"
|
67
68
|
def self.state
|
68
69
|
dictionaries[:states].random
|
@@ -70,10 +71,10 @@ class AddressForgery < Forgery
|
|
70
71
|
|
71
72
|
# Gets a random state abbreviation out of the 'state_abbrev' dictionary.
|
72
73
|
#
|
73
|
-
#
|
74
|
+
# Forgery(:address).state_abbrev
|
74
75
|
# # => "GA"
|
75
76
|
#
|
76
|
-
#
|
77
|
+
# Forgery(:address).state_abbrev
|
77
78
|
# # => "TX"
|
78
79
|
def self.state_abbrev
|
79
80
|
dictionaries[:state_abbrevs].random
|
@@ -81,10 +82,10 @@ class AddressForgery < Forgery
|
|
81
82
|
|
82
83
|
# Gets a random Canadian province or territory out of the 'provinces' dictionary.
|
83
84
|
#
|
84
|
-
#
|
85
|
+
# Forgery(:address).province
|
85
86
|
# # => "Ontario"
|
86
87
|
#
|
87
|
-
#
|
88
|
+
# Forgery(:address).province
|
88
89
|
# # => "Northwest Territories"
|
89
90
|
def self.province
|
90
91
|
dictionaries[:provinces].random
|
@@ -92,10 +93,10 @@ class AddressForgery < Forgery
|
|
92
93
|
|
93
94
|
# Gets a random Canadian province or territory abbreviation out of the 'province_abbrev' dictionary.
|
94
95
|
#
|
95
|
-
#
|
96
|
+
# Forgery(:address).province_abbrev
|
96
97
|
# # => "ON"
|
97
98
|
#
|
98
|
-
#
|
99
|
+
# Forgery(:address).province_abbrev
|
99
100
|
# # => "NT"
|
100
101
|
def self.province_abbrev
|
101
102
|
dictionaries[:province_abbrevs].random
|
@@ -103,10 +104,10 @@ class AddressForgery < Forgery
|
|
103
104
|
|
104
105
|
# Gets one of the formats from 'zip_formats' and converts it to numbers.
|
105
106
|
#
|
106
|
-
#
|
107
|
+
# Forgery(:address).zip
|
107
108
|
# # => "52474"
|
108
109
|
#
|
109
|
-
#
|
110
|
+
# Forgery(:address).zip
|
110
111
|
# # => "66702-4349"
|
111
112
|
def self.zip
|
112
113
|
formats[:zip].random.to_numbers
|
@@ -114,10 +115,10 @@ class AddressForgery < Forgery
|
|
114
115
|
|
115
116
|
# Gets one of the formats from 'phone_formats' and converts it to numbers.
|
116
117
|
#
|
117
|
-
#
|
118
|
+
# Forgery(:address).phone
|
118
119
|
# # => "1-(416)185-8799"
|
119
120
|
#
|
120
|
-
#
|
121
|
+
# Forgery(:address).phone
|
121
122
|
# # => "1-(589)248-0418"
|
122
123
|
def self.phone
|
123
124
|
formats[:phone].random.to_numbers
|
@@ -125,12 +126,13 @@ class AddressForgery < Forgery
|
|
125
126
|
|
126
127
|
# Gets a random country out of the 'countries' dictionary.
|
127
128
|
#
|
128
|
-
#
|
129
|
+
# Forgery(:address).country
|
129
130
|
# # => "Uruguay"
|
130
131
|
#
|
131
|
-
#
|
132
|
+
# Forgery(:address).country
|
132
133
|
# # => "Romania"
|
133
134
|
def self.country
|
134
135
|
dictionaries[:countries].random
|
135
136
|
end
|
137
|
+
|
136
138
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'digest/sha1'
|
2
2
|
|
3
|
-
class
|
3
|
+
class Forgery::Basic < Forgery
|
4
|
+
|
4
5
|
HEX_DIGITS = %w{0 1 2 3 4 5 6 7 8 9 a b c d e f}
|
5
6
|
UPPER_ALPHA = ('A'..'Z').to_a
|
6
7
|
LOWER_ALPHA = ('a'..'z').to_a
|
@@ -8,6 +9,27 @@ class BasicForgery < Forgery
|
|
8
9
|
SPECIAL_CHARACTERS = %w{! ' @ # $ % ^ & * ( ) _ + - = [ ] { } ; : " , . / ?}
|
9
10
|
BOOLEAN = [true, false]
|
10
11
|
|
12
|
+
# Gets a random string for use as a password
|
13
|
+
#
|
14
|
+
# Forgery(:basic).password
|
15
|
+
# # => "1MbyMQhU"
|
16
|
+
#
|
17
|
+
# Forgery(:basic).password(:at_least => 3, :at_most => 5)
|
18
|
+
# # => "WbgP"
|
19
|
+
#
|
20
|
+
# Supported Options
|
21
|
+
# [:at_least]
|
22
|
+
# The minimum length the password may be. Defaults to 6.
|
23
|
+
# [:at_most]
|
24
|
+
# The maximum length the password may be. Defaults to 12.
|
25
|
+
# [:allow_lower]
|
26
|
+
# Allow lowercase characters. Defaults to true.
|
27
|
+
# [:allow_upper]
|
28
|
+
# Allow uppercase characters. Defaults to true.
|
29
|
+
# [:allow_numeric]
|
30
|
+
# Allow numbers. Defaults to true.
|
31
|
+
# [:allow_special]
|
32
|
+
# Allow special characters. Defaults to false.
|
11
33
|
def self.password(options={})
|
12
34
|
options = {:at_least => 6,
|
13
35
|
:at_most => 12,
|
@@ -18,10 +40,27 @@ class BasicForgery < Forgery
|
|
18
40
|
self.text(options)
|
19
41
|
end
|
20
42
|
|
43
|
+
# SHA1 hexdigests a password salted with the current time
|
44
|
+
#
|
45
|
+
# Forgery(:basic).encrypt
|
46
|
+
# # => "b2fbd3955a36068e93e0b9db45bcb178f08336f5"
|
47
|
+
#
|
48
|
+
# Forgery(:basic).encrypt('your-password')
|
49
|
+
# # => "00932bafce4a9391f888ca77f81f98b8e89d3aa6"
|
50
|
+
#
|
51
|
+
# Forgery(:basic).encrypt('your-password', Time.utc(2009))
|
52
|
+
# # => "4b157c2fbf430b962842d21926eaa887c3a12f81"
|
21
53
|
def self.encrypt(password="password", salt=Time.now.to_s)
|
22
54
|
Digest::SHA1.hexdigest("--#{salt}--#{password}--")
|
23
55
|
end
|
24
56
|
|
57
|
+
# Gets a random boolean value
|
58
|
+
#
|
59
|
+
# Forgery(:basic).boolean
|
60
|
+
# # => true
|
61
|
+
#
|
62
|
+
# Forgery(:basic).boolean
|
63
|
+
# # => false
|
25
64
|
def self.boolean
|
26
65
|
BOOLEAN.random
|
27
66
|
end
|
@@ -68,4 +107,5 @@ class BasicForgery < Forgery
|
|
68
107
|
def self.frequency
|
69
108
|
dictionaries[:frequencies].random
|
70
109
|
end
|
110
|
+
|
71
111
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
class
|
1
|
+
class Forgery::Internet < Forgery
|
2
|
+
|
2
3
|
def self.user_name
|
3
4
|
(dictionaries[:male_first_names].random[0,1] + dictionaries[:last_names].random).downcase
|
4
5
|
end
|
@@ -10,8 +11,9 @@ class InternetForgery < Forgery
|
|
10
11
|
def self.domain_name
|
11
12
|
dictionaries[:company_names].random.downcase + '.' + self.top_level_domain
|
12
13
|
end
|
13
|
-
|
14
|
+
|
14
15
|
def self.email_address
|
15
16
|
self.user_name + '@' + self.domain_name
|
16
17
|
end
|
18
|
+
|
17
19
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class Forgery::LoremIpsum < Forgery
|
2
2
|
|
3
3
|
def self.text(what=:sentence, quantity=2, options={})
|
4
4
|
case what
|
@@ -21,7 +21,6 @@ class LoremIpsumForgery < Forgery
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
24
|
def self.character(options={})
|
26
25
|
self.characters(1, options)
|
27
26
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
class
|
1
|
+
class Forgery::Monetary < Forgery
|
2
|
+
|
2
3
|
def self.formatted_money(options={})
|
3
4
|
"$%1.2f" % money(options)
|
4
5
|
end
|
@@ -10,4 +11,5 @@ class MonetaryForgery < Forgery
|
|
10
11
|
value = ((options[:min] * 100)..(options[:max] * 100)).random
|
11
12
|
"%1.2f" % (value.to_f / 100)
|
12
13
|
end
|
14
|
+
|
13
15
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Forgery
|
2
|
+
|
3
|
+
class Formats
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@formats = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](key)
|
10
|
+
symbolized_key = key.to_sym
|
11
|
+
@formats[symbolized_key] ||= FileReader.read_format(symbolized_key)
|
12
|
+
end
|
13
|
+
|
14
|
+
def loaded?(key)
|
15
|
+
@formats.has_key?(key.to_sym)
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset!
|
19
|
+
@formats = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/spec/dictionaries_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
|
3
|
-
describe Dictionaries do
|
3
|
+
describe Forgery::Dictionaries do
|
4
4
|
it "should check if the dictionary is loaded" do
|
5
|
-
dictionaries = Dictionaries.new
|
5
|
+
dictionaries = Forgery::Dictionaries.new
|
6
6
|
|
7
7
|
dictionaries[:colors]
|
8
8
|
|
@@ -10,7 +10,7 @@ describe Dictionaries do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should load a dictionary when called by the key" do
|
13
|
-
dictionaries = Dictionaries.new
|
13
|
+
dictionaries = Forgery::Dictionaries.new
|
14
14
|
|
15
15
|
dictionaries.reset!
|
16
16
|
|
@@ -22,7 +22,7 @@ describe Dictionaries do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should clear the loaded dictionaries when calling reset!" do
|
25
|
-
dictionaries = Dictionaries.new
|
25
|
+
dictionaries = Forgery::Dictionaries.new
|
26
26
|
|
27
27
|
dictionaries[:colors]
|
28
28
|
|
data/spec/file_reader_spec.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
|
3
|
-
describe FileReader do
|
3
|
+
describe Forgery::FileReader do
|
4
4
|
it "should return an array when calling read_dictionary" do
|
5
|
-
FileReader.read_dictionary(:colors).should be_is_a(Array)
|
5
|
+
Forgery::FileReader.read_dictionary(:colors).should be_is_a(Array)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should return an array when calling read_format" do
|
9
|
-
FileReader.read_format(:phone).should be_is_a(Array)
|
9
|
+
Forgery::FileReader.read_format(:phone).should be_is_a(Array)
|
10
10
|
end
|
11
11
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe Forgery::Address do
|
4
4
|
it "should return a random street" do
|
5
|
-
Forgery.dictionaries[:streets].should include(
|
5
|
+
Forgery.dictionaries[:streets].should include(Forgery::Address.street_name)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should return a random street number" do
|
9
|
-
original_format =
|
9
|
+
original_format = Forgery::Address.street_number.gsub(/\d/, '#')
|
10
10
|
Forgery.formats[:street_number].should include(original_format)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should return a random street suffix" do
|
14
|
-
Forgery.dictionaries[:street_suffixes].should include(
|
14
|
+
Forgery.dictionaries[:street_suffixes].should include(Forgery::Address.street_suffix)
|
15
15
|
end
|
16
16
|
|
17
17
|
describe ".street_address" do
|
18
18
|
before do
|
19
|
-
@split_address =
|
19
|
+
@split_address = Forgery::Address.street_address.split
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should return a random street suffix" do
|
@@ -38,42 +38,42 @@ describe AddressForgery do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should return a random city" do
|
41
|
-
city =
|
41
|
+
city = Forgery::Address.city
|
42
42
|
Forgery.dictionaries[:cities].should include(city)
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should return a random state" do
|
46
|
-
state =
|
46
|
+
state = Forgery::Address.state
|
47
47
|
Forgery.dictionaries[:states].should include(state)
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should return a random state abbreviation" do
|
51
|
-
state_abbrev =
|
51
|
+
state_abbrev = Forgery::Address.state_abbrev
|
52
52
|
Forgery.dictionaries[:state_abbrevs].should include(state_abbrev)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should return a random Canadian province or territory" do
|
56
|
-
province =
|
56
|
+
province = Forgery::Address.province
|
57
57
|
Forgery.dictionaries[:provinces].should include(province)
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should return a random Canadian province or territory abbreviation" do
|
61
|
-
province_abbrev =
|
61
|
+
province_abbrev = Forgery::Address.province_abbrev
|
62
62
|
Forgery.dictionaries[:province_abbrevs].should include(province_abbrev)
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should return a random country" do
|
66
|
-
country =
|
66
|
+
country = Forgery::Address.country
|
67
67
|
Forgery.dictionaries[:countries].should include(country)
|
68
68
|
end
|
69
69
|
|
70
70
|
it "should return a random zip code" do
|
71
|
-
zip_format =
|
71
|
+
zip_format = Forgery::Address.zip.gsub(/\d/, '#')
|
72
72
|
Forgery.formats[:zip].should include(zip_format)
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should return a random phone number" do
|
76
|
-
phone_format =
|
76
|
+
phone_format = Forgery::Address.phone.gsub(/\d/, '#')
|
77
77
|
Forgery.formats[:phone].should include(phone_format)
|
78
78
|
end
|
79
79
|
end
|