sevenwire-forgery 0.1.0 → 0.2.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/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