sevenwire-forgery 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -21,11 +21,11 @@ Generator
21
21
 
22
22
  In a rails project this generator creates:
23
23
 
24
- * RAILS_ROOT/lib/forgery
25
- * RAILS_ROOT/lib/forgery/dictionaries
26
- * RAILS_ROOT/lib/forgery/extensions
27
- * RAILS_ROOT/lib/forgery/forgeries
28
- * RAILS_ROOT/lib/forgery/formats
24
+ * RAILS\_ROOT/lib/forgery
25
+ * RAILS\_ROOT/lib/forgery/dictionaries
26
+ * RAILS\_ROOT/lib/forgery/extensions
27
+ * RAILS\_ROOT/lib/forgery/forgeries
28
+ * RAILS\_ROOT/lib/forgery/formats
29
29
 
30
30
  You can then use these directories to write your own dictionaries, class
31
31
  extensions, forgeries, and formats.
@@ -45,6 +45,7 @@ Here I'll supply a few examples of how it works, in general. See each forgery
45
45
  for individual examples.
46
46
 
47
47
  <pre><code>
48
+ # Traditional syntax
48
49
  BasicForgery.password # => "wYMYvq"
49
50
  BasicForgery.password :allow_special => true # => ";Qo^N[T"
50
51
  BasicForgery.hex_color # => "#f4d841"
@@ -52,20 +53,28 @@ BasicForgery.hex_color # => "#f4d841"
52
53
  MonetaryForgery.money # => "8.21"
53
54
  MonetaryForgery.formatted_money # => "$3.25"
54
55
  MonetaryForgery.money :min => 100, :max => 1000 # => "848.97"
56
+
57
+ # Alternate syntax
58
+ Forgery(:basic).password # => "b6qZTQEH"
59
+ Forgery(:basic).password :allow_special => true # => "XlrhV%An"
60
+ Forgery(:basic).hex_color # => "#46b73f"
61
+
62
+ Forgery(:monetary).money # => "1.58"
63
+ Forgery(:monetary).formatted_money # => "$3.48"
64
+ Forgery(:monetary).money :min => 100, :max => 1000 # => "923.36"
55
65
  </code></pre>
56
66
 
57
67
  TODO
58
68
  ====
59
69
 
60
- * Delayed reading of dictionaries, forms, etc (speed and memory concerns)
61
- * Add secondary syntax similar to Factory Girl (or better?)
70
+ * Add instanced forgeries for more relative information generation.
62
71
 
63
72
  Thanks
64
73
  ======
65
74
 
66
75
  Thanks to the authors and contributors:
67
76
 
68
- * Nathan Sutton (nate aka fowlduck)
77
+ * Nate Sutton (nate aka fowlduck)
69
78
  * Brandon Arbini (brandonarbini)
70
79
  * Josh Nichols (technicalpickles)
71
80
  * Jeremy Stephens (viking aka crookshanks)
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  patch: 0
3
3
  major: 0
4
- minor: 1
4
+ minor: 2
@@ -0,0 +1,24 @@
1
+ class Dictionaries
2
+
3
+ def initialize
4
+ @dictionaries = {}
5
+ end
6
+
7
+ def [](key)
8
+ symbolized_key = key.to_sym
9
+ if loaded?(symbolized_key)
10
+ @dictionaries[symbolized_key]
11
+ else
12
+ @dictionaries[symbolized_key] = FileReader.read_dictionary(symbolized_key)
13
+ end
14
+ end
15
+
16
+ def loaded?(key)
17
+ @dictionaries.has_key?(key.to_sym)
18
+ end
19
+
20
+ def reset!
21
+ @dictionaries = {}
22
+ end
23
+
24
+ end
@@ -0,0 +1,53 @@
1
+ class FileReader
2
+
3
+ def self.read_dictionary(dictionary)
4
+ read_file(path_to_dictionary(dictionary))
5
+ end
6
+
7
+ def self.read_format(format)
8
+ read_file(path_to_format(format))
9
+ end
10
+
11
+ protected
12
+
13
+ def self.read_file(file)
14
+ lines = []
15
+ IO.foreach(file) do |line|
16
+ lines << line.chomp unless line.chomp == ''
17
+ end
18
+ lines
19
+ end
20
+
21
+ def self.path_to_format(format)
22
+ if external_path_to_format(format) && File.exists?(external_path_to_format(format))
23
+ external_path_to_format(format)
24
+ else
25
+ internal_path_to_format(format)
26
+ end
27
+ end
28
+
29
+ def self.external_path_to_format(format)
30
+ RAILS_ROOT + '/lib/forgery/formats/' + format.to_s if defined?(RAILS_ROOT)
31
+ end
32
+
33
+ def self.internal_path_to_format(format)
34
+ File.dirname(__FILE__) + '/formats/' + format.to_s
35
+ end
36
+
37
+ def self.path_to_dictionary(dictionary)
38
+ if external_path_to_dictionary(dictionary) && File.exists?(external_path_to_dictionary(dictionary))
39
+ external_path_to_dictionary(dictionary)
40
+ else
41
+ internal_path_to_dictionary(dictionary)
42
+ end
43
+ end
44
+
45
+ def self.external_path_to_dictionary(dictionary)
46
+ RAILS_ROOT + '/lib/forgery/dictionaries/' + dictionary.to_s if defined?(RAILS_ROOT)
47
+ end
48
+
49
+ def self.internal_path_to_dictionary(dictionary)
50
+ File.dirname(__FILE__) + '/dictionaries/' + dictionary.to_s
51
+ end
52
+
53
+ end
@@ -1,8 +1,5 @@
1
1
  # Generates random address information.
