ripper-tags 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d6621fd0e6fae8e6399e7f861ee28a3e0e5482c4
4
- data.tar.gz: b24806fab7cddd6f245a121b5083b987c9f55e19
2
+ SHA256:
3
+ metadata.gz: af186884f47d60d67bc23e0bc85ceee5109a89c6bd60cb92024003803e11f87f
4
+ data.tar.gz: 6dbdd9ad152c076acb592533704df108ba38c582f75287e396fc57e439a2c525
5
5
  SHA512:
6
- metadata.gz: 8ff50b98643eaf25b4cc7f7ce6244486366b6ac5662d3bff378b65c892fe1a8725780ad8dddd4c1e04ecc8309dd4871e56795c862029c472e3239566a189e16f
7
- data.tar.gz: 55fd3694353f4491629fe173142363be315acb17c0695b232efc83351898168c1f7a3fa0254d0bd7451d115e7a11d0baf595f856d2a1eafaf9c4fdd44ca8d058
6
+ metadata.gz: 44316dc2bf8a70f9b00a9da621533f41b63b83ad91da0cfa768db558c920d222cdf7656e4454099a4e29ca4cb0ff82086f613eb491160f697d52d1174d4f142d
7
+ data.tar.gz: e209fcd4873a3a98bf69d03d0205506ad9ed4615e0fa4017476fe54e3b66df7aa2548b41dc7bc63b83e3ce2b2863f36150c6f97985a739db0a767c6d82c6372f
@@ -5,19 +5,23 @@ require 'ripper-tags/parser'
5
5
  require 'ripper-tags/data_reader'
6
6
  require 'ripper-tags/default_formatter'
7
7
  require 'ripper-tags/emacs_formatter'
8
+ require 'ripper-tags/emacs_append_formatter'
8
9
  require 'ripper-tags/vim_formatter'
10
+ require 'ripper-tags/vim_append_formatter'
9
11
  require 'ripper-tags/json_formatter'
10
12
 
11
13
  module RipperTags
12
- def self.version() "0.7.0" end
14
+ def self.version() "0.8.0" end
13
15
 
14
16
  FatalError = Class.new(RuntimeError)
15
17
 
16
18
  def self.default_options
17
19
  OpenStruct.new \
18
20
  :format => nil,
21
+ :formatter => nil,
19
22
  :extra_flags => Set.new,
20
23
  :tag_file_name => nil,
24
+ :tag_file_append => false,
21
25
  :tag_relative => nil,
22
26
  :debug => false,
23
27
  :verbose_debug => false,
@@ -87,8 +91,11 @@ module RipperTags
87
91
  '"-" outputs to standard output') do |fname|
88
92
  options.tag_file_name = fname
89
93
  end
90
- opts.on("--tag-relative[=OPTIONAL]", "Make file paths relative to the directory of the tag file") do |value|
91
- options.tag_relative = value != "no"
94
+ opts.on("-a", "--append[=yes|no]", "Append tags to existing file") do |value|
95
+ options.tag_file_append = value != "no"
96
+ end
97
+ opts.on("--tag-relative[=yes|no|always|never]", "Make file paths relative to the directory of the tag file") do |value|
98
+ options.tag_relative = value || true
92
99
  end
93
100
  opts.on("-L", "--input-file=FILE", "File to read paths to process trom (use `-` for stdin)") do |file|
94
101
  options.input_file = file
@@ -103,7 +110,7 @@ module RipperTags
103
110
  options.exclude << pattern
104
111
  end
105
112
  end
106
- opts.on("--excmd=number", "Use EX number command to locate tags.") do |excmd|
113
+ opts.on("--excmd=(number|pattern|mixed|combined)", "Type of EX command to find tags in vim with (default: pattern)") do |excmd|
107
114
  options.excmd = excmd
108
115
  end
109
116
  opts.on("-n", "Equivalent to --excmd=number.") do
@@ -187,19 +194,36 @@ module RipperTags
187
194
  options.format ||= File.basename(options.tag_file_name) == 'TAGS' ? 'emacs' : 'vim'
