rspectre 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ba92a8e8133dfaf7b4b3482717139be699fb8f25
4
- data.tar.gz: 760cdddf1a3aeb9db71b54fa637f8009218eccc1
2
+ SHA256:
3
+ metadata.gz: faf75c69148e3ed8340132dca49bcf008e8aa39b51bf366e2bb9265c8c38e84c
4
+ data.tar.gz: aefe0c552bd1a55be839be57e22f6758632ece9e669609c9369c1f2ff59451ec
5
5
  SHA512:
6
- metadata.gz: f60346768b3217d357455cc3f8c8e8d3048e0f1ee859ff7bf796e3f8b85f5a57457dcc3b2170e146baf211438ef4679c144de46c2fcf4d6c1c164d90d660e411
7
- data.tar.gz: '06917b75a86f56f949b6edbd681af187b392af58ef4d8ccf567145ed7775914090b5ae0060516ef049cdea8b7358e336fbc30c6bf73b9501fdeff6100fbcdd38'
6
+ metadata.gz: c4d1ff2a8a61cbfd0e474a1bd40204ee719eab8f76c65a4dd5bd51702558651983af4e51fabf190b7992c5d6ce386705b64a8a49bf5f7f27dd4d98f63f890ae5
7
+ data.tar.gz: 76d3218da62b89ad85b905af19245824583399d5e9221538161f0e14f8ae8e029fb65d8bf8c2902e403d664c478dc8aba4ac7490951cd80f6ea59955ad7a876c
@@ -8,7 +8,7 @@ require 'optparse'
8
8
 
9
9
  require 'rspectre'
10
10
 
11
- options = { rspec: %w[--fail-fast spec], :'auto-correct' => false }
11
+ options = { rspec: %w[--fail-fast spec], 'auto-correct': false }
12
12
 
13
13
  OptionParser.new do |opts|
14
14
  opts.banner = 'Usage: rspectre [options]'
@@ -15,6 +15,7 @@ require 'rspectre/auto_corrector'
15
15
  require 'rspectre/color'
16
16
  require 'rspectre/node'
17
17
  require 'rspectre/offense'
18
+ require 'rspectre/permissive_ast_builder'
18
19
  require 'rspectre/runner'
19
20
  require 'rspectre/source_map'
20
21
  require 'rspectre/source_map/parser'
@@ -1,24 +1,72 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpectre
4
- class AutoCorrector < Parser::Rewriter
5
- include Concord.new(:filename, :nodes)
4
+ class AutoCorrector < Parser::TreeRewriter
5
+ include Concord.new(:filename, :nodes, :buffer)
6
6
 
7
- def correct
7
+ def initialize(filename, nodes)
8
8
  buffer = Parser::Source::Buffer.new("(#{filename})")
9
9
  buffer.source = File.read(filename)
10
10
 
11
+ super(filename, nodes, buffer)
12
+ end
13
+
14
+ def correct
11
15
  File.open(filename, 'w') do |file|
12
16
  file.write(rewrite(buffer, Parser::CurrentRuby.new.parse(buffer)))
13
17
  end
14
18
  end
15
19
 
16
20
  def on_block(node)
17
- remove(node.location.expression) if nodes.any? do |offense_node|
21
+ remove(removal_range(node)) if nodes.any? do |offense_node|
18
22
  node == offense_node && node.location.line == offense_node.location.line
19
23
  end
20
24
 
21
25
  super
22
26
  end
27
+
28
+ private
29
+
30
+ # This corrects for cases which contains heredocs which do not get removed in all cases if we
31
+ # just use the `expression` range.
32
+ def removal_range(node)
33
+ Parser::Source::Range.new(
34
+ buffer,
35
+ node.location.expression.begin_pos,
36
+ range_end(node)
37
+ )
38
+ end
39
+
40
+ def range_end(node) # rubocop:disable Metrics/MethodLength
41
+ location = node.location.expression
42
+
43
+ last_line = location.last_line
44
+ end_location = location.end
45
+
46
+ walk(node) do |child|
47
+ child_location = child.location
48
+
49
+ next unless child_location.respond_to?(:heredoc_end)
50
+
51
+ heredoc_end = child_location.heredoc_end
52
+
53
+ if heredoc_end.last_line > last_line
54
+ last_line = heredoc_end.last_line
55
+ end_location = heredoc_end
56
+ end
57
+ end
58
+
59
+ end_location.end_pos
60
+ end
61
+
62
+ def walk(node, &block)
63
+ yield node
64
+
65
+ node.children.each do |child|
66
+ next unless child.is_a?(::Parser::AST::Node)
67
+
68
+ walk(child, &block)
69
+ end
70
+ end
23
71
  end
