aquarium 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. data/CHANGES +35 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README +66 -20
  4. data/Rakefile +1 -1
  5. data/UPGRADE +5 -0
  6. data/examples/aspect_design_example.rb +5 -4
  7. data/examples/aspect_design_example_spec.rb +6 -5
  8. data/examples/design_by_contract_example.rb +3 -3
  9. data/examples/design_by_contract_example_spec.rb +4 -4
  10. data/examples/method_missing_example.rb +1 -1
  11. data/examples/method_missing_example_spec.rb +2 -2
  12. data/examples/method_tracing_example.rb +3 -3
  13. data/examples/method_tracing_example_spec.rb +6 -6
  14. data/lib/aquarium/aspects/advice.rb +2 -3
  15. data/lib/aquarium/aspects/aspect.rb +100 -246
  16. data/lib/aquarium/aspects/{default_object_handler.rb → default_objects_handler.rb} +7 -6
  17. data/lib/aquarium/aspects/dsl/aspect_dsl.rb +2 -2
  18. data/lib/aquarium/aspects/pointcut.rb +190 -107
  19. data/lib/aquarium/finders/method_finder.rb +120 -34
  20. data/lib/aquarium/finders/type_finder.rb +2 -5
  21. data/lib/aquarium/utils.rb +1 -0
  22. data/lib/aquarium/utils/array_utils.rb +11 -3
  23. data/lib/aquarium/utils/options_utils.rb +74 -0
  24. data/lib/aquarium/utils/type_utils.rb +25 -11
  25. data/lib/aquarium/version.rb +1 -1
  26. data/spec/aquarium/aspects/advice_chain_node_spec.rb +1 -1
  27. data/spec/aquarium/aspects/advice_spec.rb +1 -1
  28. data/spec/aquarium/aspects/aspect_invocation_spec.rb +179 -145
  29. data/spec/aquarium/aspects/aspect_spec.rb +1 -1
  30. data/spec/aquarium/aspects/aspect_with_nested_types_spec.rb +1 -1
  31. data/spec/aquarium/aspects/aspect_with_subtypes_spec.rb +1 -1
  32. data/spec/aquarium/aspects/concurrent_aspects_spec.rb +1 -1
  33. data/spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb +1 -1
  34. data/spec/aquarium/aspects/default_objects_handler_spec.rb +147 -0
  35. data/spec/aquarium/aspects/dsl/aspect_dsl_spec.rb +72 -121
  36. data/spec/aquarium/aspects/join_point_spec.rb +1 -1
  37. data/spec/aquarium/aspects/pointcut_and_composition_spec.rb +1 -1
  38. data/spec/aquarium/aspects/pointcut_or_composition_spec.rb +48 -47
  39. data/spec/aquarium/aspects/pointcut_spec.rb +727 -410
  40. data/spec/aquarium/extensions/hash_spec.rb +1 -1
  41. data/spec/aquarium/extensions/regex_spec.rb +1 -1
  42. data/spec/aquarium/extensions/set_spec.rb +1 -1
  43. data/spec/aquarium/extensions/string_spec.rb +1 -1
  44. data/spec/aquarium/extensions/symbol_spec.rb +1 -1
  45. data/spec/aquarium/extras/design_by_contract_spec.rb +1 -1
  46. data/spec/aquarium/finders/finder_result_spec.rb +1 -1
  47. data/spec/aquarium/finders/method_finder_spec.rb +49 -16
  48. data/spec/aquarium/finders/type_finder_spec.rb +1 -1
  49. data/spec/aquarium/finders/type_finder_with_descendents_and_ancestors_spec.rb +16 -1
  50. data/spec/aquarium/utils/array_utils_spec.rb +31 -6
  51. data/spec/aquarium/utils/hash_utils_spec.rb +1 -1
  52. data/spec/aquarium/utils/html_escaper_spec.rb +1 -1
  53. data/spec/aquarium/utils/logic_error_spec.rb +1 -1
  54. data/spec/aquarium/utils/method_utils_spec.rb +1 -1
  55. data/spec/aquarium/utils/name_utils_spec.rb +1 -1
  56. data/spec/aquarium/utils/nil_object_spec.rb +1 -1
  57. data/spec/aquarium/utils/set_utils_spec.rb +1 -1
  58. data/spec/aquarium/utils/type_utils_spec.rb +1 -1
  59. metadata +9 -7
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/extensions/hash'
4
4
  require 'aquarium/utils/array_utils'
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/extensions/regexp'
3
3
 