2
2
  class AddressForgery < Forgery
3
- dictionaries :streets, :street_suffixes, :cities, :states, :state_abbrevs, :countries
4
- formats :zip, :phone, :street_number
5
-
6
3
  # Gets a random street name out of the 'streets' dictionary.
7
4
  #
8
5
  # AddressForgery.street_name
@@ -11,7 +8,7 @@ class AddressForgery < Forgery
11
8
  # AddressForgery.street_name
12
9
  # # => "Fordem"
13
10
  def self.street_name
14
- STREETS.random
11
+ dictionaries[:streets].random
15
12
  end
16
13
 
17
14
  # Gets one of the formats from 'street_number_formats' and converts it to
@@ -23,7 +20,7 @@ class AddressForgery < Forgery
23
20
  # AddressForgery.street_number
24
21
  # # => 1234
25
22
  def self.street_number
26
- STREET_NUMBER_FORMATS.random.to_numbers
23
+ formats[:street_number].random.to_numbers
27
24
  end
28
25
 
29
26
  # Gets a random street suffix out of the 'street_suffixes' dictionary.
@@ -34,7 +31,7 @@ class AddressForgery < Forgery
34
31
  # AddressForgery.street_suffix
35
32
  # # => "Parkway"
36
33
  def self.street_suffix
37
- STREET_SUFFIXES.random
34
+ dictionaries[:street_suffixes].random
38
35
  end
39
36
 
40
37
  # Gets a full street address, including street number, street name, and
@@ -57,7 +54,7 @@ class AddressForgery < Forgery
57
54
  # AddressForgery.city
58
55
  # # => "Sacramento"
59
56
  def self.city
60
- CITIES.random
57
+ dictionaries[:cities].random
61
58
  end
62
59
 
63
60
  # Gets a random state out of the 'states' dictionary.
@@ -68,7 +65,7 @@ class AddressForgery < Forgery
68
65
  # AddressForgery.state
69
66
  # # => "Minnesota"
70
67
  def self.state
71
- STATES.random
68
+ dictionaries[:states].random
72
69
  end
73
70
 
74
71
  # Gets a random state abbreviation out of the 'state_abbrev' dictionary.
@@ -79,7 +76,7 @@ class AddressForgery < Forgery
79
76
  # AddressForgery.state_abbrev
80
77
  # # => "TX"
81
78
  def self.state_abbrev
82
- STATE_ABBREVS.random
79
+ dictionaries[:state_abbrevs].random
83
80
  end
84
81
 
85
82
  # Gets one of the formats from 'zip_formats' and converts it to numbers.
@@ -90,7 +87,7 @@ class AddressForgery < Forgery
90
87
  # AddressForgery.zip
91
88
  # # => "66702-4349"
92
89
  def self.zip
93
- ZIP_FORMATS.random.to_numbers
90
+ formats[:zip].random.to_numbers
94
91
  end
95
92
 
96
93
  # Gets one of the formats from 'phone_formats' and converts it to numbers.
