arrayfu 0.2.4 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 258313bbff4e2d26f92f282bdfa88a4dbbc86c75
4
- data.tar.gz: fb1abedd526aa8c20d8bb6f2430a438317076879
3
+ metadata.gz: 25afe24f24b068f40630cbfaeac49fb1de9c21d7
4
+ data.tar.gz: 87b6a78fb88a4fe163e4e3d18d98d879ddfa67a2
5
5
  SHA512:
6
- metadata.gz: dde4ff14df434de2ea0369a9504d5a90ee36708fae4b8d39a3f46bff7d443f6ef13de082e918a7889e4c378fc1f08d7dcb4e49f6f4248f314f2fab7ddecd1376
7
- data.tar.gz: 7d754406871a05ae68efde79f8f63d5ffb5754b7cd61571ba013a2657cf7e8e8a544feb0e7ad63af4e0249f99d5b2c02ba29c77c20abce37921da60f81df8f2c
6
+ metadata.gz: c3dfab3890ef09fa8db15fc4a93b27231d3c022e50fd02f1db3931852380441a4beb28a8996b3b322e42c11defcf35484a9f6b011d8ced698ab7f74fd1e2309f
7
+ data.tar.gz: 4519bc52d05189b69813c72c50e5823998e44f9b2868a5a02131d9d20da77acfcf9834bf791d6cb46c71e9ba95e1468716f9b75bff0ae66cdd29a7553b02ac21
data/.gitignore CHANGED
@@ -4,3 +4,5 @@ Gemfile.lock
4
4
  .rvmrc
5
5
  .ruby-version
6
6
  .ruby-gemset
