constructor 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ == 1.0.1 / 2007-12-21
2
+
3
+ * You can now pass a block to your constructor call; it gets executed after all the ivars get assigned. (This lets you write some initializer code if you need to.)
4
+
1
5
  == 1.0.0 / 2007-11-18
2
6
 
3
7
  * Released!
data/Rakefile CHANGED
@@ -21,3 +21,13 @@ Spec::Rake::SpecTask.new(:spec) do |t|
21
21
  t.spec_files = FileList['specs/*_spec.rb']
22
22
  t.spec_opts << '-c -f s'
23
23
  end
24
+
25
+ if File.exists?("../tools/")
26
+ load "../tools/tasks/homepage.rake"
27
+ load "../tools/tasks/release_tagging.rake"
28
+ ReleaseTagging.new do |t|
29
+ t.package = "constructor"
30
+ t.version = CONSTRUCTOR_VERSION
31
+ end
32
+ end
33
+
@@ -1,7 +1,12 @@
1
- CONSTRUCTOR_VERSION = '1.0.0'
1
+ CONSTRUCTOR_VERSION = '1.0.1' #:nodoc:#
2
2
 
3
- class Class
4
- def constructor(*attrs)
3
+ class Class #:nodoc:#
4
+ def constructor(*attrs, &block)
5
+ call_block = ''
6
+ if block_given?
7
+ @constructor_block = block
8
+ call_block = 'self.instance_eval(&self.class.constructor_block)'
9
+ end
5
10
  # Look for embedded options in the listing:
6
11
  opts = attrs.find { |a| a.kind_of?(Hash) and attrs.delete(a) }
7
12
  do_acc = opts.nil? ? false : opts[:accessors] == true
@@ -73,6 +78,7 @@ class Class
73
78
  #{validation_code}
74
79
  #{assigns}
75
80
  setup if respond_to?(:setup)
81
+ #{call_block}
76
82
  end
77
83
  }
78
84
 
@@ -81,11 +87,16 @@ class Class
81
87
  end
82
88
 
83
89
  # Access the constructor keys for this class
84
- def constructor_keys; @_ctor_keys; end
90
+ def constructor_keys; @_ctor_keys ||=[]; end
91
+
92
+ def constructor_block #:nodoc:#
93
+ @constructor_block
94
+ end
95
+
85
96
  end
86
97
 
87
98
  # Fancy validation exception, based on missing and extraneous keys.
88
- class ConstructorArgumentError < RuntimeError
99
+ class ConstructorArgumentError < RuntimeError #:nodoc:#
89
100
  def initialize(missing,rejected=[])
90
101
  err_msg = ''
91
102
  if missing.size > 0
@@ -1,123 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../lib/constructor')
2
2
 