188
195
  options.tag_relative = options.format == "emacs" if options.tag_relative.nil?
189
196
 
197
+ case options.tag_relative
198
+ when true, false, 'yes', 'no', 'always', 'never'
199
+ else
200
+ raise OptionParser::InvalidOption, 'unsupported value for --tag-relative: %p' % options.tag_relative
201
+ end
202
+
190
203
  return run.call(options)
191
204
  end
192
205
  end
193
206
 
194
207
  def self.formatter_for(options)
195
- options.formatter ||
196
- case options.format
197
- when "vim" then RipperTags::VimFormatter
198
- when "emacs" then RipperTags::EmacsFormatter
199
- when "json" then RipperTags::JSONFormatter
200
- when "custom" then RipperTags::DefaultFormatter
201
- else raise FatalError, "unknown format: #{options.format.inspect}"
202
- end.new(options)
208
+ return options.formatter unless options.formatter.nil?
209
+
210
+ if options.tag_file_append
211
+ case options.format
212
+ when "vim" then RipperTags::VimAppendFormatter.new(RipperTags::VimFormatter.new(options))
213
+ when "emacs" then RipperTags::EmacsAppendFormatter.new(RipperTags::EmacsFormatter.new(options))
214
+ else
215
+ raise FatalError, "--append is only supported for vim/emacs; got #{options.format.inspect}"
216
+ end
217
+ else
218
+ case options.format
219
+ when "vim" then RipperTags::VimFormatter.new(options)
220
+ when "emacs" then RipperTags::EmacsFormatter.new(options)
221
+ when "json" then RipperTags::JSONFormatter.new(options)
222
+ when "custom" then RipperTags::DefaultFormatter.new(options)
223
+ else
224
+ raise FatalError, "unknown format: #{options.format.inspect}"
225
+ end
226
+ end
203
227
  end
204
228
 
205
229
  def self.run(options)
@@ -56,16 +56,23 @@ module RipperTags
56
56
  end
57
57
 
58
58
  def tag_file_dir
59
- @tag_file_dir ||= Pathname.new(options.tag_file_name).dirname.expand_path
59
+ @tag_file_dir ||= stdout? ?
60
+ Pathname.pwd :
61
+ Pathname.new(options.tag_file_name).dirname.expand_path
60
62
  end
61
63
 
62
64
  def relative_path(tag)
63
65
  path = tag.fetch(:path)
64
- if options.tag_relative && !stdout? && path.index('/') != 0
65
- Pathname.new(path).expand_path.relative_path_from(tag_file_dir).to_s
66
- else
67
- path
66
+ case options.tag_relative
67
+ when true, 'yes', 'always'
68
+ filepath = Pathname.new(path)
69
+ if options.tag_relative == 'always' || filepath.relative?
70
+ path = filepath.expand_path.relative_path_from(tag_file_dir).to_s
71
+ end
72
+ when 'never'
73
+ path = File.expand_path(path)
68
74
  end
75
+ path
69
76
  end
70
77
 
71
78
  def constant?(tag)
@@ -0,0 +1,43 @@
1
+ require 'set'
2
+
3
+ module RipperTags
4
+ class EmacsAppendFormatter
5
+ # Wraps an EmacsFormatter
6
+ def initialize(fmt)
7
+ raise 'append is only possible to a file' if fmt.stdout?
8
+ @formatter = fmt
9
+ end
10
+
11
+ def with_output
12
+ old_sections = parse_tag_file
13
+ @seen_filenames = Set.new
14
+
15
+ @formatter.with_output do |out|
16
+ yield out
17
+ @formatter.flush_file_section(out)
18
+
19
+ old_sections.each do |filename, data|
20
+ next if @seen_filenames.include?(filename)
21
+ @formatter.write_section(filename, data, out)
22
+ end
23
+ end
24
+ end
25
+
26
+ def write(tag, out)
27
+ @formatter.write(tag, out)
28
+ @seen_filenames << @formatter.relative_path(tag)
29
+ end
30
+
31
+ def parse_tag_file
32
+ section_map = {}
33
+ File.open(@formatter.options.tag_file_name) do |old_file|
34
+ while line = old_file.read(2)
35
+ raise 'expected "\f\n", got %p' % line unless "\x0C\n" == line
36
+ filename, length = old_file.gets.chomp.split(',')
37
+ section_map[filename] = old_file.read(length.to_i)
38
+ end
39
+ end
40
+ section_map
41
+ end
42
+ end
43
+ end
@@ -11,12 +11,6 @@ module RipperTags
11
11
  # new source file is encountered or when `with_output` block finishes. This
