forgery 0.2.2 → 0.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.
- 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
|