aquarium 0.5.1 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +240 -215
  3. data/README +61 -44
  4. data/RELEASE-PLAN +21 -23
  5. data/Rakefile +64 -94
  6. data/UPGRADE +45 -35
  7. data/aquarium.gemspec +50 -0
  8. data/examples/README.txt +6 -0
  9. data/examples/aspect_design_example_spec.rb +2 -2
  10. data/examples/design_by_contract_example_spec.rb +3 -3
  11. data/examples/exception_wrapping_example_spec.rb +2 -2
  12. data/examples/introductions_example_spec.rb +1 -1
  13. data/examples/method_tracing_example_spec.rb +17 -16
  14. data/examples/reusable_aspect_hack_example_spec.rb +5 -5
  15. data/jruby/Rakefile +61 -0
  16. data/jruby/java/example/Worker.java +9 -0
  17. data/jruby/java/example/sorter/StringListSorter.java +22 -0
  18. data/jruby/java/example/sorter/converter/StringListCaseConverterAndSorter.java +42 -0
  19. data/jruby/java/example/visibility/Visibility.java +13 -0
  20. data/jruby/spec/java_class_aspects_spec.rb +434 -0
  21. data/jruby/spec/java_visibility_spec.rb +122 -0
  22. data/jruby/spec/spec_helper.rb +5 -0
  23. data/lib/aquarium/aspects/aspect.rb +8 -4
  24. data/lib/aquarium/utils/type_utils.rb +4 -1
  25. data/lib/aquarium/version.rb +29 -28
  26. data/previous_failures.txt +0 -0
  27. data/rspec.watchr +60 -0
  28. data/spec/aquarium/aspects/advice_spec.rb +10 -10
  29. data/spec/aquarium/aspects/aspect_invocation_spec.rb +79 -79
  30. data/spec/aquarium/aspects/aspect_spec.rb +73 -73
  31. data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +5 -5
  32. data/spec/aquarium/aspects/concurrent_aspects_spec.rb +1 -1
  33. data/spec/aquarium/aspects/default_objects_handler_spec.rb +5 -5
  34. data/spec/aquarium/aspects/join_point_spec.rb +40 -40
  35. data/spec/aquarium/aspects/pointcut_and_composition_spec.rb +8 -8
  36. data/spec/aquarium/aspects/pointcut_spec.rb +25 -25
  37. data/spec/aquarium/extensions/regex_spec.rb +6 -6
  38. data/spec/aquarium/extras/design_by_contract_spec.rb +6 -6
  39. data/spec/aquarium/finders/finder_result_spec.rb +2 -2
  40. data/spec/aquarium/finders/method_finder_spec.rb +24 -24
  41. data/spec/aquarium/finders/pointcut_finder_spec.rb +10 -10
  42. data/spec/aquarium/finders/pointcut_finder_spec_test_classes.rb +4 -4
  43. data/spec/aquarium/finders/type_finder_spec.rb +5 -5
  44. data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +6 -5
  45. data/spec/aquarium/finders/type_finder_with_nested_types_spec.rb +2 -2
  46. data/spec/aquarium/utils/logic_error_spec.rb +1 -1
  47. data/spec/aquarium/utils/method_utils_spec.rb +38 -38
  48. data/spec/aquarium/utils/nil_object_spec.rb +11 -11
  49. data/spec/aquarium/utils/options_utils_spec.rb +8 -8
  50. data/spec/aquarium/utils/type_utils_spec.rb +3 -3
  51. metadata +238 -57
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 607c8e2ff478a03b28cb82786e11db87f2809aeedb30749ca57c93e3da75a8e3
4
+ data.tar.gz: 027f4f0635c170239546fde6547f8c84a684020046cd940f3466ab9f8bbb45a4
5
+ SHA512:
6
+ metadata.gz: de21011f1c22b93eac2de02630836c40759511a80d2d02b6ee626e98a17b41bcaf50d1bb65393da9123b1638e7b503c37075764e30fbb380dd25e216134ac6e3
7
+ data.tar.gz: 30157999d9b464b2bdcb8808a14ab7f1ed90b89a8959f7cc9fe5ed7cb52f4355c6a4770f6210622d47b3e2ec85fe6e8f80ab917eb74a26d2cedd5d3448fc911f
data/CHANGES CHANGED
@@ -1,12 +1,37 @@
1
+ == Version 0.7.1
2
+
3
+ Adds support for Ruby 2.6. It was tested with 2.6.3p62 (2019-04-16 revision 67580). Basic JRuby 9.2.7.0 (2.5.3) 2019-04-09 8a269e3 support is provided, but using JRuby currently does *not* pass all the custom Java specs in the `jruby/spec` directory, which specifically test working with Java classes. However, JRuby does pass all the Ruby specs in the `spec` directory. This is a long-standing issue with JRuby support in Aquarium. Patches are welcome!
4
+
5
+ == Version 0.6.0
6
+
7
+ V0.6.0 fixes thread-unsafe code in Aspect::alias_original_method_text, which
8
+ I've known about since the beginning of the project. At the beginning of Aquarium,
9
+ circa 2006, the overhead of making copies of JoinPoints in this method was
10
+ approximately 30%! So, I sacrificed thread-safety for performance. Now, thread
11
+ safety is increasingly important in modern apps, and fortunately, the overhead
12
+ on newer machines and newer versions of Ruby is greatly reduced for making these
13
+ copies. Hence, this problem is fixed.
14
+
15
+ The rspec suite does not test thread safety in any rigorous way, so caution is
16
+ advised. Please report any problems or better, submit pull requests of better
17
+ threading tests and possible bug fixes. As always, thanks in advance.
18
+
19
+ I also fixed deprecation warnings from the latest version of RSpec. There were a
20
+ lot of them!
21
+
22
+ Now supports Ruby 1.9.X, Ruby 2.0, and JRuby 1.7.4 (please report version-related bugs!)
23
+ Drops official support for Ruby 1.8.X.
24
+
25
+
1
26
  == Version 0.5.1
