aquarium 0.4.0 → 0.4.1
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/CHANGES +26 -5
- data/README +8 -8
- data/RELEASE-PLAN +20 -2
- data/TODO.rb +26 -0
- data/UPGRADE +5 -5
- data/examples/aspect_design_example.rb +1 -1
- data/examples/aspect_design_example_spec.rb +1 -1
- data/examples/design_by_contract_example.rb +4 -9
- data/examples/design_by_contract_example_spec.rb +7 -9
- data/examples/exception_wrapping_example.rb +48 -0
- data/examples/exception_wrapping_example_spec.rb +49 -0
- data/examples/reusable_aspect_hack_example.rb +56 -0
- data/examples/reusable_aspect_hack_example_spec.rb +80 -0
- data/lib/aquarium.rb +1 -0
- data/lib/aquarium/aspects.rb +1 -1
- data/lib/aquarium/aspects/advice.rb +16 -13
- data/lib/aquarium/aspects/aspect.rb +81 -56
- data/lib/aquarium/aspects/join_point.rb +4 -4
- data/lib/aquarium/aspects/pointcut.rb +49 -73
- data/lib/aquarium/dsl.rb +2 -0
- data/lib/aquarium/dsl/aspect_dsl.rb +77 -0
- data/lib/aquarium/{aspects/dsl → dsl}/object_dsl.rb +2 -2
- data/lib/aquarium/extras/design_by_contract.rb +1 -1
- data/lib/aquarium/finders.rb +1 -1
- data/lib/aquarium/finders/method_finder.rb +26 -26
- data/lib/aquarium/finders/type_finder.rb +45 -39
- data/lib/aquarium/utils/array_utils.rb +6 -5
- data/lib/aquarium/utils/default_logger.rb +2 -1
- data/lib/aquarium/utils/options_utils.rb +178 -67
- data/lib/aquarium/utils/set_utils.rb +8 -3
- data/lib/aquarium/version.rb +1 -1
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +111 -14
- data/spec/aquarium/aspects/aspect_spec.rb +91 -7
- data/spec/aquarium/aspects/pointcut_spec.rb +61 -0
- data/spec/aquarium/{aspects/dsl → dsl}/aspect_dsl_spec.rb +76 -32
- data/spec/aquarium/finders/method_finder_spec.rb +80 -80
- data/spec/aquarium/finders/type_finder_spec.rb +57 -52
- data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +12 -12
- data/spec/aquarium/spec_example_types.rb +4 -3
- data/spec/aquarium/utils/array_utils_spec.rb +9 -7
- data/spec/aquarium/utils/options_utils_spec.rb +106 -5
- data/spec/aquarium/utils/set_utils_spec.rb +14 -0
- metadata +12 -7
- data/lib/aquarium/aspects/dsl.rb +0 -2
- data/lib/aquarium/aspects/dsl/aspect_dsl.rb +0 -64
@@ -7,6 +7,7 @@ class Outside
|
|
7
7
|
class ReallyInside; end
|
8
8
|
end
|
9
9
|
end
|
10
|
+
class SubOutside < Outside; end
|
10
11
|
|
11
12
|
describe Aquarium::Finders::TypeFinder, "#find invocation parameters" do
|
12
13
|
|
@@ -18,16 +19,18 @@ describe Aquarium::Finders::TypeFinder, "#find invocation parameters" do
|
|
18
19
|
lambda { Aquarium::Finders::TypeFinder.new.find "foo" }.should raise_error(Aquarium::Utils::InvalidOptions)
|
19
20
|
end
|
20
21
|
|
21
|
-
it "should raise if the input type value is nil." do
|
22
|
-
lambda { Aquarium::Finders::TypeFinder.new.find :type => nil }.should raise_error(Aquarium::Utils::InvalidOptions)
|
23
|
-
end
|
24
|
-
|
25
22
|
it "should return no matched types and no unmatched type expressions by default (i.e., the input is empty)." do
|
26
23
|
actual = Aquarium::Finders::TypeFinder.new.find
|
27
24
|
actual.matched.should == {}
|
28
25
|
actual.not_matched.should == {}
|
29
26
|
end
|
30
27
|
|
28
|
+
it "should return no matched types and no unmatched type expressions if nil is specified for the types." do
|
29
|
+
actual = Aquarium::Finders::TypeFinder.new.find :type => nil
|
30
|
+
actual.matched.should == {}
|
31
|
+
actual.not_matched.should == {}
|
32
|
+
end
|
33
|
+
|
31
34
|
it "should return no matched types and no unmatched type expressions if the input hash is empty." do
|
32
35
|
actual = Aquarium::Finders::TypeFinder.new.find {}
|
33
36
|
actual.matched.should == {}
|
@@ -62,51 +65,33 @@ describe Aquarium::Finders::TypeFinder, "#find invocation parameters" do
|
|
62
65
|
end
|
63
66
|
end
|
64
67
|
|
65
|
-
describe Aquarium::Finders::TypeFinder, "#
|
66
|
-
|
67
|
-
it "should be true for :names, :types, :name, :type (synonyms), as strings or symbols." do
|
68
|
-
%w[name type names types].each do |s|
|
69
|
-
Aquarium::Finders::TypeFinder.is_recognized_option(s).should == true
|
70
|
-
Aquarium::Finders::TypeFinder.is_recognized_option(s.to_sym).should == true
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should be false for unknown options." do
|
75
|
-
%w[public2 wierd unknown string method object].each do |s|
|
76
|
-
Aquarium::Finders::TypeFinder.is_recognized_option(s).should == false
|
77
|
-
Aquarium::Finders::TypeFinder.is_recognized_option(s.to_sym).should == false
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
describe Aquarium::Finders::TypeFinder, "#find with :type or :name used to specify a single type" do
|
68
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types used to specify a single type" do
|
84
69
|
it "should find a type matching a simple name (without :: namespace delimiters) using its name and the :type option." do
|
85
|
-
actual = Aquarium::Finders::TypeFinder.new.find :
|
70
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types => :Object
|
86
71
|
actual.matched_keys.should == [Object]
|
87
72
|
actual.not_matched.should == {}
|
88
73
|
end
|
89
74
|
|
90
75
|
it "should find a type matching a simple name (without :: namespace delimiters) using its name and the :name option." do
|
91
|
-
actual = Aquarium::Finders::TypeFinder.new.find :
|
76
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types => :Object
|
92
77
|
actual.matched_keys.should == [Object]
|
93
78
|
actual.not_matched.should == {}
|
94
79
|
end
|
95
80
|
|
96
81
|
it "should return an empty match for a simple name (without :: namespace delimiters) that doesn't match an existing type." do
|
97
|
-
actual = Aquarium::Finders::TypeFinder.new.find :
|
82
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types => :Unknown
|
98
83
|
actual.matched.should == {}
|
99
84
|
actual.not_matched_keys.should == [:Unknown]
|
100
85
|
end
|
101
86
|
|
102
87
|
it "should find a type matching a name with :: namespace delimiters using its name." do
|
103
|
-
actual = Aquarium::Finders::TypeFinder.new.find :
|
88
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types => "Outside::Inside1"
|
104
89
|
actual.matched_keys.should == [Outside::Inside1]
|
105
90
|
actual.not_matched.should == {}
|
106
91
|
end
|
107
92
|
end
|
108
|
-
|
109
|
-
describe Aquarium::Finders::TypeFinder, "#find with :types
|
93
|
+
|
94
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types used to specify one or more names" do
|
110
95
|
it "should find types matching simple names (without :: namespace delimiters) using their names." do
|
111
96
|
expected_found_types = [Class, Kernel, Module, Object]
|
112
97
|
expected_unfound_exps = %w[TestCase Unknown1 Unknown2]
|
@@ -124,7 +109,7 @@ describe Aquarium::Finders::TypeFinder, "#find with :types, :names, :type, and :
|
|
124
109
|
end
|
125
110
|
end
|
126
111
|
|
127
|
-
describe Aquarium::Finders::TypeFinder, "#find with :types
|
112
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types used to specify one or more regular expressions" do
|
128
113
|
it "should find types matching simple names (without :: namespace delimiters) using lists of regular expressions." do
|
129
114
|
expected_found_types = [Class, Kernel, Module, Object]
|
130
115
|
expected_unfound_exps = [/Unknown2/, /^.*TestCase.*$/, /^Unknown1/]
|
@@ -172,6 +157,16 @@ describe Aquarium::Finders::TypeFinder, "#find with :types, :names, :type, and :
|
|
172
157
|
end
|
173
158
|
end
|
174
159
|
|
160
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types" do
|
161
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["types"].reject{|key| key.eql?("types")}.each do |key|
|
162
|
+
it "should accept :#{key} as a synonym for :types." do
|
163
|
+
actual = Aquarium::Finders::TypeFinder.new.find key.intern => "Outside::Inside1"
|
164
|
+
actual.matched_keys.should == [Outside::Inside1]
|
165
|
+
actual.not_matched.should == {}
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
175
170
|
describe Aquarium::Finders::TypeFinder, "#find with :exclude_types" do
|
176
171
|
it "should exclude types specified with a regular expression." do
|
177
172
|
expected_found_types = [Class, Module, Object]
|
@@ -193,35 +188,45 @@ describe Aquarium::Finders::TypeFinder, "#find with :exclude_types" do
|
|
193
188
|
actual.not_matched.size.should == 0
|
194
189
|
end
|
195
190
|
|
196
|
-
|
197
|
-
|
198
|
-
|
191
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["exclude_types"].reject{|key| key.eql?("exclude_types")}.each do |key|
|
192
|
+
it "should accept :#{key} as a synonym for :exclude_types." do
|
193
|
+
expected_found_types = [Class, Module]
|
194
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types => [/K.+l/, /^Mod.+e$/, /^Object$/, /^Clas{2}$/], key.intern => [Kernel, Object]
|
195
|
+
actual.matched_keys.sort_by {|x| x.to_s}.should == expected_found_types.sort_by {|x| x.to_s}
|
196
|
+
actual.not_matched.size.should == 0
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types_and_descendents" do
|
202
|
+
it "should find the types and their descendents." do
|
203
|
+
expected_found_types = [Outside, SubOutside]
|
204
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types_and_descendents => Outside
|
199
205
|
actual.matched_keys.sort_by {|x| x.to_s}.should == expected_found_types.sort_by {|x| x.to_s}
|
200
206
|
actual.not_matched.size.should == 0
|
201
207
|
end
|
202
208
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["types_and_descendents"].reject{|key| key.eql?("types_and_descendents")}.each do |key|
|
210
|
+
it "should accept :#{key} as a synonym for :types_and_descendents." do
|
211
|
+
lambda {actual = Aquarium::Finders::TypeFinder.new.find key.intern => Outside, :noop => true}.should_not raise_error
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
209
215
|
|
210
|
-
|
211
|
-
|
212
|
-
actual = Aquarium::Finders::TypeFinder.new.find :
|
213
|
-
|
216
|
+
describe Aquarium::Finders::TypeFinder, "#find with :types_and_ancestors" do
|
217
|
+
it "should find the types and their ancestors." do
|
218
|
+
actual = Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => SubOutside
|
219
|
+
[Outside, SubOutside, Kernel, Object].each do |x|
|
220
|
+
actual.matched_keys.should include(x)
|
221
|
+
end
|
214
222
|
actual.not_matched.size.should == 0
|
215
223
|
end
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
actual.matched_keys.sort_by {|x| x.to_s}.should == expected_found_types.sort_by {|x| x.to_s}
|
223
|
-
actual.not_matched_keys.should == []
|
224
|
-
end
|
224
|
+
|
225
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["types_and_ancestors"].reject{|key| key.eql?("types_and_ancestors")}.each do |key|
|
226
|
+
it "should accept :#{key} as a synonym for :types_and_ancestors." do
|
227
|
+
lambda {actual = Aquarium::Finders::TypeFinder.new.find key.intern => SubOutside, :noop => true}.should_not raise_error
|
228
|
+
end
|
229
|
+
end
|
225
230
|
end
|
226
231
|
|
227
232
|
|
@@ -21,9 +21,9 @@ describe TypeUtils, "#find types and their descendents, using :types_and_descend
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
Aquarium::Finders::TypeFinder::
|
25
|
-
it "should accept :#{
|
26
|
-
lambda {Aquarium::Finders::TypeFinder.new.find
|
24
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["types_and_descendents"].each do |synonym|
|
25
|
+
it "should accept :#{synonym} as a synonym for :types_and_descendents" do
|
26
|
+
lambda {Aquarium::Finders::TypeFinder.new.find synonym.intern => TypeUtils.sample_types, :noop => true}.should_not raise_error(InvalidOptions)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -39,9 +39,9 @@ describe TypeUtils, "#find types subtracting out excluded types and descendents,
|
|
39
39
|
actual.not_matched_keys.should == []
|
40
40
|
end
|
41
41
|
|
42
|
-
Aquarium::Finders::TypeFinder::
|
43
|
-
it "should accept
|
44
|
-
lambda {Aquarium::Finders::TypeFinder.new.find :types_and_descendents => ModuleForDescendents,
|
42
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["exclude_types_and_descendents"].each do |synonym|
|
43
|
+
it "should accept :#{synonym} as a synonym for :exclude_types_and_descendents" do
|
44
|
+
lambda {Aquarium::Finders::TypeFinder.new.find :types_and_descendents => ModuleForDescendents, synonym.intern => D1ForDescendents, :noop => true}.should_not raise_error(InvalidOptions)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -57,9 +57,9 @@ describe TypeUtils, "#find types and their ancestors, using :types_and_ancestors
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
Aquarium::Finders::TypeFinder::
|
61
|
-
it "should accept :#{
|
62
|
-
lambda {Aquarium::Finders::TypeFinder.new.find
|
60
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["types_and_ancestors"].each do |synonym|
|
61
|
+
it "should accept :#{synonym} as a synonym for :types_and_ancestors" do
|
62
|
+
lambda {Aquarium::Finders::TypeFinder.new.find synonym.intern => TypeUtils.sample_types, :noop => true}.should_not raise_error(InvalidOptions)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -76,9 +76,9 @@ describe TypeUtils, "#find types subtracting out excluded types and ancestors, u
|
|
76
76
|
actual.not_matched_keys.should == []
|
77
77
|
end
|
78
78
|
|
79
|
-
Aquarium::Finders::TypeFinder::
|
80
|
-
it "should accept
|
81
|
-
lambda {Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => D1ForDescendents,
|
79
|
+
Aquarium::Finders::TypeFinder::CANONICAL_OPTIONS["exclude_types_and_ancestors"].each do |synonym|
|
80
|
+
it "should accept :#{synonym} as a synonym for :exclude_types_and_ancestors" do
|
81
|
+
lambda {Aquarium::Finders::TypeFinder.new.find :types_and_ancestors => D1ForDescendents, synonym.intern => ModuleForDescendents, :noop => true}.should_not raise_error(InvalidOptions)
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# :enddoc:
|
2
2
|
|
3
|
-
require 'aquarium/
|
3
|
+
require 'aquarium/dsl/aspect_dsl'
|
4
4
|
|
5
5
|
# Declares classes, etc. that support several different module specs.
|
6
6
|
class ExampleParentClass
|
@@ -101,7 +101,7 @@ class ClassWithAttribs < ExampleParentClass
|
|
101
101
|
end
|
102
102
|
|
103
103
|
class Watchful
|
104
|
-
include Aquarium::
|
104
|
+
include Aquarium::DSL
|
105
105
|
class WatchfulError < Exception
|
106
106
|
def initialize message = nil
|
107
107
|
super
|
@@ -225,7 +225,8 @@ module Aquarium
|
|
225
225
|
include SpecExampleTypes
|
226
226
|
|
227
227
|
def stub_type_utils_descendents
|
228
|
-
@stubbed_type_utils_descendents = Aspect.new :around, :calls_to => :descendents, :on_type => Aquarium::Utils::TypeUtils,
|
228
|
+
@stubbed_type_utils_descendents = Aspect.new :around, :calls_to => :descendents, :on_type => Aquarium::Utils::TypeUtils,
|
229
|
+
:restricting_methods_to => :class_methods do |jp, object, *args|
|
229
230
|
descendents[args[0]]
|
230
231
|
end
|
231
232
|
end
|
@@ -49,24 +49,26 @@ describe Aquarium::Utils::ArrayUtils, "#make_array" do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
describe Aquarium::Utils::ArrayUtils, "#
|
52
|
+
describe Aquarium::Utils::ArrayUtils, "#strip_array_nils" do
|
53
53
|
it "should return an empty array if an input array contains all nils." do
|
54
|
-
|
54
|
+
strip_array_nils([nil, nil]).should == []
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should return an empty array if an input Set contains all nils." do
|
58
|
-
|
58
|
+
strip_array_nils(Set.new([nil, nil])).should == []
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should return an array with all nils removed from the input array." do
|
62
|
-
|
62
|
+
strip_array_nils([nil, 1, 2, nil, 3, 4]).should == [1, 2, 3, 4]
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should return an array with all nils removed from the input Set." do
|
66
|
-
|
66
|
+
strip_array_nils(Set.new([nil, 1, 2, nil, 3, 4])).should == [1, 2, 3, 4]
|
67
67
|
end
|
68
|
+
end
|
68
69
|
|
69
|
-
|
70
|
-
|
70
|
+
describe Aquarium::Utils::ArrayUtils, ".strip_array_nils" do
|
71
|
+
it "should work like the instance method." do
|
72
|
+
Aquarium::Utils::ArrayUtils.strip_array_nils(Set.new([nil, 1, 2, nil, 3, 4])).should == [1, 2, 3, 4]
|
71
73
|
end
|
72
74
|
end
|
@@ -8,10 +8,7 @@ module Aquarium
|
|
8
8
|
class OptionsUtilsUser
|
9
9
|
include OptionsUtils
|
10
10
|
def initialize hash = {}
|
11
|
-
init_specification hash, {}
|
12
|
-
end
|
13
|
-
def all_allowed_option_symbols
|
14
|
-
[]
|
11
|
+
init_specification hash, {}, []
|
15
12
|
end
|
16
13
|
end
|
17
14
|
end
|
@@ -119,4 +116,108 @@ describe OptionsUtils, "#noop=" do
|
|
119
116
|
object.noop = false
|
120
117
|
object.noop.should be_false
|
121
118
|
end
|
122
|
-
end
|
119
|
+
end
|
120
|
+
|
121
|
+
module Aquarium
|
122
|
+
class OptionsUtilsExample
|
123
|
+
include OptionsUtils
|
124
|
+
CANONICAL_OPTIONS = {
|
125
|
+
"foos" => %w[foo foo1 foo2],
|
126
|
+
"bars" => %w[bar bar1 bar2]
|
127
|
+
}
|
128
|
+
def initialize options = {}
|
129
|
+
init_specification options, CANONICAL_OPTIONS
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class OptionsUtilsExampleWithCanonicalOptionsAccessors < OptionsUtilsExample
|
134
|
+
canonical_option_accessor CANONICAL_OPTIONS
|
135
|
+
end
|
136
|
+
class OptionsUtilsExampleWithAccessors < OptionsUtilsExample
|
137
|
+
canonical_option_accessor :foos, :bars
|
138
|
+
end
|
139
|
+
class OptionsUtilsExampleWithReaders < OptionsUtilsExample
|
140
|
+
canonical_option_reader :foos, :bars
|
141
|
+
end
|
142
|
+
class OptionsUtilsExampleWithWriters < OptionsUtilsExample
|
143
|
+
canonical_option_writer :foos, :bars
|
144
|
+
end
|
145
|
+
class OptionsUtilsExampleWithAdditionalAllowedOptions
|
146
|
+
include OptionsUtils
|
147
|
+
CANONICAL_OPTIONS = {
|
148
|
+
"foos" => %w[foo foo1 foo2],
|
149
|
+
"bars" => %w[bar bar1 bar2]
|
150
|
+
}
|
151
|
+
canonical_option_writer :foos, :bars
|
152
|
+
def initialize options = {}
|
153
|
+
init_specification options, CANONICAL_OPTIONS, [:baz, :bbb]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe OptionsUtils, ".canonical_option_accessor" do
|
159
|
+
it "should create a reader and writer method for each option" do
|
160
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("foos")
|
161
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("bars")
|
162
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("foos=")
|
163
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("bars=")
|
164
|
+
end
|
165
|
+
it "should accept individual options" do
|
166
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("foos")
|
167
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("bars")
|
168
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("foos=")
|
169
|
+
Aquarium::OptionsUtilsExampleWithAccessors.instance_methods.should include("bars=")
|
170
|
+
end
|
171
|
+
it "should accept the CANONICAL_OPTIONS as an argument" do
|
172
|
+
Aquarium::OptionsUtilsExampleWithCanonicalOptionsAccessors.instance_methods.should include("foos")
|
173
|
+
Aquarium::OptionsUtilsExampleWithCanonicalOptionsAccessors.instance_methods.should include("bars")
|
174
|
+
Aquarium::OptionsUtilsExampleWithCanonicalOptionsAccessors.instance_methods.should include("foos=")
|
175
|
+
Aquarium::OptionsUtilsExampleWithCanonicalOptionsAccessors.instance_methods.should include("bars=")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
describe OptionsUtils, ".canonical_option_reader" do
|
179
|
+
it "creates a reader method for each option" do
|
180
|
+
Aquarium::OptionsUtilsExampleWithReaders.instance_methods.should include("foos")
|
181
|
+
Aquarium::OptionsUtilsExampleWithReaders.instance_methods.should include("bars")
|
182
|
+
Aquarium::OptionsUtilsExampleWithReaders.instance_methods.should_not include("foos=")
|
183
|
+
Aquarium::OptionsUtilsExampleWithReaders.instance_methods.should_not include("bars=")
|
184
|
+
end
|
185
|
+
it "should create readers that return set values" do
|
186
|
+
object = Aquarium::OptionsUtilsExampleWithReaders.new
|
187
|
+
object.foos.class.should == Set
|
188
|
+
end
|
189
|
+
end
|
190
|
+
describe OptionsUtils, ".canonical_option_writer" do
|
191
|
+
it "creates a writer method for each option" do
|
192
|
+
Aquarium::OptionsUtilsExampleWithWriters.instance_methods.should_not include("foos")
|
193
|
+
Aquarium::OptionsUtilsExampleWithWriters.instance_methods.should_not include("bars")
|
194
|
+
Aquarium::OptionsUtilsExampleWithWriters.instance_methods.should include("foos=")
|
195
|
+
Aquarium::OptionsUtilsExampleWithWriters.instance_methods.should include("bars=")
|
196
|
+
end
|
197
|
+
it "should create writers that convert the input values to sets, if they aren't already sets" do
|
198
|
+
object = Aquarium::OptionsUtilsExampleWithAccessors.new
|
199
|
+
object.foos = "bar"
|
200
|
+
object.foos.class.should == Set
|
201
|
+
end
|
202
|
+
it "should create writers that leave the input sets unchanged" do
|
203
|
+
expected = Set.new([:b1, :b2])
|
204
|
+
object = Aquarium::OptionsUtilsExampleWithAccessors.new
|
205
|
+
object.foos = expected
|
206
|
+
object.foos.should == expected
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe OptionsUtils, "and options handling" do
|
211
|
+
it "should raise if an unknown option is specified" do
|
212
|
+
lambda {Aquarium::OptionsUtilsExampleWithAdditionalAllowedOptions.new :unknown => true}.should raise_error(Aquarium::Utils::InvalidOptions)
|
213
|
+
end
|
214
|
+
it "should not raise if a known canonical option is specified" do
|
215
|
+
lambda {Aquarium::OptionsUtilsExampleWithAdditionalAllowedOptions.new :foos => true}.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
216
|
+
end
|
217
|
+
it "should not raise if a known canonical option synonym is specified" do
|
218
|
+
lambda {Aquarium::OptionsUtilsExampleWithAdditionalAllowedOptions.new :foo1 => true}.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
219
|
+
end
|
220
|
+
it "should not raise if an known additional allowed option is specified" do
|
221
|
+
lambda {Aquarium::OptionsUtilsExampleWithAdditionalAllowedOptions.new :baz => true}.should_not raise_error(Aquarium::Utils::InvalidOptions)
|
222
|
+
end
|
223
|
+
end
|
@@ -58,3 +58,17 @@ describe Aquarium::Utils::SetUtils, "make_set" do
|
|
58
58
|
make_set(Set.new([nil, 1, 2, nil, 3, 4])).should == Set.new([1, 2, 3, 4])
|
59
59
|
end
|
60
60
|
end
|
61
|
+
|
62
|
+
describe Aquarium::Utils::SetUtils, "strip_set_nils" do
|
63
|
+
it "should return an empty set if an empty set is specified" do
|
64
|
+
strip_set_nils(Set.new([])).should == Set.new([])
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should return an empty set if a set of only nil values is specified" do
|
68
|
+
strip_set_nils(Set.new([nil, nil])).should == Set.new([])
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return a set will all nil values removed" do
|
72
|
+
strip_set_nils(Set.new([nil, :a, nil, :b])).should == Set.new([:a, :b])
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aquarium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aquarium Development Team
|
@@ -9,7 +9,7 @@ autorequire: aquarium
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-04-15 00:00:00 -05:00
|
13
13
|
default_executable: ""
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -33,18 +33,19 @@ files:
|
|
33
33
|
- Rakefile
|
34
34
|
- README
|
35
35
|
- RELEASE-PLAN
|
36
|
+
- TODO.rb
|
36
37
|
- UPGRADE
|
37
38
|
- lib/aquarium/aspects/advice.rb
|
38
39
|
- lib/aquarium/aspects/aspect.rb
|
39
40
|
- lib/aquarium/aspects/default_objects_handler.rb
|
40
|
-
- lib/aquarium/aspects/dsl/aspect_dsl.rb
|
41
|
-
- lib/aquarium/aspects/dsl/object_dsl.rb
|
42
|
-
- lib/aquarium/aspects/dsl.rb
|
43
41
|
- lib/aquarium/aspects/exclusion_handler.rb
|
44
42
|
- lib/aquarium/aspects/join_point.rb
|
45
43
|
- lib/aquarium/aspects/pointcut.rb
|
46
44
|
- lib/aquarium/aspects/pointcut_composition.rb
|
47
45
|
- lib/aquarium/aspects.rb
|
46
|
+
- lib/aquarium/dsl/aspect_dsl.rb
|
47
|
+
- lib/aquarium/dsl/object_dsl.rb
|
48
|
+
- lib/aquarium/dsl.rb
|
48
49
|
- lib/aquarium/extensions/hash.rb
|
49
50
|
- lib/aquarium/extensions/regexp.rb
|
50
51
|
- lib/aquarium/extensions/set.rb
|
@@ -82,11 +83,11 @@ files:
|
|
82
83
|
- spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb
|
83
84
|
- spec/aquarium/aspects/concurrently_accessed.rb
|
84
85
|
- spec/aquarium/aspects/default_objects_handler_spec.rb
|
85
|
-
- spec/aquarium/aspects/dsl/aspect_dsl_spec.rb
|
86
86
|
- spec/aquarium/aspects/join_point_spec.rb
|
87
87
|
- spec/aquarium/aspects/pointcut_and_composition_spec.rb
|
88
88
|
- spec/aquarium/aspects/pointcut_or_composition_spec.rb
|
89
89
|
- spec/aquarium/aspects/pointcut_spec.rb
|
90
|
+
- spec/aquarium/dsl/aspect_dsl_spec.rb
|
90
91
|
- spec/aquarium/extensions/hash_spec.rb
|
91
92
|
- spec/aquarium/extensions/regex_spec.rb
|
92
93
|
- spec/aquarium/extensions/set_spec.rb
|
@@ -115,10 +116,14 @@ files:
|
|
115
116
|
- examples/aspect_design_example_spec.rb
|
116
117
|
- examples/design_by_contract_example.rb
|
117
118
|
- examples/design_by_contract_example_spec.rb
|
119
|
+
- examples/exception_wrapping_example.rb
|
120
|
+
- examples/exception_wrapping_example_spec.rb
|
118
121
|
- examples/method_missing_example.rb
|
119
122
|
- examples/method_missing_example_spec.rb
|
120
123
|
- examples/method_tracing_example.rb
|
121
124
|
- examples/method_tracing_example_spec.rb
|
125
|
+
- examples/reusable_aspect_hack_example.rb
|
126
|
+
- examples/reusable_aspect_hack_example_spec.rb
|
122
127
|
- rake_tasks/examples.rake
|
123
128
|
- rake_tasks/examples_specdoc.rake
|
124
129
|
- rake_tasks/examples_with_rcov.rake
|
@@ -153,6 +158,6 @@ rubyforge_project: aquarium
|
|
153
158
|
rubygems_version: 1.0.1
|
154
159
|
signing_key:
|
155
160
|
specification_version: 2
|
156
|
-
summary: Aquarium-0.4.
|
161
|
+
summary: Aquarium-0.4.1 (r7) - Aspect-Oriented Programming toolkit for Ruby http://aquarium.rubyforge.org
|
157
162
|
test_files: []
|
158
163
|
|