starscope 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 38376cc70ae8d935176b3b428d6b82acb2e9ed28
4
+ data.tar.gz: eb7761acf9adc1aef79eaf1e2e74b04d7be51ca2
5
+ SHA512:
6
+ metadata.gz: b2df9c55e2e0ca2ab3c0aeb825f7a9e9f3dec274216256a9e712eb60ea3176c4851925799b5621220fa59eca32ff67ba5813699eec056aa285840397f91775db
7
+ data.tar.gz: c5159b4997e35cd23f29ffee1a17da99e298dcdb7a02789a5b64435cd645e1af56788c5666c1ef5ac3dccfd5fdc250e48c62e7c170a8aaf71009e62138590d19
@@ -1,7 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- v1.0.2 (trunk)
4
+ v1.0.3 (trunk)
5
+ --------------------
6
+
7
+ Improvements:
8
+ * Optimized extracting lines from parsed files.
9
+
10
+ Misc:
11
+ * Code cleanup.
12
+
13
+ v1.0.2 (2014-04-19)
5
14
  --------------------
6
15
 
7
16
  Bug Fixes:
@@ -1,28 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- starscope (1.0.2)
5
- oj (~> 2.7)
4
+ starscope (1.0.3)
5
+ oj (~> 2.9)
6
6
  parser (~> 2.1)
7
- ruby-progressbar (~> 1.4)
7
+ ruby-progressbar (~> 1.5)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- ast (1.1.0)
12
+ ast (2.0.0)
13
13
  coderay (1.1.0)
14
14
  method_source (0.8.2)
15
- minitest (5.3.3)
16
- oj (2.7.3)
17
- parser (2.1.8)
18
- ast (~> 1.1)
15
+ minitest (5.3.4)
16
+ oj (2.9.4)
17
+ parser (2.1.9)
18
+ ast (>= 1.1, < 3.0)
19
19
  slop (~> 3.4, >= 3.4.5)
20
20
  pry (0.9.12.6)
21
21
  coderay (~> 1.0)
22
22
  method_source (~> 0.8)
23
23
  slop (~> 3.4)
24
- rake (10.2.2)
25
- ruby-progressbar (1.4.2)
24
+ rake (10.3.2)
25
+ ruby-progressbar (1.5.1)
26
26
  slop (3.5.0)
27
27
 
28
28
  PLATFORMS
data/README.md CHANGED
@@ -35,6 +35,8 @@ $ starscope -e ctags
35
35
  $ starscope -e cscope
36
36
  ```
37
37
 
38
+ More flags and options are available, run `starscope --help` for the complete list.
39
+
38
40
  Other Uses
39
41
  ----------
40
42
 
@@ -35,20 +35,20 @@ class StarScope::DB
35
35
  @output.log("Reading database from `#{file}`... ")
36
36
  File.open(file, 'r') do |file|
37
37
  Zlib::GzipReader.wrap(file) do |file|
38
- format = file.gets.to_i
39
- if format == DB_FORMAT
38
+ case file.gets.to_i
39
+ when DB_FORMAT
40
40
  @meta = Oj.load(file.gets)
41
41
  @tables = Oj.load(file.gets)
42
42
  return false
43
- elsif format <= 2
43
+ when 3..4
44
+ # Old format, so read the directories segment then rebuild
45
+ add_paths(Oj.load(file.gets))
46
+ return true
47
+ when 0..2
44
48
  # Old format (pre-json), so read the directories segment then rebuild
45
49
  len = file.gets.to_i
46
50
  add_paths(Marshal::load(file.read(len)))
47
51
  return true
48
- elsif format <= 4
49
- # Old format, so read the directories segment then rebuild
50
- add_paths(Oj.load(file.gets))
51
- return true
52
52
  else
53
53
  raise UnknownDBFormatError
54
54
  end
@@ -190,10 +190,11 @@ END
190
190
  buf = ""
191
191
  files = []
192
192
  db_by_line().each do |filename, lines|
193
- if not lines.empty?
194
- buf << "\t@#{filename}\n\n"
195
- files << filename
196
- end
193
+ next if lines.empty?
194
+
195
+ buf << "\t@#{filename}\n\n"
196
+ files << filename
197
+
197
198
  lines.sort.each do |line_no, records|
