courgette 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/bin/{courgette.rb → courgette} +0 -0
- data/courgette.gemspec +2 -0
- data/lib/courgette/capturer.rb +29 -7
- data/lib/courgette/file_to_sexpr.rb +5 -1
- data/lib/courgette/name_resolution.rb +9 -3
- data/lib/courgette/reference_to_dependency.rb +2 -2
- data/lib/courgette/version.rb +1 -1
- data/test/courgette/test_capturer.rb +109 -0
- data/test/courgette/test_name_resolution.rb +37 -0
- data/test/courgette/test_reference_to_dependency.rb +41 -0
- data/test/courgette/test_scope.rb +1 -0
- metadata +35 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38ea2fcd95ca4875051e13099c9bd2588d27ee5a
|
4
|
+
data.tar.gz: eda2e173085c058bff814cfb19a963a6e099e0d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b842597ac23ddca376de1f97de42d4d405831a9264f32342bfedc991613d28ee9dc45cebc461b443e820644ab495e5052c2dc32635727e842aa772aacd5914f
|
7
|
+
data.tar.gz: 0716c611805a0657751446a40897a61c4bb74aae132a1177583e13be135e9d5c45a7764118623740705939cc874c408e8cc1cb5d21cdf0cc62341af967a284f0
|
File without changes
|
data/courgette.gemspec
CHANGED
@@ -25,4 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
26
|
spec.add_development_dependency "rake"
|
27
27
|
spec.add_development_dependency "minitest"
|
28
|
+
spec.add_development_dependency "mocha"
|
29
|
+
spec.add_development_dependency "simplecov"
|
28
30
|
end
|
data/lib/courgette/capturer.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
1
|
require 'courgette/scope'
|
2
2
|
|
3
3
|
module Courgette
|
4
|
-
class
|
4
|
+
class Captured
|
5
5
|
def initialize
|
6
6
|
@references = []
|
7
7
|
@definitions = []
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def add_definition definition
|
11
|
+
@definitions << definition
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_reference reference, context
|
15
|
+
@references << Reference.new(reference, context)
|
12
16
|
end
|
13
17
|
|
14
18
|
def references
|
15
|
-
@references.uniq! { |
|
19
|
+
@references.uniq! { |ref| ref.to_a }
|
16
20
|
@references
|
17
21
|
end
|
18
22
|
|
@@ -23,13 +27,32 @@ module Courgette
|
|
23
27
|
|
24
28
|
private
|
25
29
|
Reference = Struct.new :name, :context
|
30
|
+
end
|
31
|
+
|
32
|
+
class Capturer
|
33
|
+
def initialize observer = nil
|
34
|
+
@captured = observer || Captured.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def capture sexpr
|
38
|
+
iterate sexpr, []
|
39
|
+
end
|
40
|
+
|
41
|
+
def references
|
42
|
+
@captured.references
|
43
|
+
end
|
26
44
|
|
45
|
+
def definitions
|
46
|
+
@captured.definitions
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
27
50
|
def add_definition definition
|
28
|
-
@
|
51
|
+
@captured.add_definition definition.flatten
|
29
52
|
end
|
30
53
|
|
31
54
|
def add_reference context, reference
|
32
|
-
@
|
55
|
+
@captured.add_reference reference, context
|
33
56
|
end
|
34
57
|
|
35
58
|
def scope sexpr
|
@@ -63,7 +86,6 @@ module Courgette
|
|
63
86
|
iterate_many sexpr[3..-1], context
|
64
87
|
end
|
65
88
|
|
66
|
-
|
67
89
|
def iterate sexpr, context
|
68
90
|
return unless sexpr.is_a? Enumerable
|
69
91
|
|
@@ -9,7 +9,11 @@ module Courgette
|
|
9
9
|
def convert filename
|
10
10
|
contents = File.read filename
|
11
11
|
|
12
|
-
|
12
|
+
begin
|
13
|
+
x = @parser.parse contents
|
14
|
+
rescue Racc::ParseError => e
|
15
|
+
$stderr.puts "Error parsing #{filename}: #{e} (file ignored)"
|
16
|
+
end
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -5,15 +5,21 @@ module Courgette
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def resolve reference
|
8
|
-
|
9
|
-
|
10
|
-
match_scope?(definition, reference)
|
8
|
+
matches(reference).max do |x, y|
|
9
|
+
x.length <=> y.length
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
14
13
|
private
|
15
14
|
attr_reader :definitions
|
16
15
|
|
16
|
+
def matches reference
|
17
|
+
definitions.select do |definition|
|
18
|
+
match_name?(definition, reference) &&
|
19
|
+
match_scope?(definition, reference)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
17
23
|
def match_name? definition, reference
|
18
24
|
definition.last == reference.name.last
|
19
25
|
end
|
@@ -2,8 +2,8 @@ require 'courgette/name_resolution'
|
|
2
2
|
|
3
3
|
module Courgette
|
4
4
|
class ReferenceToDependency
|
5
|
-
def initialize definitions
|
6
|
-
@resolver = Courgette::NameResolution.new
|
5
|
+
def initialize definitions, resolver = nil
|
6
|
+
@resolver = resolver || Courgette::NameResolution.new(definitions)
|
7
7
|
end
|
8
8
|
|
9
9
|
def transform reference
|
data/lib/courgette/version.rb
CHANGED
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'courgette/capturer'
|
4
|
+
require 'mocha/setup'
|
5
|
+
|
6
|
+
class TestCourgetteCaptured < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@object = Courgette::Captured.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_definition
|
12
|
+
@object.add_definition [:A]
|
13
|
+
|
14
|
+
assert_equal [:A], @object.definitions.first
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_reference
|
18
|
+
@object.add_reference "name", "context"
|
19
|
+
|
20
|
+
assert_equal "name", @object.references.first.name
|
21
|
+
assert_equal "context", @object.references.first.context
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_duplicate_definitions
|
25
|
+
@object.add_definition [:A]
|
26
|
+
@object.add_definition [:A]
|
27
|
+
|
28
|
+
assert_equal 1, @object.definitions.count
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_duplicate_references
|
32
|
+
@object.add_reference "name", "context"
|
33
|
+
@object.add_reference "name", "context"
|
34
|
+
|
35
|
+
assert_equal 1, @object.references.count
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class TestCourgetteCapturer < MiniTest::Unit::TestCase
|
40
|
+
def setup
|
41
|
+
@observer = mock()
|
42
|
+
@object = Courgette::Capturer.new @observer
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_references_delegation
|
46
|
+
@observer.expects(:references).once
|
47
|
+
|
48
|
+
@object.references
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_definitions_delegation
|
52
|
+
@observer.expects(:definitions).once
|
53
|
+
|
54
|
+
@object.definitions
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_class_definition
|
58
|
+
@observer.expects(:add_definition).with([:X]).once
|
59
|
+
|
60
|
+
@object.capture [:class, :X]
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_module_definition
|
64
|
+
@observer.expects(:add_definition).with([:M]).once
|
65
|
+
|
66
|
+
@object.capture [:module, :M]
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_class_inside_module
|
70
|
+
@observer.expects(:add_definition).with([:M]).once
|
71
|
+
@observer.expects(:add_definition).with([:M, :C]).once
|
72
|
+
|
73
|
+
@object.capture [:module, :M, [:class, :C]]
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_constant_declaration
|
77
|
+
@observer.expects(:add_definition).with([:C]).once
|
78
|
+
|
79
|
+
@object.capture [:cdecl, :C, [:lit, 1]]
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_scoped_definition
|
83
|
+
@observer.expects(:add_definition).with([:M, :C]).once
|
84
|
+
|
85
|
+
@object.capture [:module, [:colon2, [:const, :M], :C]]
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_reference
|
89
|
+
@observer.expects(:add_reference).with([:C], []).once
|
90
|
+
|
91
|
+
@object.capture [:const, :C]
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_class_call
|
95
|
+
@observer.expects(:add_reference).with([:C], []).once
|
96
|
+
|
97
|
+
@object.capture [:call, [:const, :C], :new]
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_reference_in_method
|
101
|
+
@observer.expects(:add_reference).with([:C], []).once
|
102
|
+
|
103
|
+
@object.capture [:defn, :bananas, [], [:const, :C]]
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_others
|
107
|
+
@object.capture [:if, [:lit, 42]]
|
108
|
+
end
|
109
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'simplecov'
|
1
2
|
require 'minitest/autorun'
|
2
3
|
require 'courgette/name_resolution'
|
3
4
|
|
@@ -69,4 +70,40 @@ class TestCourgetteNameResolution < MiniTest::Unit::TestCase
|
|
69
70
|
ref = FakeReference.new [:Name], [[:Potato, :Scoped]]
|
70
71
|
assert_equal nil, @resolver.resolve(ref)
|
71
72
|
end
|
73
|
+
|
74
|
+
def test_ambiguous_reference_from_specific_context
|
75
|
+
definitions = [[:Potato, :Name], [:Name]]
|
76
|
+
create definitions
|
77
|
+
|
78
|
+
ref = FakeReference.new [:Name], [[:Potato]]
|
79
|
+
|
80
|
+
assert_equal [:Potato, :Name], @resolver.resolve(ref)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_ambiguous_reference_from_specific_context_different_creation_order
|
84
|
+
definitions = [[:Name], [:Potato, :Name]]
|
85
|
+
create definitions
|
86
|
+
|
87
|
+
ref = FakeReference.new [:Name], [[:Potato]]
|
88
|
+
|
89
|
+
assert_equal [:Potato, :Name], @resolver.resolve(ref)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_ambiguous_reference_from_global_context
|
93
|
+
definitions = [[:Potato, :Name], [:Name]]
|
94
|
+
create definitions
|
95
|
+
|
96
|
+
ref = FakeReference.new [:Name], []
|
97
|
+
|
98
|
+
assert_equal [:Name], @resolver.resolve(ref)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_ambiguous_reference_from_global_context_different_creation_order
|
102
|
+
definitions = [[:Name], [:Potato, :Name]]
|
103
|
+
create definitions
|
104
|
+
|
105
|
+
ref = FakeReference.new [:Name], []
|
106
|
+
|
107
|
+
assert_equal [:Name], @resolver.resolve(ref)
|
108
|
+
end
|
72
109
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'courgette/reference_to_dependency'
|
4
|
+
|
5
|
+
class FakeResolver < Struct.new(:value)
|
6
|
+
def resolve reference
|
7
|
+
value
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestCourgetteReferenceToDependency < MiniTest::Unit::TestCase
|
12
|
+
class FakeReference < Struct.new(:context)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_unknown_reference
|
16
|
+
@converter = Courgette::ReferenceToDependency.new [], FakeResolver.new(nil)
|
17
|
+
reference = FakeReference.new
|
18
|
+
|
19
|
+
dependency = @converter.transform reference
|
20
|
+
|
21
|
+
assert_nil dependency
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_known_reference
|
25
|
+
@converter = Courgette::ReferenceToDependency.new [], FakeResolver.new(42)
|
26
|
+
reference = FakeReference.new []
|
27
|
+
|
28
|
+
dependency = @converter.transform reference
|
29
|
+
|
30
|
+
assert_equal 42, dependency.reference
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_referrer
|
34
|
+
@converter = Courgette::ReferenceToDependency.new [], FakeResolver.new(42)
|
35
|
+
reference = FakeReference.new [[:X], [:Y]]
|
36
|
+
|
37
|
+
dependency = @converter.transform reference
|
38
|
+
|
39
|
+
assert_equal [:X, :Y], dependency.referrer
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: courgette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hugo Peixoto
|
@@ -94,17 +94,45 @@ dependencies:
|
|
94
94
|
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mocha
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
description: Static ruby dependency analyser
|
98
126
|
email:
|
99
127
|
- hugo.peixoto@gmail.com
|
100
128
|
executables:
|
101
|
-
- courgette
|
129
|
+
- courgette
|
102
130
|
extensions: []
|
103
131
|
extra_rdoc_files: []
|
104
132
|
files:
|
105
133
|
- Gemfile
|
106
134
|
- Rakefile
|
107
|
-
- bin/courgette
|
135
|
+
- bin/courgette
|
108
136
|
- courgette.gemspec
|
109
137
|
- lib/courgette.rb
|
110
138
|
- lib/courgette/capturer.rb
|
@@ -119,7 +147,9 @@ files:
|
|
119
147
|
- lib/courgette/reference_to_dependency.rb
|
120
148
|
- lib/courgette/scope.rb
|
121
149
|
- lib/courgette/version.rb
|
150
|
+
- test/courgette/test_capturer.rb
|
122
151
|
- test/courgette/test_name_resolution.rb
|
152
|
+
- test/courgette/test_reference_to_dependency.rb
|
123
153
|
- test/courgette/test_scope.rb
|
124
154
|
homepage: https://github.com/hugopeixoto/courgette
|
125
155
|
licenses:
|
@@ -146,6 +176,8 @@ signing_key:
|
|
146
176
|
specification_version: 4
|
147
177
|
summary: Courgette analyses a set of files, and calculates a dependency graph
|
148
178
|
test_files:
|
179
|
+
- test/courgette/test_capturer.rb
|
149
180
|
- test/courgette/test_name_resolution.rb
|
181
|
+
- test/courgette/test_reference_to_dependency.rb
|
150
182
|
- test/courgette/test_scope.rb
|
151
183
|
has_rdoc:
|