12
12
  # assumes that incoming tags are ordered by source file.
13
13
  class EmacsFormatter < DefaultFormatter
14
- def initialize(*)
15
- super
16
- @current_file = nil
17
- @section_io = nil
18
- end
19
-
20
14
  def supported_flags() ['q'] end
21
15
 
22
16
  def include_qualified_names?
@@ -25,6 +19,9 @@ module RipperTags
25
19
  end
26
20
 
27
21
  def with_output
22
+ @current_file = nil
23
+ @section_io = nil
24
+
28
25
  super do |io|
29
26
  begin
30
27
  yield io
@@ -43,21 +40,24 @@ module RipperTags
43
40
  end
44
41
  end
45
42
 
43
+ def write_section(filename, data, io)
44
+ io.write format_section_header(filename, data)
45
+ io.write data
46
+ end
47
+
46
48
  def start_file_section(filename, io)
47
49
  if filename != @current_file
48
50
  flush_file_section(io)
49
51
  @current_file = filename
50
52
  @section_io = StringIO.new
51
- else
52
- @section_io
53
53
  end
54
+ @section_io
54
55
  end
55
56
 
56
57
  def flush_file_section(out)
57
58
  if @section_io
58
- data = @section_io.string
59
- out.write format_section_header(@current_file, data)
60
- out.write data
59
+ write_section(@current_file, @section_io.string, out)
60
+ @section_io = nil
61
61
  end
62
62
  end
63
63
 
@@ -36,7 +36,13 @@ class Parser < Ripper
36
36
  [:defs, receiver && receiver[0], *method]
37
37
  end
38
38
  def on_alias(lhs, rhs)
39
- [:alias, lhs[0], rhs[0], rhs[1]] if lhs && rhs
39
+ if lhs && rhs
40
+ name, other = lhs[0], rhs[0]
41
+ name = name[0] if Array === name
42
+ other = other[0] if Array === other
43
+ line = rhs[1]
44
+ [:alias, name, other, line]
45
+ end
40
46
  end
41
47
  def on_assign(lhs, rhs)
42
48
  return if lhs.nil?
@@ -169,9 +175,11 @@ class Parser < Ripper
169
175
  name, line = call[1]
170
176
  case name
171
177
  when "alias_method"
172
- [:alias, args[1][0], args[2][0], line] if args[1] && args[2]
178
+ if args[1] && String === args[1][0] && args[2] && String === args[2][0]
179
+ [:alias, args[1][0], args[2][0], line]
180
+ end
173
181
  when "define_method"
174
- [:def, args[1][0], line]
182
+ [:def, args[1][0], line] if String === args[1][0]
175
183
  when "public_class_method", "private_class_method", "protected_class_method", "private", "public", "protected"
176
184
  access = name.sub("_class_method", "")
177
185
  klass = name == access ? nil : 'self'