4
4
  describe Regexp, "#empty?" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/extensions/set'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/extensions/string'
3
3
 
4
4
  describe String, "#to_camel_case" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/extensions/symbol'
3
3
 
4
4
  describe "Symbol#empty?" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/extras/design_by_contract'
3
3
 
4
4
  describe Aquarium::Extras::DesignByContract, "precondition" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
 
4
4
  require 'aquarium/finders/finder_result'
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/finders/method_finder'
4
4
 
@@ -82,24 +82,39 @@ describe Aquarium::Finders::MethodFinder, "#find (synonymous input parameters)"
82
82
  before_method_finder_spec
83
83
  end
84
84
 
85
- it "should accept options :types and :type, which are synonymous." do
86
- expected = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mbase/, /^mmodule/]
87
- actual = Aquarium::Finders::MethodFinder.new.find :type => Derived, :methods => [/^mbase/, /^mmodule/]
88
- actual.should == expected
85
+ Aquarium::Finders::MethodFinder::CANONICAL_OPTIONS["types"].each do |key|
86
+ it "should accept :#{key} as a synonym for :types." do
87
+ expected = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mbase/, /^mmodule/]
88
+ actual = Aquarium::Finders::MethodFinder.new.find key.intern => Derived, :methods => [/^mbase/, /^mmodule/]
89
+ actual.should == expected
90
+ end
89
91
  end
90
-
91
- it "should accept options :objects and :object, which are synonymous." do
92
- child = Derived.new
93
- expected = Aquarium::Finders::MethodFinder.new.find :objects => child, :methods => [/^mbase/, /^mmodule/]
94
- actual = Aquarium::Finders::MethodFinder.new.find :object => child, :methods => [/^mbase/, /^mmodule/]
95
- actual.should == expected
92
+
93
+ Aquarium::Finders::MethodFinder::CANONICAL_OPTIONS["objects"].each do |key|
94
+ it "should accept :#{key} as a synonym for :objects." do
95
+ child = Derived.new
96
+ expected = Aquarium::Finders::MethodFinder.new.find :objects => child, :methods => [/^mbase/, /^mmodule/]
97
+ actual = Aquarium::Finders::MethodFinder.new.find key.intern => child, :methods => [/^mbase/, /^mmodule/]
98
+ actual.should == expected
99
+ end
96
100
  end
97
-
98
- it "should accept options :methods and :method, which are synonymous." do
99
- expected = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mbase/, /^mmodule/]
100
- actual = Aquarium::Finders::MethodFinder.new.find :types => Derived, :method => [/^mbase/, /^mmodule/]
101
- actual.should == expected
101
+
102
+ Aquarium::Finders::MethodFinder::CANONICAL_OPTIONS["methods"].each do |key|
103
+ it "should accept :#{key} as a synonym for :methods." do
104
+ expected = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mbase/, /^mmodule/]
105
+ actual = Aquarium::Finders::MethodFinder.new.find :types => Derived, key.intern => [/^mbase/, /^mmodule/]
106
+ actual.should == expected
107
+ end
108
+ end
109
+
110
+ Aquarium::Finders::MethodFinder::CANONICAL_OPTIONS["options"].each do |key|
111
+ it "should accept :#{key} as a synonym for :options." do
112
+ expected = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mder/, /^mmod/], :options => [:exclude_ancestor_methods]
113
+ actual = Aquarium::Finders::MethodFinder.new.find :types => Derived, :methods => [/^mder/, /^mmod/], key.intern => [:exclude_ancestor_methods]
114
+ actual.should == expected
115
+ end
102
116
  end
117
+
103
118
  end
104
119
 
105
120
  describe Aquarium::Finders::MethodFinder, "#find (invalid input parameters)" do
@@ -330,6 +345,14 @@ describe Aquarium::Finders::MethodFinder, "#find (searching for class methods)"
330
345
  actual.matched[ClassWithPrivateClassMethod].should == Set.new(ClassWithPrivateClassMethod.public_methods.sort.map{|m| m.intern})
331
346
  end
332
347
 
348
+ it "should accept :all_methods as a synonym for :all." do
349
+ actual = Aquarium::Finders::MethodFinder.new.find :types => [ClassWithPublicClassMethod, ClassWithPrivateClassMethod], :methods => :all_methods, :options => :class
350
+ actual.matched.size.should == 2
351
+ actual.not_matched.size.should == 0
352
+ actual.matched[ClassWithPublicClassMethod].should == Set.new(ClassWithPublicClassMethod.public_methods.sort.map{|m| m.intern})
353
+ actual.matched[ClassWithPrivateClassMethod].should == Set.new(ClassWithPrivateClassMethod.public_methods.sort.map{|m| m.intern})
354
+ end
355
+
333
356
  it "should find all public class methods in types, but not ancestors, when searching with the :all method specification and the :class and :exclude_ancestor_methods options." do