2
27
 
3
28
  V0.5.1 adds support for Ruby 1.8.7, Ruby 1.9.3, JRuby 1.6.7,
4
29
  RSpec 2.9, and Webgen (0.5.14 - for the build process).
5
30
 
6
- WARNING: Earlier versions of Ruby 1.8, 1.9 and JRuby 1.X are not
31
+ WARNING: Earlier versions of Ruby 1.8, 1.9 and JRuby 1.X are not
7
32
  supported. JRuby support is limited to "pure" Ruby code; the main
8
- RSpec specifications pass under JRuby, but not the JRuby-specific
9
- specifications in jruby/spec. Restoring full JRuby support is planned,
33
+ RSpec specifications pass under JRuby, but not the JRuby-specific
34
+ specifications in jruby/spec. Restoring full JRuby support is planned,
10
35
  but the timeframe is TBD.
11
36
 
12
37
  It also has some minor API changes summarized below.
@@ -16,28 +41,28 @@ Enhancements:
16
41
  27235 Support RSpec 1.2.8 (actually 2.9) and and JRuby 1.3.1 (actually 1.6.7)
17
42
  27236 Upgrade website generation to webgen 0.5.X (X=14)
18
43
 
19
- The actual versions of these tools supported are more recent versions
44
+ The actual versions of these tools supported are more recent versions
20
45
  shown in parentheses.
21
46
 
22
- There are no API changes in this release, with two exceptions.
47
+ There are no API changes in this release, with two exceptions.
23
48
 
24
- First, Most of the code changes are minor fixes to RSpec files. The one
25
- exception is an apparent change that occurred in JRuby 1.3.X with respect
26
- to the access restrictions on Java methods. It now appears that protected
27
- methods are public, that is they are in the method list returned by
28
- :public_methods, but not :protected_methods. Also, private methods are
29
- not returned by any of the :*_methods.
49
+ First, Most of the code changes are minor fixes to RSpec files. The one
50
+ exception is an apparent change that occurred in JRuby 1.3.X with respect
51
+ to the access restrictions on Java methods. It now appears that protected
52
+ methods are public, that is they are in the method list returned by
53
+ :public_methods, but not :protected_methods. Also, private methods are
54
+ not returned by any of the :*_methods.
30
55
 
31
- Second, there was a deprecated option to the MethodFinder class,
56
+ Second, there was a deprecated option to the MethodFinder class,
32
57
  :options, that has been removed. Use :method_options instead.
33
58
 
34
- I used the upgrade to Webgen 0.5.X as an excuse to refresh the web site's
59
+ I used the upgrade to Webgen 0.5.X as an excuse to refresh the web site's
35
60
  appearance. The content is mostly the same as before.
36
61
 
37
62
 
38
63
  == Version 0.4.3
39
64
 
40
- V0.4.3 adds a few bug fixes and enhancements, and several internal
65
+ V0.4.3 adds a few bug fixes and enhancements, and several internal
41
66
  refactorings to improve performance, etc.
42
67
 
43
68
  Bug fixes:
@@ -45,114 +70,114 @@ Bug fixes:
45
70
 
46
71
  Enhancements:
47
72
  14165 Support Ruby 1.8.2, 1.8.5, 1.8.6, 1.9.X and 2.0 releases and snapshots
48
- 21283 Allow "_of" suffix at end of "*_and_descendents", "*_and_ancestors",
73
+ 21283 Allow "_of" suffix at end of "*_and_descendents", "*_and_ancestors",
49
74
  and "*_nested_types"
50
- 21924 Should be able to turn off contract-testing aspects globally in the
75
+ 21924 Should be able to turn off contract-testing aspects globally in the
51
76
  Design by Contract extra module
52
- 21993 By default, don't advise "system" methods that being with "_", but
77
+ 21993 By default, don't advise "system" methods that being with "_", but
53
78
  provide an option to do so
54
79
 
55
80
  Details:
56
- 14165: I closed this one because it's too broad. Aquarium currently runs with
81
+ 14165: I closed this one because it's too broad. Aquarium currently runs with
57
82
  1.8.6. I will open a new enhancement specifically for 1.9.
58
- 21283: Sometimes appending "_of" makes the specification read more smoothly,
83
+ 21283: Sometimes appending "_of" makes the specification read more smoothly,
59
84
  so it's now an option.
60
- 21924: To class-level methods in DesignByContract, enable_all and disable_all,
85
+ 21924: To class-level methods in DesignByContract, enable_all and disable_all,
61
86
  globally turn contracts on or off. See their documentation for details.
62
- 21993: Now, by default, MethodFinder won't match any method that starts with
63
- two underscores ("__"), so you don't have to :exclude_ancestors as much just
64
- to avoid matching methods like "__id__" and "__send__". There is also a new
65
- :method_options called :include_system_methods that will not suppress
66
- matching these methods. So, I'm calling these special methods "system
67
- methods". I don't yet provide a way to configure this list (RSpec methods
68
- would be good additions...). The list is currently defined as an array of
69
- regex's, MethodFinder::IGNORED_SYSTEM_METHODS. NOTE: This is effectively a
87
+ 21993: Now, by default, MethodFinder won't match any method that starts with
88
+ two underscores ("__"), so you don't have to :exclude_ancestors as much just
89
+ to avoid matching methods like "__id__" and "__send__". There is also a new
90
+ :method_options called :include_system_methods that will not suppress
91
+ matching these methods. So, I'm calling these special methods "system
92
+ methods". I don't yet provide a way to configure this list (RSpec methods
93
+ would be good additions...). The list is currently defined as an array of
94
+ regex's, MethodFinder::IGNORED_SYSTEM_METHODS. NOTE: This is effectively a
70
95
  behavior change, although it's not likely to affect anyone.
71
96
 
72
97
  == Version 0.4.2
73
98
 