@@ -101,7 +98,7 @@ class AddressForgery < Forgery
101
98
  # AddressForgery.phone
102
99
  # # => "1-(589)248-0418"
103
100
  def self.phone
104
- PHONE_FORMATS.random.to_numbers
101
+ formats[:phone].random.to_numbers
105
102
  end
106
103
 
107
104
  # Gets a random country out of the 'countries' dictionary.
@@ -112,6 +109,6 @@ class AddressForgery < Forgery
112
109
  # AddressForgery.country
113
110
  # # => "Romania"
114
111
  def self.country
115
- COUNTRIES.random
112
+ dictionaries[:countries].random
116
113
  end
117
114
  end
@@ -1,8 +1,6 @@
1
1
  require 'digest/sha1'
2
2
 
3
3
  class BasicForgery < Forgery
4
- dictionaries :colors, :frequencies
5
-
6
4
  HEX_DIGITS = %w{0 1 2 3 4 5 6 7 8 9 a b c d e f}
7
5
  UPPER_ALPHA = ('A'..'Z').to_a
8
6
  LOWER_ALPHA = ('a'..'z').to_a
@@ -29,7 +27,7 @@ class BasicForgery < Forgery
29
27
  end
30
28
 
31
29
  def self.color
32
- COLORS.random
30
+ dictionaries[:colors].random
33
31
  end
34
32
 
35
33
  def self.hex_color
@@ -68,6 +66,6 @@ class BasicForgery < Forgery
68
66
  end
69
67
 
70
68
  def self.frequency
71
- FREQUENCIES.random
69
+ dictionaries[:frequencies].random
72
70
  end
73
71
  end
@@ -1,16 +1,14 @@
1
1
  class InternetForgery < Forgery
2
- dictionaries :male_first_names, :female_first_names, :last_names, :top_level_domains, :company_names
3
-
4
2
  def self.user_name
5
- (MALE_FIRST_NAMES.random[0,1] + LAST_NAMES.random).downcase
3
+ (dictionaries[:male_first_names].random[0,1] + dictionaries[:last_names].random).downcase
6
4
  end
7
5
 
8
6
  def self.top_level_domain
9
- TOP_LEVEL_DOMAINS.random
7
+ dictionaries[:top_level_domains].random
10
8
  end
11
9
 
12
10
  def self.domain_name
13
- COMPANY_NAMES.random.downcase + '.' + self.top_level_domain
11
+ dictionaries[:company_names].random.downcase + '.' + self.top_level_domain
14
12
  end
15
13
 
16
14
  def self.email_address
@@ -1,7 +1,4 @@
1
1
  class LoremIpsumForgery < Forgery
2
- dictionaries :lorem_ipsum
3
- LOREM_IPSUM_WORDS = LOREM_IPSUM.join(" ").downcase.gsub(/\.|,|;/, '').split(" ")
4
- LOREM_IPSUM_CHARACTERS = LOREM_IPSUM.join("").downcase.gsub(/[^a-z\s]/,'')
5
2
 
6
3
  def self.text(what=:sentence, quantity=2, options={})
7
4
  case what
@@ -30,9 +27,9 @@ class LoremIpsumForgery < Forgery
30
27
  end
31
28
 
32
29
  def self.characters(quantity=10, options={})
33
- options.merge!(:random_limit => LOREM_IPSUM_CHARACTERS.length-quantity) if quantity.is_a?(Fixnum)
30
+ options.merge!(:random_limit => lorem_ipsum_characters.length-quantity) if quantity.is_a?(Fixnum)
34
31
 
35
- LOREM_IPSUM_CHARACTERS[range_from_quantity(quantity, options)]
32
+ lorem_ipsum_characters[range_from_quantity(quantity, options)]
36
33
  end
37
34
 
38
35
  def self.word(options={})
@@ -40,9 +37,9 @@ class LoremIpsumForgery < Forgery
40
37
  end
41
38
 
42
39
  def self.words(quantity=10, options={})
43
- options.merge!(:random_limit => LOREM_IPSUM_WORDS.length-quantity) if quantity.is_a?(Fixnum)
40
+ options.merge!(:random_limit => lorem_ipsum_words.length-quantity) if quantity.is_a?(Fixnum)
44
41
 
