aquarium 0.4.1 → 0.4.2
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/Aquarium-IDEA.ipr +252 -0
- data/Aquarium-IDEA.iws +493 -0
- data/Aquarium.ipr +1 -1
- data/Aquarium.iws +133 -138
- data/CHANGES +63 -0
- data/ParseTreePlay.rb +25 -0
- data/README +55 -3
- data/RELEASE-PLAN +9 -1
- data/TODO.rb +175 -15
- data/examples/aspect_design_example.rb +13 -1
- data/examples/aspect_design_example_spec.rb +20 -2
- data/examples/introductions_example.rb +35 -0
- data/examples/introductions_example_spec.rb +37 -0
- data/examples/method_missing_example.rb +2 -1
- data/lib/aquarium/aspects/advice.rb +127 -74
- data/lib/aquarium/aspects/aspect.rb +139 -72
- data/lib/aquarium/aspects/default_objects_handler.rb +6 -4
- data/lib/aquarium/aspects/exclusion_handler.rb +15 -3
- data/lib/aquarium/aspects/join_point.rb +60 -55
- data/lib/aquarium/aspects/pointcut.rb +153 -124
- data/lib/aquarium/aspects/pointcut_composition.rb +1 -1
- data/lib/aquarium/dsl/aspect_dsl.rb +13 -5
- data/lib/aquarium/dsl/object_dsl.rb +4 -2
- data/lib/aquarium/extras/design_by_contract.rb +9 -5
- data/lib/aquarium/finders.rb +1 -0
- data/lib/aquarium/finders/finder_result.rb +13 -5
- data/lib/aquarium/finders/method_finder.rb +75 -70
- data/lib/aquarium/finders/pointcut_finder.rb +166 -0
- data/lib/aquarium/finders/type_finder.rb +104 -62
- data/lib/aquarium/utils/array_utils.rb +1 -1
- data/lib/aquarium/utils/invalid_options.rb +2 -0
- data/lib/aquarium/utils/name_utils.rb +3 -2
- data/lib/aquarium/utils/nil_object.rb +7 -3
- data/lib/aquarium/utils/options_utils.rb +38 -27
- data/lib/aquarium/utils/set_utils.rb +2 -2
- data/lib/aquarium/utils/type_utils.rb +11 -0
- data/lib/aquarium/version.rb +1 -1
- data/spec/aquarium/aspects/advice_spec.rb +147 -32
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +252 -43
- data/spec/aquarium/aspects/aspect_spec.rb +148 -88
- data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +40 -34
- data/spec/aquarium/aspects/aspect_with_subtypes_spec.rb +39 -3
- data/spec/aquarium/aspects/join_point_spec.rb +190 -227
- data/spec/aquarium/aspects/pointcut_spec.rb +24 -1
- data/spec/aquarium/dsl/aspect_dsl_spec.rb +17 -17
- data/spec/aquarium/finders/method_finder_spec.rb +8 -2
- data/spec/aquarium/finders/pointcut_finder_spec.rb +193 -0
- data/spec/aquarium/finders/pointcut_finder_spec_test_classes.rb +90 -0
- data/spec/aquarium/finders/type_finder_spec.rb +17 -0
- data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +4 -4
- data/spec/aquarium/finders/type_finder_with_nested_types.rb +47 -0
- data/spec/aquarium/utils/nil_object_spec.rb +21 -0
- data/spec/aquarium/utils/type_utils_sample_nested_types.rb +51 -0
- data/spec/aquarium/utils/type_utils_spec.rb +18 -1
- metadata +13 -3
@@ -10,24 +10,35 @@ require File.dirname(__FILE__) + '/finder_result'
|
|
10
10
|
# Finds types known to the runtime environment.
|
11
11
|
module Aquarium
|
12
12
|
module Finders
|
13
|
+
# == TypeFinder
|
14
|
+
# Locate types.
|
13
15
|
class TypeFinder
|
14
16
|
include Aquarium::Utils::ArrayUtils
|
15
17
|
include Aquarium::Utils::TypeUtils
|
16
18
|
include Aquarium::Utils::OptionsUtils
|
17
19
|
|
18
|
-
|
20
|
+
class TypeFinderResult < Aquarium::Finders::FinderResult
|
21
|
+
include Enumerable
|
22
|
+
def each
|
23
|
+
matched_keys.each { |x| yield x }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.add_ancestors_descendents_and_nested_option_variants_for option, options_hash
|
19
28
|
all_variants = options_hash[option].dup
|
20
29
|
options_hash["#{option}_and_descendents"] = all_variants.map {|x| "#{x}_and_descendents"}
|
21
30
|
options_hash["#{option}_and_ancestors"] = all_variants.map {|x| "#{x}_and_ancestors"}
|
31
|
+
options_hash["#{option}_and_nested_types"] =
|
32
|
+
all_variants.map {|x| "#{x}_and_nested_types"} + all_variants.map {|x| "#{x}_and_nested"}
|
22
33
|
end
|
23
34
|
|
24
35
|
TYPE_FINDER_CANONICAL_OPTIONS = {
|
25
36
|
"types" => %w[type class classes module modules name names],
|
26
37
|
}
|
27
|
-
# Add the ancestors and
|
28
|
-
# are added to the former...
|
38
|
+
# Add the ancestors, descendents, and nested variants first, then add all the preposition and
|
39
|
+
# exclude variants, so the latter are added to the former...
|
29
40
|
TYPE_FINDER_CANONICAL_OPTIONS.keys.dup.each do |type_option|
|
30
|
-
|
41
|
+
add_ancestors_descendents_and_nested_option_variants_for type_option, TYPE_FINDER_CANONICAL_OPTIONS
|
31
42
|
end
|
32
43
|
TYPE_FINDER_CANONICAL_OPTIONS.keys.dup.each do |type_option|
|
33
44
|
add_prepositional_option_variants_for type_option, TYPE_FINDER_CANONICAL_OPTIONS
|
@@ -39,60 +50,85 @@ module Aquarium
|
|
39
50
|
canonical_options_given_methods CANONICAL_OPTIONS
|
40
51
|
canonical_option_accessor CANONICAL_OPTIONS
|
41
52
|
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# <tt>:type => types_and_type_names_and_regexps</tt>::
|
48
|
-
# <tt>:name => types_and_type_names_and_regexps</tt>::
|
49
|
-
# A single type or array of types, specified using any combination of the type
|
50
|
-
# name strings, the type "constants" and/or regular expessions. The four different
|
51
|
-
# flags are just "sugar" for each other.
|
53
|
+
# Returns a TypeFinder::TypeFinderResult, where the "matched" keys are the input
|
54
|
+
# types, type names, and/or regular expressions, and objects for which matches were found and the
|
55
|
+
# corresponding values are the class constant or variable pointcuts that were found.
|
56
|
+
# The keys in the "not_matched" part of the result are the specified types and objects
|
57
|
+
# for which no matches were found.
|
52
58
|
#
|
53
|
-
#
|
54
|
-
# <tt>:names_and_descendents => types_and_type_names_and_regexps</tt>::
|
55
|
-
# <tt>:type_and_descendents => types_and_type_names_and_regexps</tt>::
|
56
|
-
# <tt>:name_and_descendents => types_and_type_names_and_regexps</tt>::
|
59
|
+
# The options are as follows:
|
57
60
|
#
|
58
|
-
#
|
61
|
+
# ==== Types
|
62
|
+
# A single type, type name, name regular expression, or an array of the same. (Mixed allowed.)
|
63
|
+
# * <tt>:types => types_and_type_names_and_regexps</tt>
|
64
|
+
# * <tt>:names => types_and_type_names_and_regexps</tt>
|
65
|
+
# * <tt>:type => types_and_type_names_and_regexps</tt>
|
66
|
+
# * <tt>:name => types_and_type_names_and_regexps</tt>
|
59
67
|
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
68
|
+
# ==== Types and Descendents
|
69
|
+
# A single type, type name, name regular expression, or an array of the same. (Mixed allowed.)
|
70
|
+
# Matching types and their descendents will be found. A type that includes a module is considered
|
71
|
+
# a descendent, since the module would show up in that type's ancestors.
|
72
|
+
# * <tt>:types_and_descendents => types_and_type_names_and_regexps</tt>
|
73
|
+
# * <tt>:names_and_descendents => types_and_type_names_and_regexps</tt>
|
74
|
+
# * <tt>:type_and_descendents => types_and_type_names_and_regexps</tt>
|
75
|
+
# * <tt>:name_and_descendents => types_and_type_names_and_regexps</tt>
|
64
76
|
#
|
65
|
-
#
|
66
|
-
#
|
77
|
+
# ==== Types and Ancestors
|
78
|
+
# A single type, type name, name regular expression, or an array of the same. (Mixed allowed.)
|
79
|
+
# Matching types and their ancestors will be found.
|
80
|
+
# * <tt>:types_and_ancestors => types_and_type_names_and_regexps</tt>
|
81
|
+
# * <tt>:names_and_ancestors => types_and_type_names_and_regexps</tt>
|
82
|
+
# * <tt>:type_and_ancestors => types_and_type_names_and_regexps</tt>
|
83
|
+
# * <tt>:name_and_ancestors => types_and_type_names_and_regexps</tt>
|
84
|
+
#
|
85
|
+
# ==== Types and Nested Types
|
86
|
+
# A single type, type name, name regular expression, or an array of the same. (Mixed allowed.)
|
87
|
+
# Matching types and any types nested within them will be found.
|
88
|
+
# * <tt>:types_and_nested_types => types_and_type_names_and_regexps</tt>
|
89
|
+
# * <tt>:names_and_nested_types => types_and_type_names_and_regexps</tt>
|
90
|
+
# * <tt>:type_and_nested_types => types_and_type_names_and_regexps</tt>
|
91
|
+
# * <tt>:name_and_nested_types => types_and_type_names_and_regexps</tt>
|
92
|
+
# * <tt>:types_and_nested => types_and_type_names_and_regexps</tt>
|
93
|
+
# * <tt>:names_and_nested => types_and_type_names_and_regexps</tt>
|
94
|
+
# * <tt>:type_and_nested => types_and_type_names_and_regexps</tt>
|
95
|
+
# * <tt>:name_and_nested => types_and_type_names_and_regexps</tt>
|
96
|
+
#
|
97
|
+
# Note: This option will also match <tt>Class</tt>, <tt>Module</tt>, <i>etc.</>,
|
67
98
|
# so use with caution!
|
68
99
|
#
|
69
100
|
# To get both descendents and ancestors, use both options with the same type
|
70
101
|
# specification.
|
71
102
|
#
|
72
|
-
#
|
73
|
-
#
|
103
|
+
# ==== Exclude Types
|
104
|
+
# Exclude the specified type(s) from the list of matched types.
|
105
|
+
# Note: These excluded types <i>won't</i> appear in the FinderResult#not_matched.
|
106
|
+
# * <tt>:exclude_type => types_and_type_names_and_regexps</tt>
|
107
|
+
# * <tt>:exclude_types => types_and_type_names_and_regexps</tt>
|
108
|
+
# * <tt>:exclude_name => types_and_type_names_and_regexps</tt>
|
109
|
+
# * <tt>:exclude_names => types_and_type_names_and_regexps</tt>
|
110
|
+
# * <tt>:exclude_types_and_descendents => types_and_type_names_and_regexps</tt>
|
111
|
+
# * <tt>:exclude_names_and_descendents => types_and_type_names_and_regexps</tt>
|
112
|
+
# * <tt>:exclude_type_and_descendents => types_and_type_names_and_regexps</tt>
|
113
|
+
# * <tt>:exclude_name_and_descendents => types_and_type_names_and_regexps</tt>
|
114
|
+
# * <tt>:exclude_types_and_ancestors => types_and_type_names_and_regexps</tt>
|
115
|
+
# * <tt>:exclude_names_and_ancestors => types_and_type_names_and_regexps</tt>
|
116
|
+
# * <tt>:exclude_type_and_ancestors => types_and_type_names_and_regexps</tt>
|
117
|
+
# * <tt>:exclude_name_and_ancestors => types_and_type_names_and_regexps</tt>
|
118
|
+
# * <tt>:exclude_types_and_nested_types => types_and_type_names_and_regexps</tt>
|
119
|
+
# * <tt>:exclude_names_and_nested_types => types_and_type_names_and_regexps</tt>
|
120
|
+
# * <tt>:exclude_type_and_nested_types => types_and_type_names_and_regexps</tt>
|
121
|
+
# * <tt>:exclude_name_and_nested_types => types_and_type_names_and_regexps</tt>
|
122
|
+
# * <tt>:exclude_types_and_nested => types_and_type_names_and_regexps</tt>
|
123
|
+
# * <tt>:exclude_names_and_nested => types_and_type_names_and_regexps</tt>
|
124
|
+
# * <tt>:exclude_type_and_nested => types_and_type_names_and_regexps</tt>
|
125
|
+
# * <tt>:exclude_name_and_nested => types_and_type_names_and_regexps</tt>
|
74
126
|
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
# These excluded types <b>won't</b> appear in the FinderResult#not_matched.
|
81
|
-
#
|
82
|
-
# <tt>:exclude_types_and_descendents => types_and_type_names_and_regexps</tt>::
|
83
|
-
# <tt>:exclude_names_and_descendents => types_and_type_names_and_regexps</tt>::
|
84
|
-
# <tt>:exclude_type_and_descendents => types_and_type_names_and_regexps</tt>::
|
85
|
-
# <tt>:exclude_name_and_descendents => types_and_type_names_and_regexps</tt>::
|
86
|
-
#
|
87
|
-
# <tt>:exclude_types_and_ancestors => types_and_type_names_and_regexps</tt>::
|
88
|
-
# <tt>:exclude_names_and_ancestors => types_and_type_names_and_regexps</tt>::
|
89
|
-
# <tt>:exclude_type_and_ancestors => types_and_type_names_and_regexps</tt>::
|
90
|
-
# <tt>:exclude_name_and_ancestors => types_and_type_names_and_regexps</tt>::
|
91
|
-
#
|
92
|
-
# Exclude the descendents or ancestors, as well.
|
93
|
-
#
|
94
|
-
# Because of the special sigificance of the module ("namespace") separator "::", the rules
|
95
|
-
# for the regular expressions are as follows. Assume that "subexp" is a "sub regular
|
127
|
+
# ==== Namespaces (Modules) and Regular Expressions
|
128
|
+
# Because of the special sigificance of the module ("namespace") separator "::",
|
129
|
+
# special rules for the regular expressions apply. Normally, you can just use the
|
130
|
+
# "*_and_nested_types" or "*_and_nested" to match enclosed types, but if you want to
|
131
|
+
# be selective, note the following. First, assume that "subexp" is a "sub regular
|
96
132
|
# expression" that results if you split on the separator "::".
|
97
133
|
#
|
98
134
|
# A full regexp with no "::"::
|
@@ -121,8 +157,7 @@ module Aquarium
|
|
121
157
|
result
|
122
158
|
end
|
123
159
|
|
124
|
-
|
125
|
-
protected
|
160
|
+
private
|
126
161
|
|
127
162
|
# Hack. Since the finder could be reused, unset the specification created by #find.
|
128
163
|
def unset_specification
|
@@ -130,9 +165,9 @@ module Aquarium
|
|
130
165
|
end
|
131
166
|
|
132
167
|
def do_find_types
|
133
|
-
result
|
134
|
-
excluded = Aquarium::Finders::FinderResult.new
|
168
|
+
result = TypeFinderResult.new
|
135
169
|
return result if noop
|
170
|
+
excluded = TypeFinderResult.new
|
136
171
|
@specification.each do |option, types|
|
137
172
|
next unless TYPE_FINDER_CANONICAL_OPTIONS.keys.include?(option.to_s)
|
138
173
|
next if types.nil? or types.empty?
|
@@ -145,7 +180,7 @@ module Aquarium
|
|
145
180
|
end
|
146
181
|
|
147
182
|
def find_matching regexpes_or_names, option
|
148
|
-
result =
|
183
|
+
result = TypeFinderResult.new
|
149
184
|
expressions = make_array regexpes_or_names
|
150
185
|
expressions.each do |expression|
|
151
186
|
expr = strip expression
|
@@ -210,34 +245,41 @@ module Aquarium
|
|
210
245
|
end
|
211
246
|
|
212
247
|
def finish_and_make_successful_result found, option
|
213
|
-
all = prettify(found +
|
248
|
+
all = prettify(found + handle_ancestors_descendents_and_nested(found, option))
|
214
249
|
hash = make_return_hash(all)
|
215
|
-
|
250
|
+
TypeFinderResult.new hash
|
216
251
|
end
|
217
252
|
|
218
253
|
def make_failed_result name
|
219
|
-
|
254
|
+
TypeFinderResult.new :not_matched => {name => Set.new([])}
|
220
255
|
end
|
221
256
|
|
222
|
-
def
|
257
|
+
def handle_ancestors_descendents_and_nested types, option
|
223
258
|
result = []
|
224
|
-
result << add_descendents(types) if should_find_descendents(option)
|
225
259
|
result << add_ancestors(types) if should_find_ancestors(option)
|
260
|
+
result << add_descendents(types) if should_find_descendents(option)
|
261
|
+
result << add_nested(types) if should_find_nested(option)
|
226
262
|
result
|
227
263
|
end
|
228
264
|
|
265
|
+
def add_ancestors types
|
266
|
+
types.inject([]) { |memo, t| memo << t.ancestors }
|
267
|
+
end
|
229
268
|
def add_descendents types
|
230
269
|
types.inject([]) { |memo, t| memo << Aquarium::Utils::TypeUtils.descendents(t) }
|
231
270
|
end
|
232
|
-
def
|
233
|
-
types.inject([]) { |memo, t| memo << t
|
271
|
+
def add_nested types
|
272
|
+
types.inject([]) { |memo, t| memo << Aquarium::Utils::TypeUtils.nested(t) }
|
234
273
|
end
|
235
274
|
|
275
|
+
def should_find_ancestors option
|
276
|
+
option.to_s.include? "_ancestors"
|
277
|
+
end
|
236
278
|
def should_find_descendents option
|
237
279
|
option.to_s.include? "_descendents"
|
238
280
|
end
|
239
|
-
def
|
240
|
-
option.to_s.include? "
|
281
|
+
def should_find_nested option
|
282
|
+
option.to_s.include? "_nested"
|
241
283
|
end
|
242
284
|
|
243
285
|
|
@@ -8,7 +8,7 @@ module Aquarium
|
|
8
8
|
# Return an array containing the input item or list of items. If the input
|
9
9
|
# is an array, it is returned. In all cases, the constructed array is a
|
10
10
|
# flattened version of the input and any nil elements are removed by #strip_array_nils.
|
11
|
-
# Note that this behavior effectively converts
|
11
|
+
# Note that this behavior effectively converts <tt>nil</tt> to <tt>[]</tt>.
|
12
12
|
def make_array *value_or_enum
|
13
13
|
ArrayUtils.make_array value_or_enum
|
14
14
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'aquarium/utils/type_utils'
|
2
2
|
|
3
|
-
# Convert various strings, symbols, object ids, etc. into valid "names" that
|
4
|
-
# can be used as method names, etc.
|
5
3
|
module Aquarium
|
6
4
|
module Utils
|
5
|
+
# == NameUtils
|
6
|
+
# Convert various strings, symbols, object ids, etc. into valid "names" that
|
7
|
+
# can be used as method names, etc.
|
7
8
|
module NameUtils
|
8
9
|
|
9
10
|
@@char_expr_map = {
|
@@ -1,10 +1,14 @@
|
|
1
|
-
# One implementation of the Null Object Pattern (renamed "Nil" for Ruby).
|
2
|
-
# All methods not defined by Object simply return the Aquarium::Utils::NilObject itself.
|
3
|
-
# Users can subclass or add methods to instances to customize the behavior.
|
4
1
|
|
5
2
|
module Aquarium
|
6
3
|
module Utils
|
4
|
+
# An implementation of the Null Object Pattern (renamed "Nil" for Ruby).
|
5
|
+
# All methods not defined by Object simply return the Aquarium::Utils::NilObject itself.
|
6
|
+
# Users can subclass or add methods to instances to customize the behavior.
|
7
7
|
class Aquarium::Utils::NilObject
|
8
|
+
|
9
|
+
def eql? other
|
10
|
+
other.kind_of? NilObject
|
11
|
+
end
|
8
12
|
|
9
13
|
def method_missing method_sym, *args
|
10
14
|
self
|
@@ -4,54 +4,64 @@ require 'aquarium/utils/default_logger'
|
|
4
4
|
module Aquarium
|
5
5
|
module Utils
|
6
6
|
|
7
|
+
# == OptionsUtils
|
7
8
|
# Support parsing and processing of key-value pairs of options, where the values are always converted
|
8
|
-
# to
|
9
|
+
# to Sets.
|
9
10
|
# Types including this module should have their <tt>initialize</tt> methods call this module's
|
10
|
-
#
|
11
|
-
#
|
11
|
+
# #init_specification to do the options processing. See its documentation for more details.
|
12
|
+
#
|
13
|
+
# Several <i>class</i> methods are included for defining convenience <i>instance</i> methods.
|
14
|
+
# For example, for options <tt>:foo</tt> and <tt>:bar</tt>, calling:
|
15
|
+
#
|
16
|
+
# canonical_options_given_methods :foo, :bar
|
12
17
|
#
|
13
|
-
# Several class methods are included in including types for defining convenience instance methods.
|
14
|
-
# for options +:foo+ and +:bar+, calling:
|
15
|
-
# <tt>canonical_options_given_methods :foo, :bar</tt>
|
16
18
|
# will define several methods for each option specified, e.g.,:
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
19
|
+
#
|
20
|
+
# foo_given # => returns the value of @specification[:foo]
|
21
|
+
# foo_given? # => returns true "foo_given" is not nil or empty.
|
22
|
+
# bar_given # etc...
|
23
|
+
# bar_given?
|
24
|
+
#
|
21
25
|
# If you would like corresponding reader and writer methods, pass a list of the keys for which you want these
|
22
|
-
# methods defined to
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
26
|
+
# methods defined to one of the following methods:
|
27
|
+
#
|
28
|
+
# canonical_option_reader :foo, :bar # analogous to attr_reader
|
29
|
+
# canonical_option_writer :foo, :bar # analogous to attr_writer
|
30
|
+
# canonical_option_accessor :foo, :bar # analogous to attr_accessor
|
31
|
+
#
|
32
|
+
# For all of these methods, you can also pass <tt>CANONICAL_OPTIONS</tt> (discussed below) to define methods
|
33
|
+
# for all of the "canonical" options, <i>e.g.,</i>
|
34
|
+
#
|
35
|
+
# canonical_option_accessor CANONICAL_OPTIONS
|
29
36
|
#
|
30
37
|
# These methods are not defined by default to prevent accidentally overriding other methods that you might
|
31
38
|
# have defined with the same names. Also, note that the writer methods will convert the inputs to sets,
|
32
39
|
# following the conventions for the options and the readers will return the sets. If you want different handling,
|
33
|
-
# you'll have to provide custom implementations.
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
40
|
+
# you'll have to provide custom implementations.
|
41
|
+
#
|
42
|
+
# Note that special-case accessor methods are already defined for the <tt>:noop</tt> and <tt>:logger</tt>
|
43
|
+
# options (discussed below) where the writers expect single values, not sets, and the
|
44
|
+
# readers return the single values. (Yea, it's a bit inconsistent...)
|
45
|
+
#
|
46
|
+
# Finally, these <tt>canonical_option_*</tt> methods should only be called with the *keys* for the +CANONICAL_OPTIONS+.
|
37
47
|
# The keys are considered the "canonical options", while the values for the keys are synonyms that can be used instead.
|
38
48
|
#
|
39
49
|
# This module also defines several universal options that will be available to all types that include this module:
|
40
|
-
# <tt>:logger</tt
|
50
|
+
# <tt>:logger</tt>::
|
41
51
|
# A Ruby standard library Logger used for any messages. A default system-wide logger is used otherwise.
|
42
52
|
# The corresponding <tt>logger</tt> and <tt>logger=</tt> accessors are defined.
|
43
53
|
#
|
44
|
-
# <tt>:logger_stream</tt
|
54
|
+
# <tt>:logger_stream</tt>::
|
45
55
|
# An an alternative to defining the logger, you can define just the output stream where log output will be written.
|
46
56
|
# If this option is specified, a new logger will be created for the instance with this output stream.
|
47
57
|
# There are no corresponding accessors; use the appropriate methods on the <tt>logger</tt> object instead.
|
48
58
|
#
|
49
|
-
# <tt>:severity</tt
|
59
|
+
# <tt>:severity</tt>::
|
50
60
|
# The logging severity level, one of the Logger::Severity values or a corresponding integer value.
|
51
61
|
# If this option is specified, a new logger will be created for the instance with this output stream.
|
52
62
|
# There are no corresponding accessors; use the corresponding methods on the <tt>logger</tt> object instead.
|
53
63
|
#
|
54
|
-
# <tt>:noop => options_hash[:noop] || false</tt
|
64
|
+
# <tt>:noop => options_hash[:noop] || false</tt>::
|
55
65
|
# If true, don't do "anything", the interpretation of which will vary with the type receiving the option.
|
56
66
|
# For example, a type might go through some initialization, such as parsng its options, but
|
57
67
|
# do nothing after that. Primarily useful for debugging and testing.
|
@@ -199,7 +209,8 @@ module Aquarium
|
|
199
209
|
end
|
200
210
|
end
|
201
211
|
|
202
|
-
|
212
|
+
private
|
213
|
+
|
203
214
|
def determine_options_for_accessors canonical_option_key_list
|
204
215
|
keys = canonical_option_key_list
|
205
216
|
if canonical_option_key_list.kind_of?(Array) and canonical_option_key_list.size == 1
|
@@ -217,7 +228,7 @@ module Aquarium
|
|
217
228
|
ClassMethods.send :append_features, (class << clazz; self; end)
|
218
229
|
end
|
219
230
|
|
220
|
-
|
231
|
+
private
|
221
232
|
|
222
233
|
def all_allowed_option_symbols
|
223
234
|
@canonical_options.to_a.flatten.map {|o| o.intern} + @additional_allowed_options
|
@@ -7,14 +7,14 @@ module Aquarium
|
|
7
7
|
# Return a set containing the input item or list of items. If the input
|
8
8
|
# is a set or an array, it is returned. In all cases, the constructed set is a
|
9
9
|
# flattened version of the input and any nil elements are removed by #strip_set_nils.
|
10
|
-
# Note that this behavior effectively converts
|
10
|
+
# Note that this behavior effectively converts <tt>nil</tt> to <tt>[]</tt>.
|
11
11
|
def make_set *value_or_set_or_array
|
12
12
|
strip_set_nils(convert_to_set(*value_or_set_or_array))
|
13
13
|
end
|
14
14
|
|
15
15
|
# Return a new set that is a copy of the input set with all nils removed.
|
16
16
|
def strip_set_nils set
|
17
|
-
|
17
|
+
SetUtils.strip_set_nils set
|
18
18
|
end
|
19
19
|
|
20
20
|
# Return a new set that is a copy of the input set with all nils removed.
|
@@ -18,6 +18,17 @@ module Aquarium
|
|
18
18
|
result.uniq
|
19
19
|
end
|
20
20
|
|
21
|
+
def self.nested clazz
|
22
|
+
result = [clazz]
|
23
|
+
clazz.constants.each do |const|
|
24
|
+
mod = clazz.class_eval(const)
|
25
|
+
next unless is_type?(mod)
|
26
|
+
result << mod
|
27
|
+
result << nested(mod)
|
28
|
+
end
|
29
|
+
result.flatten.uniq
|
30
|
+
end
|
31
|
+
|
21
32
|
protected
|
22
33
|
|
23
34
|
# For JRuby classes, we have to "__x__" forms of the reflection methods that don't end in '?'.
|