class_dependencies 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
@@ -25,6 +25,12 @@ require 'inflector.rb'
25
25
  # => [:f, :e, :d]
26
26
  # AnotherDep.ordered_dependent_classes
27
27
  # => [F, E, D]
28
+ #
29
+ # *NOTE* if your class already has an inherited() or included() method
30
+ # make sure to include Sonar::ClassDependencies after that method is
31
+ # defined : Ruby has no after/before methods, so your method will
32
+ # overwrite the ClassDependencies versions, and dependency tracking
33
+ # will not work
28
34
 
29
35
  module Sonar
30
36
  module ClassDependencies
@@ -47,6 +53,12 @@ module Sonar
47
53
  def generate_inclusion_method(mod, method_name)
48
54
  mc = mod.instance_eval{class << self ; self ; end}
49
55
 
56
+ # if there is already such a method, alias it
57
+ if mod.respond_to?(method_name)
58
+ aliased_method_name = "class_dependencies_#{method_name}"
59
+ mc.send(:alias_method, aliased_method_name, method_name)
60
+ end
61
+
50
62
  mc.send(:define_method, method_name) do |mod2|
51
63
  raise "include #{mod.to_s} on a Class... doesn't work with intermediate modules" if ! mod2.is_a? Class
52
64
  mod.descendants << class_to_sym(mod2)
@@ -55,6 +67,9 @@ module Sonar
55
67
  dep_method_name = mod.relationship_name || class_to_sym(mod)
56
68
  mc2.send(:define_method, dep_method_name){|*params| mod.add_dependency(mod2, *params)}
57
69
  end
70
+
71
+ # call any aliased method. if only Ruby had :after advice etc
72
+ mod.send(aliased_method_name, mod2) if aliased_method_name
58
73
  end
59
74
  end
60
75
 
@@ -17,7 +17,6 @@ describe "ClassDependencies" do
17
17
  class C < BaseDep
18
18
  end
19
19
 
20
-
21
20
  it "should correctly order class dependences" do
22
21
  BaseDep.ordered_dependencies.should == [:c, :b, :a]
23
22
  end
@@ -58,4 +57,57 @@ describe "ClassDependencies" do
58
57
  AnotherDep.class_dependencies.should == {:d=>[:e], :e=>[:f]}
59
58
  end
60
59
 
60
+ module WithIncludedMethod
61
+ class << self
62
+ attr_accessor :count
63
+ def included(mod)
64
+ self.count ||= 0
65
+ self.count += 1
66
+ end
67
+ end
68
+
69
+ include Sonar::ClassDependencies
70
+ set_relationship_name :depends_on
71
+ end
72
+
73
+ class G
74
+ include WithIncludedMethod
75
+ depends_on :h
76
+ end
77
+
78
+ class H
79
+ include WithIncludedMethod
80
+ end
81
+
82
+
83
+ it "should call any existing included method" do
84
+ WithIncludedMethod.ordered_dependencies.should == [:h, :g]
85
+ WithIncludedMethod.count.should == 2
86
+ end
87
+
88
+ class WithInheritedMethod
89
+ class << self
90
+ attr_accessor :count
91
+ def inherited(mod)
92
+ self.count ||= 0
93
+ self.count += 1
94
+ end
95
+ end
96
+
97
+ include Sonar::ClassDependencies
98
+ set_relationship_name :depends_on
99
+ end
100
+
101
+ class I < WithInheritedMethod
102
+ depends_on :j
103
+ end
104
+
105
+ class J < WithInheritedMethod
106
+ end
107
+
108
+ it "should call any existing inherited method" do
109
+ WithInheritedMethod.ordered_dependencies.should == [:j, :i]
110
+ WithInheritedMethod.count.should == 2
111
+ end
112
+
61
113
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 1
9
- version: 0.2.1
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - mccraig mccraig of the clan mccraig