rubocop-yast 0.0.5 → 0.0.6

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
2
  SHA1:
3
- metadata.gz: 8f14f2792588ff28f55867a356603deeeafe6deb
4
- data.tar.gz: 03433493409f9d50a333391b4e05c8782a525064
3
+ metadata.gz: c59e960c99f00013d3881020fe1d576e9d67ab91
4
+ data.tar.gz: 89d463fb18eb4d31ad00df25be33621cd4309446
5
5
  SHA512:
6
- metadata.gz: 3fed38028da0bd94e103e5a5091e1723857c3c5b1995216fa175f8dc6fadaefc81f77f6182abf80a6cbe7c5e7b41fda716f44150ce6a4dc3aa2a599b7cec01f6
7
- data.tar.gz: 32e08248270ec322da28aabf4ff9fa27fc8be17729b3b64d92336106e92cf946a65d3462c4634cca7467ace025eba6ffe41b593aff467af02d09f38c16bd3d8c
6
+ metadata.gz: f6f08655ccfef688328df7f9f245df9c963ed4a55c963ae81b40395e71befa4fca00f50c8fba339f80223689863a24d51c49ff41e923d166880555d2efb02087
7
+ data.tar.gz: ea903ebf6261f79f6a7e7b3646648d198ae0432b3da2e301dbc2b29a1d07e23a7c8b9ddcf849f4d3c46b221b6d0ff11ef97879952bedbde3c66e8bc4d2fb834e
@@ -0,0 +1,19 @@
1
+ # Change Log
2
+
3
+ ## master (unreleased)
4
+
5
+ ## 0.0.6 (15/12/2014)
6
+
7
+ ### New Features
8
+
9
+ - added `LogVariable` Cop (check for `log` variable assignment)
10
+
11
+ ### Changes
12
+
13
+ - converted MarkDown test descriptions to Cucumber (removed our specific
14
+ Markdown -> RSpec renderer)
15
+
16
+ ### Fixed Bugs
17
+
18
+ - `Ops` Cop - fixed crash when using `--auto-gen-config` option
19
+ - `Builtins` Cop - fixed crash when parenthesis were missing aroung method argument
data/README.md CHANGED
@@ -2,11 +2,11 @@ rubocop-yast
2
2
  ============
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/rubocop-yast.svg)](http://badge.fury.io/rb/rubocop-yast)
5
- [![Dependency Status](https://gemnasium.com/lslezak/rubocop-yast.svg)](https://gemnasium.com/lslezak/rubocop-yast)
6
- [![Travis Build](https://travis-ci.org/lslezak/rubocop-yast.svg?branch=master)](https://travis-ci.org/lslezak/rubocop-yast)
7
- [![Coverage Status](https://img.shields.io/coveralls/lslezak/rubocop-yast.svg)](https://coveralls.io/r/lslezak/rubocop-yast?branch=master)
8
- [![Code Climate](https://codeclimate.com/github/lslezak/rubocop-yast/badges/gpa.svg)](https://codeclimate.com/github/lslezak/rubocop-yast)
9
- [![Inline docs](http://inch-ci.org/github/lslezak/rubocop-yast.svg?branch=master)](http://inch-ci.org/github/lslezak/rubocop-yast)
5
+ [![Dependency Status](https://gemnasium.com/yast/rubocop-yast.svg)](https://gemnasium.com/yast/rubocop-yast)
6
+ [![Travis Build](https://travis-ci.org/yast/rubocop-yast.svg?branch=master)](https://travis-ci.org/yast/rubocop-yast)
7
+ [![Coverage Status](https://img.shields.io/coveralls/yast/rubocop-yast.svg)](https://coveralls.io/r/yast/rubocop-yast?branch=master)
8
+ [![Code Climate](https://codeclimate.com/github/yast/rubocop-yast/badges/gpa.svg)](https://codeclimate.com/github/yast/rubocop-yast)
9
+ [![Inline docs](http://inch-ci.org/github/yast/rubocop-yast.svg?branch=master)](http://inch-ci.org/github/yast/rubocop-yast)
10
10
 
11
11
 
12
12
  This is a plugin for [RuboCop](https://github.com/bbatsov/rubocop)
@@ -18,8 +18,8 @@ The goal is to create a Rubocop plugin which can check for
18
18
  covert some ugly code parts introduced by the automatic code conversion done by
19
19
  [YCP Killer](https://github.com/yast/ycp-killer) (conversion from YCP to Ruby).
20
20
 
21
- Check [the test descriptions](spec/builtins_spec.md) to see the examples of offense
22
- detection and code conversion.
21
+ Check [the RSpec tests](spec) and [the Cucumber features](features)to see
22
+ the examples of offense detection and code conversion.
23
23
 
24
24
  *The plugin is currently in early development, always manually check the chages
25
25
  done by the plugin! It can eat your code... ;-)*
@@ -35,6 +35,9 @@ you can install it using the `gem` command:
35
35
  sudo gem install rubocop-yast
36
36
  ```
37
37
 
38
+ You can also install the latest development version directly from the Git repository,
39
+ see [Building a Gem](#building-a-gem) section below.
40
+
38
41
  Usage
39
42
  -----
40
43
 
@@ -73,8 +76,9 @@ Development
73
76
 
74
77
  ### Prerequisites
75
78
 
76
- For development you need some extra development gems. The best way is to install them with [Bundler](http://bundler.io/). To avoid a possible collision with system gems it is recommended
77
- to install the gems into a local subdirectory using
79
+ For development you need some extra development gems. The best way is to install them with [Bundler](http://bundler.io/). To avoid a possible collision with system gems (esp. RSpec,
80
+ Yast still uses version 2.14 while rubocop-yast uses 3.1) it is recommended
81
+ to install the gems into a local subdirectory using:
78
82
 
79
83
  ```shell
80
84
  bundle install --path vendor/bundle
@@ -131,3 +135,4 @@ and then run:
131
135
  bundle exec rake release
132
136
  ```
133
137
 
138
+ (Note: You need push permissions at [rubygems.org](https://rubygems.org/gems/rubocop-yast).)
data/Rakefile CHANGED
@@ -10,34 +10,13 @@ rescue Bundler::BundlerError => e
10
10
  exit e.status_code
11
11
  end
12
12
 
13
- require "redcarpet"
14
- require_relative "spec/rspec_renderer"
15
-
16
- def render_markdown(renderer_class, task)
17
- puts "Rendering file: #{task.name}"
18
- markdown = Redcarpet::Markdown.new(renderer_class, fenced_code_blocks: true)
19
-
20
- string = markdown.render(File.read(task.prerequisites[0]))
21
- File.write(task.name, string)
22
- end
23
-
24
- renderer = "spec/rspec_renderer.rb"
25
-
26
- file "spec/builtins_spec.rb" => ["spec/builtins_spec.md", renderer] do |t|
27
- render_markdown(RSpecRenderer, t)
28
- end
29
-
30
- file "spec/builtins_spec.html" => ["spec/builtins_spec.md", renderer] do |t|
31
- render_markdown(Redcarpet::Render::HTML, t)
32
- end
33
- desc "Render the specification to HTML locally"
34
- task html: ["spec/builtins_spec.html"]
13
+ require "cucumber/rake/task"
14
+ Cucumber::Rake::Task.new(:features)
35
15
 
36
16
  require "rspec/core/rake_task"
37
17
  RSpec::Core::RakeTask.new(:spec)
38
- task spec: ["spec/builtins_spec.rb"]
39
18
 
40
19
  require "rubocop/rake_task"
41
20
  RuboCop::RakeTask.new(:rubocop)
42
21
 
43
- task default: [:spec, :rubocop]
22
+ task default: [:spec, :features, :rubocop]
@@ -6,3 +6,7 @@ Yast/Ops:
6
6
  Description: "Check for obsolete Ops.* calls"
7
7
  Enabled: true
8
8
  SafeMode: true
9
+
10
+ Yast/LogVariable:
11
+ Description: "Check for using 'log' variable"
12
+ Enabled: true
@@ -8,3 +8,4 @@ RuboCop::Yast::Config.load_defaults
8
8
  require_relative "rubocop/yast/version"
9
9
  require_relative "rubocop/cop/yast/builtins"
10
10
  require_relative "rubocop/cop/yast/ops"
11
+ require_relative "rubocop/cop/yast/log_variable"
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ require "rubocop/cop/cop"
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Yast
8
+ # This cop checks for using log variable
9
+ # code like:
10
+ # log = "msg"
11
+ # can override the included logger
12
+ class LogVariable < Cop
13
+ MSG = "Do not use `log` variable, it can conflict with the logger."
14
+
15
+ def on_lvasgn(node)
16
+ name, _value = *node
17
+
18
+ add_offense(node, :name, MSG) if name == :log
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -25,7 +25,7 @@ module RuboCop
25
25
  def initialize(config = nil, options = nil)
26
26
  super(config, options)
27
27
 
28
- @safe_mode = cop_config["SafeMode"]
28
+ @safe_mode = cop_config && cop_config["SafeMode"]
29
29
  @replaced_nodes = []
30
30
  end
31
31
 
@@ -88,6 +88,7 @@ module RuboCop
88
88
  # Add Yast::Logger include somewhere up in the tree
89
89
  def add_missing_logger(node, corrector)
90
90
  target_node = parent_node_type(node, [:class, :module])
91
+ target_node = target_node.children.first if target_node.begin_type?
91
92
 
92
93
  # already added or already present
93
94
  return if added_includes.include?(target_node) ||
@@ -3,6 +3,6 @@
3
3
  module RuboCop
4
4
  # Yast plugin settings
5
5
  module Yast
6
- VERSION = "0.0.5"
6
+ VERSION = "0.0.6"
7
7
  end
8
8
  end
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency("rubocop", "~> 0.27")
32
32
 
33
33
  spec.add_development_dependency("rake")
34
- spec.add_development_dependency("redcarpet", "~> 3")
35
34
  spec.add_development_dependency("rspec", "~> 3.1.0")
35
+ spec.add_development_dependency("cucumber")
36
36
  spec.add_development_dependency("simplecov")
37
37
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- describe "RuboCop-Yast" do
5
+ describe "RuboCop::Cop::Yast::Builtins" do
6
6
  describe "Generic Tests:" do
7
7
  it "It reports y2milestone builtin as offense" do
8
8
  code = code_cleanup(<<-EOT)
@@ -13,7 +13,6 @@ describe "RuboCop-Yast" do
13
13
  inspect_source(cop, [code])
14
14
 
15
15
  expect(cop.offenses.size).to eq(1)
16
- expect(cop.messages.first).to match(/Builtin call `.*` is obsolete/)
17
16
  end
18
17
 
19
18
  it "It finds builtin in explicit Yast namespace" do
@@ -25,7 +24,6 @@ describe "RuboCop-Yast" do
25
24
  inspect_source(cop, [code])
26
25
 
27
26
  expect(cop.offenses.size).to eq(1)
28
- expect(cop.messages.first).to match(/Builtin call `.*` is obsolete/)
29
27
  end
30
28
 
31
29
  it "It finds builtin in explicit ::Yast namespace" do
@@ -37,7 +35,6 @@ describe "RuboCop-Yast" do
37
35
  inspect_source(cop, [code])
38
36
 
39
37
  expect(cop.offenses.size).to eq(1)
40
- expect(cop.messages.first).to match(/Builtin call `.*` is obsolete/)
41
38
  end
42
39
 
43
40
  it "Builtins in the ::Builtins name space are ignored" do
@@ -89,21 +86,6 @@ describe "RuboCop-Yast" do
89
86
  end
90
87
  end
91
88
 
92
- describe "Builtins.time():" do
93
- it "Is trivially converted to `::Time.now.to_i`" do
94
- original_code = code_cleanup(<<-EOT)
95
- Builtins.time()
96
- EOT
97
-
98
- translated_code = code_cleanup(<<-EOT)
99
- ::Time.now.to_i
100
- EOT
101
-
102
- cop = RuboCop::Cop::Yast::Builtins.new
103
- expect(autocorrect_source(cop, original_code)).to eq(translated_code)
104
- end
105
- end
106
-
107
89
  describe "Builtins.getenv():" do
108
90
  it "With string literal parameter is translated to ENV equivalent" do
109
91
  original_code = code_cleanup(<<-EOT)
@@ -147,7 +129,7 @@ describe "RuboCop-Yast" do
147
129
  end
148
130
  end
149
131
 
150
- describe "Logging:" do
132
+ describe "Logging - Builtins.y2debug(), ...:" do
151
133
  it "It translates `y2debug` to `log.debug`" do
152
134
  original_code = code_cleanup(<<-EOT)
153
135
  Builtins.y2debug("foo")
@@ -563,5 +545,16 @@ describe "RuboCop-Yast" do
563
545
  cop = RuboCop::Cop::Yast::Builtins.new
564
546
  expect(autocorrect_source(cop, original_code)).to eq(translated_code)
565
547
  end
548
+
549
+ it "It finds an offense with missing parenthesis around argument" do
550
+ code = code_cleanup(<<-EOT)
551
+ Builtins.y2milestone "Executing hook '\#{name}'"
552
+ EOT
553
+
554
+ cop = RuboCop::Cop::Yast::Builtins.new
555
+ inspect_source(cop, [code])
556
+
557
+ expect(cop.offenses.size).to eq(1)
558
+ end
566
559
  end
567
560
  end
@@ -95,7 +95,6 @@ describe RuboCop::Cop::Yast::Ops do
95
95
  new_source = autocorrect_source(cop, source)
96
96
  expect(new_source).to eq(source)
97
97
  end
98
-
99
98
  end
100
99
 
101
100
  context("In unsafe mode") do
@@ -117,5 +116,4 @@ describe RuboCop::Cop::Yast::Ops do
117
116
  expect(new_source).to eq("foo + bar")
118
117
  end
119
118
  end
120
-
121
119
  end
@@ -2,18 +2,6 @@
2
2
 
3
3
  require "simplecov"
4
4
 
5
- # use coveralls for on-line code coverage reporting at Travis CI
6
- if ENV["TRAVIS"]
7
- require "coveralls"
8
-
9
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
- SimpleCov::Formatter::HTMLFormatter,
11
- Coveralls::SimpleCov::Formatter
12
- ]
13
- end
14
-
15
- SimpleCov.minimum_coverage 95
16
-
17
5
  SimpleCov.start do
18
6
  # don't check code coverage in these subdirectories
19
7
  add_filter "/vendor/"
@@ -38,10 +26,4 @@ require File.join(
38
26
 
39
27
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
40
28
 
41
- def code_cleanup(s)
42
- s.split("\n").reject { |l| l =~ /^\s*$/ }.first =~ /^(\s*)/
43
- return s.dup if Regexp.last_match.nil?
44
- s.gsub(Regexp.new("^#{Regexp.last_match[1]}"), "")[0..-2]
45
- end
46
-
47
29
  require "rubocop-yast"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-yast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ladislav Slezák
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-09 00:00:00.000000000 Z
11
+ date: 2014-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -39,33 +39,33 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: redcarpet
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: 3.1.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3'
54
+ version: 3.1.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: cucumber
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 3.1.0
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 3.1.0
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +91,7 @@ extra_rdoc_files:
91
91
  - LICENSE
92
92
  - README.md
93
93
  files:
94
+ - CHANGELOG.md
94
95
  - Gemfile
95
96
  - LICENSE
96
97
  - README.md
@@ -98,6 +99,7 @@ files:
98
99
  - config/default.yml
99
100
  - lib/rubocop-yast.rb
100
101
  - lib/rubocop/cop/yast/builtins.rb
102
+ - lib/rubocop/cop/yast/log_variable.rb
101
103
  - lib/rubocop/cop/yast/ops.rb
102
104
  - lib/rubocop/yast/builtins/builtin.rb
103
105
  - lib/rubocop/yast/builtins/getenv.rb
@@ -111,11 +113,8 @@ files:
111
113
  - lib/rubocop/yast/variable_scope.rb
112
114
  - lib/rubocop/yast/version.rb
113
115
  - rubocop-yast.gemspec
114
- - spec/builtins_spec.md
115
116
  - spec/builtins_spec.rb
116
117
  - spec/ops_spec.rb
117
- - spec/rspec_code.rb
118
- - spec/rspec_renderer.rb
119
118
  - spec/spec_helper.rb
120
119
  homepage: http://github.com/yast/rubocop-yast
121
120
  licenses:
@@ -142,9 +141,6 @@ signing_key:
142
141
  specification_version: 4
143
142
  summary: Specific YaST Rubocop checks
144
143
  test_files:
145
- - spec/builtins_spec.md
146
144
  - spec/builtins_spec.rb
147
145
  - spec/ops_spec.rb
148
- - spec/rspec_code.rb
149
- - spec/rspec_renderer.rb
150
146
  - spec/spec_helper.rb
@@ -1,614 +0,0 @@
1
- Builtins Cop
2
- ============
3
-
4
- Table Of Contents
5
- -----------------
6
-
7
- 1. Description
8
- 1. Builtins.time()
9
- 1. Builtins.getenv()
10
- 1. Logging
11
-
12
- Description
13
- -----------
14
-
15
- This Cop is designed to check for `Builtins` call presence. These calls were
16
- added by YCP Killer to ensure 100% compatibily of the translated Ruby code
17
- with the old YCP.
18
-
19
- But these calls should not be used in the new code, native Ruby methods should
20
- be used instead of these wrappers.
21
-
22
- The Cop can autocorrect some trivial or easy translatable builtins.
23
-
24
- Generic Tests
25
- -------------
26
-
27
- It reports y2milestone builtin as offense
28
-
29
- **Offense**
30
-
31
- ```ruby
32
- Builtins.y2milestone("foo")
33
- ```
34
-
35
- It finds builtin in explicit Yast namespace
36
-
37
- **Offense**
38
-
39
- ```ruby
40
- Yast::Builtins.y2milestone("foo")
41
- ```
42
-
43
- It finds builtin in explicit ::Yast namespace
44
-
45
- **Offense**
46
-
47
- ```ruby
48
- ::Yast::Builtins.y2milestone("foo")
49
- ```
50
-
51
- Builtins in the ::Builtins name space are ignored
52
-
53
- **Accepted**
54
-
55
- ```ruby
56
- ::Builtins.y2milestone("foo")
57
- ```
58
-
59
- Builtins in non Yast name space are ignored
60
-
61
- **Accepted**
62
-
63
- ```ruby
64
- Foo::Builtins.y2milestone("foo")
65
- ```
66
-
67
- lsort(), crypt and gettext builtins are allowed
68
-
69
- **Accepted**
70
-
71
- ```ruby
72
- Builtins.lsort(["foo"])
73
- Builtins.crypt("foo")
74
- Builtins.dgettext("domain", "foo")
75
- ```
76
-
77
- It does not change unknown builtins
78
-
79
- **Unchanged**
80
-
81
- ```ruby
82
- Builtins.foo()
83
- ```
84
-
85
-
86
- Builtins.time()
87
- ---------------
88
-
89
- Is trivially converted to `::Time.now.to_i`
90
-
91
- **Original**
92
-
93
- ```ruby
94
- Builtins.time()
95
- ```
96
-
97
- **Translated**
98
-
99
- ```ruby
100
- ::Time.now.to_i
101
- ```
102
-
103
- Builtins.getenv()
104
- -----------------
105
-
106
- With string literal parameter is translated to ENV equivalent
107
-
108
- **Original**
109
-
110
- ```ruby
111
- Builtins.getenv("foo")
112
- ```
113
-
114
- **Translated**
115
-
116
- ```ruby
117
- ENV["foo"]
118
- ```
119
-
120
- Variable as parameter is preserved.
121
-
122
- **Original**
123
-
124
- ```ruby
125
- foo = bar
126
- Builtins.getenv(foo)
127
- ```
128
-
129
- **Translated**
130
-
131
- ```ruby
132
- foo = bar
133
- ENV[foo]
134
- ```
135
-
136
- Any other statement is preserved.
137
-
138
- **Original**
139
-
140
- ```ruby
141
- Builtins.getenv(Ops.add(foo, bar))
142
- ```
143
-
144
- **Translated**
145
-
146
- ```ruby
147
- ENV[Ops.add(foo, bar)]
148
- ```
149
-
150
- Logging
151
- --------
152
-
153
- It translates `y2debug` to `log.debug`
154
-
155
- **Original**
156
-
157
- ```ruby
158
- Builtins.y2debug("foo")
159
- ```
160
-
161
- **Translated**
162
-
163
- ```ruby
164
- include Yast::Logger
165
- log.debug "foo"
166
- ```
167
-
168
- It translates `y2milestone` to `log.info`
169
-
170
- **Original**
171
-
172
- ```ruby
173
- Builtins.y2milestone("foo")
174
- ```
175
-
176
- **Translated**
177
-
178
- ```ruby
179
- include Yast::Logger
180
- log.info "foo"
181
- ```
182
-
183
- It translates `y2warning` to `log.warn`
184
-
185
- **Original**
186
-
187
- ```ruby
188
- Builtins.y2warning("foo")
189
- ```
190
-
191
- **Translated**
192
-
193
- ```ruby
194
- include Yast::Logger
195
- log.warn "foo"
196
- ```
197
-
198
- It translates `y2error` to `log.error`
199
-
200
- **Original**
201
-
202
- ```ruby
203
- Builtins.y2error("foo")
204
- ```
205
-
206
- **Translated**
207
-
208
- ```ruby
209
- include Yast::Logger
210
- log.error "foo"
211
- ```
212
-
213
- It translates `y2security` to `log.error`
214
-
215
- **Original**
216
-
217
- ```ruby
218
- Builtins.y2security("foo")
219
- ```
220
-
221
- **Translated**
222
-
223
- ```ruby
224
- include Yast::Logger
225
- log.error "foo"
226
- ```
227
-
228
- It translates `y2internal` to `log.fatal`
229
-
230
- **Original**
231
-
232
- ```ruby
233
- Builtins.y2internal("foo")
234
- ```
235
-
236
- **Translated**
237
-
238
- ```ruby
239
- include Yast::Logger
240
- log.fatal "foo"
241
- ```
242
-
243
- It adds the include statement only once
244
-
245
- **Original**
246
-
247
- ```ruby
248
- Builtins.y2milestone("foo")
249
- Builtins.y2milestone("foo")
250
- ```
251
-
252
- **Translated**
253
-
254
- ```ruby
255
- include Yast::Logger
256
- log.info \"foo\"
257
- log.info \"foo\"
258
- ```
259
-
260
- It converts YCP sformat to Ruby interpolation
261
-
262
- **Original**
263
-
264
- ```ruby
265
- Builtins.y2milestone("foo: %1", foo)
266
- ```
267
-
268
- **Translated**
269
-
270
- ```ruby
271
- include Yast::Logger
272
- log.info "foo: #{foo}"
273
- ```
274
-
275
- It converts %% in the format string to simple %.
276
-
277
- **Original**
278
-
279
- ```ruby
280
- Builtins.y2milestone("foo: %1%%", foo)
281
- ```
282
-
283
- **Translated**
284
-
285
- ```ruby
286
- include Yast::Logger
287
- log.info "foo: #{foo}%"
288
- ```
289
-
290
- It replaces repeated % placeholders in the format string
291
-
292
- **Original**
293
-
294
- ```ruby
295
- Builtins.y2warning("%1 %1", foo)
296
- ```
297
-
298
- **Translated**
299
-
300
- ```ruby
301
- include Yast::Logger
302
- log.warn "#{foo} #{foo}"
303
- ```
304
-
305
- The % placeholders do not need to start from 1
306
-
307
- **Original**
308
-
309
- ```ruby
310
- Builtins.y2warning("%2 %2", foo, bar)
311
- ```
312
-
313
- **Translated**
314
-
315
- ```ruby
316
- include Yast::Logger
317
- log.warn "#{bar} #{bar}"
318
- ```
319
-
320
- The % placeholders do not need to be in ascending order
321
-
322
- **Original**
323
-
324
- ```ruby
325
- Builtins.y2warning("%2 %1", foo, bar)
326
- ```
327
-
328
- **Translated**
329
-
330
- ```ruby
331
- include Yast::Logger
332
- log.warn "#{bar} #{foo}"
333
- ```
334
-
335
- It keeps the original statements in interpolated string
336
-
337
- **Original**
338
-
339
- ```ruby
340
- Builtins.y2warning("%1", foo + bar)
341
- ```
342
-
343
- **Translated**
344
-
345
- ```ruby
346
- include Yast::Logger
347
- log.warn "#{foo + bar}"
348
- ```
349
-
350
- It converts a log with string interpolation
351
-
352
- **Original**
353
-
354
- ```ruby
355
- Builtins.y2warning("foo: #{foo}")
356
- ```
357
-
358
- **Translated**
359
-
360
- ```ruby
361
- include Yast::Logger
362
- log.warn "foo: #{foo}"
363
- ```
364
-
365
- It converts a log with a message variable
366
-
367
- **Original**
368
-
369
- ```ruby
370
- msg = "message"
371
- Builtins.y2warning(msg)
372
- ```
373
-
374
- **Translated**
375
-
376
- ```ruby
377
- include Yast::Logger
378
- msg = "message"
379
- log.warn msg
380
- ```
381
-
382
- It converts a log with function call
383
-
384
- **Original**
385
-
386
- ```ruby
387
- Builtins.y2warning(msg)
388
- ```
389
-
390
- **Translated**
391
-
392
- ```ruby
393
- include Yast::Logger
394
- log.warn msg
395
- ```
396
-
397
- It doesn't convert a log with extra parameters
398
-
399
- **Unchanged**
400
-
401
- ```ruby
402
- Builtins.y2warning(msg, arg1, arg2)
403
- ```
404
-
405
- It converts log with operator call
406
-
407
- **Original**
408
-
409
- ```ruby
410
- Builtins.y2warning(msg1 + msg2)
411
- ```
412
-
413
- **Translated**
414
-
415
- ```ruby
416
- include Yast::Logger
417
- log.warn msg1 + msg2
418
- ```
419
-
420
- It adds logger include to the class definition
421
-
422
- **Original**
423
-
424
- ```ruby
425
- class Foo
426
- Builtins.y2error('foo')
427
- end
428
- ```
429
-
430
- **Translated**
431
-
432
- ```ruby
433
- class Foo
434
- include Yast::Logger
435
-
436
- log.error "foo"
437
- end
438
- ```
439
-
440
- It adds logger include with correct indentation
441
-
442
- **Original**
443
-
444
- ```ruby
445
- class Foo
446
- Builtins.y2error('foo')
447
- end
448
- ```
449
-
450
- **Translated**
451
-
452
- ```ruby
453
- class Foo
454
- include Yast::Logger
455
-
456
- log.error "foo"
457
- end
458
- ```
459
-
460
- It does not add the logger include if already present
461
-
462
- **Original**
463
-
464
- ```ruby
465
- class Foo
466
- include Yast::Logger
467
- Builtins.y2error('foo')
468
- end
469
- ```
470
-
471
- **Translated**
472
-
473
- ```ruby
474
- class Foo
475
- include Yast::Logger
476
- log.error "foo"
477
- end
478
- ```
479
-
480
- It adds the logger include after the parent class name if present
481
-
482
- **Original**
483
-
484
- ```ruby
485
- class Foo < Bar
486
- Builtins.y2error('foo')
487
- end
488
- ```
489
-
490
- **Translated**
491
-
492
- ```ruby
493
- class Foo < Bar
494
- include Yast::Logger
495
-
496
- log.error "foo"
497
- end
498
- ```
499
-
500
- It adds logger include once to a derived class in a module
501
-
502
- **Original**
503
-
504
- ```ruby
505
- module Yast
506
- class TestClass < Module
507
- def test
508
- Builtins.y2error("foo")
509
- Builtins.y2debug("foo")
510
- end
511
- end
512
- end
513
- ```
514
-
515
- **Translated**
516
-
517
- ```ruby
518
- module Yast
519
- class TestClass < Module
520
- include Yast::Logger
521
-
522
- def test
523
- log.error "foo"
524
- log.debug "foo"
525
- end
526
- end
527
- end
528
- ```
529
-
530
- It converts the single quoted format string to double quoted
531
-
532
- **Original**
533
-
534
- ```ruby
535
- Builtins.y2milestone('foo: %1', foo)
536
- ```
537
-
538
- **Translated**
539
-
540
- ```ruby
541
- include Yast::Logger
542
- log.info "foo: #{foo}"
543
- ```
544
-
545
- It escapes double quotes and interpolations
546
-
547
- **Original**
548
-
549
- ```ruby
550
- Builtins.y2milestone('"#{foo}"')
551
- ```
552
-
553
- **Translated**
554
-
555
- ```ruby
556
- include Yast::Logger
557
- log.info "\\"\\#{foo}\\""
558
- ```
559
-
560
- It does not convert logging with backtrace
561
-
562
- **Unchanged**
563
-
564
- ```ruby
565
- Builtins.y2milestone(-1, "foo")
566
- ```
567
-
568
- It does not convert code with a local variable 'log'
569
-
570
- **Unchanged**
571
-
572
- ```ruby
573
- log = 1
574
- Builtins.y2milestone("foo")
575
- ```
576
-
577
- <!--
578
-
579
- Template
580
- --------
581
-
582
- It finds an offense
583
-
584
- **Offense**
585
-
586
- ```ruby
587
- ```
588
-
589
- This code is OK
590
-
591
- **Accepted**
592
-
593
- ```ruby
594
- ```
595
-
596
- It translates.
597
-
598
- **Original**
599
-
600
- ```ruby
601
- ```
602
-
603
- **Translated**
604
-
605
- ```ruby
606
- ```
607
-
608
- It does not translate.
609
-
610
- **Unchanged**
611
-
612
- ```ruby
613
- ```
614
- -->
@@ -1,47 +0,0 @@
1
-
2
- # this module provides code block generators for RSpecRenderer
3
- module RspecCode
4
- # rubocop:disable Metrics/MethodLength
5
- def generate_translation_code
6
- [
7
- "original_code = code_cleanup(<<-EOT)",
8
- Code.indent(@original_code),
9
- "EOT",
10
- "",
11
- "translated_code = code_cleanup(<<-EOT)",
12
- Code.indent(@translated_code),
13
- "EOT",
14
- "",
15
- "cop = RuboCop::Cop::Yast::Builtins.new",
16
- "expect(autocorrect_source(cop, original_code)).to eq(translated_code)"
17
- ].join("\n")
18
- end
19
-
20
- def generate_offense_code
21
- [
22
- "code = code_cleanup(<<-EOT)",
23
- Code.indent(@offense),
24
- "EOT",
25
- "",
26
- "cop = RuboCop::Cop::Yast::Builtins.new",
27
- "inspect_source(cop, [code])",
28
- "",
29
- "expect(cop.offenses.size).to eq(1)",
30
- "expect(cop.messages.first).to match(/Builtin call `.*` is obsolete/)"
31
- ].join("\n")
32
- end
33
-
34
- def generate_accepted_code
35
- [
36
- "code = code_cleanup(<<-EOT)",
37
- Code.indent(@accepted_code),
38
- "EOT",
39
- "",
40
- "cop = RuboCop::Cop::Yast::Builtins.new",
41
- "inspect_source(cop, [code])",
42
- "",
43
- "expect(cop.offenses).to be_empty"
44
- ].join("\n")
45
- end
46
- # rubocop:enable Metrics/MethodLength
47
- end
@@ -1,206 +0,0 @@
1
- require "redcarpet"
2
-
3
- require_relative "rspec_code"
4
-
5
- # Utility functions for manipulating code.
6
- module Code
7
- INDENT_STEP = 2
8
-
9
- class << self
10
- def join(lines)
11
- lines.map { |l| "#{l}\n" }.join("")
12
- end
13
-
14
- def indent(s)
15
- s.gsub(/^(?=.)/, " " * INDENT_STEP)
16
- end
17
- end
18
- end
19
-
20
- # Represents RSpec's "it" block.
21
- class It
22
- def initialize(attrs)
23
- @description = attrs[:description]
24
- @code = attrs[:code]
25
- @skip = attrs[:skip]
26
- end
27
-
28
- def render
29
- [
30
- "#{@skip ? "xit" : "it"} #{@description.inspect} do",
31
- Code.indent(@code),
32
- "end"
33
- ].join("\n")
34
- end
35
- end
36
-
37
- # Represents RSpec's "describe" block.
38
- class Describe
39
- attr_reader :blocks
40
-
41
- def initialize(attrs)
42
- @description = attrs[:description]
43
- @blocks = attrs[:blocks]
44
- end
45
-
46
- def render
47
- parts = []
48
- parts << "describe #{@description.inspect} do"
49
- parts << Code.indent(@blocks.map(&:render).join("\n\n")) if !blocks.empty?
50
- parts << "end"
51
- parts.join("\n")
52
- end
53
- end
54
-
55
- # Renders a Markdown file to an RSpec test script
56
- class RSpecRenderer < Redcarpet::Render::Base
57
- include RspecCode
58
-
59
- IGNORED_HEADERS = [
60
- "Table Of Contents",
61
- "Description"
62
- ]
63
-
64
- def initialize
65
- super
66
-
67
- @next_block_type = :unknown
68
- @describe = Describe.new(description: "RuboCop-Yast", blocks: [])
69
- end
70
-
71
- # preprocess the MarkDown input - remove comments
72
- def preprocess(fulldoc)
73
- # use multiline regexp pattern
74
- fulldoc.gsub(/<!--.*-->/m, "")
75
- end
76
-
77
- def header(text, header_level)
78
- return nil if header_level == 1 || IGNORED_HEADERS.include?(text)
79
-
80
- if header_level > describes_depth + 1
81
- raise "Missing higher level header: #{text}"
82
- end
83
-
84
- describe_at_level(header_level - 1).blocks << Describe.new(
85
- description: text + ":",
86
- blocks: []
87
- )
88
-
89
- nil
90
- end
91
-
92
- def paragraph(text)
93
- if text =~ /^\*\*(.*)\*\*$/
94
- @next_block_type = Regexp.last_match[1].downcase.to_sym
95
- else
96
- first_sentence = text.split(/\.(\s+|$)/).first
97
- @description = first_sentence.sub(/^RuboCop-Yast /, "").sub(/\n/, " ")
98
- end
99
-
100
- nil
101
- end
102
-
103
- # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity:
104
- def block_code(code, _language)
105
- escaped_code = escape(code[0..-2])
106
-
107
- case @next_block_type
108
- when :original
109
- @original_code = escaped_code
110
- when :translated
111
- @translated_code = escaped_code
112
- when :unchanged
113
- @original_code = @translated_code = escaped_code
114
- when :offense
115
- @offense = escaped_code
116
- when :accepted
117
- @accepted_code = escaped_code
118
- else
119
- raise "Invalid next code block type: #{@next_block_type}.\n#{code}"
120
- end
121
-
122
- @next_block_type = :unknown
123
-
124
- add_translation_block if @original_code && @translated_code
125
- add_offense_block if @offense
126
- add_accepted_block if @accepted_code
127
-
128
- nil
129
- end
130
- # rubocop:enable Metrics/MethodLength, Metrics/CyclomaticComplexity:
131
-
132
- # escape ruby interpolation
133
- def escape(code)
134
- code.gsub("\#{", "\\\#{")
135
- end
136
-
137
- def doc_header
138
- Code.join([
139
- "# Automatically generated -- DO NOT EDIT!",
140
- "",
141
- "require \"spec_helper\"",
142
- ""
143
- ])
144
- end
145
-
146
- def doc_footer
147
- "#{@describe.render}\n"
148
- end
149
-
150
- private
151
-
152
- def describes_depth
153
- describe = @describe
154
- depth = 1
155
- while describe.blocks.last.is_a?(Describe)
156
- describe = describe.blocks.last
157
- depth += 1
158
- end
159
- depth
160
- end
161
-
162
- def current_describe
163
- describe = @describe
164
- describe = describe.blocks.last while describe.blocks.last.is_a?(Describe)
165
- describe
166
- end
167
-
168
- def describe_at_level(level)
169
- describe = @describe
170
- 2.upto(level) do
171
- describe = describe.blocks.last
172
- end
173
- describe
174
- end
175
-
176
- def add_translation_block
177
- current_describe.blocks << It.new(
178
- description: @description,
179
- code: generate_translation_code,
180
- skip: @description =~ /XFAIL/
181
- )
182
-
183
- @original_code = nil
184
- @translated_code = nil
185
- end
186
-
187
- def add_offense_block
188
- current_describe.blocks << It.new(
189
- description: @description,
190
- code: generate_offense_code,
191
- skip: @description =~ /XFAIL/
192
- )
193
-
194
- @offense = nil
195
- end
196
-
197
- def add_accepted_block
198
- current_describe.blocks << It.new(
199
- description: @description,
200
- code: generate_accepted_code,
201
- skip: @description =~ /XFAIL/
202
- )
203
-
204
- @accepted_code = nil
205
- end
206
- end