ruby_ex 0.1.2 → 0.2.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.
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 }