arrayfu 0.0.2

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/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg
2
+ .bundle
3
+ Gemfile.lock
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.9.3@arrayfu --create
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/specs/.+_spec\.rb$})
3
+ watch(%r{^lib/developwithpassion_expander/(.+)\.rb$}) { |m| "spec/specs/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/arrayfu.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib",__FILE__)
3
+ require "core/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "arrayfu"
7
+ s.version = ArrayFu::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Develop With Passion®"]
10
+ s.email = ["open_source@developwithpassion.com"]
11
+ s.homepage = "http://www.developwithpassion.com"
12
+ s.summary = %q{Simple DSL For Declaritive Arrays}
13
+ s.description = %q{Simple DSL For Declaritive Arrays}
14
+ s.rubyforge_project = "arrayfu"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "guard"
24
+ s.add_development_dependency "guard-rspec"
25
+ s.add_development_dependency "fakes-rspec"
26
+ end
data/bin/dwp_expand ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'developwithpassion_expander'
4
+ DevelopWithPassion::Expander::CLIInterface.new.run(ARGV)
data/lib/arrayfu.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'core/add_criterion'
2
+ require 'core/dsl'
3
+ require 'core/module_registry'
4
+ require 'core/mutator_detail'
5
+ require 'core/mutator_step'
6
+ require 'core/object_extensions'
7
+ require 'core/readable_step'
8
+ require 'core/visitor_detail'
9
+ require 'core/visitor_detail_step'
10
+ require 'core/writeable_step'
@@ -0,0 +1,16 @@
1
+ module ArrayFu
2
+ class AddCriterion
3
+ attr_accessor :criteria,:failure_strategy
4
+
5
+ def initialize(criteria,failure_strategy)
6
+ @criteria = criteria
7
+ @failure_strategy = failure_strategy
8
+ end
9
+
10
+ def apply_to(value)
11
+ result = @criteria.is_satisfied_by(value)
12
+ @failure_strategy.run(@criteria.name,value) unless result
13
+ return result
14
+ end
15
+ end
16
+ end
data/lib/core/dsl.rb ADDED
@@ -0,0 +1,36 @@
1
+ module ArrayFu
2
+ class Dsl
3
+ attr_accessor :mutators,:visitors,:criteria,:name,:writable,:readable
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ initialize_arrays :mutators,:visitors,:criteria
8
+ initialize_false :writable,:readable
9
+ end
10
+
11
+ def mutator(*names,&block)
12
+ names.each{|name| @mutators.push(MutatorDetail.new(name,block))}
13
+ end
14
+
15
+ def new_item_must(criteria,fail_option)
16
+ @criteria.push(AddCriterion.new(criteria,fail_option))
17
+ end
18
+
19
+ def process_using(name,visitor)
20
+ @visitors.push(VisitorDetail.new(name,visitor))
21
+ end
22
+
23
+ def read_and_write
24
+ writable
25
+ readable
26
+ end
27
+
28
+ def writable
29
+ @writable = true
30
+ end
31
+
32
+ def readable
33
+ @readable = true
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ module ArrayFu
2
+ class ModuleRegistry
3
+ def self.all_modules
4
+ return [
5
+ MutatorStep.new,
6
+ VisitorDetailStep.new,
7
+ WriteableStep.new,
8
+ ReadableStep.new
9
+ ]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module ArrayFu
2
+ class MutatorDetail
3
+ attr_accessor :name,:block
4
+
5
+ def initialize(name,block)
6
+ @name = name
7
+ @block = block
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ module ArrayFu
2
+ class MutatorStep
3
+ def run_using(builder)
4
+ Module.new do
5
+ builder.mutators.each do|mutator|
6
+ define_method(mutator.name) do|value|
7
+ array_var = instance_variable_get("@#{builder.name}")
8
+ continue_add = true
9
+ builder.criteria.each{|criteria| continue_add &= criteria.apply_to(value)}
10
+ return unless continue_add
11
+ array_var.push(value) unless mutator.block
12
+ mutator.block.call(value) if mutator.block
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ class Object
2
+ def initialize_defaults(factory,*items)
3
+ items.each do|item|
4
+ instance_variable_set("@#{item}",factory.call)
5
+ end
6
+ end
7
+
8
+ def initialize_arrays(*items)
9
+ initialize_defaults(lambda{[]},*items)
10
+ end
11
+
12
+ def initialize_hashes(*items)
13
+ initialize_defaults(lambda{{}},*items)
14
+ end
15
+
16
+ def initialize_false(*items)
17
+ initialize_defaults(lambda{false},*items)
18
+ end
19
+
20
+ def array(name,&block)
21
+ initialize_arrays(name)
22
+ dsl = DevelopWithPassion::Arrays::Dsl.new(name)
23
+ yield dsl if block_given?
24
+ DevelopWithPassion::Arrays::ModuleRegistry.all_modules.each{|module_factory| self.extend(module_factory.run_using(dsl))}
25
+ end
26
+
27
+ end
@@ -0,0 +1,13 @@
1
+ module ArrayFu
2
+ class ReadableStep
3
+ def run_using(builder)
4
+ Module.new do
5
+ if (builder.readable)
6
+ define_method(builder.name) do
7
+ return instance_variable_get("@#{builder.name}")
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module ArrayFu
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,10 @@
1
+ module ArrayFu
2
+ class VisitorDetail
3
+ attr_accessor :name,:visitor
4
+
5
+ def initialize(name,visitor)
6
+ @name = name
7
+ @visitor = visitor
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module ArrayFu
2
+ class VisitorDetailStep
3
+ def run_using(builder)
4
+ Module.new do
5
+ builder.visitors.each do|visitor|
6
+ define_method(visitor.name) do
7
+ array_var = instance_variable_get("@#{builder.name}")
8
+ array_var.each{|item| visitor.visitor.respond_to?(:run_using) ? visitor.visitor.run_using(item) : item.send(visitor.visitor)}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module ArrayFu
2
+ class WriteableStep
3
+ def run_using(builder)
4
+ Module.new do
5
+ if (builder.writable)
6
+ define_method("#{builder.name}=") do|value|
7
+ instance_variable_set("@#{builder.name}",value)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require 'fileutils'
2
+ require 'fakes-rspec'
3
+ require 'singleton'
4
+
5
+ Dir.chdir(File.join(File.dirname(__FILE__),"..,lib".split(','))) do
6
+ require 'arrayfu.rb'
7
+ end
8
+
9
+ def catch_exception
10
+ begin
11
+ yield
12
+ rescue Exception => e
13
+ exception = e
14
+ end
15
+ exception
16
+ end
17
+
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe AddCriterion do
5
+ context "when applied to a value" do
6
+ let(:failure_strategy){fake}
7
+ let(:criteria){fake}
8
+ let(:value){42}
9
+ let(:name){"Name of criteria"}
10
+ let(:sut){AddCriterion.new(criteria,failure_strategy)}
11
+
12
+ context "and the value does not match the criteria" do
13
+ before (:each) do
14
+ criteria.stub(:is_satisfied_by).with(value).and_return(false)
15
+ criteria.stub(:name).and_return(name)
16
+ end
17
+ before (:each) do
18
+ sut.apply_to(value)
19
+ end
20
+ it "should run the failure strategy with the correct information" do
21
+ failure_strategy.should have_received(:run,name,value)
22
+ end
23
+ end
24
+
25
+ context "and the value matches the criteria" do
26
+ before (:each) do
27
+ criteria.stub(:is_satisfied_by).with(value).and_return(true)
28
+ criteria.stub(:name).and_return(name)
29
+ end
30
+ before (:each) do
31
+ @result = sut.apply_to(value)
32
+ end
33
+ it "should not use the failure strategy" do
34
+ failure_strategy.should_not have_received(:run)
35
+ end
36
+ it "should return true" do
37
+ @result.should be_true
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,284 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe Dsl do
5
+ context "when a criteria is specified" do
6
+ let(:fail_option){fake}
7
+ let(:real_criteria){fake}
8
+ let(:criteria){fake}
9
+ let(:sut){Dsl.new(:name)}
10
+ before (:each) do
11
+ AddCriterion.stub(:new).with(real_criteria,fail_option).and_return(criteria)
12
+ end
13
+ before (:each) do
14
+ sut.new_item_must(real_criteria,fail_option)
15
+ end
16
+ it "should be added to the list of add specifications for the array" do
17
+ sut.criteria[0].should == criteria
18
+ end
19
+ end
20
+ context "when specifying mutators" do
21
+ context "and a singular mutator is specified" do
22
+ let(:mutator){fake}
23
+ let(:name){"sdfsdf"}
24
+ let(:sut){Dsl.new("sdf")}
25
+ before (:each) do
26
+ MutatorDetail.stub(:new).with(name,nil).and_return(mutator)
27
+ end
28
+ before (:each) do
29
+ sut.mutator(name)
30
+ end
31
+ it "should be added to the list of mutators for the list" do
32
+ sut.mutators[0].should == mutator
33
+ end
34
+ end
35
+ context "and a set of mutators are specified" do
36
+ let(:mutator){fake}
37
+ let(:sut){Dsl.new("sdf")}
38
+ before (:each) do
39
+ MutatorDetail.stub(:new).with(:sdf,nil).and_return(mutator)
40
+ MutatorDetail.stub(:new).with(:other,nil).and_return(mutator)
41
+ end
42
+ before (:each) do
43
+ sut.mutator(:sdf,:other)
44
+ end
45
+ it "should add a new mutator for each name specified" do
46
+ sut.mutators.count.should == 2
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when a visitor is specified" do
52
+ let(:visitor){fake}
53
+ let(:the_visitor){fake}
54
+ let(:name){"sdfsdf"}
55
+ let(:sut){Dsl.new("sdf")}
56
+ before (:each) do
57
+ VisitorDetail.stub(:new).with(name,the_visitor).and_return(visitor)
58
+ end
59
+ before (:each) do
60
+ sut.process_using(name,the_visitor)
61
+ end
62
+ it "should be added to the list of visitors for the list" do
63
+ sut.visitors[0].should == visitor
64
+ end
65
+ end
66
+
67
+ context "using the dsl" do
68
+ it "should be able to initialize all arrays specified on the instance and provide a method to expose addition" do
69
+ class Item
70
+
71
+ def initialize
72
+ array :kids do|a|
73
+ a.mutator :register_child
74
+ end
75
+ end
76
+ end
77
+
78
+ item = Item.new
79
+ item.methods.include?(:register_child).should be_true
80
+ item.register_child("hello")
81
+ item.kids.count.should == 1
82
+ end
83
+ it "should be able to expose a mutator with custom logic" do
84
+ class Item
85
+ attr_accessor :added,:item_added
86
+
87
+ def initialize
88
+ @added = 0
89
+
90
+ array :kids do|a|
91
+ a.mutator :register_child do|the_item|
92
+ @item_added = the_item
93
+ @added +=1
94
+ @kids.push(the_item)
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ item = Item.new
101
+ item.register_child("hello")
102
+ item.kids.count.should == 1
103
+ item.item_added.should == "hello"
104
+ item.added.should == 1
105
+ end
106
+
107
+ it "should be able to expose a processing visitor" do
108
+ class Item
109
+ attr_accessor :added
110
+
111
+ def initialize(visitor)
112
+ @added = 0
113
+ array :kids do|a|
114
+ a.mutator :register_child
115
+ a.process_using :register_kids,visitor
116
+ end
117
+ end
118
+ end
119
+
120
+ class OurVisitor
121
+ attr_accessor :items
122
+ def initialize
123
+ @items = 0
124
+ end
125
+ def run_using(item)
126
+ @items +=1
127
+ end
128
+ end
129
+
130
+ our_visitor = OurVisitor.new
131
+ item = Item.new(our_visitor)
132
+ item.register_child("hello")
133
+ item.kids.count.should == 1
134
+ item.register_kids
135
+ our_visitor.items.should == 1
136
+ end
137
+
138
+ it "should be able to expose a processing visitor by symbol" do
139
+ class Item
140
+ attr_accessor :added
141
+
142
+ def initialize
143
+ @added = 0
144
+ array :kids do|a|
145
+ a.mutator :register_child
146
+ a.process_using :register_kids,:speak
147
+ end
148
+ end
149
+ end
150
+
151
+ class Kid
152
+ def initialize(array)
153
+ @array = array
154
+ end
155
+ def speak
156
+ @array.push("spoke")
157
+ end
158
+ end
159
+
160
+ items = []
161
+ item = Item.new
162
+ item.register_child(Kid.new(items))
163
+ item.kids.count.should == 1
164
+ item.register_kids
165
+ items.count.should == 1
166
+ end
167
+ end
168
+
169
+ context "when specifying a mutator" do
170
+ context "and no block is provided" do
171
+ it "should expose the specified method to trigger addition" do
172
+ class Item
173
+
174
+ def initialize
175
+ array :kids do|a|
176
+ a.mutator :register_child
177
+ end
178
+ end
179
+ end
180
+
181
+ item = Item.new
182
+ item.methods.include?(:register_child).should be_true
183
+ item.register_child("hello")
184
+ item.kids.count.should == 1
185
+ end
186
+ end
187
+
188
+ context "and a block is provided" do
189
+ it "should provide a method that delegates to the block when invoked" do
190
+ class Item
191
+ attr_accessor :added
192
+
193
+ def initialize
194
+ @added = 0
195
+
196
+ array :kids do|a|
197
+ a.mutator :register_child do|item|
198
+ @kids.push(item)
199
+ @added+=1
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ item = Item.new
206
+ item.register_child("hello")
207
+ item.kids.count.should == 1
208
+ item.added.should == 1
209
+ end
210
+ end
211
+
212
+
213
+ context "when criterias have been specified on the array" do
214
+ class BeGreaterThanZero
215
+ def name
216
+ return "Be greater than 0"
217
+ end
218
+ def is_satisfied_by(item)
219
+ return item > 0
220
+ end
221
+ end
222
+ context "and the criteria is not met" do
223
+ context "and the failure strategy is set to raise an error" do
224
+ class RaiseCriteriaFailure
225
+ def run(name,value)
226
+ raise "The value #{value} does not meet the criteria #{name}"
227
+ end
228
+ end
229
+ class OneClass
230
+ def initialize
231
+ array :items do|a|
232
+ a.mutator :add_item,:add_this,:add_that
233
+ a.new_item_must BeGreaterThanZero.new, RaiseCriteriaFailure.new
234
+ end
235
+ end
236
+ end
237
+ let(:target){OneClass.new}
238
+ before (:each) do
239
+ @exception = catch_exception do
240
+ target.add_item(0)
241
+ end
242
+ end
243
+
244
+ it "should raise an error when a failed add is attempted" do
245
+ (@exception.message =~ /does not meet/).should be_true
246
+ end
247
+ it "should not add the item to the underlying list" do
248
+ target.items.count.should == 0
249
+ end
250
+ end
251
+
252
+ context "and the failure strategy is not set to raise an error" do
253
+ class DisplayCriteriaFailure
254
+ include Singleton
255
+ attr_accessor :message
256
+ def run(name,value)
257
+ @message = "The value #{value} does not meet the criteria #{name}"
258
+ end
259
+ end
260
+ class AnotherClass
261
+ def initialize
262
+ array :items do|a|
263
+ a.mutator :add_item,:add_this,:add_that
264
+ a.new_item_must BeGreaterThanZero.new, DisplayCriteriaFailure.instance
265
+ end
266
+ end
267
+ end
268
+ let(:target){AnotherClass.new}
269
+ before (:each) do
270
+ target.add_item(0)
271
+ end
272
+ it "should have leveraged the failure strategy that does not throw an exception" do
273
+ DisplayCriteriaFailure.instance.message.should_not be_nil
274
+ end
275
+
276
+ it "should not add the item to the underlying list" do
277
+ target.items.count.should == 0
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe MutatorStep do
5
+ context "when run" do
6
+ let(:numbers){[]}
7
+ let(:target){Sample.new(numbers)}
8
+ let(:mutators){[]}
9
+ let(:sut){MutatorStep.new}
10
+ let(:builder){Dsl.new(:numbers)}
11
+
12
+ context "using a dsl fragment that contains no block usage" do
13
+ before (:each) do
14
+ builder.mutator(:add_a_number)
15
+ end
16
+ before (:each) do
17
+ target.extend(sut.run_using(builder))
18
+ end
19
+ it "should create a member on the target that allows mutation of the original list" do
20
+ target.respond_to?(:add_a_number).should be_true
21
+ target.add_a_number(2)
22
+ numbers[0].should == 2
23
+ end
24
+ end
25
+ context "using a dsl fragment that contains block usage" do
26
+ before (:each) do
27
+ builder.mutator(:add_a_number) do|value|
28
+ @value_attempted_to_be_added = value
29
+ end
30
+ end
31
+ before (:each) do
32
+ target.extend(sut.run_using(builder))
33
+ end
34
+ it "should create a member on the target that intercepts mutation using the provided block" do
35
+ target.respond_to?(:add_a_number).should be_true
36
+ target.add_a_number(2)
37
+ numbers.count.should == 0
38
+ @value_attempted_to_be_added.should == 2
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Object do
4
+ context "when initializing fields with defaults" do
5
+ it "should initialize based on the factory provided" do
6
+ class Item
7
+ attr_accessor :kids,:cars,:name
8
+
9
+ def initialize
10
+ initialize_defaults lambda{[]},:kids,:cars
11
+ initialize_defaults lambda{""},:name
12
+ end
13
+ end
14
+
15
+ item = Item.new
16
+ [item.kids,item.cars].each{|value| value.class.should == Array}
17
+ item.name.class.should == String
18
+ end
19
+ end
20
+
21
+ context "when initializing simple arrays" do
22
+ it "should initialize all arrays specified on the instance" do
23
+ class Item
24
+ attr_accessor :kids,:cars,:bikes
25
+
26
+ def initialize
27
+ initialize_arrays :kids,:cars,:bikes
28
+ end
29
+ end
30
+
31
+ item = Item.new
32
+ [item.kids,item.cars,item.bikes].each do|value|
33
+ value.class.should == Array
34
+ end
35
+ end
36
+ end
37
+
38
+ context "when initializing hashes" do
39
+ it "should initialize all hashes specified" do
40
+ class Item
41
+ attr_accessor :kids,:cars,:bikes
42
+
43
+ def initialize
44
+ initialize_hashes :kids,:cars,:bikes
45
+ end
46
+ end
47
+
48
+ item = Item.new
49
+ [item.kids,item.cars,item.bikes].each do|value|
50
+ value.class.should == Hash
51
+ end
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe ReadableStep do
5
+ context "when run" do
6
+ let(:target){Sample.new}
7
+ let(:mutators){[]}
8
+ let(:sut){ReadableStep.new}
9
+ let(:builder){Dsl.new(:numbers)}
10
+
11
+ context "using a dsl fragment that contains no block usage" do
12
+ before (:each) do
13
+ builder.readable
14
+ end
15
+ before (:each) do
16
+ target.extend(sut.run_using(builder))
17
+ end
18
+ it "should create a member on the target that allows reading of the array" do
19
+ target.numbers.should be_a(Array)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ class Sample
2
+ def initialize(numbers = [])
3
+ @numbers = numbers
4
+ end
5
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe VisitorDetailStep do
5
+ class OurSet
6
+ attr_accessor :items
7
+
8
+ def initialize
9
+ @items = []
10
+ end
11
+
12
+ def add(item)
13
+ @items << item
14
+ end
15
+ end
16
+ class Speak
17
+ def initialize(invocations)
18
+ @invocations = invocations
19
+ end
20
+ def hello
21
+ @invocations.push(1)
22
+ end
23
+ end
24
+ context "when run" do
25
+ context "using a visitor that is symbol based" do
26
+ let(:target){OurSet.new}
27
+ let(:mutators){[]}
28
+ let(:invocations){[]}
29
+ let(:sut){VisitorDetailStep.new}
30
+ let(:builder){Dsl.new(:items)}
31
+ before (:each) do
32
+ (1..10).each{|item| target.add(Speak.new(invocations))}
33
+ builder.process_using(:run,:hello)
34
+ end
35
+ before (:each) do
36
+ target.extend(sut.run_using(builder))
37
+ end
38
+
39
+ it "should create a method on the target that triggers each item in the list using its provided action" do
40
+ target.run
41
+ invocations.count.should == 10
42
+ end
43
+ end
44
+ context "using a visitor that is class based" do
45
+ class TheVisitor
46
+ attr_accessor :items
47
+ def initialize
48
+ @items = []
49
+ end
50
+ def run_using(item)
51
+ @items << item
52
+ end
53
+ end
54
+ let(:target){OurSet.new}
55
+ let(:visitor){TheVisitor.new}
56
+ let(:mutators){[]}
57
+ let(:invocations){[]}
58
+ let(:sut){VisitorDetailStep.new}
59
+ let(:builder){Dsl.new(:items)}
60
+
61
+ before (:each) do
62
+ (1..10).each{|item| target.add(item)}
63
+ builder.process_using(:run,visitor)
64
+ end
65
+ before (:each) do
66
+ target.extend(sut.run_using(builder))
67
+ end
68
+
69
+ it "should create a method on the target that triggers the visitor once for each item in the list" do
70
+ target.run
71
+ (1..10).each{|item| visitor.items.include?(item).should be_true}
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ module ArrayFu
4
+ describe WriteableStep do
5
+ context "when run" do
6
+ context "using a dsl fragment that contains no block usage" do
7
+ let(:target){Sample.new}
8
+ let(:mutators){[]}
9
+ let(:sut){WriteableStep.new}
10
+ let(:builder){Dsl.new(:numbers)}
11
+ before (:each) do
12
+ builder.writable
13
+ end
14
+ before (:each) do
15
+ target.extend(sut.run_using(builder))
16
+ end
17
+ it "should create a member on the target that allows assignment to the array" do
18
+ new_array = [1]
19
+ target.numbers = new_array
20
+ def target.numbers
21
+ return @numbers
22
+ end
23
+ target.numbers.should == new_array
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arrayfu
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Develop With Passion®
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: guard
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: guard-rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fakes-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Simple DSL For Declaritive Arrays
79
+ email:
80
+ - open_source@developwithpassion.com
81
+ executables:
82
+ - dwp_expand
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - .rvmrc
88
+ - Gemfile
89
+ - Guardfile
90
+ - Rakefile
91
+ - arrayfu.gemspec
92
+ - bin/dwp_expand
93
+ - lib/arrayfu.rb
94
+ - lib/core/add_criterion.rb
95
+ - lib/core/dsl.rb
96
+ - lib/core/module_registry.rb
97
+ - lib/core/mutator_detail.rb
98
+ - lib/core/mutator_step.rb
99
+ - lib/core/object_extensions.rb
100
+ - lib/core/readable_step.rb
101
+ - lib/core/version.rb
102
+ - lib/core/visitor_detail.rb
103
+ - lib/core/visitor_detail_step.rb
104
+ - lib/core/writeable_step.rb
105
+ - spec/spec_helper.rb
106
+ - spec/specs/add_criterion_spec.rb
107
+ - spec/specs/dsl_spec.rb
108
+ - spec/specs/mutator_step_spec.rb
109
+ - spec/specs/object_extensions_spec.rb
110
+ - spec/specs/readable_step_spec.rb
111
+ - spec/specs/sample.rb
112
+ - spec/specs/visitor_detail_step_spec.rb
113
+ - spec/specs/writeable_step_spec.rb
114
+ homepage: http://www.developwithpassion.com
115
+ licenses: []
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project: arrayfu
134
+ rubygems_version: 1.8.21
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: Simple DSL For Declaritive Arrays
138
+ test_files:
139
+ - spec/spec_helper.rb
140
+ - spec/specs/add_criterion_spec.rb
141
+ - spec/specs/dsl_spec.rb
142
+ - spec/specs/mutator_step_spec.rb
143
+ - spec/specs/object_extensions_spec.rb
144
+ - spec/specs/readable_step_spec.rb
145
+ - spec/specs/sample.rb
146
+ - spec/specs/visitor_detail_step_spec.rb
147
+ - spec/specs/writeable_step_spec.rb