starscope 0.0.3 → 0.0.4
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.
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +2 -2
- data/README.md +18 -1
- data/bin/starscope.rb +64 -23
- data/lib/starscope/db.rb +14 -9
- data/lib/starscope/version.rb +1 -1
- data/starscope.gemspec +1 -1
- metadata +33 -32
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -6,6 +6,23 @@ across the fantastic Cscope tool [1]. Sadly, it only works for C (and sort of
|
|
6
6
|
works for C++).
|
7
7
|
|
8
8
|
StarScope is a similar tool for Ruby, with a design intended to make it easy to
|
9
|
-
add support for other languages at some point within the same framework
|
9
|
+
add support for other languages at some point within the same framework (thus
|
10
|
+
the name StarScope, ie \*scope).
|
11
|
+
|
12
|
+
Install it as a gem:
|
13
|
+
```
|
14
|
+
$ gem install starscope
|
15
|
+
```
|
16
|
+
|
17
|
+
Build your database, by just running it in the project directory:
|
18
|
+
```
|
19
|
+
$ cd ~/my-project
|
20
|
+
$ starscope.rb
|
21
|
+
```
|
22
|
+
|
23
|
+
Ask it things with `-q`
|
24
|
+
```
|
25
|
+
$ starscope.rb -q calls,new # Lists all callers of new
|
26
|
+
```
|
10
27
|
|
11
28
|
[1] http://cscope.sourceforge.net/
|
data/bin/starscope.rb
CHANGED
@@ -24,6 +24,9 @@ END
|
|
24
24
|
opts.on("-d", "--dump [TABLE]", "Dumps the DB or specified table to stdout") do |tbl|
|
25
25
|
options[:dump] = tbl || true
|
26
26
|
end
|
27
|
+
opts.on("-l", "--line-mode", "Starts line-oriented interface") do
|
28
|
+
options[:linemode] = true
|
29
|
+
end
|
27
30
|
opts.on("-q", "--query TABLE,QUERY", "Looks up QUERY in TABLE") do |query|
|
28
31
|
options[:query] = query
|
29
32
|
end
|
@@ -50,39 +53,49 @@ END
|
|
50
53
|
|
51
54
|
end.parse!
|
52
55
|
|
53
|
-
|
56
|
+
def print_summary(db)
|
57
|
+
db.summary.each do |name, count|
|
58
|
+
printf("%-8s %5d keys\n", name, count)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def run_query(db, input, separator)
|
63
|
+
table, value = input.split(separator, 2)
|
64
|
+
if not value
|
65
|
+
$stderr.puts "Invalid query - did you separate your table and query with '#{separator}'?"
|
66
|
+
return
|
67
|
+
end
|
68
|
+
puts db.query(table.to_sym, value)
|
69
|
+
rescue StarScope::DB::NoTableError
|
70
|
+
$stderr.puts "Table '#{table}' doesn't exist."
|
71
|
+
end
|
72
|
+
|
73
|
+
if options[:auto] and not options[:write]
|
74
|
+
options[:write] = DEFAULT_DB
|
75
|
+
end
|
76
|
+
|
77
|
+
if File.exists?(DEFAULT_DB) and not options[:read]
|
78
|
+
options[:read] = DEFAULT_DB
|
79
|
+
end
|
80
|
+
|
54
81
|
db = StarScope::DB.new
|
55
|
-
|
82
|
+
|
56
83
|
if options[:read]
|
57
84
|
db.load(options[:read])
|
58
|
-
|
59
|
-
elsif
|
60
|
-
db.
|
61
|
-
new = false
|
62
|
-
end
|
63
|
-
|
64
|
-
if ARGV.empty?
|
65
|
-
db.add_dirs(['.']) if new
|
85
|
+
db.add_dirs(ARGV)
|
86
|
+
elsif ARGV.empty?
|
87
|
+
db.add_dirs(['.'])
|
66
88
|
else
|
67
89
|
db.add_dirs(ARGV)
|
68
90
|
end
|
69
91
|
|
70
|
-
|
71
|
-
db.update if options[:auto] and not new
|
92
|
+
db.update if options[:read] and options[:auto]
|
72
93
|
|
73
|
-
|
74
|
-
if options[:auto] || options[:write]
|
75
|
-
db.save(options[:write] || DEFAULT_DB)
|
76
|
-
end
|
94
|
+
db.save(options[:write]) if options[:write]
|
77
95
|
|
78
|
-
if options[:query]
|
79
|
-
table, value = options[:query].split(',', 2)
|
80
|
-
db.query(table.to_sym, value)
|
81
|
-
end
|
96
|
+
run_query(db, options[:query], ',') if options[:query]
|
82
97
|
|
83
|
-
if options[:summary]
|
84
|
-
db.print_summary
|
85
|
-
end
|
98
|
+
print_summary(db) if options[:summary]
|
86
99
|
|
87
100
|
if options[:dump]
|
88
101
|
if options[:dump].is_a? String
|
@@ -91,3 +104,31 @@ if options[:dump]
|
|
91
104
|
db.dump_all
|
92
105
|
end
|
93
106
|
end
|
107
|
+
|
108
|
+
if options[:linemode]
|
109
|
+
puts <<END
|
110
|
+
Normal input is of the form
|
111
|
+
table query
|
112
|
+
and returns the result of that query. The following special commands
|
113
|
+
are also recognized:
|
114
|
+
!summary
|
115
|
+
!update
|
116
|
+
!quit
|
117
|
+
|
118
|
+
END
|
119
|
+
while true
|
120
|
+
print "> "
|
121
|
+
input = gets.chomp
|
122
|
+
case input
|
123
|
+
when "!summary"
|
124
|
+
print_summary(db)
|
125
|
+
when "!update"
|
126
|
+
db.update
|
127
|
+
db.save(options[:write]) if options[:write]
|
128
|
+
when "!quit"
|
129
|
+
exit
|
130
|
+
else
|
131
|
+
run_query(db, input, ' ')
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/lib/starscope/db.rb
CHANGED
@@ -8,6 +8,8 @@ class StarScope::DB
|
|
8
8
|
|
9
9
|
DB_FORMAT = 1
|
10
10
|
|
11
|
+
class NoTableError < StandardError; end
|
12
|
+
|
11
13
|
def initialize
|
12
14
|
@dirs = []
|
13
15
|
@files = {}
|
@@ -37,7 +39,7 @@ class StarScope::DB
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def add_dirs(dirs)
|
40
|
-
@dirs
|
42
|
+
@dirs += dirs
|
41
43
|
dirs.each do |dir|
|
42
44
|
Dir["#{dir}/**/*"].each do |file|
|
43
45
|
add_file(file)
|
@@ -52,6 +54,7 @@ class StarScope::DB
|
|
52
54
|
end
|
53
55
|
|
54
56
|
def dump_table(table)
|
57
|
+
raise NoTableError if not @tables[table]
|
55
58
|
puts "== Table: #{table} =="
|
56
59
|
@tables[table].each do |val, data|
|
57
60
|
puts "#{val}"
|
@@ -66,22 +69,24 @@ class StarScope::DB
|
|
66
69
|
@tables.keys.each {|tbl| dump_table(tbl)}
|
67
70
|
end
|
68
71
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
+
def summary
|
73
|
+
ret = {}
|
74
|
+
|
75
|
+
@tables.each_key do |key|
|
76
|
+
ret[key] = @tables[key].keys.count
|
72
77
|
end
|
78
|
+
|
79
|
+
ret
|
73
80
|
end
|
74
81
|
|
75
82
|
def query(table, value)
|
76
83
|
fqn = value.split("::")
|
84
|
+
raise NoTableError if not @tables[table]
|
77
85
|
results = @tables[table][fqn[-1].to_sym]
|
86
|
+
return [] if results.nil? || results.empty?
|
78
87
|
results.sort! {|a,b| b.score_match(fqn) <=> a.score_match(fqn)}
|
79
88
|
best_score = results[0].score_match(fqn)
|
80
|
-
results.
|
81
|
-
# 4 is a guess at the best heuristic, not magic
|
82
|
-
return if best_score - result.score_match(fqn) > 4
|
83
|
-
puts result
|
84
|
-
end
|
89
|
+
results.select {|result| best_score - result.score_match(fqn) < 4}
|
85
90
|
end
|
86
91
|
|
87
92
|
private
|
data/lib/starscope/version.rb
CHANGED
data/starscope.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.add_dependency 'parser'
|
19
|
+
s.add_dependency 'parser', '~> 1.4'
|
20
20
|
s.add_development_dependency 'bundler', '~> 1.3'
|
21
21
|
s.add_development_dependency 'rake'
|
22
22
|
s.add_development_dependency 'pry'
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: starscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Evan Huus
|
@@ -12,85 +12,85 @@ cert_chain: []
|
|
12
12
|
date: 2013-06-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
15
|
+
name: parser
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- -
|
19
|
+
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
none: false
|
21
|
-
name: parser
|
21
|
+
version: '1.4'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
25
26
|
requirements:
|
26
|
-
- -
|
27
|
+
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
29
|
-
none: false
|
29
|
+
version: '1.4'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
32
34
|
requirements:
|
33
35
|
- - ~>
|
34
36
|
- !ruby/object:Gem::Version
|
35
37
|
version: '1.3'
|
36
|
-
none: false
|
37
|
-
name: bundler
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
41
42
|
requirements:
|
42
43
|
- - ~>
|
43
44
|
- !ruby/object:Gem::Version
|
44
45
|
version: '1.3'
|
45
|
-
none: false
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
48
50
|
requirements:
|
49
51
|
- - ! '>='
|
50
52
|
- !ruby/object:Gem::Version
|
51
53
|
version: '0'
|
52
|
-
none: false
|
53
|
-
name: rake
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
57
58
|
requirements:
|
58
59
|
- - ! '>='
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: '0'
|
61
|
-
none: false
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
64
66
|
requirements:
|
65
67
|
- - ! '>='
|
66
68
|
- !ruby/object:Gem::Version
|
67
69
|
version: '0'
|
68
|
-
none: false
|
69
|
-
name: pry
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
73
74
|
requirements:
|
74
75
|
- - ! '>='
|
75
76
|
- !ruby/object:Gem::Version
|
76
77
|
version: '0'
|
77
|
-
none: false
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
|
79
|
+
name: pry-debugger
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
80
82
|
requirements:
|
81
83
|
- - ! '>='
|
82
84
|
- !ruby/object:Gem::Version
|
83
85
|
version: '0'
|
84
|
-
none: false
|
85
|
-
name: pry-debugger
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
89
90
|
requirements:
|
90
91
|
- - ! '>='
|
91
92
|
- !ruby/object:Gem::Version
|
92
93
|
version: '0'
|
93
|
-
none: false
|
94
94
|
description: A tool like the venerable cscope, but for ruby and other languages
|
95
95
|
email: evan.huus@jadedpixel.com
|
96
96
|
executables:
|
@@ -99,6 +99,7 @@ extensions: []
|
|
99
99
|
extra_rdoc_files: []
|
100
100
|
files:
|
101
101
|
- .gitignore
|
102
|
+
- CHANGELOG.md
|
102
103
|
- Gemfile
|
103
104
|
- Gemfile.lock
|
104
105
|
- LICENSE.txt
|
@@ -119,17 +120,17 @@ rdoc_options: []
|
|
119
120
|
require_paths:
|
120
121
|
- lib
|
121
122
|
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
122
124
|
requirements:
|
123
125
|
- - ! '>='
|
124
126
|
- !ruby/object:Gem::Version
|
125
127
|
version: '0'
|
126
|
-
none: false
|
127
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
128
130
|
requirements:
|
129
131
|
- - ! '>='
|
130
132
|
- !ruby/object:Gem::Version
|
131
133
|
version: '0'
|
132
|
-
none: false
|
133
134
|
requirements: []
|
134
135
|
rubyforge_project:
|
135
136
|
rubygems_version: 1.8.23
|