45
- LOREM_IPSUM_WORDS[range_from_quantity(quantity, options)].join(" ")
42
+ lorem_ipsum_words[range_from_quantity(quantity, options)].join(" ")
46
43
  end
47
44
 
48
45
  def self.sentence(options={})
@@ -50,9 +47,9 @@ class LoremIpsumForgery < Forgery
50
47
  end
51
48
 
52
49
  def self.sentences(quantity=2, options={})
53
- options.merge!(:random_limit => (LOREM_IPSUM.length-quantity)) if quantity.is_a?(Fixnum)
50
+ options.merge!(:random_limit => (dictionaries[:lorem_ipsum].length-quantity)) if quantity.is_a?(Fixnum)
54
51
 
55
- LOREM_IPSUM[range_from_quantity(quantity, options)].join(" ")
52
+ dictionaries[:lorem_ipsum][range_from_quantity(quantity, options)].join(" ")
56
53
  end
57
54
 
58
55
  def self.paragraph(options={})
@@ -66,7 +63,7 @@ class LoremIpsumForgery < Forgery
66
63
  :end => "" },
67
64
  :html => false,
68
65
  :sentences => 3)
69
- options.merge!(:random_limit => (LOREM_IPSUM.length/options[:sentences])-quantity) if quantity.is_a?(Fixnum)
66
+ options.merge!(:random_limit => (dictionaries[:lorem_ipsum].length/options[:sentences])-quantity) if quantity.is_a?(Fixnum)
70
67
 
71
68
  if options[:html]