7
+ .yardoc
8
+ doc
@@ -0,0 +1,423 @@
1
+ #ArrayFu
2
+
3
+ One of the first ruby projects I. It is a simple dsl for declaritive arrays. Hopefully the examples below show how it can be used!
4
+
5
+ ##Examples
6
+
7
+ ```ruby
8
+ example "Basic" do
9
+ class Example1
10
+ include ArrayFu
11
+
12
+ array :names
13
+ end
14
+ end
15
+
16
+ example 'Allow the array to have a read accessor' do
17
+ class Example2
18
+ include ArrayFu
19
+
20
+ array(:names) { readable }
21
+ end
22
+ Example2.new.names.should_not be_nil
23
+ end
24
+
25
+ example 'Allow the array to have a write accessor' do
26
+ class Example3
27
+ include ArrayFu
28
+
29
+ array(:names) { writeable }
30
+ end
31
+ instance = Example3.new
32
+ new_names = []
33
+ instance.names = new_names
34
+ instance.instance_eval do
35
+ @names.should == new_names
36
+ end
37
+ end
38
+
39
+ example 'Allow the array to have a read and write accessor' do
40
+ class Example4
41
+ include ArrayFu
42
+
43
+ array(:names) { read_and_write }
44
+ end
45
+ Example4.new.names.should_not be_nil
46
+ end
47
+
48
+ example 'Add a mutator method to the class that stores the array' do
49
+ class Example5
50
+ include ArrayFu
51
+
52
+ array(:names) { mutator :add_item }
53
+ end
54
+
55
+ instance = Example5.new
56
+ instance.add_item("JP")
57
+ instance.instance_eval do
58
+ @names.count.should == 1
59
+ end
60
+ end
61
+
62
+ example 'Add multiple mutators to the class that stores the array' do
63
+ class Example6
64
+ include ArrayFu
65
+
66
+ array :names do
67
+ mutator :add_item, :add_it, :push_it
68
+ end
69
+ end
70
+
71
+ instance = Example6.new
72
+ instance.add_item("JP")
73
+ instance.add_it("JP")
74
+ instance.push_it("JP")
75
+ instance.instance_eval do
76
+ @names.count.should == 3
77
+ end
78
+ end
79
+
80
+ example 'Add a mutator that ignores addition' do
81
+ class Example7
82
+ include ArrayFu
83
+
84
+ array :names do
85
+ mutator :add_item do|item|
86
+ end
87
+ end
88
+ end
89
+
90
+ instance = Example7.new
91
+ instance.add_item("JP")
92
+ instance.instance_eval do
93
+ @names.count.should == 0
94
+ end
95
+ end
96
+
97
+ example 'Add a mutator that does other custom logic as well as addition' do
98
+ class Example8
99
+ include ArrayFu
100
+
101
+ array(:secondary) { readable }
102
+
103
+ array :names do
104
+ readable
105
+ mutator :add_item do|item|
106
+ @secondary.push item
107
+ @names.push item
108
+ end
109
+ end
110
+ end
111
+
112
+ instance = Example8.new
113
+ instance.add_item("JP")
114
+ instance.names.count.should == 1
115
+ instance.secondary.count.should == 1
116
+ end
117
+
118
+ example 'Add a singular constraint and failure condition to each of the mutators' do
119
+ module NotBeJP
120
+ extend self
121
+
122
+ def matches?(item)
123
+ return item != "JP"
124
+ end
125
+
126
+ def name
127
+ return "The value should not be JP"
128
+ end
129
+ end
130
+
131
+ module CriteriaViolation
132
+ extend self
133
+
134
+ def run(description,value)
135
+
136
+ end
137
+ end
138
+
139
+ class Example9
140
+ include ArrayFu
141
+
142
+ array :names do
143
+ readable
144
+ mutator :add_item,:add_it
145
+ new_item_must NotBeJP, CriteriaViolation
146
+ end
147
+ end
148
+
149
+ instance = Example9.new
150
+ instance.add_item("JP")
151
+ instance.add_it("JP")
152
+ instance.names.count.should == 0
153
+ end
154
+
155
+ example 'Add multiple constraints and a failure condition to each of the mutators' do
156
+ module NotBeJP
157
+ extend self
158
+
159
+ def matches?(item)
160
+ return item != "JP"
161
+ end
162
+
163
+ def name
164
+ return "The value should not be JP"
165
+ end
166
+ end
167
+
168
+ module NotBeNil
169
+ extend self
170
+
171
+ def matches?(item)
172
+ return item != nil
173
+ end
174
+
175
+ def name
176
+ return "The value should not be nil"
177
+ end
178
+ end
179
+
180
+ module CriteriaViolation
181
+ extend self
182
+
183
+ def run(description,value)
184
+ # puts "Criteria violated - #{description} - #{value}"
185
+ end
186
+ end
187
+
188
+ class Example10
189
+ include ArrayFu
190
+
191
+ array :names do
192
+ readable
193
+ mutator :add_item,:add_it
194
+ addition_constraint NotBeJP
195
+ addition_constraint NotBeNil, CriteriaViolation
196
+ end
197
+ end
198
+
199
+ instance = Example10.new
200
+ instance.add_item("JP")
201
+ instance.add_it("JP")
202
+ instance.add_item(nil)
203
+ instance.names.count.should == 0
204
+ end
205
+
206
+ example 'Add an explicit processing visitor to the array' do
207
+ class DisplayItem
208
+ @@number_of_items_displayed = 0
209
+ class << self
210
+ def run_using(item)
211
+ @@number_of_items_displayed += 1
212
+ end
213
+ def item_count
214
+ return @@number_of_items_displayed
215
+ end
216
+ end
217
+ end
218
+
219
+ class Example11
220
+ include ArrayFu
221
+
222
+ array :names do
223
+ mutator :add_item
224
+ process_using :display_all,DisplayItem
225
+ end
226
+ end
227
+
228
+ instance = Example11.new
229
+ (1..10).each{|item| instance.add_item(item)}
230
+ instance.display_all
231
+ DisplayItem.item_count.should == 10
232
+ end
233
+
234
+ example 'Add an method based processing visitor to the array based on a method that exists on the items in the array' do
235
+ class Item
236
+ def process
237
+ Example12.increment
238
+ end
239
+ end
240
+
241
+ class Example12
242
+ @@items_visited = 0
243
+ include ArrayFu
244
+
245
+ array :names do
246
+ mutator :add_item
247
+ process_using :display_all, :process #the second symbol is the name of a method on an element in the array
248
+ end
249
+
250
+
251
+ #the process method of the Item class invokes this method (a little bit roundabout, but it hopefully demonstrates the capability
252
+ def self.increment
253
+ @@items_visited += 1
254
+ end
255
+ def self.number_of_items_visited
256
+ @@items_visited
257
+ end
258
+ end
259
+
260
+ instance = Example12.new
261
+ (1..10).each{|item| instance.add_item(Item.new)}
262
+ instance.display_all
263
+ Example12.number_of_items_visited.should == 10
264
+ end
265
+
266
+ example 'Augment configuration using configuration block' do
267
+ class ArrayConfigs
268
+ def self.add_another_mutator
269
+ return lambda{|item| item.mutator :another_push}
270
+ end
271
+ end
272
+
273
+ class Example13
274
+ include ArrayFu
275
+
276
+ array :names do
277
+ readable
278
+ mutator :add_item
279
+ configure_using ArrayConfigs.add_another_mutator
280
+ end
281
+ end
282
+
283
+ instance = Example13.new
284
+ instance.add_item("Yo")
285
+ instance.another_push("Yo")
286
+ instance.names.count.should == 2
287
+ end
288
+
289
+ example 'Augment configuration using inline configuration block' do
290
+ class Example14
291
+ include ArrayFu
292
+
293
+ array :names do
294
+ readable
295
+ mutator :add_item
296
+ configure_using -> (item) do
297
+ item.mutator :another_pushes
298
+ end
299
+ end
300
+ end
301
+
302
+ instance = Example14.new
303
+ instance.add_item("Yo")
304
+ instance.another_pushes("Yo")
305
+ instance.names.count.should == 2
306
+ end
307
+
308
+ example 'Augment configuration using configuration instance (anything that responds to configure with the array definition as the argument)' do
309
+
310
+ module ArrayConfiguration
311
+ extend self
312
+
313
+ def configure(item)
314
+ item.mutator :once_more
315
+ end
316
+ end
317
+
318
+ class Example15
319
+ include ArrayFu
320
+
321
+ array :names do
322
+ readable
323
+ mutator :add_item
324
+ configure_using ArrayConfiguration
325
+ end
326
+ end
327
+
328
+ instance = Example15.new
329
+ instance.add_item("Yo")
330
+ instance.once_more("Yo")
331
+ instance.names.count.should == 2
332
+ end
333
+
334
+ example 'Augment configuration using configuration block' do
335
+
336
+ module ArrayConfiguration
337
+ extend self
338
+
339
+ def configuration_block
340
+ Proc.new do|array|
341
+ array.mutator :once_more
342
+ end
343
+ end
344
+ end
345
+
346
+ class Example16
347
+ include ArrayFu
348
+
349
+ array :names do
350
+ readable
351
+ mutator :add_item
352
+ configure_using ArrayConfiguration.configuration_block
353
+ end
354
+ end
355
+
356
+ instance = Example16.new
357
+ instance.add_item("Yo")
358
+ instance.once_more("Yo")
359
+ instance.names.count.should == 2
360
+ end
361
+
362
+ example 'Augment configuration of an existing array' do
363
+
364
+ module ExampleConfig1
365
+ extend self
366
+
367
+ def configuration_block
368
+ -> (array) { array.mutator :once_more }
369
+ end
370
+ end
371
+
372
+ class Example17
373
+ include ArrayFu
374
+
375
+ array :names do
376
+ readable
377
+ mutator :add_item
378
+ end
379
+
380
+ def initialize
381
+ array :names do
382
+ configure_using ExampleConfig1.configuration_block
383
+ end
384
+ super
385
+ end
386
+ end
387
+
388
+ instance = Example17.new
389
+ instance.add_item("Yo")
390
+ instance.once_more("Yo")
391
+ instance.names.count.should == 2
392
+ end
393
+
394
+ example 'Alternate way to augment configuration of an existing array' do
395
+
396
+ module ExampleConfig3
397
+ extend self
398
+
399
+ def configure(array_definition)
400
+ array_definition.mutator :once_more
401
+ end
402
+ end
403
+
404
+ class Example18
405
+ include ArrayFu
406
+
407
+ array :names do
408
+ readable
409
+ mutator :add_item
410
+ end
411
+
412
+ def initialize(config)
413
+ config.configure(array(:names))
414
+ super
415
+ end
416
+ end
417
+
418
+ instance = Example18.new(ExampleConfig3)
419
+ instance.add_item("Yo")
420
+ instance.once_more("Yo")
421
+ instance.names.count.should == 2
422
+ end
423
+ ```
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
 
