starscope 1.1.2 → 1.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/CHANGELOG.md +20 -2
- data/Gemfile.lock +5 -1
- data/README.md +5 -7
- data/Rakefile +1 -1
- data/bin/starscope +56 -48
- data/doc/DB_FORMAT.md +4 -4
- data/doc/LANGUAGE_SUPPORT.md +8 -4
- data/doc/USER_GUIDE.md +36 -9
- data/lib/starscope/db.rb +150 -265
- data/lib/starscope/export.rb +256 -0
- data/lib/starscope/langs/coffeescript.rb +2 -1
- data/lib/starscope/langs/go.rb +20 -2
- data/lib/starscope/langs/ruby.rb +60 -71
- data/lib/starscope/matcher.rb +1 -1
- data/lib/starscope/output.rb +9 -7
- data/lib/starscope/version.rb +2 -2
- data/starscope.gemspec +2 -1
- data/test/fixtures/db_added_files.json +8 -0
- data/test/fixtures/db_old_extractor.json +15 -0
- data/test/fixtures/db_out_of_date.json +15 -0
- data/test/fixtures/db_removed_files.json +12 -0
- data/test/fixtures/db_up_to_date.json +15 -0
- data/test/fixtures/sample_ruby.rb +21 -21
- data/test/functional/starscope_test.rb +57 -0
- data/test/test_helper.rb +1 -0
- data/test/unit/db_test.rb +141 -0
- data/test/unit/export_test.rb +34 -0
- data/test/unit/langs/golang_test.rb +98 -0
- data/test/unit/langs/ruby_test.rb +66 -0
- data/test/unit/{test_matcher.rb → matcher_test.rb} +6 -6
- data/test/unit/output_test.rb +29 -0
- metadata +41 -15
- data/lib/starscope/record.rb +0 -98
- data/test/functional/test_starscope.rb +0 -35
- data/test/unit/test_db.rb +0 -136
- data/test/unit/test_golang.rb +0 -80
- data/test/unit/test_record.rb +0 -35
- data/test/unit/test_ruby.rb +0 -60
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Starscope::Lang::Go do
|
4
|
+
before do
|
5
|
+
@db = {}
|
6
|
+
Starscope::Lang::Go.extract(GOLANG_SAMPLE) do |tbl, name, args|
|
7
|
+
@db[tbl] ||= []
|
8
|
+
@db[tbl] << Starscope::DB.normalize_record(GOLANG_SAMPLE, name, args)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must match golang files" do
|
13
|
+
Starscope::Lang::Go.match_file(GOLANG_SAMPLE).must_equal true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "must not match non-golang files" do
|
17
|
+
Starscope::Lang::Go.match_file(RUBY_SAMPLE).must_equal false
|
18
|
+
Starscope::Lang::Go.match_file(EMPTY_FILE).must_equal false
|
19
|
+
end
|
20
|
+
|
21
|
+
it "must identify definitions" do
|
22
|
+
@db.keys.must_include :defs
|
23
|
+
defs = @db[:defs].map {|x| x[:name][-1]}
|
24
|
+
|
25
|
+
defs.must_include :a
|
26
|
+
defs.must_include :b
|
27
|
+
defs.must_include :c
|
28
|
+
defs.must_include :ttt
|
29
|
+
defs.must_include :main
|
30
|
+
defs.must_include :v1
|
31
|
+
defs.must_include :v2
|
32
|
+
defs.must_include :Sunday
|
33
|
+
defs.must_include :Monday
|
34
|
+
defs.must_include :single_var
|
35
|
+
defs.must_include :single_const
|
36
|
+
|
37
|
+
defs.wont_include :"0x00"
|
38
|
+
defs.wont_include :"0x01"
|
39
|
+
defs.wont_include :"0x02"
|
40
|
+
defs.wont_include :"0x03"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "must identify endings" do
|
44
|
+
@db.keys.must_include :end
|
45
|
+
@db[:end].count.must_equal 7
|
46
|
+
end
|
47
|
+
|
48
|
+
it "must identify function calls" do
|
49
|
+
@db.keys.must_include :calls
|
50
|
+
calls = @db[:calls].group_by {|x| x[:name][-1]}
|
51
|
+
|
52
|
+
calls.keys.must_include :a
|
53
|
+
calls.keys.must_include :b
|
54
|
+
calls.keys.must_include :c
|
55
|
+
calls.keys.must_include :ttt
|
56
|
+
calls.keys.must_include :Errorf
|
57
|
+
|
58
|
+
calls[:a].count.must_equal 3
|
59
|
+
calls[:b].count.must_equal 4
|
60
|
+
calls[:c].count.must_equal 4
|
61
|
+
calls[:ttt].count.must_equal 2
|
62
|
+
calls[:Errorf].count.must_equal 1
|
63
|
+
end
|
64
|
+
|
65
|
+
it "must identify variable assignments" do
|
66
|
+
@db.keys.must_include :assigns
|
67
|
+
assigns = @db[:assigns].group_by {|x| x[:name][-1]}
|
68
|
+
|
69
|
+
assigns.keys.must_include :x
|
70
|
+
assigns.keys.must_include :y
|
71
|
+
assigns.keys.must_include :z
|
72
|
+
assigns.keys.must_include :n
|
73
|
+
assigns.keys.must_include :m
|
74
|
+
assigns.keys.must_include :msg
|
75
|
+
|
76
|
+
assigns[:x].count.must_equal 2
|
77
|
+
assigns[:y].count.must_equal 1
|
78
|
+
assigns[:z].count.must_equal 1
|
79
|
+
assigns[:n].count.must_equal 1
|
80
|
+
assigns[:m].count.must_equal 2
|
81
|
+
end
|
82
|
+
|
83
|
+
it "must identify imports" do
|
84
|
+
@db.keys.must_include :imports
|
85
|
+
imports = @db[:imports].group_by {|x| x[:name][-1]}
|
86
|
+
|
87
|
+
imports.keys.must_include :fmt
|
88
|
+
end
|
89
|
+
|
90
|
+
it "must correctly find the end of string constants" do
|
91
|
+
Starscope::Lang::Go.find_end_of_string('"123"foo', 0).must_equal 4
|
92
|
+
Starscope::Lang::Go.find_end_of_string('a"123"foo', 0).must_equal 1
|
93
|
+
Starscope::Lang::Go.find_end_of_string('a"123"foo', 1).must_equal 5
|
94
|
+
Starscope::Lang::Go.find_end_of_string('"1\""foo', 0).must_equal 4
|
95
|
+
Starscope::Lang::Go.find_end_of_string('"1\\""foo', 0).must_equal 4
|
96
|
+
Starscope::Lang::Go.find_end_of_string('"1\\\\\"foo', 0).must_equal 9
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Starscope::Lang::Ruby do
|
4
|
+
before do
|
5
|
+
@db = {}
|
6
|
+
Starscope::Lang::Ruby.extract(RUBY_SAMPLE) do |tbl, name, args|
|
7
|
+
@db[tbl] ||= []
|
8
|
+
@db[tbl] << Starscope::DB.normalize_record(RUBY_SAMPLE, name, args)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "must match ruby files" do
|
13
|
+
Starscope::Lang::Ruby.match_file(RUBY_SAMPLE).must_equal true
|
14
|
+
Starscope::Lang::Ruby.match_file('bin/starscope').must_equal true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must not match non-ruby files" do
|
18
|
+
Starscope::Lang::Ruby.match_file(GOLANG_SAMPLE).must_equal false
|
19
|
+
Starscope::Lang::Ruby.match_file(EMPTY_FILE).must_equal false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "must identify function definitions" do
|
23
|
+
@db.keys.must_include :defs
|
24
|
+
defs = @db[:defs].map {|x| x[:name][-1]}
|
25
|
+
|
26
|
+
defs.must_include :DB
|
27
|
+
defs.must_include :NoTableError
|
28
|
+
defs.must_include :load
|
29
|
+
defs.must_include :update
|
30
|
+
defs.must_include :files_from_path
|
31
|
+
end
|
32
|
+
|
33
|
+
it "must identify constant definitions" do
|
34
|
+
@db[:defs].map {|x| x[:name][-1]}.must_include :PBAR_FORMAT
|
35
|
+
end
|
36
|
+
|
37
|
+
it "must identify endings" do
|
38
|
+
@db.keys.must_include :end
|
39
|
+
@db[:end].count.must_equal 13
|
40
|
+
end
|
41
|
+
|
42
|
+
it "must identify function calls" do
|
43
|
+
@db.keys.must_include :calls
|
44
|
+
calls = @db[:calls].group_by {|x| x[:name][-1]}
|
45
|
+
|
46
|
+
calls.keys.must_include :add_file
|
47
|
+
calls.keys.must_include :each
|
48
|
+
calls[:add_file].count.must_equal 3
|
49
|
+
calls[:each].count.must_equal 8
|
50
|
+
end
|
51
|
+
|
52
|
+
it "must identify variable assignments" do
|
53
|
+
@db.keys.must_include :assigns
|
54
|
+
assigns = @db[:assigns].group_by {|x| x[:name][-1]}
|
55
|
+
|
56
|
+
assigns.keys.must_include :pbar
|
57
|
+
assigns.keys.must_include :PBAR_FORMAT
|
58
|
+
assigns.keys.must_include :foo
|
59
|
+
assigns[:pbar].count.must_equal 2
|
60
|
+
assigns[:PBAR_FORMAT].count.must_equal 1
|
61
|
+
assigns[:foo].count.must_equal 1
|
62
|
+
|
63
|
+
assigns.keys.wont_include "=".to_sym
|
64
|
+
assigns.keys.wont_include "<".to_sym
|
65
|
+
end
|
66
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe Starscope::Matcher do
|
4
4
|
|
5
5
|
SAMPLE_RECORDS = [
|
6
6
|
{:name => [:"[abc"]},
|
@@ -9,25 +9,25 @@ describe StarScope::Matcher do
|
|
9
9
|
]
|
10
10
|
|
11
11
|
it "must handle empty input" do
|
12
|
-
matcher =
|
12
|
+
matcher = Starscope::Matcher.new("foo", [])
|
13
13
|
matcher.query.must_be_empty
|
14
14
|
end
|
15
15
|
|
16
16
|
it "must handle scoped queries" do
|
17
|
-
matcher =
|
17
|
+
matcher = Starscope::Matcher.new("a::b::", SAMPLE_RECORDS)
|
18
18
|
matcher.query.must_equal [SAMPLE_RECORDS[2]]
|
19
19
|
end
|
20
20
|
|
21
21
|
it "must handle regex queries" do
|
22
|
-
matcher =
|
22
|
+
matcher = Starscope::Matcher.new("a[bc]{2}", SAMPLE_RECORDS)
|
23
23
|
matcher.query.must_equal [SAMPLE_RECORDS[0]]
|
24
24
|
|
25
|
-
matcher =
|
25
|
+
matcher = Starscope::Matcher.new("a.*d", SAMPLE_RECORDS)
|
26
26
|
matcher.query.must_equal [SAMPLE_RECORDS[2]]
|
27
27
|
end
|
28
28
|
|
29
29
|
it "must handle malformed regexes" do
|
30
|
-
matcher =
|
30
|
+
matcher = Starscope::Matcher.new("[abc", SAMPLE_RECORDS)
|
31
31
|
matcher.query.must_equal [SAMPLE_RECORDS[0]]
|
32
32
|
end
|
33
33
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Starscope::Output do
|
4
|
+
|
5
|
+
it "must be quiet" do
|
6
|
+
buf = StringIO.new
|
7
|
+
out = Starscope::Output.new(:quiet, buf)
|
8
|
+
out.normal("foo")
|
9
|
+
out.extra("foo")
|
10
|
+
buf.size.must_equal 0
|
11
|
+
end
|
12
|
+
|
13
|
+
it "must be normal" do
|
14
|
+
buf = StringIO.new
|
15
|
+
out = Starscope::Output.new(:normal, buf)
|
16
|
+
out.normal("foo")
|
17
|
+
out.extra("foo")
|
18
|
+
buf.size.must_equal 4
|
19
|
+
end
|
20
|
+
|
21
|
+
it "must be verbose" do
|
22
|
+
buf = StringIO.new
|
23
|
+
out = Starscope::Output.new(:verbose, buf)
|
24
|
+
out.normal("foo")
|
25
|
+
out.extra("foo")
|
26
|
+
buf.size.must_equal 8
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: starscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Huus
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: mocha
|
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'
|
111
125
|
description: A tool like the venerable cscope, but for ruby, golang and other languages
|
112
126
|
email: eapache@gmail.com
|
113
127
|
executables:
|
@@ -129,25 +143,31 @@ files:
|
|
129
143
|
- doc/USER_GUIDE.md
|
130
144
|
- lib/starscope.rb
|
131
145
|
- lib/starscope/db.rb
|
146
|
+
- lib/starscope/export.rb
|
132
147
|
- lib/starscope/langs/coffeescript.rb
|
133
148
|
- lib/starscope/langs/go.rb
|
134
149
|
- lib/starscope/langs/ruby.rb
|
135
150
|
- lib/starscope/matcher.rb
|
136
151
|
- lib/starscope/output.rb
|
137
|
-
- lib/starscope/record.rb
|
138
152
|
- lib/starscope/version.rb
|
139
153
|
- starscope.gemspec
|
154
|
+
- test/fixtures/db_added_files.json
|
140
155
|
- test/fixtures/db_old.json.gz
|
156
|
+
- test/fixtures/db_old_extractor.json
|
157
|
+
- test/fixtures/db_out_of_date.json
|
158
|
+
- test/fixtures/db_removed_files.json
|
159
|
+
- test/fixtures/db_up_to_date.json
|
141
160
|
- test/fixtures/empty
|
142
161
|
- test/fixtures/sample_golang.go
|
143
162
|
- test/fixtures/sample_ruby.rb
|
144
|
-
- test/functional/
|
163
|
+
- test/functional/starscope_test.rb
|
145
164
|
- test/test_helper.rb
|
146
|
-
- test/unit/
|
147
|
-
- test/unit/
|
148
|
-
- test/unit/
|
149
|
-
- test/unit/
|
150
|
-
- test/unit/
|
165
|
+
- test/unit/db_test.rb
|
166
|
+
- test/unit/export_test.rb
|
167
|
+
- test/unit/langs/golang_test.rb
|
168
|
+
- test/unit/langs/ruby_test.rb
|
169
|
+
- test/unit/matcher_test.rb
|
170
|
+
- test/unit/output_test.rb
|
151
171
|
homepage: https://github.com/eapache/starscope
|
152
172
|
licenses:
|
153
173
|
- MIT
|
@@ -173,14 +193,20 @@ signing_key:
|
|
173
193
|
specification_version: 4
|
174
194
|
summary: A code indexer and analyzer
|
175
195
|
test_files:
|
196
|
+
- test/fixtures/db_added_files.json
|
176
197
|
- test/fixtures/db_old.json.gz
|
198
|
+
- test/fixtures/db_old_extractor.json
|
199
|
+
- test/fixtures/db_out_of_date.json
|
200
|
+
- test/fixtures/db_removed_files.json
|
201
|
+
- test/fixtures/db_up_to_date.json
|
177
202
|
- test/fixtures/empty
|
178
203
|
- test/fixtures/sample_golang.go
|
179
204
|
- test/fixtures/sample_ruby.rb
|
180
|
-
- test/functional/
|
205
|
+
- test/functional/starscope_test.rb
|
181
206
|
- test/test_helper.rb
|
182
|
-
- test/unit/
|
183
|
-
- test/unit/
|
184
|
-
- test/unit/
|
185
|
-
- test/unit/
|
186
|
-
- test/unit/
|
207
|
+
- test/unit/db_test.rb
|
208
|
+
- test/unit/export_test.rb
|
209
|
+
- test/unit/langs/golang_test.rb
|
210
|
+
- test/unit/langs/ruby_test.rb
|
211
|
+
- test/unit/matcher_test.rb
|
212
|
+
- test/unit/output_test.rb
|
data/lib/starscope/record.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
class StarScope::Record
|
2
|
-
|
3
|
-
@@cachedFile = nil
|
4
|
-
@@cachedLines = nil
|
5
|
-
|
6
|
-
def self.build(file, name, args)
|
7
|
-
args[:file] = file
|
8
|
-
|
9
|
-
if name.is_a? Array
|
10
|
-
args[:name] = name.map {|x| x.to_sym}
|
11
|
-
else
|
12
|
-
args[:name] = [name.to_sym]
|
13
|
-
end
|
14
|
-
|
15
|
-
if args[:line_no]
|
16
|
-
if @@cachedFile != file
|
17
|
-
@@cachedFile = file
|
18
|
-
@@cachedLines = File.readlines(file)
|
19
|
-
end
|
20
|
-
|
21
|
-
args[:line] = @@cachedLines[args[:line_no]-1].chomp
|
22
|
-
end
|
23
|
-
|
24
|
-
args
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.format(rec)
|
28
|
-
"#{rec[:name].join " "} -- #{rec[:file]}:#{rec[:line_no]} (#{rec[:line].strip})"
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.ctag_line(rec, file)
|
32
|
-
ret = "#{rec[:name][-1]}\t#{rec[:file]}\t/^#{rec[:line]}$/"
|
33
|
-
|
34
|
-
ext = self.ctag_ext_tags(rec, file)
|
35
|
-
if not ext.empty?
|
36
|
-
ret << ";\""
|
37
|
-
ext.sort.each do |k, v|
|
38
|
-
ret << "\t#{k}:#{v}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
ret
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.ctag_ext_tags(rec, file)
|
46
|
-
tag = {}
|
47
|
-
|
48
|
-
# these extensions are documented at http://ctags.sourceforge.net/FORMAT
|
49
|
-
case rec[:type]
|
50
|
-
when :func
|
51
|
-
tag["kind"] = "f"
|
52
|
-
when :module, :class
|
53
|
-
tag["kind"] = "c"
|
54
|
-
end
|
55
|
-
|
56
|
-
tag["language"] = file[:lang]
|
57
|
-
|
58
|
-
tag
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.cscope_mark(tbl, rec)
|
62
|
-
case tbl
|
63
|
-
when :end
|
64
|
-
case rec[:type]
|
65
|
-
when :func
|
66
|
-
ret = "}"
|
67
|
-
else
|
68
|
-
return ""
|
69
|
-
end
|
70
|
-
when :file
|
71
|
-
ret = "@"
|
72
|
-
when :defs
|
73
|
-
case rec[:type]
|
74
|
-
when :func
|
75
|
-
ret = "$"
|
76
|
-
when :class, :module
|
77
|
-
ret = "c"
|
78
|
-
when :type
|
79
|
-
ret = "t"
|
80
|
-
else
|
81
|
-
ret = "g"
|
82
|
-
end
|
83
|
-
when :calls
|
84
|
-
ret = "`"
|
85
|
-
when :requires
|
86
|
-
ret = "~\""
|
87
|
-
when :imports
|
88
|
-
ret = "~<"
|
89
|
-
when :assigns
|
90
|
-
ret = "="
|
91
|
-
else
|
92
|
-
return ""
|
93
|
-
end
|
94
|
-
|
95
|
-
return "\t" + ret
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require File.expand_path('../../test_helper', __FILE__)
|
2
|
-
|
3
|
-
class TestStarScope < Minitest::Test
|
4
|
-
|
5
|
-
BASE = "bundle exec bin/starscope --quiet"
|
6
|
-
EXTRACT = "#{BASE} --no-read --no-write #{FIXTURES}"
|
7
|
-
|
8
|
-
def test_help
|
9
|
-
`#{BASE} -h`.each_line do |line|
|
10
|
-
assert line.length <= 80
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_version
|
15
|
-
assert_equal StarScope::VERSION, `#{BASE} -v`.chomp
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_summary
|
19
|
-
lines = `#{EXTRACT} -s`.lines.to_a
|
20
|
-
assert_equal lines.length, 6
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_dump
|
24
|
-
lines = `#{EXTRACT} -d requires`.lines.to_a
|
25
|
-
assert_equal 'date', lines[1].split.first
|
26
|
-
assert_equal 'zlib', lines[2].split.first
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_query
|
30
|
-
`#{EXTRACT} -q calls,add_file`.each_line do |line|
|
31
|
-
assert_equal ["StarScope", "DB", "add_file"], line.split[0..2]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|