3
- class TestingClass
4
- attr_accessor :foo, :bar, :why, :qux
5
- constructor :foo, :bar, :why, :qux, :strict => false
6
-
7
- def to_pretty_pretty
8
- "#{@foo} #{@bar}"
9
- end
10
-
11
- end
12
-
13
- class Mama
14
- attr_accessor :fat, :age
15
- constructor :age, :strict => false
16
- def setup
17
- @fat = "much"
18
- end
19
- end
20
-
21
- class Baby < Mama
22
- constructor :cuteness
23
- end
24
-
25
- class Sissy < Mama
26
- attr_accessor :friends, :beauty
27
- constructor :beauty, :strict => false
28
- def setup
29
- super #IMPORTANT!
30
- @friends = "many"
31
- end
32
- end
33
-
34
- class TestingStrictArgsDefault
35
- constructor :foo, :bar
36
- def to_pretty_pretty
37
- "#{@foo} #{@bar}"
38
- end
39
- end
40
-
41
- class TestingStrictArgs
42
- constructor :foo, :bar, :strict => true
43
- def to_pretty_pretty
44
- "#{@foo} #{@bar}"
45
- end
46
- end
47
-
48
- class TestingStrictArgs2
49
- constructor :foo, :bar, :accessors => true
50
- end
51
-
52
- class SubclassOfTestingClass < TestingClass
53
- end
54
-
55
- class SubclassOfTestingClass2 < TestingClass
56
- def initialize; end
57
- end
58
-
59
- class SubclassOfTestingClass3 < TestingClass
60
- attr_reader :my_new_var
61
- def initialize(hash = nil)
62
- super
63
- @my_new_var = "something"
64
- end
65
- end
66
-
67
- class TestingAutoAccessors
68
- constructor :foo, :bar, :why, :qux, :accessors => true, :strict => false
69
- def to_pretty_pretty
70
- "#{@foo} #{@bar}"
71
- end
72
- end
73
-
74
- class TestingSuperConstructorBase
75
- attr_reader :a, :b
76
- def initialize(a,b)
77
- @a = a
78
- @b = b
79
- end
80
- end
81
-
82
- class TestingSuperConstructor < TestingSuperConstructorBase
83
- constructor :far, :away, :accessors => true, :super => ["once", :twice], :strict => false
84
- end
85
-
86
- class TestingSuperConstructorBase2
87
- attr_reader :c, :d
88
- def initialize
89
- @c = 'what a'
90
- @d = 'day for'
91
- end
92
- end
93
-
94
- class TestingSuperConstructor2 < TestingSuperConstructorBase2
95
- constructor :some, :accessors => true, :super => [], :strict => false
96
- end
97
-
98
- class TestingBlockedAccessors
99
- constructor :foo, :bar, :accessors => false
100
- def to_pretty_pretty
101
- "#{@foo} #{@bar}"
102
- end
103
- end
104
-
105
- class Papa
106
- constructor :car, :saw
107
- end
108
-
109
- class Sonny < Papa
110
- constructor :computer, :accessors => true
111
- end
112
-
113
- class Llamma
114
- attr_accessor :hungry, :hair
115
- constructor :hair
116
- def setup
117
- @hungry = true
118
- end
119
- end
120
-
121
3
  describe 'standard constructor usage' do
122
4
  it 'allows for object construction using a hash of named arguments' do
