factory 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/README.rdoc +92 -0
- data/Rakefile +29 -0
- data/factory.gemspec +31 -0
- data/lib/factory.rb +228 -0
- data/lib/factory/version.rb +5 -0
- data/test/helper.rb +32 -0
- data/test/test_factory.rb +235 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: af7197952cadafdfba8350d996ceeb68ac7a36ac
|
4
|
+
data.tar.gz: e8ac58587592718d33024f25f605fe79cae03c7d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 99f06461fb2a002858d3be54f6654f50892e96d2188c7492f0d5c2f91119d42598ac124b15b61bf26a73d8907761508cda7fb32a2cfdeca6ed85d9ced9bcb5d6
|
7
|
+
data.tar.gz: 45b57955dd35837f63a9ba1c4f4ae339ef0a3ee3012937e4398d0401e2ae92c947f98a2abe27e4317f5e6425ee9975a9dce1f168f42253c150ba46e6964b3f6b
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
Welcome to the Factory!
|
2
|
+
|
3
|
+
=Overview
|
4
|
+
|
5
|
+
The Factory mixin provides a robust Factory implementation. Overrides are
|
6
|
+
automatically registered upon sub-classing. Manual override and disables are
|
7
|
+
available if auto-registration does not result in the desired factory overrides.
|
8
|
+
Manual overrides are available at the class and global granularities. Method arguments
|
9
|
+
can be passed in as strings or symbols so that overrides can be set even before classes
|
10
|
+
have been defined.
|
11
|
+
|
12
|
+
=Usage
|
13
|
+
|
14
|
+
==Using the Factory
|
15
|
+
|
16
|
+
The Factory module should be included in the classes which you want to provide factory
|
17
|
+
overrides.
|
18
|
+
class ParentClass
|
19
|
+
include Factory
|
20
|
+
def initialize arg=nil
|
21
|
+
@arg = arg
|
22
|
+
end
|
23
|
+
end
|
24
|
+
Inheriting from this class will automatically register the sub-class as the override
|
25
|
+
of the parent class.
|
26
|
+
class Child1 < ParentClass
|
27
|
+
end
|
28
|
+
Sub-classes need not include +Factory+ though doing so should not hurt anything.
|
29
|
+
The +create+ class method is implemeted by the mixin for the parent class and all
|
30
|
+
sub-classes. Constructor arguments can be passed similarly through +create+.
|
31
|
+
ParentClass.create('hello') # Returns an object of type Child1
|
32
|
+
Subsequent sub-classing updates the factory overrides.
|
33
|
+
class Child2 < Child1
|
34
|
+
end
|
35
|
+
|
36
|
+
ParentClass.create # Returns an object of type Child2
|
37
|
+
Child1.create # Returns an object of type Child2
|
38
|
+
ParentClass.new # Works normally. Returns an object of type ParentClass.
|
39
|
+
|
40
|
+
class Child3 < ParentClass
|
41
|
+
end
|
42
|
+
|
43
|
+
ParentClass.create # Returns an object of type Child3
|
44
|
+
Child1.create # Returns an object of type Child2 since Child3 is not a decendent.
|
45
|
+
|
46
|
+
== Manual Factory Overrides
|
47
|
+
|
48
|
+
If the resulting factory overrides are not what is desired, they can be manually
|
49
|
+
overriden.
|
50
|
+
The methods that are discussed in the section takes arguments which are the class
|
51
|
+
constants
|
52
|
+
Factory.global_disable_override Child3
|
53
|
+
or as a symbol (strings are also accepted).
|
54
|
+
Factory.global_disable_override :Child3
|
55
|
+
This allows overrides to be used even before a class is defined.
|
56
|
+
|
57
|
+
=== Factory Override Disable
|
58
|
+
|
59
|
+
Continuing from the above example +ParentClass+ has a factory override of +Child3+
|
60
|
+
since it was the last sub-class to inherit from it. If the intention is to have
|
61
|
+
+Child2+ be the factory override there are several ways this can be accomplished.
|
62
|
+
To disable a class from overriding a particular class either of the following can
|
63
|
+
be used.
|
64
|
+
Factory.disable_override ParentClass, Child3
|
65
|
+
ParentClass.create # Returns an object of type Child2
|
66
|
+
or,
|
67
|
+
ParentClass.disable_factory_override Child3
|
68
|
+
ParentClass.create # Returns an object of type Child2
|
69
|
+
Since the disable is with respect to a specific ancestor, other ancestors are
|
70
|
+
uneffected.
|
71
|
+
|
72
|
+
=== Factory Override Enable
|
73
|
+
|
74
|
+
Another way of manually configuring overrides is through enabling an override. This
|
75
|
+
can also be used to cancel an existing class specific factory disable override.
|
76
|
+
Factory.enable_override ParentClass, Child3
|
77
|
+
ParentClass.create # Returns an object of type Child3
|
78
|
+
The last override enable takes presedence.
|
79
|
+
Factory.enable_override ParentClass, Child2
|
80
|
+
ParentClass.create # Returns an object of type Child2
|
81
|
+
or,
|
82
|
+
ParentClass.enable_override Child2
|
83
|
+
ParentClass.create # Returns an object of type Child2
|
84
|
+
Subsequent calls of the disable override methods will cancel the previous enable
|
85
|
+
overrides on the same types.
|
86
|
+
|
87
|
+
=== Global Factory Override Methods
|
88
|
+
|
89
|
+
To disable a class from overriding any classes use the following,
|
90
|
+
Factory.global_disable_override Child3
|
91
|
+
To cancel the disable override,
|
92
|
+
Factory.remove_global_disable_override Child3
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rdoc/task'
|
3
|
+
|
4
|
+
#
|
5
|
+
# Rake defined tasks
|
6
|
+
#
|
7
|
+
|
8
|
+
Rake::TestTask.new do |t|
|
9
|
+
t.libs << 'test'
|
10
|
+
t.test_files = FileList['test/test*.rb']
|
11
|
+
# t.verbose = true
|
12
|
+
end
|
13
|
+
|
14
|
+
Rake::RDocTask.new(:rdoc) do |rd|
|
15
|
+
rd.main = "doc/README.rdoc"
|
16
|
+
rd.rdoc_files.include("doc/*.rdoc", "lib/**/*.rb", "bin/*")
|
17
|
+
rd.title = "Factory API"
|
18
|
+
rd.options << "--include=doc"
|
19
|
+
end
|
20
|
+
|
21
|
+
Rake::RDocTask.new(:rdoc_dev) do |rd|
|
22
|
+
rd.main = "doc/README.rdoc"
|
23
|
+
rd.rdoc_files.include("doc/*.rdoc", "lib/**/*.rb", "test/**/*.rb", "bin/*")
|
24
|
+
rd.rdoc_dir = "html_dev"
|
25
|
+
rd.title = "Factory Development API"
|
26
|
+
rd.options << "--all"
|
27
|
+
rd.options << "--include=doc"
|
28
|
+
end
|
29
|
+
|
data/factory.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'factory/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "factory"
|
8
|
+
spec.version = Factory::VERSION
|
9
|
+
spec.authors = ["Ben Delsol"]
|
10
|
+
spec.email = ["ben.delsol@intel.com"]
|
11
|
+
spec.summary = "Provides a simple factory module for object construction."
|
12
|
+
spec.description = ""
|
13
|
+
spec.homepage = ""
|
14
|
+
|
15
|
+
orig = $VERBOSE; $VERBOSE = nil
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
$VERBOSE = orig
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler"
|
23
|
+
spec.add_development_dependency "rake", "0.8.7"
|
24
|
+
spec.add_development_dependency "rdoc"
|
25
|
+
|
26
|
+
spec.extra_rdoc_files = Dir.glob("doc/*.rdoc")
|
27
|
+
spec.has_rdoc = true
|
28
|
+
spec.rdoc_options += ["--title=TestStats API",
|
29
|
+
"--main=README.rdoc", "-f", "hanna"]
|
30
|
+
end
|
31
|
+
|
data/lib/factory.rb
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
|
2
|
+
require 'factory/version'
|
3
|
+
|
4
|
+
# The Factory mixin provides a robust Factory implementation. Overrides are
|
5
|
+
# automatically registered upon sub-classing. Manual override and disables are
|
6
|
+
# available if auto-registration does not result in the desired factory overrides.
|
7
|
+
# Manual overrides are available at the class and global granularities. Method arguments
|
8
|
+
# can be passed in as strings or symbols so that overrides can be set even before
|
9
|
+
# classes have been defined.
|
10
|
+
module Factory
|
11
|
+
|
12
|
+
@override_lists = {}
|
13
|
+
@global_override_disables = []
|
14
|
+
|
15
|
+
# OverrideList is used to keep track of a classes various override settings.
|
16
|
+
class OverrideList #:nodoc:
|
17
|
+
|
18
|
+
attr_reader :class_name, :parent
|
19
|
+
|
20
|
+
def initialize name
|
21
|
+
@class_name = name
|
22
|
+
@parent = nil
|
23
|
+
@sub_class_overrides = []
|
24
|
+
@override_disables = []
|
25
|
+
@manual_overrides =[]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Used to specify the parent class of the class which this OverrideList is for.
|
29
|
+
def parent= class_name
|
30
|
+
if (!@parent.nil? and !class_name.nil?) and (@parent != class_name)
|
31
|
+
raise "parent can be written only once."
|
32
|
+
end
|
33
|
+
@parent ||= class_name
|
34
|
+
end
|
35
|
+
|
36
|
+
# Called by Factory when a registered class is inherited from.
|
37
|
+
def add_inherited_override sub_class
|
38
|
+
@sub_class_overrides << sub_class
|
39
|
+
end
|
40
|
+
|
41
|
+
# Called by Factory when the user is manually overriding factory override
|
42
|
+
# sub-class defaults.
|
43
|
+
def add_override name
|
44
|
+
@manual_overrides << name
|
45
|
+
@override_disables.delete name
|
46
|
+
end
|
47
|
+
|
48
|
+
# Called by Factory when the user is manually overriding factory override
|
49
|
+
# sub-class defaults.
|
50
|
+
def remove_override name
|
51
|
+
@override_disables << name
|
52
|
+
end
|
53
|
+
|
54
|
+
# Calculates and returns the class name as string of the factory override for the
|
55
|
+
# class which this OverrideList is for. Manual and global overrides take
|
56
|
+
# presedence over automatic overrides via inheritance.
|
57
|
+
def get_override
|
58
|
+
overrides = @sub_class_overrides + @manual_overrides
|
59
|
+
while !overrides.empty?
|
60
|
+
override = overrides.pop
|
61
|
+
return override unless @override_disables.include? override or
|
62
|
+
Factory.global_override_disables.include? override
|
63
|
+
end
|
64
|
+
return @class_name
|
65
|
+
end
|
66
|
+
|
67
|
+
# Called during testing.
|
68
|
+
def reset_overrides #:nodoc:
|
69
|
+
@manual_overrides.clear
|
70
|
+
@override_disables.clear
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns a print friendly string which summarizes the factory override
|
74
|
+
# configuration.
|
75
|
+
def to_s
|
76
|
+
<<-TXT
|
77
|
+
Factory Class: #{class_name}
|
78
|
+
Parent: #{parent.nil? ? 'Not in Factory' : parent}
|
79
|
+
Sub-class Overrides: #{@sub_class_overrides.empty? ?
|
80
|
+
'None' : @sub_class_overrides.join(', ')}
|
81
|
+
Manual Overrides: #{@manual_overrides.empty? ?
|
82
|
+
'None' : @manual_overrides.join(', ')}
|
83
|
+
Manual Override Disables: #{@override_disables.empty? ?
|
84
|
+
'None' : @override_disables.join(', ')}
|
85
|
+
Factory Override: #{get_override}
|
86
|
+
TXT
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
########################################
|
92
|
+
# Factory Class Methods
|
93
|
+
########################################
|
94
|
+
|
95
|
+
# Include callback which adds class methods to the including class.
|
96
|
+
def self.included klass #:nodoc:
|
97
|
+
Factory.create_override_list klass
|
98
|
+
klass.extend Factory::ClassMethods
|
99
|
+
end
|
100
|
+
|
101
|
+
# The methods in this module will be added to classes which include Factory as
|
102
|
+
# class methods.
|
103
|
+
module ClassMethods
|
104
|
+
|
105
|
+
# Inheritance callback. Creates an OverrideList and adds sub-class auto-overrides.
|
106
|
+
def inherited sub_class #:nodoc:
|
107
|
+
Factory.create_override_list sub_class, self
|
108
|
+
Factory.inherited_override self, sub_class
|
109
|
+
end
|
110
|
+
|
111
|
+
# Used to create objects of the type registered as the classes factory override.
|
112
|
+
def create *args
|
113
|
+
return Factory[self].new() if args.empty?
|
114
|
+
return Factory[self].new(*args)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Used to manually enable class specific override class.
|
118
|
+
def enable_factory_override overriding_class
|
119
|
+
Factory.enable_override self, overriding_class
|
120
|
+
end
|
121
|
+
|
122
|
+
# Used to manually disable class specific override class.
|
123
|
+
def disable_factory_override overriding_class
|
124
|
+
Factory.disable_override self, overriding_class
|
125
|
+
end
|
126
|
+
|
127
|
+
# Accessor which returns the class which is registered as this classes override.
|
128
|
+
def factory_override
|
129
|
+
Factory[self]
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
########################################
|
135
|
+
# Class Method Mixins
|
136
|
+
########################################
|
137
|
+
|
138
|
+
# Registers a class in the factory by creating it an OverrideList.
|
139
|
+
def self.create_override_list klass, parent=nil #:nodoc:
|
140
|
+
parent = parent.to_s unless parent.nil?
|
141
|
+
@override_lists[klass.to_s] ||= OverrideList.new(klass.to_s)
|
142
|
+
@override_lists[klass.to_s].parent ||= parent
|
143
|
+
return @override_lists[klass.to_s]
|
144
|
+
end
|
145
|
+
|
146
|
+
# Adds inherited overrides up the chain of ancestors.
|
147
|
+
def self.inherited_override parent, sub_class #:nodoc:
|
148
|
+
override_list = @override_lists[parent.to_s]
|
149
|
+
override_list.add_inherited_override sub_class.to_s
|
150
|
+
if override_list.parent
|
151
|
+
Factory.inherited_override override_list.parent, sub_class.to_s
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Returns an OverrideList for +klass+ or creates it if it does not already exist.
|
156
|
+
def self.override_list klass #:nodoc:
|
157
|
+
@override_lists[klass.to_s] ||= Factory.create_override_list(klass.to_s)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Accessor which returns the +@global_override_disables+ array.
|
161
|
+
def self.global_override_disables #:nodoc:
|
162
|
+
@global_override_disables.dup
|
163
|
+
end
|
164
|
+
|
165
|
+
# Used for testing purposes. Resets all manual override arrays.
|
166
|
+
def self.reset_overrides #:nodoc:
|
167
|
+
@global_override_disables.clear
|
168
|
+
@override_lists.each_value do |ovr_list|
|
169
|
+
ovr_list.reset_overrides
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# Used to manually enable class specific override class.
|
174
|
+
def self.enable_override overridden_class, overriding_class
|
175
|
+
Factory.override_list(overridden_class).add_override overriding_class.to_s
|
176
|
+
end
|
177
|
+
|
178
|
+
# Used to manually disable class specific override class.
|
179
|
+
def self.disable_override overridden_class, overriding_class
|
180
|
+
Factory.override_list(overridden_class.to_s).remove_override overriding_class.to_s
|
181
|
+
end
|
182
|
+
|
183
|
+
# Used to manually disable a class from overriding any ancestors.
|
184
|
+
def self.global_disable_override overriding_class
|
185
|
+
@global_override_disables << overriding_class.to_s
|
186
|
+
end
|
187
|
+
|
188
|
+
# Used to cancel a previous +global_disable_override+.
|
189
|
+
def self.remove_global_disable_override overriding_class
|
190
|
+
@global_override_disables.delete overriding_class.to_s
|
191
|
+
end
|
192
|
+
|
193
|
+
# Accessor which returns the factory override of +base_class+.
|
194
|
+
def self.[] base_class
|
195
|
+
if @override_lists[base_class.to_s].nil?
|
196
|
+
raise "class called #{base_class} is not registered with the factory."
|
197
|
+
end
|
198
|
+
eval @override_lists[base_class.to_s].get_override
|
199
|
+
end
|
200
|
+
|
201
|
+
# Prints a summary of the Factory override configuration. Returns the summary as
|
202
|
+
# a string. The summary will not be printed if +silent+ is true.
|
203
|
+
def self.print_overrides silent=false
|
204
|
+
s = <<-TXT
|
205
|
+
********************************
|
206
|
+
Factory Overrides
|
207
|
+
********************************
|
208
|
+
|
209
|
+
Global Factory Override Disables: #{@global_override_disables.empty? ?
|
210
|
+
'None' : @global_override_disables.join(', ')}
|
211
|
+
|
212
|
+
TXT
|
213
|
+
|
214
|
+
@override_lists.each_value {|ovr_list| s += ovr_list.to_s }
|
215
|
+
puts s unless silent
|
216
|
+
|
217
|
+
return s
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
########################################
|
222
|
+
# Instance Method Mixins
|
223
|
+
########################################
|
224
|
+
|
225
|
+
# None.
|
226
|
+
|
227
|
+
end
|
228
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
require 'factory'
|
5
|
+
|
6
|
+
Factory.enable_override :Base, :C3
|
7
|
+
Factory.global_disable_override :C4
|
8
|
+
class Base
|
9
|
+
include Factory
|
10
|
+
attr_reader :arg
|
11
|
+
def initialize arg=nil
|
12
|
+
@arg = arg
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class C1 < Base
|
17
|
+
include Factory # Not needed but shouldn't hurt anything
|
18
|
+
end
|
19
|
+
C1.disable_factory_override :C5
|
20
|
+
class C2 < Base
|
21
|
+
end
|
22
|
+
class C3 < C1
|
23
|
+
end
|
24
|
+
class C4 < C2
|
25
|
+
end
|
26
|
+
class C5 < C1
|
27
|
+
end
|
28
|
+
Array.class_eval do
|
29
|
+
include Factory
|
30
|
+
end
|
31
|
+
class Array2 < Array
|
32
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
|
2
|
+
require 'helper'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class FactoryTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_factory01_pre_class_definition_overrides
|
8
|
+
|
9
|
+
assert_equal C3, Base.create.class
|
10
|
+
assert_equal C3, Factory[Base]
|
11
|
+
assert_equal C3, Base.factory_override
|
12
|
+
|
13
|
+
assert_equal C2, C2.create.class
|
14
|
+
assert_equal C2, Factory[C2]
|
15
|
+
assert_equal C2, C2.factory_override
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_factory02_check_inherited_overrides
|
20
|
+
|
21
|
+
assert_equal C3, C1.create.class
|
22
|
+
assert_equal C3, Factory[C1]
|
23
|
+
assert_equal C3, C1.factory_override
|
24
|
+
|
25
|
+
assert_equal C3, C3.create.class
|
26
|
+
assert_equal C3, Factory[C3]
|
27
|
+
assert_equal C3, C3.factory_override
|
28
|
+
|
29
|
+
assert_equal Array2, Array.create.class
|
30
|
+
assert_equal Array2, Factory[Array]
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_factory03_enable_disable_factory_overrides
|
35
|
+
Factory.reset_overrides
|
36
|
+
|
37
|
+
# def enable_factory_override overriding_class
|
38
|
+
# Factory.enable_override self, overriding_class
|
39
|
+
# end
|
40
|
+
|
41
|
+
# def disable_factory_override overriding_class
|
42
|
+
# Factory.disable_override self, overriding_class
|
43
|
+
# end
|
44
|
+
|
45
|
+
C1.enable_factory_override C3
|
46
|
+
|
47
|
+
assert_equal C5, Base.create.class
|
48
|
+
assert_equal C5, Factory[Base]
|
49
|
+
assert_equal C5, Base.factory_override
|
50
|
+
assert_equal C3, C1.create.class
|
51
|
+
assert_equal C3, Factory[C1]
|
52
|
+
assert_equal C3, C1.factory_override
|
53
|
+
assert_equal C3, C3.create.class
|
54
|
+
assert_equal C3, Factory[C3]
|
55
|
+
assert_equal C3, C3.factory_override
|
56
|
+
assert_equal C5, C5.create.class
|
57
|
+
assert_equal C5, Factory[C5]
|
58
|
+
assert_equal C5, C5.factory_override
|
59
|
+
|
60
|
+
C1.disable_factory_override C3
|
61
|
+
Factory.disable_override :C1, C5
|
62
|
+
C2.disable_factory_override :C4
|
63
|
+
|
64
|
+
assert_equal C5, Base.create.class
|
65
|
+
assert_equal C5, Factory[Base]
|
66
|
+
assert_equal C5, Base.factory_override
|
67
|
+
assert_equal C1, C1.create.class
|
68
|
+
assert_equal C1, Factory[C1]
|
69
|
+
assert_equal C1, C1.factory_override
|
70
|
+
assert_equal C3, C3.create.class
|
71
|
+
assert_equal C3, Factory[C3]
|
72
|
+
assert_equal C3, C3.factory_override
|
73
|
+
assert_equal C5, C5.create.class
|
74
|
+
assert_equal C5, Factory[C5]
|
75
|
+
assert_equal C5, C5.factory_override
|
76
|
+
assert_equal C2, C2.create.class
|
77
|
+
assert_equal C2, Factory[C2]
|
78
|
+
assert_equal C2, C2.factory_override
|
79
|
+
|
80
|
+
Factory.enable_override :Base, C1
|
81
|
+
C3.enable_factory_override :C5
|
82
|
+
Factory.enable_override "C1", "C3"
|
83
|
+
|
84
|
+
assert_equal C1, Base.create.class
|
85
|
+
assert_equal C1, Factory[Base]
|
86
|
+
assert_equal C1, Base.factory_override
|
87
|
+
assert_equal C3, C1.create.class
|
88
|
+
assert_equal C3, Factory[C1]
|
89
|
+
assert_equal C3, C1.factory_override
|
90
|
+
assert_equal C5, C3.create.class
|
91
|
+
assert_equal C5, Factory[C3]
|
92
|
+
assert_equal C5, C3.factory_override
|
93
|
+
assert_equal C5, C5.create.class
|
94
|
+
assert_equal C5, Factory[C5]
|
95
|
+
assert_equal C5, C5.factory_override
|
96
|
+
|
97
|
+
Factory.disable_override :Array, Array2
|
98
|
+
|
99
|
+
assert_equal Array, Array.create.class
|
100
|
+
assert_equal Array, Factory[Array]
|
101
|
+
|
102
|
+
Array.enable_factory_override Array2
|
103
|
+
|
104
|
+
assert_equal Array2, Array.create.class
|
105
|
+
assert_equal Array2, Factory[Array]
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_factory05_global_disable_override_and_remove_global_disable_override
|
110
|
+
Factory.reset_overrides
|
111
|
+
|
112
|
+
Factory.global_disable_override :C4
|
113
|
+
Factory.global_disable_override C5
|
114
|
+
|
115
|
+
assert_equal C3, Base.create.class
|
116
|
+
assert_equal C3, Factory[Base]
|
117
|
+
assert_equal C3, Base.factory_override
|
118
|
+
assert_equal C3, C1.create.class
|
119
|
+
assert_equal C3, Factory[C1]
|
120
|
+
assert_equal C3, C1.factory_override
|
121
|
+
assert_equal C3, C3.create.class
|
122
|
+
assert_equal C3, Factory[C3]
|
123
|
+
assert_equal C3, C3.factory_override
|
124
|
+
assert_equal C5, C5.create.class
|
125
|
+
assert_equal C5, Factory[C5]
|
126
|
+
assert_equal C5, C5.factory_override
|
127
|
+
assert_equal C2, C2.create.class
|
128
|
+
assert_equal C2, Factory[C2]
|
129
|
+
assert_equal C2, C2.factory_override
|
130
|
+
assert_equal C4, C4.create.class
|
131
|
+
assert_equal C4, Factory[C4]
|
132
|
+
assert_equal C4, C4.factory_override
|
133
|
+
|
134
|
+
Factory.remove_global_disable_override C4
|
135
|
+
|
136
|
+
assert_equal C4, Base.create.class
|
137
|
+
assert_equal C4, Factory[Base]
|
138
|
+
assert_equal C4, Base.factory_override
|
139
|
+
assert_equal C3, C1.create.class
|
140
|
+
assert_equal C3, Factory[C1]
|
141
|
+
assert_equal C3, C1.factory_override
|
142
|
+
assert_equal C3, C3.create.class
|
143
|
+
assert_equal C3, Factory[C3]
|
144
|
+
assert_equal C3, C3.factory_override
|
145
|
+
assert_equal C5, C5.create.class
|
146
|
+
assert_equal C5, Factory[C5]
|
147
|
+
assert_equal C5, C5.factory_override
|
148
|
+
assert_equal C4, C2.create.class
|
149
|
+
assert_equal C4, Factory[C2]
|
150
|
+
assert_equal C4, C2.factory_override
|
151
|
+
assert_equal C4, C4.create.class
|
152
|
+
assert_equal C4, Factory[C4]
|
153
|
+
assert_equal C4, C4.factory_override
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_factory06_create_args
|
158
|
+
Factory.reset_overrides
|
159
|
+
o = C1.create('hello')
|
160
|
+
assert_equal C5, o.class
|
161
|
+
assert_equal 'hello', o.arg
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_factory07_print_overrides
|
165
|
+
|
166
|
+
Factory.reset_overrides
|
167
|
+
|
168
|
+
# One of each type of instance variable set
|
169
|
+
Factory.global_disable_override :C4
|
170
|
+
C1.enable_factory_override C3
|
171
|
+
Factory.disable_override :Array, Array2
|
172
|
+
|
173
|
+
expected_string = <<-TXT
|
174
|
+
********************************
|
175
|
+
Factory Overrides
|
176
|
+
********************************
|
177
|
+
|
178
|
+
Global Factory Override Disables: C4
|
179
|
+
|
180
|
+
Factory Class: Base
|
181
|
+
Parent: Not in Factory
|
182
|
+
Sub-class Overrides: C1, C2, C3, C4, C5
|
183
|
+
Manual Overrides: None
|
184
|
+
Manual Override Disables: None
|
185
|
+
Factory Override: C5
|
186
|
+
Factory Class: C1
|
187
|
+
Parent: Base
|
188
|
+
Sub-class Overrides: C3, C5
|
189
|
+
Manual Overrides: C3
|
190
|
+
Manual Override Disables: None
|
191
|
+
Factory Override: C3
|
192
|
+
Factory Class: C2
|
193
|
+
Parent: Base
|
194
|
+
Sub-class Overrides: C4
|
195
|
+
Manual Overrides: None
|
196
|
+
Manual Override Disables: None
|
197
|
+
Factory Override: C2
|
198
|
+
Factory Class: C3
|
199
|
+
Parent: C1
|
200
|
+
Sub-class Overrides: None
|
201
|
+
Manual Overrides: None
|
202
|
+
Manual Override Disables: None
|
203
|
+
Factory Override: C3
|
204
|
+
Factory Class: C4
|
205
|
+
Parent: C2
|
206
|
+
Sub-class Overrides: None
|
207
|
+
Manual Overrides: None
|
208
|
+
Manual Override Disables: None
|
209
|
+
Factory Override: C4
|
210
|
+
Factory Class: C5
|
211
|
+
Parent: C1
|
212
|
+
Sub-class Overrides: None
|
213
|
+
Manual Overrides: None
|
214
|
+
Manual Override Disables: None
|
215
|
+
Factory Override: C5
|
216
|
+
Factory Class: Array
|
217
|
+
Parent: Not in Factory
|
218
|
+
Sub-class Overrides: Array2
|
219
|
+
Manual Overrides: None
|
220
|
+
Manual Override Disables: Array2
|
221
|
+
Factory Override: Array
|
222
|
+
Factory Class: Array2
|
223
|
+
Parent: Array
|
224
|
+
Sub-class Overrides: None
|
225
|
+
Manual Overrides: None
|
226
|
+
Manual Override Disables: None
|
227
|
+
Factory Override: Array2
|
228
|
+
TXT
|
229
|
+
|
230
|
+
assert_equal expected_string, Factory.print_overrides(true)
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: factory
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Delsol
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.7
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.7
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rdoc
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: ''
|
56
|
+
email:
|
57
|
+
- ben.delsol@intel.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- README.rdoc
|
65
|
+
- Rakefile
|
66
|
+
- factory.gemspec
|
67
|
+
- lib/factory.rb
|
68
|
+
- lib/factory/version.rb
|
69
|
+
- test/helper.rb
|
70
|
+
- test/test_factory.rb
|
71
|
+
homepage: ''
|
72
|
+
licenses: []
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options:
|
76
|
+
- --title=TestStats API
|
77
|
+
- --main=README.rdoc
|
78
|
+
- -f
|
79
|
+
- hanna
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.0.2
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Provides a simple factory module for object construction.
|
98
|
+
test_files:
|
99
|
+
- test/helper.rb
|
100
|
+
- test/test_factory.rb
|