21
21
  # specify any dependencies here; for example:
22
22
  s.add_development_dependency("rake", "~> 0.9.0")
23
+ s.add_development_dependency("yard", "~> 0.8.7.4")
23
24
  s.add_development_dependency("guard", "~> 2.6.1")
24
25
  s.add_development_dependency("guard-rspec", "~> 4.2.9")
25
26
  s.add_development_dependency("fakes-rspec", "~> 2.0.0")
@@ -1,41 +1,121 @@
1
1
  module ArrayFu
2
+ # A builder for specifying behaviours exposed by a class that defines arrays
2
3
  class ArrayDefinition
3
4
  include Initializer
4
5
 
5
- attr_accessor :name
6
- attr_accessor :writable
6
+ # The name that will be given to this array definition, it will also become a variable named @[name] on the class that defined this array
7
+ attr_reader :name
8
+ # Flag for writeability
9
+ attr_accessor :writeable
10
+ # Flag for readability
7
11
  attr_accessor :readable
12
+ # List of mutator definitions for this array
8
13
  attr_accessor :mutators
14
+ # List of processing visitors
9
15
  attr_accessor :visitors
16
+
17
+ # The list of constraints specified for this array definition
10
18
  attr_accessor :constraints
11
19
 
20
+ # Create an array definition with the specified name
21
+ #
22
+ # == Parameters:
23
+ # @name::
24
+ # Name given to the array definition. This name will also be used to generate a variable on the target class named: @[name]
12
25
  def initialize(name)
13
26
  @name = name
14
27
  initialize_arrays :mutators, :visitors, :constraints