123
5
  fuh = TestingClass.new(
@@ -291,9 +173,11 @@ describe 'stict mode usage' do
291
173
  end
292
174
 
293
175
  it 'does not allow extraneous arguments when strict option is true' do
294
- lambda {
295
- TestingStrictArgs.new :foo => 1, :bar => 2, :other => 3, :thing => 4
296
- }.should raise_error(ConstructorArgumentError,/thing,other/)
176
+ [ /thing/, /other/ ].each do |rejected_arg|
177
+ lambda {
178
+ TestingStrictArgs.new(:foo => 1, :bar => 2, :other => 3, :thing => 4)
179
+ }.should raise_error(ConstructorArgumentError, rejected_arg)
180
+ end
297
181
  end
298
182
 
299
183
  it 'allows for setting accessors option while in strict mode' do
@@ -317,3 +201,133 @@ describe 'catching ConstructorArgumentError' do
317
201
  end
318
202
  end
319
203
  end
204
+
205
+ describe 'block yielding' do
206
+ it 'executes a specified block after instantiating' do
207
+ TestingBlockYield.new(:a => false).a.should == true
208
+ end
209
+ end
210
+
211
+ class TestingClass
212
+ attr_accessor :foo, :bar, :why, :qux
213
+ constructor :foo, :bar, :why, :qux, :strict => false
214
+
215
+ def to_pretty_pretty
216
+ "#{@foo} #{@bar}"
217
+ end
218
+
219
+ end
220
+
221
+ class Mama
222
+ attr_accessor :fat, :age
223
+ constructor :age, :strict => false
224
+ def setup
225
+ @fat = "much"
226
+ end
227
+ end
228
+
229
+ class Baby < Mama
230
+ constructor :cuteness
231
+ end
232
+
233
+ class Sissy < Mama
234
+ attr_accessor :friends, :beauty
235
+ constructor :beauty, :strict => false
236
+ def setup
237
+ super #IMPORTANT!
238
+ @friends = "many"
239
+ end
240
+ end
241
+
242
+ class TestingStrictArgsDefault
243
+ constructor :foo, :bar
244
+ def to_pretty_pretty
245
+ "#{@foo} #{@bar}"
246
+ end
247
+ end
248
+
249
+ class TestingStrictArgs
250
+ constructor :foo, :bar, :strict => true
251
+ def to_pretty_pretty
252
+ "#{@foo} #{@bar}"
253
+ end
254
+ end
255
+
256
+ class TestingStrictArgs2
257
+ constructor :foo, :bar, :accessors => true
258
+ end
259
+
260
+ class SubclassOfTestingClass < TestingClass
261
+ end
262
+
263
+ class SubclassOfTestingClass2 < TestingClass
264
+ def initialize; end
265
+ end
266
+
267
+ class SubclassOfTestingClass3 < TestingClass
268
+ attr_reader :my_new_var
269
+ def initialize(hash = nil)
270
+ super
271
+ @my_new_var = "something"
272
+ end
273
+ end
274
+
275
+ class TestingAutoAccessors
276
+ constructor :foo, :bar, :why, :qux, :accessors => true, :strict => false
277
+ def to_pretty_pretty
278
+ "#{@foo} #{@bar}"
279
+ end
280
+ end
281
+
282
+ class TestingSuperConstructorBase
283
+ attr_reader :a, :b
284
+ def initialize(a,b)
285
+ @a = a
286
+ @b = b
287
+ end
288
+ end
289
+
290
+ class TestingSuperConstructor < TestingSuperConstructorBase
291
+ constructor :far, :away, :accessors => true, :super => ["once", :twice], :strict => false
292
+ end
293
+
294
+ class TestingSuperConstructorBase2
295
+ attr_reader :c, :d
296
+ def initialize
297
+ @c = 'what a'
298
+ @d = 'day for'
299
+ end
300
+ end
301
+
302
+ class TestingSuperConstructor2 < TestingSuperConstructorBase2
303
+ constructor :some, :accessors => true, :super => [], :strict => false
304
+ end
305
+
306
+ class TestingBlockedAccessors
307
+ constructor :foo, :bar, :accessors => false
308
+ def to_pretty_pretty
309
+ "#{@foo} #{@bar}"
310
+ end
311
+ end
312
+
313
+ class Papa
314
+ constructor :car, :saw
315
+ end
316
+
317
+ class Sonny < Papa
318
+ constructor :computer, :accessors => true
319
+ end
320
+
321
+ class Llamma
322
+ attr_accessor :hungry, :hair
323
+ constructor :hair
324
+ def setup
325
+ @hungry = true
326
+ end
327
+ end
328
+
329
+ class TestingBlockYield
330
+ constructor :a, :accessors => true do
331
+ @a = true
332
+ end
333
+ end
metadata CHANGED
@@ -1,33 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
3
- specification_version: 1
4
2
  name: constructor
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.0.0
7
- date: 2007-11-18 00:00:00 -05:00
8
- summary: Declarative, named constructor arguments.
9
- require_paths:
10
- - lib
11
- email: dev@atomicobject.com
12
- homepage: http://rubyforge.org/projects/atomicobjectrb/
13
- rubyforge_project: atomicobjectrb
14
- description: "== DESCRIPTION: Declarative means to define object properties by passing a hash to the constructor, which will set the corresponding ivars."
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 1.0.1
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Atomic Object
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-08 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.5.1
23
+ version:
24
+ description: "== DESCRIPTION: Declarative means to define object properties by passing a hash to the constructor, which will set the corresponding ivars."
25
+ email: dev@atomicobject.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - History.txt
32
+ - Manifest.txt
33
+ - README.txt
31
34
  files:
32
35
  - History.txt
33
36
  - Manifest.txt
@@ -35,28 +38,32 @@ files:
35
38
  - Rakefile
36
39
  - lib/constructor.rb
37
40
  - specs/constructor_spec.rb
38
- test_files: []
39
-
41
+ has_rdoc: true
42
+ homepage: http://rubyforge.org/projects/atomicobjectrb/
43
+ post_install_message:
40
44
  rdoc_options:
41
45
  - --main
42
46
  - README.txt
43
- extra_rdoc_files:
44
- - History.txt
45
- - Manifest.txt
46
- - README.txt
47
- executables: []
48
-
49
- extensions: []
50
-
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
51
61
  requirements: []
52
62
 
53
- dependencies:
54
- - !ruby/object:Gem::Dependency
55
- name: hoe
56
- version_requirement:
57
- version_requirements: !ruby/object:Gem::Version::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 1.3.0
62
- version:
63
+ rubyforge_project: atomicobjectrb
64
+ rubygems_version: 1.1.1
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: Declarative, named constructor arguments.
68
+ test_files: []
69
+