forgery 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/.gitignore +3 -0
  2. data/LICENSE +20 -0
  3. data/README.markdown +13 -13
  4. data/Rakefile +50 -0
  5. data/VERSION.yml +3 -2
  6. data/forgery.gemspec +120 -0
  7. data/init.rb +1 -0
  8. data/lib/forgery.rb +14 -28
  9. data/lib/forgery/dictionaries.rb +24 -0
  10. data/lib/{dictionaries → forgery/dictionaries}/cities +0 -0
  11. data/lib/{dictionaries → forgery/dictionaries}/colors +0 -0
  12. data/lib/{dictionaries → forgery/dictionaries}/company_names +0 -0
  13. data/lib/{dictionaries → forgery/dictionaries}/countries +0 -0
  14. data/lib/{dictionaries → forgery/dictionaries}/female_first_names +0 -0
  15. data/lib/{dictionaries → forgery/dictionaries}/frequencies +0 -0
  16. data/lib/{dictionaries → forgery/dictionaries}/genders +0 -0
  17. data/lib/{dictionaries → forgery/dictionaries}/languages +0 -0
  18. data/lib/{dictionaries → forgery/dictionaries}/last_names +0 -0
  19. data/lib/{dictionaries → forgery/dictionaries}/lorem_ipsum +0 -0
  20. data/lib/{dictionaries → forgery/dictionaries}/male_first_names +0 -0
  21. data/lib/{dictionaries → forgery/dictionaries}/name_suffixes +0 -0
  22. data/lib/{dictionaries → forgery/dictionaries}/name_titles +0 -0
  23. data/lib/{dictionaries → forgery/dictionaries}/province_abbrevs +0 -0
  24. data/lib/{dictionaries → forgery/dictionaries}/provinces +0 -0
  25. data/lib/{dictionaries → forgery/dictionaries}/races +0 -0
  26. data/lib/{dictionaries → forgery/dictionaries}/shirt_sizes +0 -0
  27. data/lib/{dictionaries → forgery/dictionaries}/state_abbrevs +0 -0
  28. data/lib/{dictionaries → forgery/dictionaries}/states +0 -0
  29. data/lib/{dictionaries → forgery/dictionaries}/street_suffixes +0 -0
  30. data/lib/{dictionaries → forgery/dictionaries}/streets +0 -0
  31. data/lib/{dictionaries → forgery/dictionaries}/top_level_domains +0 -0
  32. data/lib/{extensions → forgery/extensions}/array.rb +0 -0
  33. data/lib/{extensions → forgery/extensions}/hash.rb +0 -0
  34. data/lib/{extensions → forgery/extensions}/range.rb +0 -0
  35. data/lib/{extensions → forgery/extensions}/string.rb +1 -0
  36. data/lib/forgery/file_reader.rb +69 -0
  37. data/lib/forgery/forgery.rb +23 -0
  38. data/lib/{forgeries/address_forgery.rb → forgery/forgery/address.rb} +27 -25
  39. data/lib/{forgeries/basic_forgery.rb → forgery/forgery/basic.rb} +41 -1
  40. data/lib/{forgeries/internet_forgery.rb → forgery/forgery/internet.rb} +4 -2
  41. data/lib/{forgeries/lorem_ipsum_forgery.rb → forgery/forgery/lorem_ipsum.rb} +1 -2
  42. data/lib/{forgeries/monetary_forgery.rb → forgery/forgery/monetary.rb} +3 -1
  43. data/lib/{forgeries/name_forgery.rb → forgery/forgery/name.rb} +2 -1
  44. data/lib/{forgeries/personal_forgery.rb → forgery/forgery/personal.rb} +2 -1
  45. data/lib/forgery/forgery_api.rb +9 -0
  46. data/lib/forgery/formats.rb +24 -0
  47. data/lib/{formats → forgery/formats}/phone +0 -0
  48. data/lib/{formats → forgery/formats}/street_number +0 -0
  49. data/lib/{formats → forgery/formats}/zip +0 -0
  50. data/spec/dictionaries_spec.rb +4 -4
  51. data/spec/file_reader_spec.rb +3 -3
  52. data/spec/{forgeries/address_forgery_spec.rb → forgery/address_spec.rb} +13 -13
  53. data/spec/{forgeries/basic_forgery_spec.rb → forgery/basic_spec.rb} +51 -51
  54. data/spec/{forgeries/internet_forgery_spec.rb → forgery/internet_spec.rb} +6 -6
  55. data/spec/{forgeries/lorem_ipsum_forgery_spec.rb → forgery/lorem_ipsum_spec.rb} +26 -26
  56. data/spec/{forgeries/monetary_forgery_spec.rb → forgery/monetary_spec.rb} +1 -1
  57. data/spec/{forgeries/name_forgery_spec.rb → forgery/name_spec.rb} +1 -1
  58. data/spec/{forgeries/personal_forgery_spec.rb → forgery/personal_spec.rb} +3 -3
  59. data/spec/forgery_spec.rb +33 -6
  60. data/spec/formats_spec.rb +4 -4
  61. metadata +78 -57
  62. data/lib/dictionaries.rb +0 -24
  63. data/lib/file_reader.rb +0 -53
  64. 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 AddressForgery < Forgery