15
- initialize_false :writable, :readable
28
+ initialize_false :writeable, :readable
16
29
  end
17
30
 
31
+ # Flag that the class that is defining this array will expose both a reader and writer for the array variable
32
+ #
33
+ # Example:
34
+ #
35
+ # class SomeClass
36
+ # include ArrayFu
37
+ #
38
+ # array :names { read_and_write }
39
+ # end
40
+ #
41
+ # The above is the same as the following
42
+ #
43
+ # class SomeClass
44
+ # attr_accessor :names
45
+ #
46
+ # def initialize
47
+ # @names = []
48
+ # end
49
+ # end
18
50
  def read_and_write
19
- writable
51
+ writeable
20
52
  readable
21
53
  end
22
54
 
23
- def writable
24
- @writable = true
55
+
56
+ # Flag that the class that is defining this array will expose a writer for the array variable
57
+ def writeable
58
+ @writeable = true
25
59
  end
26
60
 
61
+ # Flag that the class that is defining this array will expose a writer for the array variable
27
62
  def readable
28
63
  @readable = true
29
64
  end
30
65
 
31
- def writable?
32
- @writable ||= false
66
+ # Used by internal infrastructure to determine if this arraydefinition should expose a writer for the array variable
67
+ def writeable?
68
+ @writeable ||= false
33
69
  end
34
70
 
71
+ # Used by internal infrastructure to determine if this arraydefinition should expose a reader for the array variable
35
72
  def readable?
36
73
  @readable ||= false
37
74
  end
38
75
 
76
+ # This method allows for external configurators to customize the behaviour of this array definition
77
+ # == Parameters:
78
+ # configurators::
79
+ # One or many objects/blocks (can be a mix). If a configurator is an object, it must respond to the following method:
80
+ # def configure(definition)
81
+ # Where definition is an {ArrayDefinition}.
82
+ #
83
+ # If a configurator is a block, it will be a block that takes a singular parameter which is the {ArrayDefinition}
84
+ # Examples:
85
+ #
86
+ # * Configuring using an object
87
+ #
88
+ # class SomeConfigurator
89
+ # def self.configure(array_definition)
90
+ # array_definition.mutator :add_it
91
+ # end
92
+ # end
93
+ #
94
+ # class SomeClass
95
+ # include ArrayFu
96
+ #
97
+ # array :names do
98
+ # configure_using SomeConfigurator
99
+ # end
100
+ # end
101
+ #
102
+ # instance = SomeClass.new
103
+ # instance.add_it('JP')
104
+ #
105
+ # * Configuring using a lambda
106
+ #
107
+ # class SomeClass
108
+ # include ArrayFu
109
+ #
110
+ # array :names do
111
+ # configure_using -> (item) do
112
+ # item.mutator :add_it
113
+ # end
114
+ # end
115
+ # end
116
+ #
117
+ # instance = SomeClass.new
118
+ # instance.add_it('JP')
39
119
  def configure_using(*configurators)
40
120
  configurators.each do|configurator|
41
121
  method = configurator.respond_to?(:configure) ? :configure : 'call'.to_sym
@@ -43,12 +123,70 @@ module ArrayFu
43
123
  end
44
124
  end
45
125
 
126
+ # Method used to specify a list of methods that will be exposed on the class that is defining this array. The methods are write methods that will push data back to the underlying array
127
+ #
128
+ # == Parameters:
129
+ # names::
130
+ # Method names that will be used to expose push methods to this array
131
+ # &block::
132
+ # If provided, this block will be run anytime the mutator method is invoked. It's single parameter is the new item that is attempting to be added to the underlying array
133
+ # if you provide this block, and dont push the item parameter back to the original array, no changes will happen to the underlying array
134
+ #
135
+ # Examples:
136
+ #
137
+ # class SomeClass
138
+ # include ArrayFu
139
+ #
140
+ # array :names { mutator :add_item }
141
+ # end
142
+ #
143
+ # The above will generate an instance method named :add_item on the SomeClass class. When you call this method, the names array will have an item pushed to it:
144
+ #
145
+ # instance = SomeClass.new
146
+ # instance.add_item('Hello') #the @names array variable will now contain ['Hello']
147
+ #
148
+ # You can specify multiple mutators at once:
149
+ #
150
+ # class SomeClass
151
+ # include ArrayFu
152
+ #
153
+ # array :names do
154
+ # mutator :add_item,
155
+ # :add_another,
156
+ # :add_one_more
157
+ # end
158
+ # end
159
+ #
160
+ # instance = SomeClass.new
161
+ # instance.add_item('JP')
162
+ # instance.add_another('Yeah')
163
+ # instance.add_one_more('Yep')
164
+ #
165
+ # Example:
166
+ #
167
+ # * A mutator with custom logic in a block
168
+ #
169
+ # class SomeClass
170
+ # include ArrayFu
171
+ #
172
+ # array :names do
173
+ # mutator :add_one do |item|
174
+ # puts 'About to add one new item #{item}'
175
+ # @names.push(item) #if this does not happen, no changes will occur to the underlying array
176
+ # end
177
+ # end
178
+ # end
179
+ #
180
+ # instance = SomeClass.new
181
+ # instance.add_one('JP') # at this point we will see a console out
182
+ #
46
183
  def mutator(*names, &block)