74
- V0.4.2 adds a few bug fixes and enhancements, greatly improved RDoc output,
99
+ V0.4.2 adds a few bug fixes and enhancements, greatly improved RDoc output,
75
100
  and internal refactorings to improve performance.
76
101
 
77
102
  Bug fixes:
78
103
  15202 Intermittent confusion between classes and objects when invoking advice
79
- 19262 Just putting join_point argument in advice block causes mysterious
104
+ 19262 Just putting join_point argument in advice block causes mysterious
80
105
  method missing error.
81
106
  19321 Advice overhead is too high (ongoing improvements)
82
107
 
83
108
  Enhancements:
84
- 13403 Support recursion into nested types without requiring "tricky" regular
109
+ 13403 Support recursion into nested types without requiring "tricky" regular
85
110
  expressions
86
111
  13406 "Sugar" for adding methods and attributes to types
87
112
  18537 Provide a search for all pointcut constants
88
113
  19666 Improve the RDoc output
89
- 19119 Provide an "after_raising" type of advice that lets you handle the
114
+ 19119 Provide an "after_raising" type of advice that lets you handle the
90
115
  exception.
91
116
 
92
- #15202: I never figured out the cause of this problem, but it hasn't been seen
93
- since late last
94
- year, so I suspect it disappeared as a side effect of on-going refactoring and
117
+ #15202: I never figured out the cause of this problem, but it hasn't been seen
118
+ since late last
119
+ year, so I suspect it disappeared as a side effect of on-going refactoring and
95
120
  enhancements.
96
121
 
97
- #19262: If you just specified "|jp|" for an advice block, you would sometimes
98
- get a method missing error. I never figured out exactly why, but it was
99
- somehow related to passing the usual three arguments internally, where the
100
- last two would be ignored in this case. Now, the code checks the arity and
101
- only passes the join point in this case.
122
+ #19262: If you just specified "|jp|" for an advice block, you would sometimes
123
+ get a method missing error. I never figured out exactly why, but it was
124
+ somehow related to passing the usual three arguments internally, where the
125
+ last two would be ignored in this case. Now, the code checks the arity and
126
+ only passes the join point in this case.
102
127
 