2
+ class Forgery::Address < Forgery
3
+
3
4
  # Gets a random street name out of the 'streets' dictionary.
4
5
  #
5
- # AddressForgery.street_name
6
+ # Forgery(:address).street_name
6
7
  # # => "Atwood"
7
8
  #
8
- # AddressForgery.street_name
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
- # AddressForgery.street_number
18
+ # Forgery(:address).street_number
18
19
  # # => 1
19
20
  #
20
- # AddressForgery.street_number
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
- # AddressForgery.street_suffix
29
+ # Forgery(:address).street_suffix
29
30
  # # => "Street"
30
31
  #
31
- # AddressForgery.street_suffix
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
- # AddressForgery.street_address
41
+ # Forgery(:address).street_address
41
42
  # # => "92 West Circle"
42
43
  #
43
- # AddressForgery.street_address
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
- # AddressForgery.city
52
+ # Forgery(:address).city
52
53
  # # => "Anaheim"
53
54
  #
54
- # AddressForgery.city
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
- # AddressForgery.state
63
+ # Forgery(:address).state
63
64
  # # => "Mississippi"
64
65
  #
65
- # AddressForgery.state
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
- # AddressForgery.state_abbrev
74
+ # Forgery(:address).state_abbrev
74
75
  # # => "GA"
75
76
  #
76
- # AddressForgery.state_abbrev
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
- # AddressForgery.province
85
+ # Forgery(:address).province
85
86
  # # => "Ontario"
86
87
  #
87
- # AddressForgery.province
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
- # AddressForgery.province_abbrev
96
+ # Forgery(:address).province_abbrev
96
97
  # # => "ON"
97
98
  #
98
- # AddressForgery.province_abbrev
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
- # AddressForgery.zip
107
+ # Forgery(:address).zip
107
108
  # # => "52474"
108
109
  #
109
- # AddressForgery.zip
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
- # AddressForgery.phone
118
+ # Forgery(:address).phone
118
119
  # # => "1-(416)185-8799"
119
120
  #
120
- # AddressForgery.phone
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
- # AddressForgery.country
129
+ # Forgery(:address).country
129
130
  # # => "Uruguay"
130
131
  #
131
- # AddressForgery.country
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 BasicForgery < Forgery
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 InternetForgery < Forgery
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 LoremIpsumForgery < Forgery
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 MonetaryForgery < Forgery
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
@@ -1,4 +1,4 @@
1
- class NameForgery < Forgery
1
+ class Forgery::Name < Forgery
2
2
 
3
3
  def self.last_name
4
4
  dictionaries[:last_names].random
@@ -31,4 +31,5 @@ class NameForgery < Forgery
31
31
  def self.suffix
32
32
  dictionaries[:name_suffixes].random
33
33
  end
34
+
34
35
  end
@@ -1,4 +1,4 @@
1
- class PersonalForgery < Forgery
1
+ class Forgery::Personal < Forgery
2
2
 
3
3
  def self.gender
4
4
  dictionaries[:genders].random
@@ -19,4 +19,5 @@ class PersonalForgery < Forgery
19
19
  def self.language
20
20
  dictionaries[:languages].random
21
21
  end
22
+
22
23
  end
@@ -0,0 +1,9 @@
1
+ # Alternate Forgery api, see spec/forgery_spec.rb for examples.
2
+ def Forgery(forgery, method=nil, *args)
3
+ klass = "Forgery::#{forgery.to_s.camelize}".constantize
4
+ if method
5
+ klass.send(method, *args)
6
+ else
7
+ klass
8
+ end
9
+ 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
@@ -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
 
@@ -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 AddressForgery do
3
+ describe Forgery::Address do
4
4
  it "should return a random street" do
5
- Forgery.dictionaries[:streets].should include(AddressForgery.street_name)
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 = AddressForgery.street_number.gsub(/\d/, '#')
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(AddressForgery.street_suffix)
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 = AddressForgery.street_address.split
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 = AddressForgery.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 = AddressForgery.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 = AddressForgery.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 = AddressForgery.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 = AddressForgery.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 = AddressForgery.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 = AddressForgery.zip.gsub(/\d/, '#')
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 = AddressForgery.phone.gsub(/\d/, '#')
76
+ phone_format = Forgery::Address.phone.gsub(/\d/, '#')
77
77
  Forgery.formats[:phone].should include(phone_format)
78
78
  end
79
79
  end