198
199
  begin
199
200
  line = records.first[:line].strip.gsub(/\s+/, ' ')
@@ -201,25 +202,25 @@ END
201
202
  # invalid utf-8 byte sequence in the line, just do our best
202
203
  line = records.first[:line]
203
204
  end
204
- toks = {}
205
205
 
206
+ toks = {}
206
207
  records.each do |record|
207
- index = line.index(record[:name][-1].to_s)
208
+ key = record[:name][-1].to_s
209
+ index = line.index(key)
208
210
  while index
209
211
  toks[index] = record
210
- index = line.index(record[:name][-1].to_s, index + 1)
212
+ index = line.index(key, index + 1)
211
213
  end
212
214
  end
213
-
214
215
  next if toks.empty?
215
216
 
216
217
  prev = 0
217
218
  buf << line_no.to_s << " "
218
- toks.sort().each do |offset, record|
219
+ toks.sort.each do |offset, record|
220
+ key = record[:name][-1].to_s
219
221
  buf << line.slice(prev...offset) << "\n"
220
- buf << StarScope::Record.cscope_mark(record[:tbl], record)
221
- buf << record[:name][-1].to_s << "\n"
222
- prev = offset + record[:name][-1].to_s.length
222
+ buf << StarScope::Record.cscope_mark(record[:tbl], record) << key << "\n"
223
+ prev = offset + key.length
223
224
  end
224
225
  buf << line.slice(prev..-1) << "\n\n"
225
226
  end
@@ -18,51 +18,39 @@ module StarScope::Lang
18
18
  scope = []
19
19
  str = File.readlines(file).each_with_index do |line, line_no|
20
20
  line_no += 1 # zero-index to one-index
21
+
21
22
  # strip single-line comments like // foo
22
23
  match = /(.*)\/\//.match(line)
23
- if match
24
- line = match[1]
25
- end
24
+ line = match[1] if match
26
25
  # strip single-line comments like foo /* foo */ foo
27
26
  match = /(.*?)\/\*.*\*\/(.*)/.match(line)
28
- if match
29
- line = match[1] + match[2]
30
- end
27
+ line = match[1] + match[2] if match
31
28
  # strip end-of-line comment starters like foo /* foo \n
32
29
  match = /(.*?)\/\*/.match(line)
33
- if match
34
- line = match[1]
35
- ends_with_comment = true
36
- else
37
- ends_with_comment = false
38
- end
30
+ line = match[1] if match
31
+ ends_with_comment = !match.nil?
32
+
39
33
  # if we're in a block comment, wait for it to end
40
34
  if stack[-1] == :comment
41
35
  match = /\*\/(.*)/.match(line)
42
- if match
43
- line = match[1]
44
- stack.pop
45
- else
46
- next
47
- end
36
+ next unless match
37
+ line = match[1]
38
+ stack.pop
48
39
  end
40
+
49
41
  # poor-man's parser
50
42
  case stack[-1]
51
43
  when :struct
52
44
  case line
53
45
  when END_OF_BLOCK
54
- yield :end, scope + ["}"], :line_no => line_no, :type => :class
55
- stack.pop
56
- scope.pop
46
+ end_block(line_no, scope, stack, &block)
57
47
  when /(.+)\s+\w+/
58
48
  parse_def($1, line_no, scope, &block)
59
49
  end
60
50
  when :interface
61
51
  case line
62
52
  when END_OF_BLOCK
63
- yield :end, scope + ["}"], :line_no => line_no, :type => :class
64
- stack.pop
65
- scope.pop
53
+ end_block(line_no, scope, stack, &block)
66
54
  when /(\w+)\(.*\)\s+/
67
55
  yield :defs, scope + [$1], :line_no => line_no
68
56
  end
@@ -83,60 +71,18 @@ module StarScope::Lang
83
71
  name = $1.split('/')
84
72
  yield :imports, name, :line_no => line_no
85
73
  end
86
- else
87
- if stack[-1] == :func and /^\}/ =~ line
74
+ when :func
75
+ case line
76
+ when /^\}/
88
77
  yield :end, "}", :line_no => line_no, :type => :func
89
78
  stack.pop