47
184
  names.each do |mutator_name|
48
185
  self.mutators.push(MutatorDefinition.new(mutator_name, block))
49
186
  end
50
187
  end
51
188
 
189
+ # Null object implementation for a constraint failure (No-op)
52
190
  module NoFailure
53
191
  extend self
54
192
 
@@ -56,18 +194,31 @@ module ArrayFu
56
194
  end
57
195
  end
58
196
 
197
+ # Run each of its {ArrayFu::MutatorDefinition} against the provided block
59
198
  def each_mutator(&block)
60
199
  mutators.each &block
61
200
  end
62
201
 
202
+ # Run each of its {ArrayFu::ItemConstraint} against the provided block
63
203
  def each_constraint(&block)
64
204
  constraints.each &block
65
205
  end
66
206
 
207
+ # Run each of its {ArrayFu::VisitorDefinition} against the provided block
67
208
  def each_visitor(&block)
68
209
  visitors.each &block
69
210
  end
70
211
 
212
+ # Adds a constraint that must be met for any new item being passed to a mutator method
213
+ # == Parameters:
214
+ # constraint::
215
+ # An object that responds to the following 2 methods:
216
+ # name: - Should return a descriptive name for the constraint
217
+ # matches?(item) - The constraint method, it will be called with any new item about to be added
218
+ # fail_option (defaults to {ArrayFu::ArrayDefinition::NoFailure})::
219
+ # An object that responds to the following methods:
220
+ # run(description, value) - Behaviour to run when the constraint is not met. It is given the description of the failed constraint, and the value
221
+ # that did not meet the constraint
71
222
  def addition_constraint(constraint, fail_option = NoFailure)
72
223
  self.constraints.push(ItemConstraint.new(constraint, fail_option))
73
224
  end
@@ -77,6 +228,7 @@ module ArrayFu
77
228
  self.visitors.push(VisitorDefinition.new(name, visitor))
78
229
  end
79
230
 
231
+ # Method used by internal builder mechanism. Specifies the name that will be used for the backing array variable for this array definition
80
232
  def variable_name
81
233
  "@#{@name}"
82
234
  end
@@ -1,3 +1,5 @@
1
+ # Main module that can be mixed in to allow for declaritive array definitions
2
+ #
1
3
  module ArrayFu
2
4
  include Initializer
3
5
 
@@ -5,6 +7,27 @@ module ArrayFu
5
7
  base.extend ClassMethods
6
8
  end
7
9
 
10
+ # This method is here to ensure that all of the array definitions are expanded and a variable instance is assigned to the variable name specified by the array
11
+ # If you are mixing in this module and the class has its own constructor definition, make sure you call super to ensure that array initialization occurs correctly as shown:
12
+ #
13
+ # class SomeClass
14
+ # include ArrayFu
15
+ #
16
+ # array :names
17
+ #
18
+ # def initialize(some_value)
19
+ # super
20
+ # end
21
+ # end
22
+ #
23
+ # If your class does not contain custom constructor logic, no extra code is needed:
24
+ #
25
+ #
26
+ # class SomeClass
27
+ # include ArrayFu
28
+ #
29
+ # array :names
30
+ # end
8
31
  def initialize(*args)
9
32
  self.class.each_array_definition do |array_definition|
10
33
  initialize_arrays(array_definition.name)
@@ -12,6 +35,49 @@ module ArrayFu
12
35
  end
13
36
  end
14
37
 
38
+ # Array definition dsl entry point
39
+ #
40
+ # == Parameters:
41
+ # name::
42
+ # A name that will be used to initialize a variable on the class that is including this module.
43
+ # It will serve as the backing array for the array definition
44
+ #
45
+ # &block::
46
+ # A configuration block that will serve to configure an {ArrayFu::ArrayDefinition}
47
+ #
48
+ # Examples:
49
+ #
50
+ # * Define a basic array
51
+ #
52
+ # class SomeClass
53
+ # include ArrayFu
54
+ #
55
+ # array :names
56
+ # end
57
+ #
58
+ # * Define a basic array that supports a read accessor
59
+ #
60
+ # class SomeClass
61
+ # include ArrayFu
62
+ #
63
+ # array :names { readable }
64
+ # end
65
+ #
66
+ # * Define a basic array that supports a write accessor
67
+ #
68
+ # class SomeClass
69
+ # include ArrayFu
70
+ #
71
+ # array :names { writeable }
72
+ # end
73
+ #
74
+ # * Define a basic array that supports both read and write accessors
75
+ #
76
+ # class SomeClass
77
+ # include ArrayFu
78
+ #
79
+ # array :names { read_and_write }
80
+ # end
15
81
  def array(name, &block)
