courgette 0.2.2 → 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.
- checksums.yaml +4 -4
- data/courgette.gemspec +1 -1
- data/lib/courgette/capturer.rb +10 -13
- data/lib/courgette/file_to_sexpr.rb +9 -5
- data/lib/courgette/scope.rb +3 -6
- data/lib/courgette/version.rb +1 -2
- data/test/courgette/test_capturer.rb +15 -9
- data/test/courgette/test_scope.rb +13 -7
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f615e4ef69593e21d1de8c8e0f5a1f4137777bd6
|
4
|
+
data.tar.gz: 9972586e2328530973db1e9234d6fd6978a214e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31414ebd38fb6d5a3328e0c4e46be2d6bdc7fd2b97b66beabcc7f081140c2fe2ea31ca489168cf538fee32e025f88d9a7268b08f46b3f1720c56b1b5314ca3c5
|
7
|
+
data.tar.gz: 86c6a07660d04acffb78c4909b1a90fd67548f0952b7e0876b0a9de511608b3b144134ada8869de57b8f5992f287d68272709ac05b83ef21219cc205630b5890
|
data/courgette.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "
|
21
|
+
spec.add_dependency "parser"
|
22
22
|
spec.add_dependency "commander"
|
23
23
|
spec.add_dependency "graph"
|
24
24
|
|
data/lib/courgette/capturer.rb
CHANGED
@@ -12,6 +12,7 @@ module Courgette
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def add_reference reference, context
|
15
|
+
context = [Kernel] if context.empty?
|
15
16
|
@references << Reference.new(reference, context)
|
16
17
|
end
|
17
18
|
|
@@ -74,11 +75,13 @@ module Courgette
|
|
74
75
|
end
|
75
76
|
|
76
77
|
def iterate_definition sexpr, context
|
77
|
-
s = scope sexpr[
|
78
|
+
s = scope sexpr.children[0]
|
78
79
|
new_context = context + [s]
|
80
|
+
|
79
81
|
add_definition new_context
|
80
82
|
|
81
|
-
|
83
|
+
|
84
|
+
iterate_many sexpr.children[1..-1], new_context
|
82
85
|
end
|
83
86
|
|
84
87
|
def iterate_call sexpr, context
|
@@ -87,23 +90,17 @@ module Courgette
|
|
87
90
|
end
|
88
91
|
|
89
92
|
def iterate sexpr, context
|
90
|
-
return unless sexpr.is_a?
|
93
|
+
return unless sexpr.is_a? Parser::AST::Node
|
91
94
|
|
92
|
-
case sexpr
|
95
|
+
case sexpr.type
|
93
96
|
when :const, :colon2
|
94
97
|
add_reference context, scope(sexpr)
|
95
98
|
when :module, :class
|
96
99
|
iterate_definition sexpr, context
|
97
|
-
when :
|
98
|
-
|
99
|
-
when :defn
|
100
|
-
iterate_many sexpr[3..-1], context
|
101
|
-
|
102
|
-
when :call
|
103
|
-
iterate_call sexpr, context
|
104
|
-
when :nil, :lit
|
100
|
+
when :casgn
|
101
|
+
add_definition context + [sexpr.children[1]]
|
105
102
|
else
|
106
|
-
iterate_many sexpr
|
103
|
+
iterate_many sexpr.children, context
|
107
104
|
end
|
108
105
|
end
|
109
106
|
end
|
@@ -1,17 +1,21 @@
|
|
1
|
-
require '
|
1
|
+
require 'parser/current'
|
2
2
|
|
3
3
|
module Courgette
|
4
4
|
class FileToSexpr
|
5
|
-
def initialize
|
6
|
-
@parser =
|
5
|
+
def initialize p=nil
|
6
|
+
@parser = p || default_parser
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_parser
|
10
|
+
Parser::CurrentRuby
|
7
11
|
end
|
8
12
|
|
9
13
|
def convert filename
|
10
14
|
contents = File.read filename
|
11
15
|
|
12
16
|
begin
|
13
|
-
|
14
|
-
rescue
|
17
|
+
@parser.parse contents
|
18
|
+
rescue Parser::SyntaxError => e
|
15
19
|
$stderr.puts "Error parsing #{filename}: #{e} (file ignored)"
|
16
20
|
end
|
17
21
|
end
|
data/lib/courgette/scope.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
module Courgette
|
2
2
|
class Scope
|
3
3
|
def scope sexpr
|
4
|
-
|
5
|
-
|
6
|
-
scope(sexpr[1]) + scope(sexpr[2])
|
7
|
-
when :const
|
8
|
-
scope sexpr[1]
|
4
|
+
if sexpr.respond_to? :type
|
5
|
+
sexpr.children.flat_map { |c| scope c }
|
9
6
|
else
|
10
|
-
[sexpr]
|
7
|
+
[sexpr].compact
|
11
8
|
end
|
12
9
|
end
|
13
10
|
end
|
data/lib/courgette/version.rb
CHANGED
@@ -2,6 +2,7 @@ require 'simplecov'
|
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'courgette/capturer'
|
4
4
|
require 'mocha/setup'
|
5
|
+
require 'parser/current'
|
5
6
|
|
6
7
|
class TestCourgetteCaptured < MiniTest::Unit::TestCase
|
7
8
|
def setup
|
@@ -40,6 +41,11 @@ class TestCourgetteCapturer < MiniTest::Unit::TestCase
|
|
40
41
|
def setup
|
41
42
|
@observer = mock()
|
42
43
|
@object = Courgette::Capturer.new @observer
|
44
|
+
@parser = Parser::CurrentRuby
|
45
|
+
end
|
46
|
+
|
47
|
+
def capture code
|
48
|
+
@object.capture @parser.parse(code)
|
43
49
|
end
|
44
50
|
|
45
51
|
def test_references_delegation
|
@@ -57,53 +63,53 @@ class TestCourgetteCapturer < MiniTest::Unit::TestCase
|
|
57
63
|
def test_class_definition
|
58
64
|
@observer.expects(:add_definition).with([:X]).once
|
59
65
|
|
60
|
-
|
66
|
+
capture "class X; end"
|
61
67
|
end
|
62
68
|
|
63
69
|
def test_module_definition
|
64
70
|
@observer.expects(:add_definition).with([:M]).once
|
65
71
|
|
66
|
-
|
72
|
+
capture "module M; end"
|
67
73
|
end
|
68
74
|
|
69
75
|
def test_class_inside_module
|
70
76
|
@observer.expects(:add_definition).with([:M]).once
|
71
77
|
@observer.expects(:add_definition).with([:M, :C]).once
|
72
78
|
|
73
|
-
|
79
|
+
capture "module M; class C; end; end"
|
74
80
|
end
|
75
81
|
|
76
82
|
def test_constant_declaration
|
77
83
|
@observer.expects(:add_definition).with([:C]).once
|
78
84
|
|
79
|
-
|
85
|
+
capture "C = 1"
|
80
86
|
end
|
81
87
|
|
82
88
|
def test_scoped_definition
|
83
89
|
@observer.expects(:add_definition).with([:M, :C]).once
|
84
90
|
|
85
|
-
|
91
|
+
capture "module M::C; end"
|
86
92
|
end
|
87
93
|
|
88
94
|
def test_reference
|
89
95
|
@observer.expects(:add_reference).with([:C], []).once
|
90
96
|
|
91
|
-
|
97
|
+
capture "C"
|
92
98
|
end
|
93
99
|
|
94
100
|
def test_class_call
|
95
101
|
@observer.expects(:add_reference).with([:C], []).once
|
96
102
|
|
97
|
-
|
103
|
+
capture "C.new"
|
98
104
|
end
|
99
105
|
|
100
106
|
def test_reference_in_method
|
101
107
|
@observer.expects(:add_reference).with([:C], []).once
|
102
108
|
|
103
|
-
|
109
|
+
capture "def bananas; C; end"
|
104
110
|
end
|
105
111
|
|
106
112
|
def test_others
|
107
|
-
|
113
|
+
capture "if 42; end"
|
108
114
|
end
|
109
115
|
end
|
@@ -7,8 +7,14 @@ class TestCourgetteScope < MiniTest::Unit::TestCase
|
|
7
7
|
@scope = Courgette::Scope.new
|
8
8
|
end
|
9
9
|
|
10
|
+
class ConstNode < Struct.new(:children)
|
11
|
+
def type
|
12
|
+
:const
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
10
16
|
def test_const
|
11
|
-
assert_equal [:Name], @scope.scope([
|
17
|
+
assert_equal [:Name], @scope.scope(ConstNode.new([nil, :Name]))
|
12
18
|
end
|
13
19
|
|
14
20
|
def test_other
|
@@ -17,16 +23,16 @@ class TestCourgetteScope < MiniTest::Unit::TestCase
|
|
17
23
|
|
18
24
|
def test_colon2
|
19
25
|
assert_equal [:Scoped, :Name],
|
20
|
-
@scope.scope([
|
26
|
+
@scope.scope(ConstNode.new([ConstNode.new([nil, :Scoped]), :Name]))
|
21
27
|
end
|
22
28
|
|
23
29
|
def test_compose
|
24
30
|
assert_equal [:Really, :Scoped, :Name],
|
25
31
|
@scope.scope(
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
|
30
|
-
|
32
|
+
ConstNode.new([
|
33
|
+
ConstNode.new([
|
34
|
+
ConstNode.new([nil, :Really]),
|
35
|
+
:Scoped]),
|
36
|
+
:Name]))
|
31
37
|
end
|
32
38
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: courgette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hugo Peixoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: parser
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -171,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
171
|
version: '0'
|
172
172
|
requirements: []
|
173
173
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.2.
|
174
|
+
rubygems_version: 2.2.2
|
175
175
|
signing_key:
|
176
176
|
specification_version: 4
|
177
177
|
summary: Courgette analyses a set of files, and calculates a dependency graph
|
@@ -180,3 +180,4 @@ test_files:
|
|
180
180
|
- test/courgette/test_name_resolution.rb
|
181
181
|
- test/courgette/test_reference_to_dependency.rb
|
182
182
|
- test/courgette/test_scope.rb
|
183
|
+
has_rdoc:
|