334
357
  actual = Aquarium::Finders::MethodFinder.new.find :types => [ClassWithPublicClassMethod, ClassWithPrivateClassMethod], :methods => :all, :options => [:class, :exclude_ancestor_methods]
335
358
  actual.matched.size.should == 1
@@ -569,6 +592,16 @@ describe Aquarium::Finders::MethodFinder, "#find (using :methods => :all)" do
569
592
  actual.matched[pub].should == Set.new([:public_instance_test_method])
570
593
  end
571
594
 
595
+ it "should ignore other method arguments if :all_methods is present." do
596
+ actual = Aquarium::Finders::MethodFinder.new.find :type => ClassWithPublicInstanceMethod, :method => [:all_methods, :none, /.*foo.*/], :methods =>[/.*bar.*/, /^baz/], :options => :exclude_ancestor_methods
597
+ actual.matched.size.should == 1
598
+ actual.matched[ClassWithPublicInstanceMethod].should == Set.new([:public_instance_test_method])
599
+ pub = ClassWithPublicInstanceMethod.new
600
+ actual = Aquarium::Finders::MethodFinder.new.find :object => pub, :method => [:all, :none, /.*foo.*/], :methods =>[/.*bar.*/, /^baz/], :options => :exclude_ancestor_methods
601
+ actual.matched.size.should == 1
602
+ actual.matched[pub].should == Set.new([:public_instance_test_method])
603
+ end
604
+
572
605
  it "should report [:all] as the not_matched value when :all is the method argument and no methods match, e.g., for :exclude_ancestor_methods." do
573
606
  actual = Aquarium::Finders::MethodFinder.new.find :type => ClassWithPrivateInstanceMethod, :method => :all, :options => :exclude_ancestor_methods
574
607
  actual.matched.size.should == 0
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/finders/type_finder'
3
3
 
4
4
  class Outside
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../utils/type_utils_sample_classes'
3
3
  require 'aquarium/finders/type_finder'
4
4
 
@@ -151,6 +151,21 @@ end
151
151
  EOF
152
152
  end
153
153
 
154
+ describe "#find with regular expressions, including descendents and ancestors" do
155
+ it "should find the matching types, including their descendents and ancestors, even in different nested modules." do
156
+ doption = "types_and_descendents".intern
157
+ aoption = "types_and_ancestors".intern
158
+ regexs = [/ForDescendents$/, /Aquarium::ForDescendents::.*ForDescendents/]
159
+ actual = Aquarium::Finders::TypeFinder.new.find aoption => regexs, doption => regexs
160
+ actual_keys = purge_actuals actual
161
+ expected = Aquarium::Utils::TypeUtils.sample_types_descendents_and_ancestors.keys + [Kernel, Object]
162
+ actual_keys.size.should == expected.size
163
+ expected.each do |t|
164
+ actual_keys.should include(t)
165
+ end
166
+ actual.not_matched_keys.should == []
167
+ end
168
+ end
154
169
 
155
170
  describe "#find with regular expressions, including descendents and ancestors", :shared => true do
156
171
  it "should find the matching types, including their descendents and ancestors, even in different nested modules." do
@@ -1,13 +1,17 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/utils/array_utils'
3
3
  require 'set'
4
4
 
5
- describe Aquarium::Utils::ArrayUtils, "make_array" do
6
-
5
+ describe Aquarium::Utils::ArrayUtils, "#make_array" do
7
6
  it "should return an empty array if the input is nil." do
8
7
  make_array(nil).should == []
9
8
  end
10
9
 
10
+ it "should accept a list of arguments instead of an array or Set." do
11
+ make_array(nil, nil).should == []
12
+ make_array(nil, 1, 2, nil, 3, 4).should == [1, 2, 3, 4]
13
+ end
14
+
11
15
  it "should return an empty array if an input array contains all nils." do
12
16
  make_array([nil, nil]).should == []
13
17
  end
@@ -40,8 +44,29 @@ describe Aquarium::Utils::ArrayUtils, "make_array" do
40
44
  make_array(Set.new([1,2,"123"])).should == [1,2,"123"]
41
45
  end
42
46
 
