loquacious 1.6.4 → 1.7.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.
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 1.7.0 / 2010-08-16
2
+
3
+ * Enhancements
4
+ * Adding a "copy" function for configuration objects
5
+ * Bug Fixes
6
+ * Fixing warnings
7
+
1
8
  == 1.6.4 / 2010-06-08
2
9
 
3
10
  * Bug Fixes
@@ -47,19 +47,19 @@ module Loquacious
47
47
  alias :help :help_for
48
48
  end
49
49
 
50
- Keepers = %r/^__|^object_id$|^initialize$|^\w+\?$/
51
50
  instance_methods(true).each do |m|
52
- next if m[Keepers]
51
+ next if m[::Loquacious::KEEPERS]
53
52
  undef_method m
54
53
  end
55
54
  Kernel.methods.each do |m|
56
- next if m[Keepers]
55
+ next if m[::Loquacious::KEEPERS]
57
56
  module_eval <<-CODE
58
57
  def #{m}( *args, &block )
59
58
  self.method_missing('#{m}', *args, &block)
60
59
  end
61
60
  CODE
62
61
  end
62
+ undef_method :method_missing rescue nil
63
63
 
64
64
  # Accessor for the description hash.
65
65
  attr_reader :__desc
@@ -185,21 +185,22 @@ module Loquacious
185
185
  alias :__instance_eval :instance_eval
186
186
 
187
187
  instance_methods(true).each do |m|
188
- next if m[Keepers]
188
+ next if m[::Loquacious::KEEPERS]
189
189
  undef_method m
190
190
  end
191
191
  private_instance_methods(true).each do |m|
192
- next if m[Keepers]
192
+ next if m[::Loquacious::KEEPERS]
193
193
  undef_method m
194
194
  end
195
195
  Kernel.methods.each do |m|
196
- next if m[Keepers]
196
+ next if m[::Loquacious::KEEPERS]
197
197
  module_eval <<-CODE
198
198
  def #{m}( *args, &block )
199
199
  self.method_missing('#{m}', *args, &block)
200
200
  end
201
201
  CODE
202
202
  end
203
+ undef_method :method_missing rescue nil
203
204
 
204
205
  # Create a new DSL and evaluate the given _block_ in the context of
205
206
  # the DSL. Returns a newly created configuration object.
@@ -12,23 +12,23 @@ module Loquacious
12
12
  #
13
13
  class Undefined
14
14
 
15
- Keepers = %r/^__|^object_id$|^initialize$|^call$|^\w+\?$/
16
15
  instance_methods(true).each do |m|
17
- next if m[Keepers]
16
+ next if m[::Loquacious::KEEPERS]
18
17
  undef_method m
19
18
  end
20
19
  private_instance_methods(true).each do |m|
21
- next if m[Keepers]
20
+ next if m[::Loquacious::KEEPERS]
22
21
  undef_method m
23
22
  end
24
23
  Kernel.methods.each do |m|
25
- next if m[Keepers]
24
+ next if m[::Loquacious::KEEPERS]
26
25
  module_eval <<-CODE
27
26
  def #{m}( *args, &block )
28
27
  self.method_missing('#{m}', *args, &block)
29
28
  end
30
29
  CODE
31
30
  end
31
+ undef_method :method_missing rescue nil
32
32
 
33
33
  @io = $stderr
34
34
  @first_time = true
@@ -84,7 +84,7 @@ information about the undefined properties.
84
84
  def method_missing( method, *args, &block )
85
85
  key = @key.dup << method.to_s
86
86
  Undefined.warn key
87
- return Undefined.new key
87
+ return Undefined.new(key)
88
88
  end
89
89
 
90
90
  end # class Undefined
data/lib/loquacious.rb CHANGED
@@ -4,6 +4,9 @@ module Loquacious
4
4
  # :stopdoc:
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ KEEPERS = (RUBY_PLATFORM == 'java') ?
8
+ %r/^__|^object_id$|^initialize$|^singleton_method_added$|^\w+\?$/ :
9
+ %r/^__|^object_id$|^initialize$|^\w+\?$/
7
10
  # :startdoc:
8
11
 
9
12
  class << self
@@ -78,6 +81,7 @@ module Loquacious
78
81
  #
79
82
  # Loquacious.remove :gem # courtesy of rubygems
80
83
  # Loquacious.remove :test, :file # courtesy of rake
84
+ # Loquacious.remove :main # courtesy of main
81
85
  #
82
86
  def remove( *args )
83
87
  args.each { |name|
@@ -91,6 +95,41 @@ module Loquacious
91
95
  }
92
96
  end
93
97
 