90
- end
91
- case line
92
- when /^func\s+(\w+)\(/
93
- yield :defs, scope + [$1], :line_no => line_no, :type => :func
94
- stack.push(:func)
95
- when /^func\s+\(\w+\s+\*?(\w+)\)\s*(\w+)\(/
96
- yield :defs, scope + [$1, $2], :line_no => line_no, :type => :func
97
- stack.push(:func)
98
- when /^package\s+(\w+)/
99
- scope.push($1)
100
- yield :defs, scope, :line_no => line_no, :type => :package
101
- when /^type\s+(\w+)\s+struct\s*\{/
102
- scope.push($1)
103
- stack.push(:struct)
104
- yield :defs, scope, :line_no => line_no, :type => :class
105
- when /^type\s+(\w+)\s+interface\s*\{/
106
- scope.push($1)
107
- stack.push(:interface)
108
- yield :defs, scope, :line_no => line_no, :type => :class
109
- when /^type\s+(\w+)/
110
- yield :defs, scope + [$1], :line_no => line_no, :type => :type
111
- when /^import\s+"(.+)"/
112
- name = $1.split('/')
113
- yield :imports, name, :line_no => line_no
114
- when /^import\s+\(/
115
- stack.push(:import)
116
- when /^var\s+\(/
117
- stack.push(:def)
118
- when /^var\s+(\w+)\s/
119
- yield :defs, scope + [$1], :line_no => line_no
120
- when /^const\s+\(/
121
- stack.push(:def)
122
- when /^const\s+(\w+)\s/
123
- yield :defs, scope + [$1], :line_no => line_no
124
- when /^\s+(.*?) :?=[^=]/
125
- $1.split(' ').each do |var|
126
- next if CONTROL_KEYS.include?(var)
127
- name = var.delete(',').split('.')
128
- next if name[0] == "_" # assigning to _ is a discard in golang
129
- if name.length == 1
130
- yield :assigns, scope + [name[0]], :line_no => line_no
131
- else
132
- yield :assigns, name, :line_no => line_no
133
- end
134
- end
135
- parse_call(line, line_no, scope, &block)
136
79
  else
137
- parse_call(line, line_no, scope, &block)
80
+ parse_new_line(line, line_no, scope, stack, &block)
138
81
  end
82
+ else
83
+ parse_new_line(line, line_no, scope, stack, &block)
139
84
  end
85
+
140
86
  # if the line looks like "foo /* foo" then we enter the comment state
141
87
  # after parsing the usable part of the line
142
88
  if ends_with_comment
@@ -145,6 +91,58 @@ module StarScope::Lang
145
91
  end
146
92
  end
147
93
 
94
+ # handles new lines (when not in the middle of an existing definition)
95
+ def self.parse_new_line(line, line_no, scope, stack, &block)
96
+ case line
97
+ when /^func\s+(\w+)\(/
98
+ yield :defs, scope + [$1], :line_no => line_no, :type => :func
99
+ stack.push(:func)
100
+ when /^func\s+\(\w+\s+\*?(\w+)\)\s*(\w+)\(/
101
+ yield :defs, scope + [$1, $2], :line_no => line_no, :type => :func
102
+ stack.push(:func)
103
+ when /^package\s+(\w+)/
104
+ scope.push($1)
105
+ yield :defs, scope, :line_no => line_no, :type => :package
106
+ when /^type\s+(\w+)\s+struct\s*\{/
107
+ scope.push($1)
108
+ stack.push(:struct)
109
+ yield :defs, scope, :line_no => line_no, :type => :class
110
+ when /^type\s+(\w+)\s+interface\s*\{/
111
+ scope.push($1)
112
+ stack.push(:interface)
113
+ yield :defs, scope, :line_no => line_no, :type => :class
114
+ when /^type\s+(\w+)/
115
+ yield :defs, scope + [$1], :line_no => line_no, :type => :type
116
+ when /^import\s+"(.+)"/
117
+ name = $1.split('/')
118
+ yield :imports, name, :line_no => line_no
119
+ when /^import\s+\(/
120
+ stack.push(:import)
121
+ when /^var\s+\(/
122
+ stack.push(:def)
123
+ when /^var\s+(\w+)\s/
124
+ yield :defs, scope + [$1], :line_no => line_no
125
+ when /^const\s+\(/
126
+ stack.push(:def)
127
+ when /^const\s+(\w+)\s/
128
+ yield :defs, scope + [$1], :line_no => line_no
129
+ when /^\s+(.*?) :?=[^=]/
130
+ $1.split(' ').each do |var|
131
+ next if CONTROL_KEYS.include?(var)
132
+ name = var.delete(',').split('.')
133
+ next if name[0] == "_" # assigning to _ is a discard in golang
134
+ if name.length == 1
135
+ yield :assigns, scope + [name[0]], :line_no => line_no
136
+ else
137
+ yield :assigns, name, :line_no => line_no
138
+ end
139
+ end
140
+ parse_call(line, line_no, scope, &block)
141
+ else
142
+ parse_call(line, line_no, scope, &block)
143
+ end
144
+ end
145
+
148
146
  def self.parse_call(line, line_no, scope)
149
147
  line.scan(FUNC_CALL) do |match|
150
148
  name = match[0].split('.').select {|chunk| not chunk.empty?}
@@ -171,5 +169,11 @@ module StarScope::Lang
171
169
  break if not var.end_with?(',')
172
170
  end
173
171
  end
172
+
173
+ def self.end_block(line_no, scope, stack)
174
+ yield :end, scope + ["}"], :line_no => line_no, :type => :class
175
+ stack.pop
176
+ scope.pop
177
+ end
174
178
  end
175
179
  end
@@ -51,32 +51,38 @@ module StarScope::Lang
51
51
  end
52
52
 
53
53
  def extract_node(node)
54
+ loc = node.location
55
+
54
56
  case node.type
55
57
  when :send
56
- fqn = scoped_name(node)
57
- yield :calls, fqn, :line_no => node.location.expression.line
58
+ yield :calls, scoped_name(node), :line_no => loc.expression.line
58
59
  if node.children[0].nil? and node.children[1] == :require and node.children[2].type == :str
59
- fqn = node.children[2].children[0].split("/")
60
- yield :requires, fqn, :line_no => node.location.expression.line
60
+ yield :requires, node.children[2].children[0].split("/"),
61
+ :line_no => loc.expression.line
61
62
  end
63
+
62
64
  when :def
63
65
  yield :defs, @scope + [node.children[0]],
64
- :line_no => node.location.expression.line, :type => :func
65
- yield :end, :end, :line_no => node.location.end.line, :type => :func
66
+ :line_no => loc.expression.line, :type => :func
67
+ yield :end, :end, :line_no => loc.end.line, :type => :func
68
+
66
69
  when :defs
67
70
  yield :defs, @scope + [node.children[1]],
68
- :line_no => node.location.expression.line, :type => :func
69
- yield :end, :end, :line_no => node.location.end.line, :type => :func
71
+ :line_no => loc.expression.line, :type => :func
72
+ yield :end, :end, :line_no => loc.end.line, :type => :func
73
+
70
74
  when :module, :class
71
- fqn = @scope + scoped_name(node.children[0])
72
- yield :defs, fqn, :line_no => node.location.expression.line, :type => node.type
73
- yield :end, :end, :line_no => node.location.end.line, :type => node.type
75
+ yield :defs, @scope + scoped_name(node.children[0]),
76
+ :line_no => loc.expression.line, :type => node.type
77
+ yield :end, :end, :line_no => loc.end.line, :type => node.type
78
+
74
79
  when :casgn
75
80
  fqn = scoped_name(node)
76
- yield :assigns, fqn, :line_no => node.location.expression.line
77
- yield :defs, fqn, :line_no => node.location.expression.line
81
+ yield :assigns, fqn, :line_no => loc.expression.line
82
+ yield :defs, fqn, :line_no => loc.expression.line
83
+
78
84
  when :lvasgn, :ivasgn, :cvasgn, :gvasgn
79
- yield :assigns, @scope + [node.children[0]], :line_no => node.location.expression.line
85
+ yield :assigns, @scope + [node.children[0]], :line_no => loc.expression.line
80
86
  end
81
87
  end
82
88
 
@@ -1,5 +1,8 @@
1
1
  class StarScope::Record
2
2
 
3
+ @@cachedFile = nil
4
+ @@cachedLines = nil
5
+
3
6
  def self.build(file, name, args)
4
7
  args[:file] = file
5
8
 
@@ -10,7 +13,12 @@ class StarScope::Record
10
13
  end
11
14
 
12
15
  if args[:line_no]
13
- args[:line] = File.readlines(file)[args[:line_no]-1].chomp
16
+ if @@cachedFile != file
17
+ @@cachedFile = file
18
+ @@cachedLines = File.readlines(file)
19
+ end
20
+
21
+ args[:line] = @@cachedLines[args[:line_no]-1].chomp
14
22
  end
15
23
 
16
24
  args
@@ -1,3 +1,3 @@
1
1
  module StarScope
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.3"
3
3
  end
@@ -15,9 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.required_ruby_version = '>= 1.8.7'
17
17
 
18
- gem.add_dependency 'oj', '~> 2.7'
18
+ gem.add_dependency 'oj', '~> 2.9'
19
19
  gem.add_dependency 'parser', '~> 2.1'
20
- gem.add_dependency 'ruby-progressbar', '~> 1.4'
20
+ gem.add_dependency 'ruby-progressbar', '~> 1.5'
21
21
  gem.add_development_dependency 'bundler', '~> 1.5'
22
22
  gem.add_development_dependency 'rake'
23
23
  gem.add_development_dependency 'pry'
@@ -13,8 +13,23 @@ describe StarScope::Record do
13
13
  end
14
14
 
15
15
  it "must read correct line from file" do
16
+
17
+ # we interleave the files here to test the cache
18
+
16
19
  rec = StarScope::Record.build(GOLANG_SAMPLE, :a, {:line_no => 1})
17
20
  rec[:line].must_equal "package main"
21
+
22
+ rec = StarScope::Record.build(GOLANG_SAMPLE, :a, {:line_no => 62})
23
+ rec[:line].must_equal "\tfmt.Println(t)"
24
+
25
+ rec = StarScope::Record.build(RUBY_SAMPLE, :a, {:line_no => 1})
26
+ rec[:line].must_equal "require 'date'"
27
+
28
+ rec = StarScope::Record.build(RUBY_SAMPLE, :a, {:line_no => 163})
29
+ rec[:line].must_equal "end"
30
+
31
+ rec = StarScope::Record.build(GOLANG_SAMPLE, :a, {:line_no => 63})
32
+ rec[:line].must_equal "}"
18
33
  end
19
34
 
20
35
  end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: starscope
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
5
- prerelease:
4
+ version: 1.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Evan Huus
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-19 00:00:00.000000000 Z
11
+ date: 2014-06-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: oj
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: '2.7'
19
+ version: '2.9'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: '2.7'
26
+ version: '2.9'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: parser
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,23 +41,20 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: ruby-progressbar
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: '1.4'
47
+ version: '1.5'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: '1.4'
54
+ version: '1.5'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: bundler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,49 +69,43 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: pry
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: minitest
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  description: A tool like the venerable cscope, but for ruby, golang and other languages
@@ -163,30 +148,26 @@ files:
163
148
  homepage: https://github.com/eapache/starscope
164
149
  licenses:
165
150
  - MIT
151
+ metadata: {}
166
152
  post_install_message:
167
153
  rdoc_options: []
168
154
  require_paths:
169
155
  - lib
170
156
  required_ruby_version: !ruby/object:Gem::Requirement
171
- none: false
172
157
  requirements:
173
- - - ! '>='
158
+ - - '>='
174
159
  - !ruby/object:Gem::Version
175
160
  version: 1.8.7
176
161
  required_rubygems_version: !ruby/object:Gem::Requirement
177
- none: false
178
162
  requirements:
179
- - - ! '>='
163
+ - - '>='
180
164
  - !ruby/object:Gem::Version
181
165
  version: '0'
182
- segments:
183
- - 0
184
- hash: 2115433325249412524
185
166
  requirements: []
186
167
  rubyforge_project:
187
- rubygems_version: 1.8.23
168
+ rubygems_version: 2.0.14
188
169
  signing_key:
189
- specification_version: 3
170
+ specification_version: 4
190
171
  summary: A code indexer and analyzer
191
172
  test_files:
192
173
  - test/files/db_old.json.gz