43
- it "should accept a list of arguments instead of an array or Set." do
44
- make_array(nil, nil).should == []
45
- make_array(nil, 1, 2, nil, 3, 4).should == [1, 2, 3, 4]
47
+ it "should be available as a class method." do
48
+ Aquarium::Utils::ArrayUtils.make_array(Set.new([1,2,"123"])).should == [1,2,"123"]
49
+ end
50
+ end
51
+
52
+ describe Aquarium::Utils::ArrayUtils, "#strip_nils" do
53
+ it "should return an empty array if an input array contains all nils." do
54
+ strip_nils([nil, nil]).should == []
55
+ end
56
+
57
+ it "should return an empty array if an input Set contains all nils." do
58
+ strip_nils(Set.new([nil, nil])).should == []
59
+ end
60
+
61
+ it "should return an array with all nils removed from the input array." do
62
+ strip_nils([nil, 1, 2, nil, 3, 4]).should == [1, 2, 3, 4]
63
+ end
64
+
65
+ it "should return an array with all nils removed from the input Set." do
66
+ strip_nils(Set.new([nil, 1, 2, nil, 3, 4])).should == [1, 2, 3, 4]
67
+ end
68
+
69
+ it "should be accessible as a class method." do
70
+ Aquarium::Utils::ArrayUtils.strip_nils(Set.new([nil, 1, 2, nil, 3, 4])).should == [1, 2, 3, 4]
46
71
  end
47
72
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/utils/hash_utils'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/utils/array_utils'
3
3
  require 'set'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/utils/logic_error'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/utils/method_utils'
3
3
 
4
4
  describe Aquarium::Utils::MethodUtils, ".method_args_to_hash" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/utils/name_utils'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/utils/nil_object'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require File.dirname(__FILE__) + '/../spec_example_classes'
3
3
  require 'aquarium/utils/set_utils'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
  require 'aquarium/utils/type_utils'
3
3
  require File.dirname(__FILE__) + '/../utils/type_utils_sample_classes'
4
4
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aquarium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- platform: ""
4
+ version: 0.3.0
5
+ platform: ruby
6
6
  authors:
7
- - - Aquarium Development Team
7
+ - Aquarium Development Team
8
8
  autorequire: aquarium
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2007-11-24 00:00:00 -06:00
12
+ date: 2008-01-21 00:00:00 -06:00
13
13
  default_executable: ""
14
14
  dependencies: []
15
15
 
@@ -34,7 +34,7 @@ files:
34
34
  - UPGRADE
35
35
  - lib/aquarium/aspects/advice.rb
36
36
  - lib/aquarium/aspects/aspect.rb
37
- - lib/aquarium/aspects/default_object_handler.rb
37
+ - lib/aquarium/aspects/default_objects_handler.rb
38
38
  - lib/aquarium/aspects/dsl/aspect_dsl.rb
39
39
  - lib/aquarium/aspects/dsl/object_dsl.rb
40
40
  - lib/aquarium/aspects/dsl.rb
@@ -63,6 +63,7 @@ files:
63
63
  - lib/aquarium/utils/method_utils.rb
64
64
  - lib/aquarium/utils/name_utils.rb
65
65
  - lib/aquarium/utils/nil_object.rb
66
+ - lib/aquarium/utils/options_utils.rb
66
67
  - lib/aquarium/utils/set_utils.rb
67
68
  - lib/aquarium/utils/type_utils.rb
68
69
  - lib/aquarium/utils.rb
@@ -77,6 +78,7 @@ files:
77
78
  - spec/aquarium/aspects/concurrent_aspects_spec.rb
78
79
  - spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb
79
80
  - spec/aquarium/aspects/concurrently_accessed.rb
81
+ - spec/aquarium/aspects/default_objects_handler_spec.rb
80
82
  - spec/aquarium/aspects/dsl/aspect_dsl_spec.rb
81
83
  - spec/aquarium/aspects/join_point_spec.rb
82
84
  - spec/aquarium/aspects/pointcut_and_composition_spec.rb
@@ -143,9 +145,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
145
  requirements: []
144
146
 
145
147
  rubyforge_project: aquarium
146
- rubygems_version: 0.9.5
148
+ rubygems_version: 1.0.1
147
149
  signing_key:
148
150
  specification_version: 2
149
- summary: Aquarium-0.2.0 (r7) - Aspect-Oriented Programming toolkit for Ruby http://aquarium.rubyforge.org
151
+ summary: Aquarium-0.3.0 (r7) - Aspect-Oriented Programming toolkit for Ruby http://aquarium.rubyforge.org
150
152
  test_files: []
151
153