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.
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