98
+ # A helper method that will create a deep copy of a given Configuration
99
+ # object. This method accepts either a Configuration instance or a name
100
+ # that can be used to lookup the Configuration instance (via the
101
+ # "Loquacious.configuration_for" method).
102
+ #
103
+ # Loquacious.copy(config)
104
+ # Loquacious.copy('name')
105
+ #
106
+ # Optionally a block can be given. It will be used to modify the returned
107
+ # copy with the given values. The Configuration object being copied is
108
+ # never modified by this method.
109
+ #
110
+ # Loquacious.copy(config) {
111
+ # foo 'bar'
112
+ # baz 'buz'
113
+ # }
114
+ #
115
+ def copy( config, &block )
116
+ config = Configuration.for(config) unless config.instance_of? Configuration
117
+ return unless config
118
+
119
+ rv = Configuration.new
120
+ rv.merge!(config)
121
+
122
+ # deep copy
123
+ rv.__desc.each do |key,desc|
124
+ value = rv.__send(key)
125
+ next unless value.instance_of? Configuration
126
+ rv.__send("#{key}=", ::Loquacious.copy(value))
127
+ end
128
+
129
+ rv.merge!(Configuration::DSL.evaluate(&block)) if block
130
+ rv
131
+ end
132
+
94
133
  end # class << self
95
134
  end # module Loquacious
96
135
 
@@ -102,4 +141,3 @@ Loquacious.libpath {
102
141
  require 'loquacious/configuration/help'
103
142
  }
104
143
 
105
- # EOF
@@ -17,6 +17,60 @@ describe Loquacious do
17
17
  it "finds things releative to 'root'" do
18
18
  Loquacious.path('Rakefile').should == File.join(@root_dir, 'Rakefile')
19
19
  end
20
+
21
+ describe "when copying configuration objects" do
22
+ it "creates a deep copy" do
23
+ obj = Loquacious::Configuration.new {
24
+ first 'foo'
25
+ second {
26
+ bar 'baz'
27
+ }
28
+ }
29
+
30
+ copy = Loquacious.copy obj
31
+ copy.first = 'foobar'
32
+ copy.second.bar = 'buz'
33
+
34
+ obj.first.should == 'foo'
35
+ obj.second.bar.should == 'baz'
36
+ copy.first.should == 'foobar'
37
+ copy.second.bar.should == 'buz'
38
+ end
39
+
40
+ it "looks up a configuration object by name" do
41
+ Loquacious.config_for('by name') {
42
+ first 'foo'
43
+ second {
44
+ bar 'baz'
45
+ }
46
+ }
47
+
48
+ copy = Loquacious.copy('by name')
49
+ copy.first.should == 'foo'
50
+ copy.second.bar.should == 'baz'
51
+ end
52
+
53
+ it "returns nil when a configuration object cannot be found" do
54
+ Loquacious.copy('does not exist').should be_nil
55
+ end
56
+
57
+ it "overrides options with a block" do
58
+ Loquacious.config_for('another by name') {
59
+ first 'foo'
60
+ second {
61
+ bar 'baz'
62
+ }
63
+ }
64
+
65
+ copy = Loquacious.copy('another by name') {
66
+ second { bar 'foobar' }
67
+ third "hey I'm new"
68
+ }
69
+
70
+ copy.first.should == 'foo'
71
+ copy.second.bar.should == 'foobar'
72
+ copy.third.should == "hey I'm new"
73
+ end
74
+ end
20
75
  end
21
76
 
22
- # EOF
data/version.txt CHANGED
@@ -1 +1 @@
1
- 1.6.4
1
+ 1.7.0
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loquacious
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 11
4
5
  prerelease: false
5
6
  segments:
6
7
  - 1
7
- - 6
8
- - 4
9
- version: 1.6.4
8
+ - 7
9
+ - 0
10
+ version: 1.7.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Tim Pease
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-06-08 00:00:00 -06:00
18
+ date: 2010-08-16 00:00:00 -06:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rspec
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 27
27
30
  segments:
28
31
  - 1
29
32
  - 3
@@ -116,23 +119,27 @@ rdoc_options:
116
119
  require_paths:
117
120
  - lib
118
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
119
123
  requirements:
120
124
  - - ">="
121
125
  - !ruby/object:Gem::Version
126
+ hash: 3
122
127
  segments:
123
128
  - 0
124
129
  version: "0"
125
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
126
132
  requirements:
127
133
  - - ">="
128
134
  - !ruby/object:Gem::Version
135
+ hash: 3
129
136
  segments:
130
137
  - 0
131
138
  version: "0"
132
139
  requirements: []
133
140
 
134
141
  rubyforge_project: codeforpeople
135
- rubygems_version: 1.3.6
142
+ rubygems_version: 1.3.7
136
143
  signing_key:
137
144
  specification_version: 3
138
145
  summary: Descriptive configuration files for Ruby written in Ruby