@@ -0,0 +1,35 @@
1
+ require 'set'
2
+
3
+ module RipperTags
4
+ class VimAppendFormatter
5
+ # Wraps a VimFormatter
6
+ def initialize(fmt)
7
+ raise 'append is only possible to a file' if fmt.stdout?
8
+ @formatter = fmt
9
+ end
10
+
11
+ def with_output
12
+ orig_lines = File.readlines(@formatter.options.tag_file_name)
13
+ @seen_filenames = Set.new
14
+
15
+ @formatter.with_output do |out|
16
+ yield out
17
+
18
+ orig_lines.each do |line|
19
+ f1, f2, = line.split("\t", 3)
20
+ # skip repeating header entries
21
+ next if f1 == '!_TAG_FILE_FORMAT' || f1 == '!_TAG_FILE_SORTED'
22
+ # skip old tags for newly processed files
23
+ next if f1.index('!_TAG_') != 0 && @seen_filenames.include?(f2)
24
+ # preserve other tags from original file
25
+ @formatter.write_line(line)
26
+ end
27
+ end
28
+ end
29
+
30
+ def write(tag, out)
31
+ @formatter.write(tag, out)
32
+ @seen_filenames << @formatter.relative_path(tag)
33
+ end
34
+ end
35
+ end
@@ -30,21 +30,33 @@ module RipperTags
30
30
  end
31
31
 
32
32
  def write(tag, out)
33
- @queued_write << format(tag)
33
+ write_line(format(tag))
34
34
  if include_qualified_names? && tag[:full_name] != tag[:name] && constant?(tag)
35
- @queued_write << format(tag, :full_name)
35
+ write_line(format(tag, :full_name))
36
36
  end
37
37
  end
38
38
 
39
+ def write_line(line)
40
+ @queued_write << line
41
+ end
42
+
39
43
  def display_constant(const)
40
44
  const.to_s.gsub('::', '.')
41
45
  end
42
46
 
43
47
  def display_excmd_info(tag)
44
- if options.excmd == "number"
48
+ case options.excmd
49
+ when 'n', 'number'
45
50
  "%d;\"" % tag.fetch(:line)
46
- else
51
+ when nil, 'p', 'pattern', 'm', 'mixed'
47
52
  "/^%s$/;\"" % tag.fetch(:pattern).to_s.gsub('\\','\\\\\\\\').gsub('/','\\/')
53
+ when 'c', 'combined'
54
+ "%d;/^%s$/;\"" % [
55
+ tag.fetch(:line) - 1,
56
+ tag.fetch(:pattern).to_s.gsub('\\','\\\\\\\\').gsub('/','\\/')
57
+ ]
58
+ else
59
+ raise 'invalid excmd value: %p', options.excmd
48
60
  end
49
61
  end
50
62
 
metadata CHANGED
@@ -1,17 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ripper-tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Mislav Marohnić
7
8
  - Aman Gupta
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-12-11 00:00:00.000000000 Z
12
+ date: 2019-11-26 00:00:00.000000000 Z
12
13
  dependencies: []
13
14
  description: fast, accurate ctags generator for ruby source code using Ripper
14
15
  email:
16
+ - mislav.marohnic@gmail.com
15
17
  - aman@tmm1.net
16
18
  executables:
17
19
  - ripper-tags
@@ -24,11 +26,13 @@ files:
24
26
  - lib/ripper-tags.rb
25
27
  - lib/ripper-tags/data_reader.rb
26
28
  - lib/ripper-tags/default_formatter.rb
29
+ - lib/ripper-tags/emacs_append_formatter.rb
27
30
  - lib/ripper-tags/emacs_formatter.rb
28
31
  - lib/ripper-tags/json_formatter.rb
29
32
  - lib/ripper-tags/parser.rb
33
+ - lib/ripper-tags/vim_append_formatter.rb
30
34
  - lib/ripper-tags/vim_formatter.rb
31
- homepage: http://github.com/tmm1/ripper-tags
35
+ homepage: https://github.com/tmm1/ripper-tags
32
36
  licenses:
33
37
  - MIT
34
38
  metadata: {}
@@ -47,8 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
51
  - !ruby/object:Gem::Version
48
52
  version: '0'
49
53
  requirements: []
50
- rubyforge_project:
51
- rubygems_version: 2.5.2
54
+ rubygems_version: 3.0.3
52
55
  signing_key:
53
56
  specification_version: 4
54
57
  summary: ctags generator for ruby code