16
82
  self.class.array(name, &block)
17
83
  end
@@ -4,7 +4,7 @@ module ArrayFu
4
4
 
5
5
  def create_using(builder)
6
6
  Module.new do
7
- if (builder.writable?)
7
+ if (builder.writeable?)
8
8
  define_method("#{builder.name}=") do|value|
9
9
  instance_variable_set(builder.variable_name, value)
10
10
  end
@@ -1,3 +1,3 @@
1
1
  module ArrayFu
2
- VERSION = "0.2.4"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  example "Basic" do
4
- class SomeClass
4
+ class Example1
5
5
  include ArrayFu
6
6
 
7
7
  array :names
@@ -9,46 +9,53 @@ example "Basic" do
9
9
  end
10
10
 
11
11
  example 'Allow the array to have a read accessor' do
12
- class SomeClass
12
+ class Example2
13
13
  include ArrayFu
14
14
 
15
15
  array(:names) { readable }
16
16
  end
17
- SomeClass.new.names.should_not be_nil
17
+ Example2.new.names.should_not be_nil
18
18
  end
19
19
 
20
20
  example 'Allow the array to have a write accessor' do
21
- class SomeClass
21
+ class Example3
22
22
  include ArrayFu
23
23
 
24
- array(:names) { writable }
24
+ array(:names) { writeable }
25
+ end
26
+ instance = Example3.new
27
+ new_names = []
28
+ instance.names = new_names
29
+ instance.instance_eval do
30
+ @names.should == new_names
25
31
  end
26
- SomeClass.new.names.should_not be_nil
27
32
  end
28
33
 
29
34
  example 'Allow the array to have a read and write accessor' do
30
- class SomeClass
35
+ class Example4
31
36
  include ArrayFu
32
37
 
33
38
  array(:names) { read_and_write }
34
39
  end
35
- SomeClass.new.names.should_not be_nil
40
+ Example4.new.names.should_not be_nil
36
41
  end
37
42
 
38
43
  example 'Add a mutator method to the class that stores the array' do
39
- class SomeClass
44
+ class Example5
40
45
  include ArrayFu
41
46
 
42
47
  array(:names) { mutator :add_item }
43
48
  end
44
49
 
45
- items = SomeClass.new
46
- items.add_item("JP")
47
- items.names.count.should == 1
50
+ instance = Example5.new
51
+ instance.add_item("JP")
52
+ instance.instance_eval do
53
+ @names.count.should == 1
54
+ end
48
55
  end
49
56
 
50
57
  example 'Add multiple mutators to the class that stores the array' do
51
- class SomeClass
58
+ class Example6
52
59
  include ArrayFu
53
60
 
54
61
  array :names do
@@ -56,15 +63,17 @@ example 'Add multiple mutators to the class that stores the array' do
56
63
  end
57
64
  end
58
65
 
59
- items = SomeClass.new
60
- items.add_item("JP")
61
- items.add_it("JP")
62
- items.push_it("JP")
63
- items.names.count.should == 3
66
+ instance = Example6.new
67
+ instance.add_item("JP")
68
+ instance.add_it("JP")
69
+ instance.push_it("JP")
70
+ instance.instance_eval do
71
+ @names.count.should == 3
72
+ end
64
73
  end
65
74
 
66
75
  example 'Add a mutator that ignores addition' do
67
- class SomeClass
76
+ class Example7
68
77
  include ArrayFu
69
78
 
70
79
  array :names do
@@ -73,13 +82,15 @@ example 'Add a mutator that ignores addition' do
73
82
  end
74
83
  end
75
84
 
76
- items = SomeClass.new
77
- items.add_item("JP")
78
- items.names.count.should == 0
85
+ instance = Example7.new
86
+ instance.add_item("JP")
87
+ instance.instance_eval do
88
+ @names.count.should == 0
89
+ end
79
90
  end
80
91
 
81
92
  example 'Add a mutator that does other custom logic as well as addition' do
82
- class SomeClass
93
+ class Example8
83
94
  include ArrayFu
84
95
 
85
96
  array(:secondary) { readable }
@@ -93,10 +104,10 @@ example 'Add a mutator that does other custom logic as well as addition' do
93
104
  end
94
105
  end
95
106
 
96
- items = SomeClass.new
97
- items.add_item("JP")
98
- items.names.count.should == 1
99
- items.secondary.count.should == 1
107
+ instance = Example8.new
108
+ instance.add_item("JP")
109
+ instance.names.count.should == 1
110
+ instance.secondary.count.should == 1
100
111
  end
