rspectre 0.0.1 → 0.0.2

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: 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: []