24
72
  end
@@ -26,6 +26,7 @@ module RSpectre
26
26
  puts to_s
27
27
  end
28
28
 
29
+ # rubocop:disable Layout/IndentHeredoc
29
30
  def to_s
30
31
  <<~DOC
31
32
 
@@ -34,6 +35,7 @@ module RSpectre
34
35
  #{highlight}
35
36
  DOC
36
37
  end
38
+ # rubocop:enable Layout/IndentHeredoc
37
39
 
38
40
  def description
39
41
  DESCRIPTIONS.fetch(type)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # See: https://github.com/whitequark/parser/issues/323#issuecomment-253606403
4
+ # Solution to: https://github.com/dgollahon/rspectre/issues/17
5
+ # See also: https://github.com/whitequark/parser/blob/c25585d8d91f3470d9cdfd6f3b6a553ad9a809fb/lib/parser/builders/default.rb#L2076
6
+
7
+ module RSpectre
8
+ class PermissiveASTBuilder < ::Parser::Builders::Default
9
+ def string_value(token)
10
+ token.first
11
+ end
12
+ end
13
+ end
@@ -36,5 +36,5 @@ module RSpectre
36
36
 
37
37
  RSpec::Core::Runner.new(rspec_config).tap { |runner| runner.setup($stderr, StringIO.new) }
38
38
  end
39
- end # Rspec
39
+ end
40
40
  end
@@ -20,26 +20,16 @@ module RSpectre
20
20
  end
21
21
 
22
22
  def find_method(target_selector, line)
23
- candidates = find_methods(target_selector, line)
24
-
25
- if candidates.one?
26
- candidates.first
27
- else
28
- warn Color.yellow("Unable to resolve `#{target_selector}` on line #{line}.")
29
- end
30
- end
31
-
32
- private
33
-
34
- def find_methods(target_selector, line)
35
23
  block_nodes(line).select do |node|
36
24
  send, = *node
37
25
  _receiver, selector = *send
38
26
 
39
27
  selector.equal?(target_selector)
40
- end
28
+ end.first
41
29
  end
42
30
 
31
+ private
32
+
43
33
  def block_nodes(line)
44
34
  map.fetch(line, []).select { |node| node.type.equal?(:block) }
45
35
  end
@@ -28,7 +28,10 @@ module RSpectre
28
28
  end
29
29
 
30
30
  def parsed_source
31
- ::Parser::CurrentRuby.parse(raw_source, file)
31
+ parser = ::Parser::CurrentRuby.new(PermissiveASTBuilder.new)
32
+ buffer = ::Parser::Source::Buffer.new(file, source: raw_source)
33
+
34
+ parser.parse(buffer)
32
35
  end
33
36
 
34
37
  def raw_source
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpectre
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspectre
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Gollahon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2017-03-25 00:00:00.000000000 Z
@@ -100,30 +100,30 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.47'
103
+ version: 0.60.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.47'
110
+ version: 0.60.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop-rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.15'
117
+ version: 1.30.1
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.15'
125
- description:
126
- email:
124
+ version: 1.30.1
125
+ description:
126
+ email:
127
127
  executables:
128
128
  - rspectre
129
129
  extensions: []
@@ -139,6 +139,7 @@ files:
139
139
  - lib/rspectre/linter/unused_subject.rb
140
140
  - lib/rspectre/node.rb
141
141
  - lib/rspectre/offense.rb
142
+ - lib/rspectre/permissive_ast_builder.rb
142
143
  - lib/rspectre/runner.rb
143
144
  - lib/rspectre/source_map.rb
144
145
  - lib/rspectre/source_map/parser.rb
@@ -148,7 +149,7 @@ homepage: http://github.com/dgollahon/rspectre
148
149
  licenses:
149
150
  - MIT
150
151
  metadata: {}
151
- post_install_message:
152
+ post_install_message:
152
153
  rdoc_options: []
153
154
  require_paths:
154
155
  - lib
@@ -163,9 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
164
  - !ruby/object:Gem::Version
164
165
  version: '0'
165
166
  requirements: []
166
- rubyforge_project:
167
- rubygems_version: 2.6.11
168
- signing_key:
167
+ rubygems_version: 3.0.8
168
+ signing_key:
169
169
  specification_version: 4
170
170
  summary: A tool for linting RSpec test suites.
171
171
  test_files: []