101
112
 
102
113
  example 'Add a singular constraint and failure condition to each of the mutators' do
@@ -120,19 +131,20 @@ example 'Add a singular constraint and failure condition to each of the mutators
120
131
  end
121
132
  end
122
133
 
123
- class SomeClass
134
+ class Example9
124
135
  include ArrayFu
125
136
 
126
137
  array :names do
138
+ readable
127
139
  mutator :add_item,:add_it
128
140
  new_item_must NotBeJP, CriteriaViolation
129
141
  end
130
142
  end
131
143
 
132
- items = SomeClass.new
133
- items.add_item("JP")
134
- items.add_it("JP")
135
- items.names.count.should == 0
144
+ instance = Example9.new
145
+ instance.add_item("JP")
146
+ instance.add_it("JP")
147
+ instance.names.count.should == 0
136
148
  end
137
149
 
138
150
  example 'Add multiple constraints and a failure condition to each of the mutators' do
@@ -168,21 +180,22 @@ example 'Add multiple constraints and a failure condition to each of the mutator
168
180
  end
169
181
  end
170
182
 
171
- class SomeClass
183
+ class Example10
172
184
  include ArrayFu
173
185
 
174
186
  array :names do
187
+ readable
175
188
  mutator :add_item,:add_it
176
189
  addition_constraint NotBeJP
177
190
  addition_constraint NotBeNil, CriteriaViolation
178
191
  end
179
192
  end
180
193
 
181
- items = SomeClass.new
182
- items.add_item("JP")
183
- items.add_it("JP")
184
- items.add_item(nil)
185
- items.names.count.should == 0
194
+ instance = Example10.new
195
+ instance.add_item("JP")
196
+ instance.add_it("JP")
197
+ instance.add_item(nil)
198
+ instance.names.count.should == 0
186
199
  end
187
200
 
188
201
  example 'Add an explicit processing visitor to the array' do
@@ -198,7 +211,7 @@ example 'Add an explicit processing visitor to the array' do
198
211
  end
199
212
  end
200
213
 
201
- class SomeClass
214
+ class Example11
202
215
  include ArrayFu
203
216
 
204
217
  array :names do
@@ -207,20 +220,20 @@ example 'Add an explicit processing visitor to the array' do
207
220
  end
208
221
  end
209
222
 
210
- items = SomeClass.new
211
- (1..10).each{|item| items.add_item(item)}
212
- items.display_all
223
+ instance = Example11.new
224
+ (1..10).each{|item| instance.add_item(item)}
225
+ instance.display_all
213
226
  DisplayItem.item_count.should == 10
214
227
  end
215
228
 
216
229
  example 'Add an method based processing visitor to the array based on a method that exists on the items in the array' do
217
230
  class Item
218
231
  def process
219
- SomeClass.increment
232
+ Example12.increment
220
233
  end
221
234
  end
222
235
 
223
- class SomeClass
236
+ class Example12
224
237
  @@items_visited = 0
225
238
  include ArrayFu
226
239
 
@@ -239,10 +252,10 @@ example 'Add an method based processing visitor to the array based on a method t
239
252
  end
240
253
  end
241
254
 
242
- items = SomeClass.new
243
- (1..10).each{|item| items.add_item(Item.new)}
244
- items.display_all
245
- SomeClass.number_of_items_visited.should == 10
255
+ instance = Example12.new
256
+ (1..10).each{|item| instance.add_item(Item.new)}
257
+ instance.display_all
258
+ Example12.number_of_items_visited.should == 10
246
259
  end
247
260
 
248
261
  example 'Augment configuration using configuration block' do
@@ -252,19 +265,39 @@ example 'Augment configuration using configuration block' do
252
265
  end
253
266
  end
254
267
 
255
- class SomeClass
268
+ class Example13
256
269
  include ArrayFu
257
270
 
258
271
  array :names do
272
+ readable
259
273
  mutator :add_item
260
274
  configure_using ArrayConfigs.add_another_mutator
261
275
  end
262
276
  end
263
277
 
264
- items = SomeClass.new
265
- items.add_item("Yo")
266
- items.another_push("Yo")
267
- items.names.count.should == 2
278
+ instance = Example13.new
279
+ instance.add_item("Yo")
280
+ instance.another_push("Yo")
281
+ instance.names.count.should == 2
282
+ end
283
+
284
+ example 'Augment configuration using inline configuration block' do
285
+ class Example14
286
+ include ArrayFu
287
+
288
+ array :names do
289
+ readable
290
+ mutator :add_item
291
+ configure_using -> (item) do
292
+ item.mutator :another_pushes
293
+ end
294
+ end
295
+ end
296
+
297
+ instance = Example14.new
298
+ instance.add_item("Yo")
299
+ instance.another_pushes("Yo")
300
+ instance.names.count.should == 2
268
301
  end
