aquarium 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 '?'.
|