group_delegator 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "GroupDelegator Set Up" do
4
+ it "loads all requires" do
5
+ expect { SourceGroup }.to_not raise_error
6
+ expect { SourceHelper }.to_not raise_error
7
+ expect { GroupDelegatorInstances }.to_not raise_error
8
+ expect { GroupDelegatorKlasses }.to_not raise_error
9
+ expect { GroupDelegator }.to_not raise_error
10
+ end
11
+ end
12
+
@@ -0,0 +1,259 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ #Source Classes for Testing
4
+ class Base
5
+ class<<self; attr_accessor :my_class_instance_var; end
6
+ @@my_val = nil
7
+
8
+ def self.set_class_method(set_val)
9
+ @@my_val = set_val
10
+ end
11
+
12
+ def self.get_class_method
13
+ @@my_val
14
+ end
15
+
16
+ attr_accessor :my_instance_var, :params, :my_val
17
+
18
+ def initialize(params)
19
+ @params = params
20
+ end
21
+
22
+ def set_instance_method(set_val)
23
+ @my_val = set_val
24
+ end
25
+
26
+ def get_instance_method
27
+ @my_val
28
+ end
29
+ end
30
+
31
+ class A < Base
32
+ def A.unique_result
33
+ :A
34
+ end
35
+
36
+ def a_method_only
37
+ :a
38
+ end
39
+ end
40
+
41
+ class B < Base
42
+ def B.unique_result
43
+ :B
44
+ end
45
+
46
+ def b_method_only
47
+ :b
48
+ end
49
+ end
50
+
51
+ class C < Base
52
+ def C.unique_result
53
+ :C
54
+ end
55
+
56
+ def c_method_only
57
+ :c
58
+ end
59
+ end
60
+
61
+ #Testing SourceGroup
62
+ shared_examples_for "a source group of class level objects" do
63
+ describe "forwarding to source class level objects" do
64
+ it "can set and retrieve class instance variables using forward" do
65
+ expected_result = {A=>:class_iv_var, B=>:class_iv_var, C=>:class_iv_var}
66
+ source_class_group.forward(:my_class_instance_var=, :class_iv_var).should == expected_result
67
+ source_class_group.forward(:my_class_instance_var).should == expected_result
68
+ end
69
+
70
+ it "can send parameters to class methods" do
71
+ expected_result = {A=>"some val", B=>"some val", C=>"some val"}
72
+ source_class_group.forward(:set_class_method, "some val").should == expected_result
73
+ source_class_group.forward(:get_class_method).should == expected_result
74
+ end
75
+
76
+ it "handles different return values " do
77
+ expected_result = {A=>:A, B=>:B, C=>:C}
78
+ source_class_group.forward(:unique_result).should == expected_result
79
+ end
80
+
81
+ it "returns error if no sources have that method" do
82
+ case source_class_group.concurrency_model
83
+ when :iterative
84
+ source_class_group.forward(:foo).should == {}
85
+ when :threaded
86
+ source_class_group.forward(:foo).should == nil
87
+ end
88
+ #expect { source_class_group.forward(:foo) }.to raise_error
89
+ end
90
+ end
91
+ end
92
+
93
+ shared_examples_for "a source group of instance objects" do
94
+ describe "forwarding to source instance objects" do
95
+ it "can set and retrieve instance variables using forward" do
96
+ expected_result = {@a=>:iv_val, @b=>:iv_val, @c=>:iv_val}
97
+ source_class_group.forward(:my_instance_var=, :iv_val).should == expected_result
98
+ source_class_group.forward(:my_instance_var).should == expected_result
99
+ end
100
+
101
+ it "can send parameters to instance methods" do
102
+ expected_result = {@a=>"some inst val", @b=>"some inst val", @c=>"some inst val"}
103
+ source_class_group.forward(:set_instance_method, "some inst val").should == expected_result
104
+ source_class_group.forward(:get_instance_method).should == expected_result
105
+ end
106
+
107
+ it "will return result as long as at least one object has that method" do
108
+ source_class_group.forward(:a_method_only).should == {@a=>:a}
109
+ source_class_group.forward(:c_method_only).should == {@c=>:c}
110
+ end
111
+
112
+ end
113
+ end
114
+
115
+ shared_examples_for "a source group of class level objects; first_response concurrency model" do
116
+ describe "forwarding to source class level objects" do
117
+ it "can set and retrieve class instance variables using forward" do
118
+ expected_result_set = {A=>:class_iv_var, B=>:class_iv_var, C=>:class_iv_var}
119
+ result = source_class_group.forward(:my_class_instance_var=, :class_iv_var)
120
+ result_key = result.keys.first
121
+ expected_result_set.keys.should include result_key
122
+ result.should == {result_key => :class_iv_var}
123
+ end
124
+
125
+ it "can send parameters to class methods" do
126
+ expected_result_set = {A=>"some val", B=>"some val", C=>"some val"}
127
+ result = source_class_group.forward(:set_class_method, "some val")
128
+ result_key = result.keys.first
129
+ expected_result_set.keys.should include result_key
130
+ result.should == {result_key => "some val"}
131
+ end
132
+
133
+ it "can get parameters from class methods" do
134
+ expected_result_set = {A=>"some val", B=>"some val", C=>"some val"}
135
+ result = source_class_group.forward(:get_class_method)
136
+ result_key = result.keys.first
137
+ expected_result_set.keys.should include result_key
138
+ result.should == {result_key => "some val"}
139
+ end
140
+ end
141
+ end
142
+
143
+ shared_examples_for "a source group of instance objects; first_response concurrency model" do
144
+ describe "forwarding to source instance objects" do
145
+ it "can set and retrieve instance variables using forward" do
146
+ expected_result_set = {@a=>:iv_val, @b=>:iv_val, @c=>:iv_val}
147
+ result = source_class_group.forward(:my_instance_var=, :iv_val)
148
+ result_key = result.keys.first
149
+ expected_result_set.keys.should include result_key
150
+ result.should == {result_key => :iv_val}
151
+ end
152
+
153
+ it "can send parameters to instance methods" do
154
+ expected_result_set = {@a=>"some inst val", @b=>"some inst val", @c=>"some inst val"}
155
+ result = source_class_group.forward(:set_instance_method, "some inst val")
156
+ result_key = result.keys.first
157
+ expected_result_set.keys.should include result_key
158
+ result.should == {result_key => "some inst val"}
159
+
160
+ end
161
+
162
+ it "can get parameters to instance methods" do
163
+ expected_result_set = {@a=>"some inst val", @b=>"some inst val", @c=>"some inst val"}
164
+ source_class_group.forward(:set_instance_method, "some inst val")
165
+ result = source_class_group.forward(:get_instance_method)
166
+ result_key = result.keys.first
167
+ expected_result_set.keys.should include result_key
168
+ result.should == {result_key => "some inst val"}
169
+ end
170
+
171
+ it "will return result as long as at least one object has that method" do
172
+ source_class_group.forward(:a_method_only).should == {@a=>:a}
173
+ source_class_group.forward(:c_method_only).should == {@c=>:c}
174
+ end
175
+
176
+ end
177
+ end
178
+
179
+
180
+
181
+ describe "SourceGroup" do
182
+
183
+ describe "initializing class objects as targets" do
184
+ before(:each) do
185
+ @source_class_group = SourceGroup.new([A,B,C])
186
+ end
187
+
188
+ it "should exist" do
189
+ @source_class_group.class.should == SourceGroup
190
+ end
191
+ end
192
+
193
+ describe "source group default concurrency" do
194
+
195
+ before(:each) do
196
+ @a = A.new(:a_param); @b = B.new(:b_param); @c = C.new(:c_param)
197
+ end
198
+
199
+
200
+ it_should_behave_like "a source group of class level objects" do
201
+ let(:source_class_group) { SourceGroup.new([A,B,C]) }
202
+ end
203
+
204
+ it_should_behave_like "a source group of instance objects" do
205
+ let(:source_class_group) { SourceGroup.new([@a,@b,@c]) }
206
+ end
207
+ end
208
+
209
+ describe "source group iterative concurrency" do
210
+
211
+ before(:each) do
212
+ @a = A.new(:a_param); @b = B.new(:b_param); @c = C.new(:c_param)
213
+ end
214
+
215
+ it_should_behave_like "a source group of class level objects" do
216
+ let(:source_class_group) { SourceGroup.new([A,B,C], :iterative) }
217
+ end
218
+
219
+ it_should_behave_like "a source group of instance objects" do
220
+ let(:source_class_group) { SourceGroup.new([@a,@b,@c], :iterative) }
221
+ end
222
+ end
223
+
224
+ describe "source group threaded concurrency" do
225
+
226
+ before(:each) do
227
+ @a = A.new(:a_param); @b = B.new(:b_param); @c = C.new(:c_param)
228
+ end
229
+
230
+ it_should_behave_like "a source group of class level objects" do
231
+ let(:source_class_group) { SourceGroup.new([A,B,C], :threaded) }
232
+ end
233
+
234
+ it_should_behave_like "a source group of instance objects" do
235
+ let(:source_class_group) { SourceGroup.new([@a,@b,@c], :threaded) }
236
+ end
237
+ end
238
+
239
+ describe "source group first response concurrency" do
240
+
241
+ before(:each) do
242
+ @a = A.new(:a_param); @b = B.new(:b_param); @c = C.new(:c_param)
243
+ end
244
+
245
+ it_should_behave_like "a source group of class level objects; first_response concurrency model" do
246
+ let(:source_class_group) { SourceGroup.new([A,B,C], :first_response) }
247
+ end
248
+
249
+ it_should_behave_like "a source group of instance objects; first_response concurrency model" do
250
+ let(:source_class_group) { SourceGroup.new([@a,@b,@c], :first_response) }
251
+ end
252
+ end
253
+
254
+ #TODO Build some timing tests to show benefits of threaded and first response models
255
+ end
256
+
257
+
258
+ #TODO Build Test Classes for the Delegator wrappers
259
+
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'group_delegator'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: group_delegator
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
+ platform: ruby
11
+ authors:
12
+ - Dave M
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-03-09 00:00:00 +00:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 3
30
+ - 0
31
+ version: 2.3.0
32
+ type: :development
33
+ prerelease: false
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: bundler
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 1
44
+ - 0
45
+ - 0
46
+ version: 1.0.0
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: jeweler
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 1
59
+ - 5
60
+ - 2
61
+ version: 1.5.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rcov
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: *id004
78
+ description: A wrapper that allows method calls to multiple objects with various concurrency models
79
+ email: dmarti21@gmail.com
80
+ executables: []
81
+
82
+ extensions: []
83
+
84
+ extra_rdoc_files:
85
+ - LICENSE.txt
86
+ - README.rdoc
87
+ files:
88
+ - .document
89
+ - Gemfile
90
+ - LICENSE.txt
91
+ - README.rdoc
92
+ - Rakefile
93
+ - VERSION
94
+ - examples/compare_to_map.rb
95
+ - examples/diff_w_map.rb
96
+ - examples/find_troublemakers.rb
97
+ - examples/remote_component_update_sim.rb
98
+ - examples/search_examples_with_benchmarks.rb
99
+ - lib/group_delegator.rb
100
+ - lib/group_delegator/group_delegator_instances.rb
101
+ - lib/group_delegator/group_delegator_klasses.rb
102
+ - lib/group_delegator/source_group.rb
103
+ - lib/group_delegator/source_helper.rb
104
+ - spec/group_delegator_instances_spec.rb
105
+ - spec/group_delegator_klasses_spec.rb
106
+ - spec/group_delegator_spec.rb
107
+ - spec/source_group_spec.rb
108
+ - spec/spec_helper.rb
109
+ has_rdoc: true
110
+ homepage: http://github.com/forforf/group_delegator
111
+ licenses:
112
+ - MIT
113
+ post_install_message:
114
+ rdoc_options: []
115
+
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ hash: 284065555
124
+ segments:
125
+ - 0
126
+ version: "0"
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ segments:
133
+ - 0
134
+ version: "0"
135
+ requirements: []
136
+
137
+ rubyforge_project:
138
+ rubygems_version: 1.3.7
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Delegate to multiple objects concurrently
142
+ test_files:
143
+ - examples/compare_to_map.rb
144
+ - examples/diff_w_map.rb
145
+ - examples/find_troublemakers.rb
146
+ - examples/remote_component_update_sim.rb
147
+ - examples/search_examples_with_benchmarks.rb
148
+ - spec/group_delegator_instances_spec.rb
149
+ - spec/group_delegator_klasses_spec.rb
150
+ - spec/group_delegator_spec.rb
151
+ - spec/source_group_spec.rb
152
+ - spec/spec_helper.rb