269
302
 
270
303
  example 'Augment configuration using configuration instance (anything that responds to configure with the array definition as the argument)' do
@@ -277,19 +310,20 @@ example 'Augment configuration using configuration instance (anything that respo
277
310
  end
278
311
  end
279
312
 
280
- class SomeClass
313
+ class Example15
281
314
  include ArrayFu
282
315
 
283
316
  array :names do
317
+ readable
284
318
  mutator :add_item
285
319
  configure_using ArrayConfiguration
286
320
  end
287
321
  end
288
322
 
289
- items = SomeClass.new
290
- items.add_item("Yo")
291
- items.once_more("Yo")
292
- items.names.count.should == 2
323
+ instance = Example15.new
324
+ instance.add_item("Yo")
325
+ instance.once_more("Yo")
326
+ instance.names.count.should == 2
293
327
  end
294
328
 
295
329
  example 'Augment configuration using configuration block' do
@@ -304,50 +338,80 @@ example 'Augment configuration using configuration block' do
304
338
  end
305
339
  end
306
340
 
307
- class SomeClass
341
+ class Example16
308
342
  include ArrayFu
309
343
 
310
344
  array :names do
345
+ readable
311
346
  mutator :add_item
312
347
  configure_using ArrayConfiguration.configuration_block
313
348
  end
314
349
  end
315
350
 
316
- items = SomeClass.new
317
- items.add_item("Yo")
318
- items.once_more("Yo")
319
- items.names.count.should == 2
351
+ instance = Example16.new
352
+ instance.add_item("Yo")
353
+ instance.once_more("Yo")
354
+ instance.names.count.should == 2
320
355
  end
321
356
 
322
357
  example 'Augment configuration of an existing array' do
323
358
 
324
- module ArrayConfiguration
359
+ module ExampleConfig1
325
360
  extend self
326
361
 
327
362
  def configuration_block
328
- Proc.new do|array|
329
- array.mutator :once_more
330
- end
363
+ -> (array) { array.mutator :once_more }
331
364
  end
332
365
  end
333
366
 
334
- class SomeClass
367
+ class Example17
335
368
  include ArrayFu
336
369
 
337
370
  array :names do
371
+ readable
338
372
  mutator :add_item
339
373
  end
340
374
 
341
375
  def initialize
342
- super
343
376
  array :names do
344
- configure_using ArrayConfiguration.configuration_block
377
+ configure_using ExampleConfig1.configuration_block
345
378
  end
379
+ super
380
+ end
381
+ end
382
+
383
+ instance = Example17.new
384
+ instance.add_item("Yo")
385
+ instance.once_more("Yo")
386
+ instance.names.count.should == 2
387
+ end
388
+
389
+ example 'Alternate way to augment configuration of an existing array' do
390
+
391
+ module ExampleConfig3
392
+ extend self
393
+
394
+ def configure(array_definition)
395
+ array_definition.mutator :once_more
396
+ end
397
+ end
398
+
399
+ class Example18
400
+ include ArrayFu
401
+
402
+ array :names do
403
+ readable
404
+ mutator :add_item
405
+ end
406
+
407
+ def initialize(config)
408
+ config.configure(array(:names))
409
+ super
346
410
  end
347
411
  end
348
412
 
349
- items = SomeClass.new
350
- items.add_item("Yo")
351
- items.once_more("Yo")
352
- items.names.count.should == 2
413
+ instance = Example18.new(ExampleConfig3)
414
+ instance.add_item("Yo")
415
+ instance.once_more("Yo")
416
+ instance.names.count.should == 2
353
417
  end
@@ -9,7 +9,7 @@ module ArrayFu
9
9
  let(:sut){GenerateWriters}
10
10
  let(:builder){ArrayDefinition.new(:numbers)}
11
11
  before (:each) do
12
- builder.writable
12
+ builder.writeable
13
13
  end
14
14
  before (:each) do
15
15
  target.extend(sut.create_using(builder))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arrayfu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Develop With Passion®
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-26 00:00:00.000000000 Z
11
+ date: 2014-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: yard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.7.4
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.4
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: guard
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -77,6 +91,7 @@ files:
77
91
  - Gemfile
78
92
  - Guardfile
79
93
  - LICENSE
94
+ - README.md
80
95
  - Rakefile
81
96
  - arrayfu.gemspec
82
97
  - lib/arrayfu.rb
@@ -137,3 +152,4 @@ test_files:
137
152
  - spec/specs/generate_writers_step_spec.rb
138
153
  - spec/specs/initializer_spec.rb
139
154
  - spec/specs/item_constraint_spec.rb
155
+ has_rdoc: