ruby_ex 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/ChangeLog +693 -0
  2. data/NEWS +74 -0
  3. data/SPEC.dyn.yml +6 -6
  4. data/SPEC.gemspec +14 -0
  5. data/SPEC.yml +4 -4
  6. data/lib/abstract.rb +2 -4
  7. data/lib/abstract_node.rb +1 -2
  8. data/lib/algorithms/simulated_annealing.rb +50 -29
  9. data/lib/attributed_class.rb +50 -21
  10. data/lib/auto_object.rb +102 -0
  11. data/lib/blank_slate.rb +102 -0
  12. data/lib/cache.rb +1 -2
  13. data/lib/choose.rb +165 -163
  14. data/lib/commands.rb +2 -3
  15. data/lib/commands/command.rb +47 -20
  16. data/lib/commands/datas.rb +1 -1
  17. data/lib/commands/datas/composite.rb +5 -1
  18. data/lib/commands/datas/data.rb +102 -5
  19. data/lib/commands/datas/factory.rb +13 -6
  20. data/lib/commands/datas/temp.rb +3 -5
  21. data/lib/commands/factory.rb +1 -1
  22. data/lib/commands/helpers.rb +1 -1
  23. data/lib/commands/pipe.rb +10 -1
  24. data/lib/commands/runners.rb +1 -1
  25. data/lib/commands/runners/exec.rb +1 -1
  26. data/lib/commands/runners/fork.rb +3 -16
  27. data/lib/commands/runners/mock.rb +67 -0
  28. data/lib/commands/runners/runner.rb +5 -3
  29. data/lib/commands/runners/system.rb +1 -1
  30. data/lib/commands/seq.rb +2 -1
  31. data/lib/config_file.rb +10 -2
  32. data/lib/const_regexp.rb +1 -2
  33. data/lib/{dlogger.rb → d_logger.rb} +1 -2
  34. data/lib/daemon.rb +1 -2
  35. data/lib/diff.rb +1 -2
  36. data/lib/drb/drb_observable.rb +1 -2
  37. data/lib/drb/drb_observable_pool.rb +2 -2
  38. data/lib/drb/drb_service.rb +1 -2
  39. data/lib/drb/drb_undumped_attributes.rb +1 -2
  40. data/lib/drb/drb_undumped_indexed_object.rb +1 -2
  41. data/lib/drb/insecure_protected_methods.rb +1 -2
  42. data/lib/drb_ex.rb +2 -2
  43. data/lib/file_type.rb +466 -0
  44. data/lib/generate_id.rb +12 -6
  45. data/lib/genpasswd.rb +22 -0
  46. data/lib/hash_eval.rb +83 -0
  47. data/lib/histogram.rb +1 -2
  48. data/lib/hookable.rb +3 -4
  49. data/lib/hooker.rb +1 -3
  50. data/lib/html_encode.rb +191 -0
  51. data/lib/indexed_node.rb +0 -1
  52. data/lib/io_marshal.rb +4 -2
  53. data/lib/ioo.rb +3 -2
  54. data/lib/kill_all.rb +46 -0
  55. data/lib/labeled_node.rb +0 -1
  56. data/lib/logger_observer.rb +8 -4
  57. data/lib/md5sum.rb +3 -3
  58. data/lib/meta_factory.rb +99 -0
  59. data/lib/method_call.rb +87 -0
  60. data/lib/mocks.rb +12 -0
  61. data/lib/mocks/assertions.rb +50 -0
  62. data/lib/mocks/method_logger.rb +40 -0
  63. data/lib/mocks/mock.rb +64 -0
  64. data/lib/mocks/object.rb +47 -0
  65. data/lib/mocks/observer.rb +38 -0
  66. data/lib/module/autoload_tree.rb +30 -29
  67. data/lib/module/hierarchy.rb +176 -171
  68. data/lib/module/instance_method_visibility.rb +39 -38
  69. data/lib/node.rb +0 -1
  70. data/lib/object_monitor.rb +1 -2
  71. data/lib/object_monitor_activity.rb +1 -2
  72. data/lib/observable.rb +1 -2
  73. data/lib/observable_pool.rb +1 -2
  74. data/lib/{orderedhash.rb → ordered_hash.rb} +41 -5
  75. data/lib/pp_hierarchy.rb +7 -2
  76. data/lib/r_path.rb +307 -0
  77. data/lib/random_generators.rb +7 -20
  78. data/lib/random_generators/random_generator.rb +2 -4
  79. data/lib/random_generators/ruby.rb +4 -2
  80. data/lib/regex_path.rb +124 -0
  81. data/lib/ruby_ex.rb +28 -98
  82. data/lib/safe_eval.rb +1 -2
  83. data/lib/sendmail.rb +14 -17
  84. data/lib/service_manager.rb +1 -2
  85. data/lib/shuffle.rb +6 -2
  86. data/lib/spring.rb +1 -2
  87. data/lib/spring_set.rb +1 -2
  88. data/lib/{symtbl.rb → sym_tbl.rb} +90 -5
  89. data/lib/sym_tbl_gsub.rb +227 -0
  90. data/lib/{synflow.rb → syn_flow.rb} +1 -2
  91. data/lib/text.rb +218 -0
  92. data/lib/timeout_ex.rb +1 -2
  93. data/lib/trace.rb +9 -8
  94. data/lib/uri/druby.rb +1 -2
  95. data/lib/uri/file.rb +1 -1
  96. data/lib/uri/ftp_ex.rb +1 -1
  97. data/lib/uri/http_ex.rb +1 -1
  98. data/lib/uri/mysql.rb +121 -0
  99. data/lib/uri/pgsql.rb +19 -38
  100. data/lib/uri/svn.rb +1 -2
  101. data/lib/uri_ex.rb +45 -3
  102. data/lib/verbose_object.rb +181 -38
  103. data/lib/yaml/chop_header.rb +19 -11
  104. data/lib/yaml/transform.rb +17 -11
  105. data/lib/yaml/yregexpath.rb +11 -5
  106. data/test/algorithms/simulated_annealing_test.rb +2 -2
  107. data/test/resources/foo.tar.gz +0 -0
  108. data/test/resources/tar.gz.log +49 -0
  109. data/test/sanity-suite.yml +5 -7
  110. data/test/sanity/multiple-requires.yml +17 -7
  111. data/test/sanity/single-requires.yml +38 -20
  112. data/test/stress-tests/threads_and_exceptions.yml +13 -0
  113. data/test/test-unit-setup.rb +3 -1
  114. data/test/unit-suite.yml +7 -8
  115. metadata +42 -31
  116. data/lib/algorithms.rb +0 -12
  117. data/lib/ask.rb +0 -100
  118. data/lib/checkout.rb +0 -12
  119. data/lib/dumpable_proc.rb +0 -57
  120. data/lib/filetype.rb +0 -229
  121. data/lib/thread_mutex.rb +0 -11
  122. data/lib/yaml/basenode_ext.rb +0 -63
data/NEWS CHANGED
@@ -1,3 +1,77 @@
1
+ = New in 0.2, 2005-09-16:
2
+
3
+ * Many many changes and new things for RubyEx.
4
+
5
+ * Remove many requires which are now useless, many are not yet
6
+ suppressed.
7
+
8
+ * Renaming to follow the camelize/underscore convention.
9
+
10
+ * Commands:
11
+ Provides a object oriented way to manage, combine and run your commands.
12
+
13
+ Example:
14
+ require 'rubygems' ; require_gem 'ruby_ex' ; require 'ruby_ex'
15
+ Commands.import!
16
+ ls, wc, out = 'ls'.to_cmd, 'wc'.to_cmd, 'out'.to_path
17
+
18
+ data = ls.system # other runners exist (exec, fork, sh...)
19
+
20
+ p data.status
21
+ puts data.output.read
22
+
23
+ (ls > STDOUT).system
24
+
25
+ cmd = ls['*.rb'] | wc['-l'] > out
26
+ cmd.system
27
+
28
+ puts out.read
29
+
30
+ * RPath: Add RPath, a basic (but powerful) way to search your ruby data.
31
+
32
+ * BlankSlate, Mocks, VerboseObject, and AutoObject:
33
+
34
+ - BlankSlate: For method_missing based classes.
35
+ - Mocks::Mock: Abstract mock.
36
+ - Mocks::Object: Save all method calls.
37
+ - Mocks::Observer: Respond to update.
38
+ - Mocks::Assertions: Helpers for unit tests which use these classes.
39
+ - Mocks::MethodLogger: Respond to log and treat arguments as a method call.
40
+ - VerboseObject: Proxies that display received method calls and verbosify
41
+ objects recursivly.
42
+ - AutoObject: It's like a verbose object without a real object inside.
43
+
44
+ * Text:
45
+ A little text manipulation class.
46
+ Transformation available are:
47
+ - justifying
48
+ - spliting
49
+ - croping
50
+ - clipping
51
+
52
+ * FileType:
53
+ - Use the Commands module.
54
+ - Add extractable? and installable? methods.
55
+ - Add priorities for extensions.
56
+ - Clean the declaration syntax for extensions.
57
+ - Add many unit tests.
58
+ - Add gem filetype support (with the install method).
59
+
60
+ * MetaFactory: A class that help to produce objects that
61
+ share the same initializion step.
62
+
63
+ * Html encode: Support accent encoding for the iso latin1 charset.
64
+
65
+ * URI: Support for Mysql and Pgsql.
66
+
67
+ * HashEval:
68
+ Provides a block in which methods name are keys and arguments/blocks
69
+ are values.
70
+
71
+ * SymTbl (Symbol Table):
72
+ Add symtbl_gsub methods to provide a global substitution sheme over any
73
+ objects.
74
+
1
75
  = New in 0.1, 2005-05-31:
2
76
 
3
77
  Initial Release.
data/SPEC.dyn.yml CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:OpenStruct
2
2
  table:
3
- :date: "Sun, 05 Jun 2005"
4
- :version: !ruby/object:Version
5
- build: 2
6
- major: 0
7
- minor: 1
8
- revision: 282
9
3
  :version_id: ''
10
4
  :url: svn://svn.feydakins.org/ruby_ex/trunk
5
+ :version: !ruby/object:Version
6
+ build: 0
7
+ major: 0
8
+ minor: 2
9
+ revision: 360
10
+ :date: "Fri, 16 Sep 2005"
data/SPEC.gemspec ADDED
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{ruby_ex}
3
+ s.version = "0.2.0"
4
+ s.date = %q{2005-09-16}
5
+ s.summary = %q{RubyEx contains general purpose Ruby extensions.}
6
+ s.email = ["nicolas.despres@gmail.com", "ertai@feydakins.org"]
7
+ s.homepage = %q{http://api.feydakins.org/ruby_ex}
8
+ s.rubyforge_project = %q{ruby_ex}
9
+ s.description = %q{}
10
+ s.authors = ["Nicolas Despr\350s", "Nicolas Pouillard"]
11
+ s.files = ["lib/abstract.rb", "lib/abstract_node.rb", "lib/attributed_class.rb", "lib/auto_object.rb", "lib/blank_slate.rb", "lib/cache.rb", "lib/choose.rb", "lib/commands.rb", "lib/config_file.rb", "lib/const_regexp.rb", "lib/d_logger.rb", "lib/daemon.rb", "lib/diff.rb", "lib/drb_ex.rb", "lib/file_type.rb", "lib/generate_id.rb", "lib/genpasswd.rb", "lib/hash_eval.rb", "lib/histogram.rb", "lib/hookable.rb", "lib/hooker.rb", "lib/html_encode.rb", "lib/indexed_node.rb", "lib/io_marshal.rb", "lib/ioo.rb", "lib/kill_all.rb", "lib/labeled_node.rb", "lib/logger_observer.rb", "lib/md5sum.rb", "lib/meta_factory.rb", "lib/method_call.rb", "lib/mocks.rb", "lib/node.rb", "lib/object_monitor.rb", "lib/object_monitor_activity.rb", "lib/observable.rb", "lib/observable_pool.rb", "lib/ordered_hash.rb", "lib/pp_hierarchy.rb", "lib/r_path.rb", "lib/random_generators.rb", "lib/regex_path.rb", "lib/ruby_ex.rb", "lib/safe_eval.rb", "lib/sendmail.rb", "lib/service_manager.rb", "lib/shuffle.rb", "lib/spring.rb", "lib/spring_set.rb", "lib/sym_tbl.rb", "lib/sym_tbl_gsub.rb", "lib/syn_flow.rb", "lib/text.rb", "lib/timeout_ex.rb", "lib/trace.rb", "lib/uri_ex.rb", "lib/verbose_object.rb", "lib/algorithms/simulated_annealing.rb", "lib/commands/command.rb", "lib/commands/datas.rb", "lib/commands/factory.rb", "lib/commands/helpers.rb", "lib/commands/pipe.rb", "lib/commands/runners.rb", "lib/commands/seq.rb", "lib/commands/datas/composite.rb", "lib/commands/datas/data.rb", "lib/commands/datas/factory.rb", "lib/commands/datas/temp.rb", "lib/commands/runners/exec.rb", "lib/commands/runners/fork.rb", "lib/commands/runners/mock.rb", "lib/commands/runners/runner.rb", "lib/commands/runners/system.rb", "lib/drb/drb_observable.rb", "lib/drb/drb_observable_pool.rb", "lib/drb/drb_service.rb", "lib/drb/drb_undumped_attributes.rb", "lib/drb/drb_undumped_indexed_object.rb", "lib/drb/insecure_protected_methods.rb", "lib/mocks/assertions.rb", "lib/mocks/method_logger.rb", "lib/mocks/mock.rb", "lib/mocks/object.rb", "lib/mocks/observer.rb", "lib/module/autoload_tree.rb", "lib/module/hierarchy.rb", "lib/module/instance_method_visibility.rb", "lib/random_generators/random_generator.rb", "lib/random_generators/ruby.rb", "lib/uri/druby.rb", "lib/uri/file.rb", "lib/uri/ftp_ex.rb", "lib/uri/http_ex.rb", "lib/uri/mysql.rb", "lib/uri/pgsql.rb", "lib/uri/ssh.rb", "lib/uri/svn.rb", "lib/yaml/chop_header.rb", "lib/yaml/transform.rb", "lib/yaml/yregexpath.rb", "test/algorithms", "test/check-pkg-ruby_ex.yml", "test/check-ruby_ex.yml", "test/resources", "test/sanity", "test/sanity-suite.yml", "test/stress-tests", "test/test-unit-setup.rb", "test/unit-suite.yml", "test/algorithms/simulated_annealing_test.rb", "test/resources/autoload_tree", "test/resources/foo.tar.gz", "test/resources/foo.txt", "test/resources/tar.gz.log", "test/resources/autoload_tree/A.rb", "test/resources/autoload_tree/B.rb", "test/resources/autoload_tree/foo", "test/resources/autoload_tree/foo/C.rb", "test/sanity/multiple-requires.yml", "test/sanity/single-requires.yml", "test/stress-tests/threads_and_exceptions.yml", "AUTHORS", "ChangeLog", "NEWS", "Rakefile", "README", "SPEC.dyn.yml", "SPEC.gemspec", "SPEC.yml"]
12
+ s.add_dependency(%q<highline>, ["~> 1.0.1"])
13
+ s.add_dependency(%q<core_ex>, ["~> 0.3.1"])
14
+ end
data/SPEC.yml CHANGED
@@ -22,7 +22,7 @@ rdoc_files: !filelist
22
22
  - README
23
23
  - AUTHORS
24
24
  - NEWS
25
- - src/**/*.rb
25
+ - lib/**/*.rb
26
26
 
27
27
  pkg_files: !filelist
28
28
  - lib/**/*.rb
@@ -30,7 +30,7 @@ pkg_files: !filelist
30
30
  - '[A-Z]*'
31
31
 
32
32
  dependencies:
33
- core_ex: ~> 0.1.3
34
- activesupport: ~> 1.0.4
35
- # ttk: ~> 0.2.0
33
+ core_ex: [~> 0.3.1, 6077/core_ex-0.3.1.tar.gz]
34
+ highline: [~> 1.0.1, 5143/highline-1.0.1.tgz]
36
35
 
36
+ ttk_version: ~> 0.3.0
data/lib/abstract.rb CHANGED
@@ -3,14 +3,12 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: abstract.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: abstract.rb 343 2005-09-08 01:32:57Z ertai $
7
7
 
8
8
 
9
9
  #FIXME: find a way to be thread safe.
10
10
 
11
-
12
- require 'module/instance_method_visibility'
13
- require 'ruby_ex'
11
+ InstanceMethodVisibility.import!
14
12
 
15
13
 
16
14
  module Concrete; end
data/lib/abstract_node.rb CHANGED
@@ -3,10 +3,9 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: abstract_node.rb 279 2005-06-05 17:46:53Z ertai $
6
+ # $Id: abstract_node.rb 339 2005-09-06 23:27:27Z ertai $
7
7
 
8
8
 
9
- require 'ruby_ex'
10
9
  require 'abstract'
11
10
 
12
11
  class AbstractNode
@@ -3,13 +3,12 @@
3
3
  # License:: GNU General Public License (GPL).
4
4
  # Revision:: $Id$
5
5
 
6
- require 'ruby_ex'
7
6
  require 'choose'
8
7
 
9
8
  module Algorithms
10
9
 
11
10
  class SimulatedAnnealing
12
-
11
+
13
12
  # Example:
14
13
  #
15
14
  # obj = MySimulatedAnnealingObject.new
@@ -39,50 +38,72 @@ module Algorithms
39
38
  @iteration = 0
40
39
  @probability_threshold = 0
41
40
  end
42
-
43
-
41
+
42
+ @@zeros = [0.0] * 8
43
+
44
+ def reset
45
+ @up, @down, @same, @reject, @proba_mean, @proba_mean_count,
46
+ @threshold_mean, @threshold_mean_count = @@zeros
47
+ end
48
+
49
+
44
50
  def run
51
+ reset
45
52
  @output.puts '---'
46
53
  while @cur_cost > @global_thresold
47
54
  # puts "Iteration(#{it}) #{@cur_cost}"
48
55
  @transition = @support.choose_transition(@generator)
49
56
  @diff_cost = @support.transition_cost(@cur_cost, @transition)
50
-
57
+
51
58
  @iteration += 1
52
59
  if (@iteration % @step_modulus).zero?
53
- @temperature *= @step_multiplicator
60
+ @temperature *= @step_multiplicator
54
61
  end
55
62
 
56
63
  if @diff_cost > 0
57
64
  @probability_threshold = Math.exp(- @diff_cost.to_f / @temperature)
58
65
  @proba = choose_probability(@generator)
66
+ @proba_mean += @proba
67
+ @proba_mean_count += 1
68
+ @threshold_mean += @probability_threshold
69
+ @threshold_mean_count += 1
59
70
  if @proba < @probability_threshold
60
71
  progression '+'
72
+ @up += 1
61
73
  else
62
74
  progression ' '
75
+ @reject += 1
63
76
  next
64
77
  end
65
78
  else
66
79
  @probability_threshold = 1
67
80
  @proba = 1
68
- progression((@diff_cost.zero?)? '=' : '-')
81
+ if @diff_cost.zero?
82
+ @same += 1
83
+ progression '='
84
+ else
85
+ @down += 1
86
+ progression '-'
87
+ end
69
88
  end
70
89
 
71
90
  @support.apply_transition(@transition)
72
91
  @cur_cost += @diff_cost
73
92
  end
74
93
  end
75
-
76
-
94
+
95
+
77
96
  def disp ( output=@output )
78
- args = [ @progression, @diff_cost.abs, @temperature,
79
- @proba, @probability_threshold, @cur_cost ]
80
- fmt = '- { diff: %s%-7d, temp: %-4f, ' +
97
+ args = [ @up, @same, @down, @reject, @temperature,
98
+ @proba_mean / @proba_mean_count,
99
+ @threshold_mean / @threshold_mean_count, @cur_cost ]
100
+ fmt = '- { "+%-5d|=%-5d|-%-5d|x%-5d", temp: %-4f, ' +
81
101
  'prob: %-7f, thres: %-7f, cost: %-5s }'
82
102
  output.puts fmt % args
103
+ reset
83
104
  end
84
-
85
-
105
+
106
+
86
107
  def summary
87
108
  @output.puts %Q[
88
109
  |---
@@ -91,52 +112,52 @@ module Algorithms
91
112
  |Nb iterations: #@iteration
92
113
  ].head_cut!
93
114
  end
94
-
95
-
115
+
116
+
96
117
  def progression ( x )
97
118
  @progression = x
98
119
  disp if (@iteration % @iteration_modulus).zero?
99
120
  end
100
-
101
-
121
+
122
+
102
123
  def choose_probability ( generator=nil )
103
124
  1.0.choose(generator)
104
125
  end
105
-
106
-
126
+
127
+
107
128
  module Support
108
-
129
+
109
130
  def included ( aModule )
110
-
131
+
111
132
  aModule.module_eval do
112
-
133
+
113
134
  #
114
135
  # Return a transition which can be applied by apply_transition.
115
136
  #
116
137
  def choose_transition ( generator=nil )
117
138
  raise NotImplementedError
118
139
  end
119
-
140
+
120
141
  #
121
142
  # Return a cost difference
122
143
  #
123
144
  def transition_cost ( current_cost, transition )
124
145
  raise NotImplementedError
125
146
  end
126
-
147
+
127
148
  #
128
149
  # Apply the given transition to your current object.
129
150
  #
130
151
  def apply_transition ( transition )
131
152
  raise NotImplementedError
132
153
  end
133
-
154
+
134
155
  end
135
-
156
+
136
157
  end
137
-
158
+
138
159
  end # module Support
139
-
160
+
140
161
  end # class SimulatedAnnealing
141
162
 
142
163
  end # module Algorithms
@@ -1,10 +1,9 @@
1
1
  # Copyright:: Copyright (c) 2004, 2005 Nicolas Pouillard. All rights reserved.
2
2
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
3
  # License:: Gnu General Public License.
4
- # Revision:: $Id: attributed_class.rb 279 2005-06-05 17:46:53Z ertai $
4
+ # Revision:: $Id: attributed_class.rb 339 2005-09-06 23:27:27Z ertai $
5
5
 
6
6
 
7
- require 'ruby_ex'
8
7
 
9
8
  # Extension to have inherited, class attributes,
10
9
  # Where each class have his own attributes set.
@@ -85,7 +84,7 @@ module AttributedClass
85
84
  end
86
85
 
87
86
  def valid? ( anObject )
88
- return false if mandatory? and anObject.nil?
87
+ return ! mandatory? if anObject.nil?
89
88
  @klass.nil? or @klass.empty? or @klass.any? { |k| anObject.is_a? k }
90
89
  end
91
90
 
@@ -93,8 +92,8 @@ module AttributedClass
93
92
  def self.set_default_proc ( &block )
94
93
  @@default_proc = block
95
94
  end
96
-
97
-
95
+
96
+
98
97
  def help ( output=STDERR )
99
98
  output << "#@name: #@descr"
100
99
  output << " [#@klass]" unless @klass.nil?
@@ -109,6 +108,33 @@ module AttributedClass
109
108
  help('#<') + '>'
110
109
  end
111
110
 
111
+ def to_form ( b )
112
+ if (!@default.nil?) or @klass.nil?
113
+ gfx = @default
114
+ elsif @klass.is_a? Array and @klass.size == 1
115
+ gfx = @klass.first.default_instance
116
+ else
117
+ gfx = @klass
118
+ end
119
+ gfx = gfx.to_gfx_element
120
+ gfx.object = 'test'
121
+ gfx.builder = b
122
+ gfx.attribute = self
123
+ gfx.to_form
124
+ end
125
+
126
+ def compute_default ( default_proc_args )
127
+ unless @default_proc.nil?
128
+ pr = @default_proc
129
+ if pr.arity == default_proc_args.size
130
+ @default = pr[*default_proc_args]
131
+ else
132
+ @default = pr[self, *default_proc_args]
133
+ end
134
+ end
135
+ return @default
136
+ end
137
+
112
138
  end # class Attribute
113
139
 
114
140
 
@@ -137,10 +163,10 @@ module AttributedClass
137
163
 
138
164
  def initialize ( anObject, anAttr, val=nil )
139
165
  if val.nil?
140
- super "Missing the #{anAttr.name} attribute for `#{anObject}'"
166
+ super "Missing the `#{anAttr.name}' attribute for `#{anObject}'"
141
167
  else
142
- super "Attribute #{anAttr.name} wait for a `#{anAttr.klass}' not " +
143
- "`#{val}' in #{anObject}"
168
+ super "Attribute `#{anAttr.name}' wait for a " +
169
+ "`#{anAttr.klass.join(' or ')}' not `#{val}' in #{anObject}"
144
170
  end
145
171
  end
146
172
 
@@ -154,19 +180,11 @@ module AttributedClass
154
180
  def initialize_attributes ( *default_proc_args )
155
181
  self.class.attributes.each do |attr|
156
182
  next if attr.is_a? MethodAttribute
157
- if attr.default_proc.nil? and attr.default.nil?
183
+ default = attr.compute_default(default_proc_args)
184
+ if default.nil?
158
185
  instance_variable_set("@#{attr.name}", nil)
159
186
  else
160
- unless attr.default_proc.nil?
161
- pr = attr.default_proc
162
- if pr.arity == default_proc_args.size
163
- default = pr[*default_proc_args]
164
- else
165
- default = pr[attr, *default_proc_args]
166
- end
167
- attr.default = default
168
- end
169
- send "#{attr.name}=", attr.default
187
+ send "#{attr.name}=", default
170
188
  end
171
189
  end
172
190
  end
@@ -231,7 +249,19 @@ module AttributedClass
231
249
  if att = get_attribute(name, MethodAttribute)
232
250
  attributes.delete(att)
233
251
  end
234
- attr_reader name
252
+ class_eval <<-"end;", __FILE__, __LINE__
253
+ def #{name}(arg=nil, &block)
254
+ if arg.nil?
255
+ if block.nil?
256
+ @#{name}
257
+ else
258
+ self.#{name} = block[]
259
+ end
260
+ else
261
+ self.#{name} = arg
262
+ end
263
+ end
264
+ end;
235
265
  end
236
266
  meth = "#{name}="
237
267
  unless method_defined? meth
@@ -282,7 +312,6 @@ test_section __FILE__ do
282
312
  end
283
313
  cc, d, dd = nil, nil, nil
284
314
  assert_nothing_raised { cc = c.new }
285
- assert_equal(nil, cc.foo)
286
315
  assert_nothing_raised { cc.initialize_attributes }
287
316
  assert_equal(42, cc.foo)
288
317
  assert_nothing_raised { cc.foo = 32 }