103
- #19321: I removed some of the wasted object creation and initialization in
104
- advice invocation,
105
- improving the overhead by about 40%. However, it is still at least 10x higher
106
- than simple method aliasing, so I want to make more improvements. (I did not
128
+ #19321: I removed some of the wasted object creation and initialization in
129
+ advice invocation,
130
+ improving the overhead by about 40%. However, it is still at least 10x higher
131
+ than simple method aliasing, so I want to make more improvements. (I did not
107
132
  close this item.)
108
133
 
109
- #13403: I added new options :types_and_nested_types and :types_and_nested that
110
- are analogous to the similar "ancestors" and "descendents" options. The
111
- nested option will return the specified types and any types they "enclose".
134
+ #13403: I added new options :types_and_nested_types and :types_and_nested that
135
+ are analogous to the similar "ancestors" and "descendents" options. The
136
+ nested option will return the specified types and any types they "enclose".
112
137
  There are also corresponding "exclude" options.
113
138
 
114
- #13406: I've decided not to do this, as it really isn't the "simplest thing
139
+ #13406: I've decided not to do this, as it really isn't the "simplest thing
115
140
  that could possibly work." It's easy enough for the user to define a module
116
- of new behavior and just use "obj.extend(module)". However, when the user
141
+ of new behavior and just use "obj.extend(module)". However, when the user
117
142
  needs to do this over a set of types, Aquarium's TypeFinder can be helpful,
118
143
  so I added an example to the Examples code and page.
119
144
 
120
- #18537: I've provided an example of the design approach where you define
121
- pointcuts in a class, as a kind of "aspect interface" and write aspects that
122
- specify those pointcuts. The problem has been that you had to name every
123
- single such pointcut explicitly. There was no "finder" option, as for types,
124
- methods, etc. Now there is a pointcut finder option with a new option
125
- ":named_pointcuts" for Aspect.new to specify a search for pointcuts in a set
126
- of types matching a name specification. Either constants or class variables
145
+ #18537: I've provided an example of the design approach where you define
146
+ pointcuts in a class, as a kind of "aspect interface" and write aspects that
147
+ specify those pointcuts. The problem has been that you had to name every
148
+ single such pointcut explicitly. There was no "finder" option, as for types,
149
+ methods, etc. Now there is a pointcut finder option with a new option
150
+ ":named_pointcuts" for Aspect.new to specify a search for pointcuts in a set
151
+ of types matching a name specification. Either constants or class variables
127
152
  will be matched (or both).
128
153
 
129
- #19666: The rdoc for the key classes was cleaned up so it "renders" better.
154
+ #19666: The rdoc for the key classes was cleaned up so it "renders" better.
130
155
  Feedback is welcome.
131
156
 
132
- #19119: I finished the previously-incomplete support for allowing advice to
133
- change the raised exception, in both after and after_raising advice. A
134
- common scenario is to wrap the thrown exception in another. For example, a
157
+ #19119: I finished the previously-incomplete support for allowing advice to
158
+ change the raised exception, in both after and after_raising advice. A
159
+ common scenario is to wrap the thrown exception in another. For example, a
135
160
  low-level, service-specific exception (like a database error) in a
136
- higher-level, more generic application exception.
161
+ higher-level, more generic application exception.
137
162
 
138
- You still can't rescue the exception completely in :after_raising and :after
139
- advice; the value for the exception in
163
+ You still can't rescue the exception completely in :after_raising and :after
164
+ advice; the value for the exception in
140
165
  joinpoint.context.raised_exception
141
- when the advice returns will be raised by Aquarium. I think that permitting
142
- :after_raising or :after advice to "eat" the exception could cause subtle
143
- issues with scope and variable binding. It would also probably violate the
144
- "principle of least surprise"; the advice code that rescues the exception would
166
+ when the advice returns will be raised by Aquarium. I think that permitting
167
+ :after_raising or :after advice to "eat" the exception could cause subtle
168
+ issues with scope and variable binding. It would also probably violate the
169
+ "principle of least surprise"; the advice code that rescues the exception would
145
170
  not be as "obvious" to the reader as the familiar idiom of rescue clauses
146
- that we are accustomed to using. Therefore, if you want to recover completely
171
+ that we are accustomed to using. Therefore, if you want to recover completely
147
172
  from an exception, use rescue clauses in around advice.
148
173
 
149
174
  == Version 0.4.1
150
175
 
151
- V0.4.1 adds a few bug fixes, a few more user examples, internal refactoring and
176
+ V0.4.1 adds a few bug fixes, a few more user examples, internal refactoring and
152
177
  some performance improvements.
153
178
 
154
179
  Bug fixes:
155
- 19116 When an exception is thrown during advice execution, the error message
180
+ 19116 When an exception is thrown during advice execution, the error message
156
181
  always reports the advice type is :before!
157
182
  19261 after_raising DSL method provides no way to specify exceptions
158
183
 
@@ -161,19 +186,19 @@ Enhancements:
161
186
  19320 Move the Aquarium::...::AspectDSL file to Aquarium::DSL for convenience
162
187
  19399 Improve the Design by Contract example
163
188
 
164
- I added a new :exceptions argument (synonym :exception) that takes a single
165
- exception or list thereof. You can only use this argument with :after_raising.
166
- If you specify exceptions with the latter and use the :exceptions argument,
189
+ I added a new :exceptions argument (synonym :exception) that takes a single
190
+ exception or list thereof. You can only use this argument with :after_raising.
191
+ If you specify exceptions with the latter and use the :exceptions argument,
167
192
  the values will be merged.
168
193
 
169
- I thought it was ugly to have to type "include
170
- Aquarium::Aspects::DSL::AspectDSL", so I moved the code so now it's "include
171
- Aquarium::DSL". However, for backwards compatibility, the old module still
194
+ I thought it was ugly to have to type "include
195
+ Aquarium::Aspects::DSL::AspectDSL", so I moved the code so now it's "include
196
+ Aquarium::DSL". However, for backwards compatibility, the old module still
172
197
  works.
173
198
 
174
199
  == Version 0.4.0
175
200
 
176
- V0.4.0 adds specs to characterize and test advising Java classes when running
201
+ V0.4.0 adds specs to characterize and test advising Java classes when running
177
202
  on JRuby and adds several API enhancements.
178
203
 
179
204
  Bug fixes:
@@ -185,50 +210,50 @@ Enhancements:
185
210
  17834 Allow :class and :module (and variants) wherever :type is allowed
186
211
  17881 Add specs that exercise advising Java types and objects using JRuby
187
212
 
188
- #17844 occurred because of the way JRuby encodes Java packages into modules.
213
+ #17844 occurred because of the way JRuby encodes Java packages into modules.
189
214
  Aquarium now properly handles JRuby types.
190
215
 
191
216
  #17883 reflected a JRuby bug, so a workaround was required.
192
-
193
- #17834 allows the user to substitute the words "class", "classes", "module" or
194
- "modules" anywhere the words "type" and "types" are used in the API, since some
217
+
218
+ #17834 allows the user to substitute the words "class", "classes", "module" or
219
+ "modules" anywhere the words "type" and "types" are used in the API, since some
195
220
  users might naturally want to write aspects like this:
196
221
 
197
222
  around :calls_to => :my_method, :in_class => MyClass do ...; end
198
223
 
199
- However, there is no enforcement to ensure that "class" is only used for
200
- classes and "module" is only used for modules, etc. Note: it's possible we'll
201
- enforce this in some future release, as a way of saying things like "only advise
224
+ However, there is no enforcement to ensure that "class" is only used for
225
+ classes and "module" is only used for modules, etc. Note: it's possible we'll
226
+ enforce this in some future release, as a way of saying things like "only advise
202
227
  classes that match ...", etc. Caveat Emptor!
203
228
 
204
- For #18090, a bug prevented JoinPoint#invoke_original_join_point (which allows
205
- you to bypass all advices at the join point) from working except for :around
229
+ For #18090, a bug prevented JoinPoint#invoke_original_join_point (which allows
230
+ you to bypass all advices at the join point) from working except for :around
206
231
  advice (and yes, the specs didn't cover this adequately - gasp!). Now fixed.
207
232
 
208
- For #17881, I created a separate set of specs for JRuby, so it's easier to run
209
- the "regular" Aquarium specs using MRI and the JRuby-specific specs separately
210
- with JRuby. The new "jruby" directory contains a Rakefile, another set of specs,
211
- and Java example code for the specs to use. The default Rakefile task re-runs
212
- the main Aquarium spec suite using JRuby, to confirm that the suite passes
213
- successfully, then it runs a set of different specs that load sample Java
233
+ For #17881, I created a separate set of specs for JRuby, so it's easier to run
234
+ the "regular" Aquarium specs using MRI and the JRuby-specific specs separately
235
+ with JRuby. The new "jruby" directory contains a Rakefile, another set of specs,
236
+ and Java example code for the specs to use. The default Rakefile task re-runs
237
+ the main Aquarium spec suite using JRuby, to confirm that the suite passes
238
+ successfully, then it runs a set of different specs that load sample Java
214
239
  interfaces and classes into JRuby and then advises them with Aquarium.
215
240
 
216
- I found a few JRuby bugs and other behavior differences between MRI during this
217
- release. I was able to handle them with modifications to the Aquarium code. If
218
- you "grep" the Aquarium "lib" and "spec" directories for the word "jruby"
219
- (ignoring case), you'll find notes about these issues and the workarounds I
241
+ I found a few JRuby bugs and other behavior differences between MRI during this
242
+ release. I was able to handle them with modifications to the Aquarium code. If
243
+ you "grep" the Aquarium "lib" and "spec" directories for the word "jruby"
244
+ (ignoring case), you'll find notes about these issues and the workarounds I
220
245
  implemented.
221
246
 
222
- The separate JRuby spec suite shows what you can and cannot do with Java types.
223
- As a side benefit, it also demonstrates how Java types, objects, and methods
224
- are mapped to Ruby. There are some important limitations, however. See the
225
- jruby.html page on the website or the README for more details.
247
+ The separate JRuby spec suite shows what you can and cannot do with Java types.
248
+ As a side benefit, it also demonstrates how Java types, objects, and methods
249
+ are mapped to Ruby. There are some important limitations, however. See the
250
+ jruby.html page on the website or the README for more details.
226
251
 
227
252
  Note: JRuby 1.1RC2 was used.
228
-
253
+
229
254
  == Version 0.3.1
230
255
 
231
- V0.3.1 adds numerous performance improvements, especially in the RSpec suite,
256
+ V0.3.1 adds numerous performance improvements, especially in the RSpec suite,
232
257
  and some minor API additions.
233
258
 
234
259
  Bug fixes:
@@ -236,60 +261,60 @@ N.A.
236
261
 
237
262
  Enhancements:
238
263
  14447 Unify internal handling of reporting errors to the user
239
- 17514 Provide an Aquarium library-wide logger with configuration parameters and
264
+ 17514 Provide an Aquarium library-wide logger with configuration parameters and
240
265
  instance overrides
241
266
  17515 Add an optional warning if an aspect doesn't match any join points
242
- 17516 Remove unnecessary examples that use :types_and_descendents to shorten
267
+ 17516 Remove unnecessary examples that use :types_and_descendents to shorten
243
268
  time to run the RSpec suite
244
- 17565 JoinPoint.new should convert a type name, symbol, or regex to the type
269
+ 17565 JoinPoint.new should convert a type name, symbol, or regex to the type
245
270
  and only allow one type
246
271
 
247
- These first two enhancements are related. There is a now an
248
- Aquarium::Utils::DefaultLogger module with static accessors for getting and
249
- setting the "system-wide" logger.
272
+ These first two enhancements are related. There is a now an
273
+ Aquarium::Utils::DefaultLogger module with static accessors for getting and
274
+ setting the "system-wide" logger.
250
275
 
251
- When instance-level overrides are necessary, the Aquarium::Utils::OptionsUtils
252
- provides "universal" options (but currently used only by Aspect and Pointcut)
253
- for specifying a logger (with the new :logger parameter), or alternatively,
254
- specifying just the output stream (:logger_stream) and/or the severity
255
- (:severity, one of the standard library's Logger::Severity-defined constants).
256
- If either of the latter two options is specified, a separate logger instance is
276
+ When instance-level overrides are necessary, the Aquarium::Utils::OptionsUtils
277
+ provides "universal" options (but currently used only by Aspect and Pointcut)
278
+ for specifying a logger (with the new :logger parameter), or alternatively,
279
+ specifying just the output stream (:logger_stream) and/or the severity
280
+ (:severity, one of the standard library's Logger::Severity-defined constants).
281
+ If either of the latter two options is specified, a separate logger instance is
257
282
  created, rather than changing parameters for the global logger.
258
283
 
259
- OptionsUtils also supports a :noop parameter, which classes interpret to mean
284
+ OptionsUtils also supports a :noop parameter, which classes interpret to mean
260
285
  do none (or perhaps only some) of the processing. Useful for debugging.
261
286
 
262
- #17515 adds a helpful warning to the system (or aspect-instance's) logger if
263
- an aspect matches no join points. This warning will be suppressed if (i) the
264
- severity level for the logger is above WARN or (ii) the aspect was created
287
+ #17515 adds a helpful warning to the system (or aspect-instance's) logger if
288
+ an aspect matches no join points. This warning will be suppressed if (i) the
289
+ severity level for the logger is above WARN or (ii) the aspect was created
265
290
  with the option :ignore_no_matching_join_points => true.
266
291
 
267
- #17516 fixes halved the long execution times for the whole RSpec suite by
268
- refactoring some examples that used type finders with the :types_and_descendents
269
- option unnecessarily. It is a very intensive computation! Note that I stubbed
270
- out these calls using an aspect with around advise, a useful "development-time"
292
+ #17516 fixes halved the long execution times for the whole RSpec suite by
293
+ refactoring some examples that used type finders with the :types_and_descendents
294
+ option unnecessarily. It is a very intensive computation! Note that I stubbed
295
+ out these calls using an aspect with around advise, a useful "development-time"
271
296
  aspect. See Aquarium::TypeUtilsStub (in spec_example_types.rb) and how it's used
272
- in pointcut_spec.rb. Using this technique and other optimizations, the time to
297
+ in pointcut_spec.rb. Using this technique and other optimizations, the time to
273
298
  run the suite was reduced from ~5 minutes to about 1 minute.
274
-
275
- #17565 fixes a "hole" in JoinPoint, where it doesn't confirm that a specified
276
- type string, symbol or regex matches a class that exists and only one class. Now
299
+
300
+ #17565 fixes a "hole" in JoinPoint, where it doesn't confirm that a specified
301
+ type string, symbol or regex matches a class that exists and only one class. Now
277
302
  it does and it stores the type, rather than the original "specification" for it.
278
303
 
279
304
  == Version 0.3.0
280
305
 
281
- V0.3.0 adds numerous improvements to the DSL, making aspect specification more
306
+ V0.3.0 adds numerous improvements to the DSL, making aspect specification more
282
307
  intuitive and English-like. For example, where you previously wrote, e.g.,
283
308
 
284
309
  around :methods => :all, :types => [Foo, Bar], :advice => advice_proc
285
310
  after :attribute => name, :attribute_options => [:readers], :objects => [foo, bar] ...
286
-
311
+
287
312
  Now you can write the same aspects as follows:
288
313
 
289
314
  around :calls_to => :all_methods, :within_types => [Foo, Bar], :use_advice => advice_proc
290
315
  after :reading => name, :on_objects => [foo, bar] ...
291
316
 
292
- Other improvements include performance and robustness enhancements and
317
+ Other improvements include performance and robustness enhancements and
293
318
  miscellaneous internal refactoring and DRY improvements.
294
319
 
295
320
  Bug fixes:
@@ -300,23 +325,23 @@ Enhancements:
300
325
 
301
326
  For #17154, the following changes were made:
302
327
  Added :all_methods as a synonym for the :all special value.
303
- Added :reading as a synonym for :attributes => ..., :attribute_options =>
328
+ Added :reading as a synonym for :attributes => ..., :attribute_options =>
304
329
  [:readers]
305
- Added :writing and :changing as synonyms for :attributes => ...,
330
+ Added :writing and :changing as synonyms for :attributes => ...,
306
331
  :attribute_options => [:writers]
307
332
  Added :accessing as a synonym for :attributes => ...
308
- Added :calls_to, :calling, :invoking, :sending_message_to as synonyms for
333
+ Added :calls_to, :calling, :invoking, :sending_message_to as synonyms for
309
334
  :methods.
310
- Added :on_types, :in_types, :within_types and :for_types as synonyms for :types.
311
- The same set of prefixes is supported for :type, :objects, :object, and the
335
+ Added :on_types, :in_types, :within_types and :for_types as synonyms for :types.
336
+ The same set of prefixes is supported for :type, :objects, :object, and the
312
337
  various :exclude_*, :*_and_ancestors, and :*_and_descendents.
313
338
 
314
- The full list of possible synonyms are shown in the spec examples. In
339
+ The full list of possible synonyms are shown in the spec examples. In
315
340
  particular, see "pointcut_spec.rb".
316
341
 
317
342
  == Version 0.2.0
318
343
 
319
- V0.2.0 changes the parameter list used for advice blocks and adds numerous
344
+ V0.2.0 changes the parameter list used for advice blocks and adds numerous
320
345
  enhancements, robustness improvements and more complete "spec'ing".
321
346
 
322
347
  Bug fixes:
@@ -325,20 +350,20 @@ none
325
350
  Enhancements:
326
351
  13402 Support a subclass syntax like AspectJ's "Type+".
327
352
  13984 More flexible argument list to the advise block.
328
- 14053 Remove JoinPoint#type, JoinPoint#type=, JoinPoint#object, and
353
+ 14053 Remove JoinPoint#type, JoinPoint#type=, JoinPoint#object, and
329
354
  JoinPoint#object=
330
355
  14061 Add a control flow mechanism to skipping (sic) intermediate advice
331
356
  15164 Deprecate ObjectFinder
332
357
  15413 Remove ObjectFinder
333
358
  15710 Eliminate redundant public methods in various "finders"
334
359
 
335
- #13402 adds new invocation options to specify types and their descendents
336
- (subclasses or modules that include the specified module(s)) and ancestors.
337
- The latter should be used cautiously as it will include things like Kernel,
338
- Object, and Class! I used new command options rather than the AspectJ "+"
339
- suffix (and the proposed, but never implemented "-" suffix for ancestors),
340
- because the "+" would be confusing with regular expressions and not in the
341
- spirit of trying to make the pointcut language "easy to read". So, the
360
+ #13402 adds new invocation options to specify types and their descendents
361
+ (subclasses or modules that include the specified module(s)) and ancestors.
362
+ The latter should be used cautiously as it will include things like Kernel,
363
+ Object, and Class! I used new command options rather than the AspectJ "+"
364
+ suffix (and the proposed, but never implemented "-" suffix for ancestors),
365
+ because the "+" would be confusing with regular expressions and not in the
366
+ spirit of trying to make the pointcut language "easy to read". So, the
342
367
  following are now available:
343
368
  :type_and_ancestors
344
369
  :types_and_ancestors
@@ -349,39 +374,39 @@ Enhancements:
349
374
  :exclude_types_and_ancestors
350
375
  :exclude_type_and_descendents
351
376
  :exclude_types_and_descendents
352
- If you want both the ancestors and descendents, just use both options with
377
+ If you want both the ancestors and descendents, just use both options with
353
378
  the same value.
354
379
 
355
- #13984 adds the object as the second argument to the advice block parameter
356
- list. This change reflects the fact that the object is often needed, but
357
- calling jp.context.advised_object is a bit tedious. THIS CHANGE BREAKS
358
- BACKWARDS COMPATIBILITY!! An exception is raised if advice has the signature
380
+ #13984 adds the object as the second argument to the advice block parameter
381
+ list. This change reflects the fact that the object is often needed, but
382
+ calling jp.context.advised_object is a bit tedious. THIS CHANGE BREAKS
383
+ BACKWARDS COMPATIBILITY!! An exception is raised if advice has the signature
359
384
  |jp, *args|.
360
385
 
361
- #14061 adds a new method, JoinPoint#invoke_original_join_point, which will
362
- invoke the original method without intermediate advice. If called within
363
- around advice, you can write advice that vetoes all subsequent advice, yet
364
- invokes the original method. Use this technique cautiously, however, since you
365
- may not always know what other advices are involved and what side effects this
386
+ #14061 adds a new method, JoinPoint#invoke_original_join_point, which will
387
+ invoke the original method without intermediate advice. If called within
388
+ around advice, you can write advice that vetoes all subsequent advice, yet
389
+ invokes the original method. Use this technique cautiously, however, since you
390
+ may not always know what other advices are involved and what side effects this
366
391
  control-flow change might cause.
367
392
 
368
- #15164 and 15413 remove ObjectFinder because it is not used and it requires
369
- ObjectSpace, which has high overhead and won't be enabled, by default, in
393
+ #15164 and 15413 remove ObjectFinder because it is not used and it requires
394
+ ObjectSpace, which has high overhead and won't be enabled, by default, in
370
395
  JRuby (it will be optional).
371
396
 
372
- #15710 removes redundant methods that were becoming a maintenance issue, in
373
- particular, MethodFinder#find_all_by and TypeFinder#find_by_name. This is a
374
- non-backwards-compatible API change.
397
+ #15710 removes redundant methods that were becoming a maintenance issue, in
398
+ particular, MethodFinder#find_all_by and TypeFinder#find_by_name. This is a
399
+ non-backwards-compatible API change.
375
400
 
376
- Finally, note that I have not yet been able to resolve bug #15202, "Intermittent
377
- confusion between classes and objects when invoking advice." I believe this is a
378
- very rare occurrence and only likely to ever happen during the "torture-test" of
401
+ Finally, note that I have not yet been able to resolve bug #15202, "Intermittent
402
+ confusion between classes and objects when invoking advice." I believe this is a
403
+ very rare occurrence and only likely to ever happen during the "torture-test" of
379
404
  running the RSpec suite. Please post a comment to Tracker if you encounter it!
380
405
 
381
406
  == Version 0.1.8
382
407
 
383
- V0.1.7 did not successfully "register" at rubyforge. This releases fixes that
384
- problem and also adds several feature enhancements and refactorings. There are
408
+ V0.1.7 did not successfully "register" at rubyforge. This releases fixes that
409
+ problem and also adds several feature enhancements and refactorings. There are
385
410
  no known upgrade issues.
386
411
 
387
412
  Bug fixes:
@@ -391,14 +416,14 @@ Enhancements:
391
416
  13399 Add :exclusion options for methods and types.
392
417
  14707 :exclude_ancestor_methods as synonym for :suppress_ancestor_methods
393
418
 
394
- 13399 adds new :exclude_(pointcuts|join_points|types|objects|methods|attributes)
395
- options for Aspect.new, and Pointcut.new that make it easier to specify a list
396
- or regular expression for various "items" and then to exclude particular
397
- items, e.g., Aspect.new :around, :types => /nterestingType/, :exclude_types =>
419
+ 13399 adds new :exclude_(pointcuts|join_points|types|objects|methods|attributes)
420
+ options for Aspect.new, and Pointcut.new that make it easier to specify a list
421
+ or regular expression for various "items" and then to exclude particular
422
+ items, e.g., Aspect.new :around, :types => /nterestingType/, :exclude_types =>
398
423
  UninterestingType ...
399
424
 
400
- The :exclude_ancestor_methods option is now preferred over
401
- :suppress_ancestor_methods, since the former is more consistent with the new
425
+ The :exclude_ancestor_methods option is now preferred over
426
+ :suppress_ancestor_methods, since the former is more consistent with the new
402
427
  :exclude_* options.
403
428
 
404
429
  == Version 0.1.7
@@ -407,43 +432,43 @@ Bug fixes:
407
432
  14946 Advice fails when instrumenting methods containing special characters
408
433
  15038 Spec for pointcut example variation #1
409
434
  15039 Spec for pointcut example variation #2
410
- 15085 Specifying just :attributes for aspects also matches all methods, as if
435
+ 15085 Specifying just :attributes for aspects also matches all methods, as if
411
436
  :methods => :all specified
412
437
 
413
438
  Enhancements:
414
439
  13396 Unify internal handling of types vs. objects
415
440
 
416
- 15038 and 15039 were bugs in one of the examples (actually in the comments).
441
+ 15038 and 15039 were bugs in one of the examples (actually in the comments).
417
442
  However, experimenting with them also revealed the nasty 15085 bug!
418
443
 
419
- I previously handled some special characters in method names, but not all the
420
- possible ones, hence 14946. Aquarium should now properly handle any valid Ruby
444
+ I previously handled some special characters in method names, but not all the
445
+ possible ones, hence 14946. Aquarium should now properly handle any valid Ruby
421
446
  method name.
422
447
 
423
448
  == Version 0.1.6
424
449
 
425
450
  Bug fixes:
426
- 14353 Advising subclass method that calls super raises exception when method
451
+ 14353 Advising subclass method that calls super raises exception when method
427
452
  executed
428
- 14356 Regexps for types must cover the whole name, which is inconsistent with
453
+ 14356 Regexps for types must cover the whole name, which is inconsistent with
429
454
  method/attribute regexps
430
455
  14384 Design by Contract "extra" does not return correct value "invar" handling
431
456
  13410 Fix funky navigation bar on website
432
457
 
433
- 14353 was kind of bad, but it's actually a Ruby bug with a good workaround. If
434
- you advised a method that called "super", Ruby would use the wrong method name
458
+ 14353 was kind of bad, but it's actually a Ruby bug with a good workaround. If
459
+ you advised a method that called "super", Ruby would use the wrong method name
435
460
  to lookup the class in the parent. See the bug description for the details.
436
461
 
437
- For 14356, type regular expressions now match on parts of names; they don't have
438
- to match the whole name. The exception is regular expressions with module
439
- separators "::". In this case, it seems to make more sense for the regular
440
- expression to be interpreted as follows: If the expression is /A::B::C::D/,
441
- then for the the outermost types, the expression behaves as /^.*A/, for the
442
- types between two "::", the expressions behave as /^B$/ and /^C$/, and the
462
+ For 14356, type regular expressions now match on parts of names; they don't have
463
+ to match the whole name. The exception is regular expressions with module
464
+ separators "::". In this case, it seems to make more sense for the regular
465
+ expression to be interpreted as follows: If the expression is /A::B::C::D/,
466
+ then for the the outermost types, the expression behaves as /^.*A/, for the
467
+ types between two "::", the expressions behave as /^B$/ and /^C$/, and the
443
468
  trailing expression behaves as /D.*$/.
444
469
 
445
- 14384 was an easy mistake to make with "around" advice; you have to remember to
446
- return the result of the "join_point.proceed" call, unless you specifically
470
+ 14384 was an easy mistake to make with "around" advice; you have to remember to
471
+ return the result of the "join_point.proceed" call, unless you specifically
447
472
  want to change the returned value! Here are two ways to do it:
448
473
 
449
474
  do_something_before(...)
@@ -452,7 +477,7 @@ For 14356, type regular expressions now match on parts of names; they don't have
452
477
  return result
453
478
 
454
479
  or
455
-
480
+
456
481
  begin
457
482
  do_something_before(...)
458
483
  join_point.proceed
@@ -460,10 +485,10 @@ For 14356, type regular expressions now match on parts of names; they don't have
460
485
  do_something_after(...)
461
486
  end
462
487
 
463
- The latter approach looks "asymmetrical" and it will behave differently if
464
- "proceed" raises! However, it eliminates the temporary, if you find that
488
+ The latter approach looks "asymmetrical" and it will behave differently if
489
+ "proceed" raises! However, it eliminates the temporary, if you find that
465
490
  desirable.
466
-
491
+
467
492
  Enhancements:
468
493
  13407 Pick a better method name for JoinPoint#type, which hides the Module#type
469
494
  14385 Pointcut.new should accept a :join_point => jp argument
@@ -476,24 +501,24 @@ For 13407, new attribute methods have been added
476
501
  * JoinPoint#target_object return the object that the join_point matches.
477
502
  * JoinPoint#target_object= set the object that the join_point matches.
478
503
 
479
- The following, older methods are now deprecated and will be removed in the 0.2.0
504
+ The following, older methods are now deprecated and will be removed in the 0.2.0
480
505
  release (#14053):
481
506
  * JoinPoint#type
482
507
  * JoinPoint#type=
483
508
  * JoinPoint#object
484
509
  * JoinPoint#object=
485
510
 
486
- JoinPoint#type method is deprecated because it hides Module#type, which returns
487
- the type of the corresponding object. For "symmetry", the other three methods
488
- are also now deprecated and they will be removed in a future release. Until
489
- then, all will print a warning message to STDOUT. (If you really want the type
490
- of what could be a JoinPoint object, you should use #class anyway, as
511
+ JoinPoint#type method is deprecated because it hides Module#type, which returns
512
+ the type of the corresponding object. For "symmetry", the other three methods
513
+ are also now deprecated and they will be removed in a future release. Until
514
+ then, all will print a warning message to STDOUT. (If you really want the type
515
+ of what could be a JoinPoint object, you should use #class anyway, as
491
516
  Module#type is also deprecated!)
492
517
 
493
518
  == Version 0.1.5
494
519
 
495
520
  Bug fixes:
496
- 13514 Protected and private methods are made public when advised and left that
521
+ 13514 Protected and private methods are made public when advised and left that
497
522
  way when unadvised
498
523
  13650 Loading Aquarium interferes with Rails filters
499
524
  13864 Bug with negative object_id
@@ -502,23 +527,23 @@ Enhancements:
502
527
  13392 Convert examples to specs.
503
528
  13463 Support running in JRuby
504
529
 
505
- Fixing 13650 required an API change, which is why I've tagged this release
506
- "0.1.5" instead of something like "0.1.1" (and the changes don't seem big enough
530
+ Fixing 13650 required an API change, which is why I've tagged this release
531
+ "0.1.5" instead of something like "0.1.1" (and the changes don't seem big enough
507
532
  to warrant "0.2.0"...).
508
533
 
509
- Previously, requiring "aquarium.rb" in the top-level "lib" directory would
510
- implicitly require lib/aquarium/dsl/aspect_dsl.rb, which has Object include the
511
- AspectDSL module. This module adds methods like :before and :after to Object.
512
- Unfortunately, those methods collide with methods of the same name that Rails
513
- adds to Object. It was also a bit presumptuous of me to assume that everyone
534
+ Previously, requiring "aquarium.rb" in the top-level "lib" directory would
535
+ implicitly require lib/aquarium/dsl/aspect_dsl.rb, which has Object include the
536
+ AspectDSL module. This module adds methods like :before and :after to Object.
537
+ Unfortunately, those methods collide with methods of the same name that Rails
538
+ adds to Object. It was also a bit presumptuous of me to assume that everyone
514
539
  wanted those methods on Object ;)
515
540
 
516
- In this release, aspect_dsl.rb is still implicitly included and it still defines
517
- the AspectDSL module. Now, however, it does not include the AspectDSL module in
518
- Object. Instead, if you want this behavior for all types, you must require the
519
- new lib/aquarium/aspects/dsl/object_dsl.rb explicitly.
541
+ In this release, aspect_dsl.rb is still implicitly included and it still defines
542
+ the AspectDSL module. Now, however, it does not include the AspectDSL module in
543
+ Object. Instead, if you want this behavior for all types, you must require the
544
+ new lib/aquarium/aspects/dsl/object_dsl.rb explicitly.
520
545
 
521
- As an alternative, if you just want the AspectDSL module included selectively in
546
+ As an alternative, if you just want the AspectDSL module included selectively in
522
547
  certain types, then do the following:
523
548
 
524
549
  class MyClass # reopen "MyClass"
@@ -541,12 +566,12 @@ To add the methods as _instance_ methods on individual objects:
541
566
  object.extend(Aquarium::DSL)
542
567
 
543
568
 
544
- Note: as discussed at
545
- http://practicalruby.blogspot.com/2007/02/reopen-with-moduleeval.html,
546
- using "class_eval" or "module_eval" is safer that just reopening a class if
547
- you're not sure that "MyClass" has actually been defined yet. However, in our
548
- particular case, it probably doesn't matter, as AspectDSL doesn't change
549
- anything about the type, like aliasing existing methods. Still, we can't
569
+ Note: as discussed at
570
+ http://practicalruby.blogspot.com/2007/02/reopen-with-moduleeval.html,
571
+ using "class_eval" or "module_eval" is safer that just reopening a class if
572
+ you're not sure that "MyClass" has actually been defined yet. However, in our
573
+ particular case, it probably doesn't matter, as AspectDSL doesn't change
574
+ anything about the type, like aliasing existing methods. Still, we can't
550
575
  guarantee that this won't change in the future.
551
576
 
552
577
  == Version 0.1.0