72
69
  options[:wrap] = { :start => "<p>",
@@ -81,7 +78,7 @@ class LoremIpsumForgery < Forgery
81
78
  range.to_a.length.times do |i|
82
79
  paragraphs << (
83
80
  options[:wrap][:start] +
84
- LOREM_IPSUM[start..(start+options[:sentences]-1)].join(" ") +
81
+ dictionaries[:lorem_ipsum][start..(start+options[:sentences]-1)].join(" ") +
85
82
  options[:wrap][:end]
86
83
  )
87
84
  start += options[:sentences]
@@ -103,5 +100,13 @@ protected
103
100
  0..(quantity-1)
104
101
  end
105
102
  end
106
-
103
+
104
+ def self.lorem_ipsum_words
105
+ @@lorem_ipsum_words ||= dictionaries[:lorem_ipsum].join(" ").downcase.gsub(/\.|,|;/, '').split(" ")
106
+ end
107
+
108
+ def self.lorem_ipsum_characters
109
+ @@lorem_ipsum_characters ||= dictionaries[:lorem_ipsum].join("").downcase.gsub(/[^a-z\s]/,'')
110
+ end
111
+
107
112
  end
@@ -1,13 +1,11 @@
1
1
  class NameForgery < Forgery
2
- dictionaries :last_names, :male_first_names, :female_first_names, :company_names,
3
- :name_suffixes, :name_titles
4
2
 
5
3
  def self.last_name
6
- LAST_NAMES.random
4
+ dictionaries[:last_names].random
7
5
  end
8
6
 
9
7
  def self.first_name
10
- [MALE_FIRST_NAMES, FEMALE_FIRST_NAMES].random.random
8
+ [dictionaries[:male_first_names], dictionaries[:female_first_names]].random.random
11
9
  end
12
10
 
13
11
  def self.full_name
@@ -15,22 +13,22 @@ class NameForgery < Forgery
15
13
  end
16
14
 
17
15
  def self.male_first_name
18
- MALE_FIRST_NAMES.random
16
+ dictionaries[:male_first_names].random
19
17
  end
20
18
 
21
19
  def self.female_first_name
22
- FEMALE_FIRST_NAMES.random
20
+ dictionaries[:female_first_names].random
23
21
  end
24
22
 
25
23
  def self.company_name
26
- COMPANY_NAMES.random
24
+ dictionaries[:company_names].random
27
25
  end
28
26
 
29
27
  def self.title
30
- NAME_TITLES.random
28
+ dictionaries[:name_titles].random
31
29
  end
32
30
 
33
31
  def self.suffix
34
- NAME_SUFFIXES.random
32
+ dictionaries[:name_suffixes].random
35
33
  end
36
34
  end
@@ -1,8 +1,7 @@
1
1
  class PersonalForgery < Forgery
2
- dictionaries :races, :languages, :shirt_sizes, :genders
3
2
 
4
3
  def self.gender
5
- GENDERS.random
4
+ dictionaries[:genders].random
6
5
  end
7
6
 
8
7
  def self.abbreviated_gender
@@ -10,14 +9,14 @@ class PersonalForgery < Forgery
10
9
  end
11
10
 
12
11
  def self.shirt_size
13
- SHIRT_SIZES.random
12
+ dictionaries[:shirt_sizes].random
14
13
  end
15
14
 
16
15
  def self.race
17
- RACES.random
16
+ dictionaries[:races].random
18
17
  end
19
18
 
20
19
  def self.language
21
- LANGUAGES.random
20
+ dictionaries[:languages].random
22
21
  end
23
22
  end
data/lib/forgery.rb CHANGED
@@ -1,73 +1,29 @@
1
- # Require forgeries at the bottom of the file so Forgery works as a gem
1
+ # Require forgeries at the bottom of the file so Forgery works as a gem both
2
+ # within rails and outside of it.
2
3
 
4
+ # Loading forgery helpers.
5
+ require File.expand_path(File.dirname(__FILE__) + '/file_reader')
6
+ require File.expand_path(File.dirname(__FILE__) + '/dictionaries')
7
+ require File.expand_path(File.dirname(__FILE__) + '/formats')
8
+
9
+ # Loading class extensions
3
10
  Dir[File.expand_path(File.dirname(__FILE__) + '/extensions/**/*.rb')].uniq.each do |file|
4
11
  require file
5
12
  end
6
13
 
7
14
  class Forgery
8
- def self.dictionaries(*dictionaries)
9
- dictionaries.each do |dictionary|
10
- const_set(dictionary.to_s.upcase, read_dictionary(dictionary))
11
- end
12
- end
13
-
14
- def self.formats(*formats)
15
- formats.each do |format|
16
- const_set(format.to_s.upcase + "_FORMATS", read_format(format))
17
- end
18
- end
19
-
20
- protected
21
-
22
- def self.read_file(file)
23
- lines = []
24
- IO.foreach(file) do |line|
25
- lines << line.chomp unless line.chomp == ''
26
- end
27
- lines
28
- end
29
-
30
- def self.read_dictionary(dictionary)
31
- read_file(path_to_dictionary(dictionary))
32
- end
33
-
34
- def self.read_format(format)
35
- read_file(path_to_format(format))
36
- end
37
15
 
38
- def self.path_to_format(format)
39
- if external_path_to_format(format) && File.exists?(external_path_to_format(format))
40
- external_path_to_format(format)
41
- else
42
- internal_path_to_format(format)
43
- end
16
+ def self.dictionaries
17
+ @@dictionaries ||= Dictionaries.new
44
18
  end
45
19
 
46
- def self.external_path_to_format(format)
47
- RAILS_ROOT + '/lib/forgery/formats/' + format.to_s if defined?(RAILS_ROOT)
20
+ def self.formats
21
+ @@formats ||= Formats.new
48
22
  end
49
23
 
50
- def self.internal_path_to_format(format)
51
- File.dirname(__FILE__) + '/formats/' + format.to_s
52
- end
53
-
54
- def self.path_to_dictionary(dictionary)
55
- if external_path_to_dictionary(dictionary) && File.exists?(external_path_to_dictionary(dictionary))
56
- external_path_to_dictionary(dictionary)
57
- else
58
- internal_path_to_dictionary(dictionary)
59
- end
60
- end
61
-
62
- def self.external_path_to_dictionary(dictionary)
63
- RAILS_ROOT + '/lib/forgery/dictionaries/' + dictionary.to_s if defined?(RAILS_ROOT)
64
- end
65
-
66
- def self.internal_path_to_dictionary(dictionary)
67
- File.dirname(__FILE__) + '/dictionaries/' + dictionary.to_s
68
- end
69
24
  end
70
25
 
26
+ # Alternate Forgery api, see spec/forgery_spec.rb for examples.
71
27
  def Forgery(forgery, method=nil, *args)
72
28
  klass = "#{forgery.to_s.camelize}Forgery".constantize
73
29
  if method
@@ -77,6 +33,15 @@ def Forgery(forgery, method=nil, *args)
77
33
  end
78
34
  end
79
35
 
36
+ # Loading the other forgeries AFTER the initial Forgery class is defined.
80
37
  Dir[File.expand_path(File.dirname(__FILE__) + '/forgeries/**/*.rb')].uniq.each do |file|
81
38
  require file
82
39
  end
40
+
41
+ # Loading rails forgeries to override current forgery methods and add new
42
+ # forgeries
43
+ if defined?(RAILS_ROOT)
44
+ Dir[File.expand_path(RAILS_ROOT + '/lib/forgery/**/*.rb')].uniq.each do |file|
45
+ require file
46
+ end
47
+ end
data/lib/formats.rb ADDED
@@ -0,0 +1,24 @@
1
+ class Formats
2
+
3
+ def initialize
4
+ @formats = {}
5
+ end
6
+
7
+ def [](key)
8
+ symbolized_key = key.to_sym
9
+ if @formats.has_key?(symbolized_key)
10
+ @formats[symbolized_key]
11
+ else
12
+ @formats[symbolized_key] = FileReader.read_format(symbolized_key)
13
+ end
14
+ end
15
+
16
+ def loaded?(key)
17
+ @formats.has_key?(key.to_sym)
18
+ end
19
+
20
+ def reset!
21
+ @formats = {}
22
+ end
23
+
24
+ end
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Dictionaries do
4
+ it "should check if the dictionary is loaded" do
5
+ dictionaries = Dictionaries.new
6
+
7
+ dictionaries[:colors]
8
+
9
+ dictionaries.should be_loaded(:colors)
10
+ end
11
+
12
+ it "should load a dictionary when called by the key" do
13
+ dictionaries = Dictionaries.new
14
+
15
+ dictionaries.reset!
16
+
17
+ dictionaries.should_not be_loaded(:colors)
18
+
19
+ dictionaries[:colors]
20
+
21
+ dictionaries.should be_loaded(:colors)
22
+ end
23
+
24
+ it "should clear the loaded dictionaries when calling reset!" do
25
+ dictionaries = Dictionaries.new
26
+
27
+ dictionaries[:colors]
28
+
29
+ dictionaries.should be_loaded(:colors)
30
+
31
+ dictionaries.reset!
32
+
33
+ dictionaries.should_not be_loaded(:colors)
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe FileReader do
4
+ it "should return an array when calling read_dictionary" do
5
+ FileReader.read_dictionary(:colors).should be_is_a(Array)
6
+ end
7
+
8
+ it "should return an array when calling read_format" do
9
+ FileReader.read_format(:phone).should be_is_a(Array)
10
+ end
11
+ end
@@ -2,16 +2,16 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe AddressForgery do
4
4
  it "should return a random street" do
5
- AddressForgery::STREETS.should include(AddressForgery.street_name)
5
+ Forgery.dictionaries[:streets].should include(AddressForgery.street_name)
6
6
  end
7
7
 
8
8
  it "should return a random street number" do
9
9
  original_format = AddressForgery.street_number.gsub(/\d/, '#')
10
- AddressForgery::STREET_NUMBER_FORMATS.should include(original_format)
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
- AddressForgery::STREET_SUFFIXES.should include(AddressForgery.street_suffix)
14
+ Forgery.dictionaries[:street_suffixes].should include(AddressForgery.street_suffix)
15
15
  end
16
16
 
17
17
  describe ".street_address" do
@@ -21,49 +21,49 @@ describe AddressForgery do
21
21
 
22
22
  it "should return a random street suffix" do
23
23
  street_suffix = @split_address.pop
24
- AddressForgery::STREET_SUFFIXES.should include(street_suffix)
24
+ Forgery.dictionaries[:street_suffixes].should include(street_suffix)
25
25
  end
26
26
 
27
27
  it "should return a random street number" do
28
28
  street_number_format = @split_address.shift.gsub(/\d/, '#')
29
- AddressForgery::STREET_NUMBER_FORMATS.should include(street_number_format)
29
+ Forgery.formats[:street_number].should include(street_number_format)
30
30
  end
31
31
 
32
32
  it "should return a random street" do
33
33
  @split_address.pop
34
34
  @split_address.shift
35
35
  street = @split_address.join(" ")
36
- AddressForgery::STREETS.should include(street)
36
+ Forgery.dictionaries[:streets].should include(street)
37
37
  end
38
38
  end
39
39
 
40
40
  it "should return a random city" do
41
41
  city = AddressForgery.city
42
- AddressForgery::CITIES.should include(city)
42
+ Forgery.dictionaries[:cities].should include(city)
43
43
  end
44
44
 
45
45
  it "should return a random state" do
46
46
  state = AddressForgery.state
47
- AddressForgery::STATES.should include(state)
47
+ Forgery.dictionaries[:states].should include(state)
48
48
  end
49
49
 
50
50
  it "should return a random state abbreviation" do
51
51
  state_abbrev = AddressForgery.state_abbrev
52
- AddressForgery::STATE_ABBREVS.should include(state_abbrev)
52
+ Forgery.dictionaries[:state_abbrevs].should include(state_abbrev)
53
53
  end
54
54
 
55
55
  it "should return a random country" do
56
56
  country = AddressForgery.country
57
- AddressForgery::COUNTRIES.should include(country)
57
+ Forgery.dictionaries[:countries].should include(country)
58
58
  end
59
59
 
60
60
  it "should return a random zip code" do
61
61
  zip_format = AddressForgery.zip.gsub(/\d/, '#')
62
- AddressForgery::ZIP_FORMATS.should include(zip_format)
62
+ Forgery.formats[:zip].should include(zip_format)
63
63
  end
64
64
 
65
65
  it "should return a random phone number" do
66
66
  phone_format = AddressForgery.phone.gsub(/\d/, '#')
67
- AddressForgery::PHONE_FORMATS.should include(phone_format)
67
+ Forgery.formats[:phone].should include(phone_format)
68
68
  end
69
69
  end
@@ -83,7 +83,7 @@ describe BasicForgery do
83
83
 
84
84
  describe ".color" do
85
85
  it "should return a random color" do
86
- BasicForgery::COLORS.should include(BasicForgery.color)
86
+ Forgery.dictionaries[:colors].should include(BasicForgery.color)
87
87
  end
88
88
  end
89
89
 
@@ -8,23 +8,23 @@ describe InternetForgery do
8
8
  end
9
9
 
10
10
  it "should return a top level domain" do
11
- InternetForgery::TOP_LEVEL_DOMAINS.should include(InternetForgery.top_level_domain)
11
+ Forgery.dictionaries[:top_level_domains].should include(InternetForgery.top_level_domain)
12
12
  end
13
13
 
14
14
  describe ".domain_name" do
15
15
  it "should return a domain name that contains a lowercase company name" do
16
16
  downcase_company_name = InternetForgery.domain_name.split('.').first
17
- InternetForgery::COMPANY_NAMES.any?{ |cn| cn =~ /#{downcase_company_name}/i }
17
+ Forgery.dictionaries[:company_names].any?{ |cn| cn =~ /#{downcase_company_name}/i }
18
18
  end
19
19
 
20
20
  it "should return a domain name that contains a top level domain" do
21
- InternetForgery::TOP_LEVEL_DOMAINS.should include(InternetForgery.domain_name.split('.').last)
21
+ Forgery.dictionaries[:top_level_domains].should include(InternetForgery.domain_name.split('.').last)
22
22
  end
23
23
  end
24
24
 
25
25
  describe ".email_address" do
26
26
  it "should match the email format" do
27
- InternetForgery.email_address.should match(/.+@.+\.(#{InternetForgery::TOP_LEVEL_DOMAINS.join("|")})/)
27
+ InternetForgery.email_address.should match(/.+@.+\.(#{Forgery.dictionaries[:top_level_domains].join("|")})/)
28
28
  end
29
29
  end
30
30
  end
@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
  describe PersonalForgery do
4
4
  describe '.gender' do
5
5
  it 'should return male or female' do
6
- PersonalForgery::GENDERS.should include(PersonalForgery.gender)
6
+ Forgery.dictionaries[:genders].should include(PersonalForgery.gender)
7
7
  end
8
8
  end
9
9
 
10
10
  describe '.shirt_size' do
11
11
  it 'should return a sane size' do
12
- PersonalForgery::SHIRT_SIZES.should include(PersonalForgery.shirt_size)
12
+ Forgery.dictionaries[:shirt_sizes].should include(PersonalForgery.shirt_size)
13
13
  end
14
14
  end
15
15
  end
data/spec/forgery_spec.rb CHANGED
@@ -1,18 +1,24 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  describe Forgery do
4
- it "should define constants for defined dictionaries" do
5
- Forgery.dictionaries :cities, :colors, :countries
6
- Forgery::CITIES.should be_is_a(Array)
7
- Forgery::COLORS.should be_is_a(Array)
8
- Forgery::COUNTRIES.should be_is_a(Array)
4
+ it "should load a dictionary when it is requested" do
5
+ Forgery.dictionaries.reset!
6
+
7
+ Forgery.dictionaries.should_not be_loaded(:colors)
8
+
9
+ Forgery.dictionaries[:colors]
10
+
11
+ Forgery.dictionaries.should be_loaded(:colors)
9
12
  end
10
13
 
11
- it "should define constants for defined formats" do
12
- Forgery.formats :phone, :street_number, :zip
13
- Forgery::PHONE_FORMATS.should be_is_a(Array)
14
- Forgery::STREET_NUMBER_FORMATS.should be_is_a(Array)
15
- Forgery::ZIP_FORMATS.should be_is_a(Array)
14
+ it "should load formats when it is requested" do
15
+ Forgery.formats.reset!
16
+
17
+ Forgery.formats.should_not be_loaded(:phone)
18
+
19
+ Forgery.formats[:phone]
20
+
21
+ Forgery.formats.should be_loaded(:phone)
16
22
  end
17
23
 
18
24
  it "should accept a symbol and return the appropriate forgery class" do
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Formats do
4
+ it "should check if the dictionary is loaded" do
5
+ formats = Formats.new
6
+
7
+ formats[:phone]
8
+
9
+ formats.should be_loaded(:phone)
10
+ end
11
+
12
+ it "should load a dictionary when called by the key" do
13
+ formats = Formats.new
14
+
15
+ formats.reset!
16
+
17
+ formats.should_not be_loaded(:phone)
18
+
19
+ formats[:phone]
20
+
21
+ formats.should be_loaded(:phone)
22
+ end
23
+
24
+ it "should clear the loaded formats when calling reset!" do
25
+ formats = Formats.new
26
+
27
+ formats[:phone]
28
+
29
+ formats.should be_loaded(:phone)
30
+
31
+ formats.reset!
32
+
33
+ formats.should_not be_loaded(:phone)
34
+ end
35
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'spec'
2
2
  require File.dirname(__FILE__) + '/../init'
3
+
3
4
  Spec::Runner.configure do |config|
4
5
 
5
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sevenwire-forgery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Sutton
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-15 00:00:00 -08:00
12
+ date: 2008-11-30 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -48,11 +48,13 @@ files:
48
48
  - lib/dictionaries/street_suffixes
49
49
  - lib/dictionaries/streets
50
50
  - lib/dictionaries/top_level_domains
51
+ - lib/dictionaries.rb
51
52
  - lib/extensions
52
53
  - lib/extensions/array.rb
53
54
  - lib/extensions/hash.rb
54
55
  - lib/extensions/range.rb
55
56
  - lib/extensions/string.rb
57
+ - lib/file_reader.rb
56
58
  - lib/forgeries
57
59
  - lib/forgeries/address_forgery.rb
58
60
  - lib/forgeries/basic_forgery.rb
@@ -66,10 +68,13 @@ files:
66
68
  - lib/formats/phone
67
69
  - lib/formats/street_number
68
70
  - lib/formats/zip
71
+ - lib/formats.rb
72
+ - spec/dictionaries_spec.rb
69
73
  - spec/extensions
70
74
  - spec/extensions/array_spec.rb
71
75
  - spec/extensions/range_spec.rb
72
76
  - spec/extensions/string_spec.rb
77
+ - spec/file_reader_spec.rb
73
78
  - spec/forgeries
74
79
  - spec/forgeries/address_forgery_spec.rb
75
80
  - spec/forgeries/basic_forgery_spec.rb
@@ -79,6 +84,7 @@ files:
79
84
  - spec/forgeries/name_forgery_spec.rb
80
85
  - spec/forgeries/personal_forgery_spec.rb
81
86
  - spec/forgery_spec.rb
87
+ - spec/formats_spec.rb
82
88
  - spec/spec_helper.rb
83
89
  has_rdoc: false
84
90
  homepage: http://github.com/sevenwire/forgery