factory 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|