reek-checkstyle-formatter 0.0.1
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.
- data/.gitignore +1 -0
- data/Gemfile +7 -0
- data/README.md +36 -0
- data/Rakefile +17 -0
- data/lib/reek-checkstyle-formatter.rb +96 -0
- data/lib/reek-checkstyle-formatter/rake_task.rb +18 -0
- data/lib/reek-checkstyle-formatter/version.rb +6 -0
- data/reek-checkstyle-formatter.gemspec +28 -0
- data/spec/spec_helper.rb +32 -0
- metadata +125 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# description
|
2
|
+
|
3
|
+
Checkstyle formatter for [reek](https://github.com/troessner/reek)
|
4
|
+
|
5
|
+
|
6
|
+
# usage
|
7
|
+
|
8
|
+
Load the rake task into your `Rakefile`.
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
require 'reek-checkstyle-formatter/rake_task'
|
12
|
+
```
|
13
|
+
|
14
|
+
`rake -T`
|
15
|
+
|
16
|
+
```
|
17
|
+
[...]
|
18
|
+
rake reek # Check for code smells
|
19
|
+
rake reek:checkstyle # Generate checkstyle XML for code smells analyzed by reek
|
20
|
+
[...]
|
21
|
+
```
|
22
|
+
|
23
|
+
# customize
|
24
|
+
|
25
|
+
Overwrite the formatter options in your `Rakefile`.
|
26
|
+
E.g Map a smell to a different severity (default *warning*):
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Reek::CheckstyleFormatter.rake_task_options = {
|
30
|
+
:smell_severities => {
|
31
|
+
'IrresponsibleModule' => 'error'
|
32
|
+
}
|
33
|
+
}
|
34
|
+
```
|
35
|
+
|
36
|
+
Please look at [Reek::CheckstyleFormatter#initialize](lib/reek-checkstyle-formatter.rb) for available options.
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'reek-checkstyle-formatter/rake_task'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
# make test task the gem task
|
9
|
+
task :default => :spec
|
10
|
+
task :spec => :clean
|
11
|
+
|
12
|
+
desc 'Remove generated files.'
|
13
|
+
task :clean do
|
14
|
+
['spec/reports', 'spec/coverage'].each do |path|
|
15
|
+
FileUtils.rm_rf(path) if File.exists?(path)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'reek/source/source_locator'
|
2
|
+
require 'reek/examiner'
|
3
|
+
require 'rexml/document'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
class Reek::CheckstyleFormatter
|
7
|
+
REXML_PRETTY_PRINT_INDENT = 0
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :rake_task_options
|
11
|
+
end
|
12
|
+
|
13
|
+
# options that are used by the rake task to overwrite the default formatter options
|
14
|
+
@rake_task_options = {}
|
15
|
+
|
16
|
+
attr_accessor :glob_pattern, :output, :smell_doc_url, :smell_severities
|
17
|
+
|
18
|
+
# @param [Hash] opts
|
19
|
+
# @option opts [String] :glob_pattern Glob pattern (absolute path) for files to analyse
|
20
|
+
# @option opts [String] :output File path for checkstyle xml output
|
21
|
+
# @option opts [String] :smell_doc_url URL to code smell documentation (reek wiki)
|
22
|
+
# @option opts [Hash] :smell_severities Mapping of smell subclasses to [checkstyle severity](http://checkstyle.sourceforge.net/property_types.html#severity)
|
23
|
+
def initialize(opts = {})
|
24
|
+
@glob_pattern = opts[:glob_pattern]
|
25
|
+
@output = opts[:output]
|
26
|
+
@smell_doc_url = opts[:smell_doc_url]
|
27
|
+
@smell_severities = opts[:smell_severities] || {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def run
|
31
|
+
puts "Generating Reek Checkstyle XML #{self.inspect}"
|
32
|
+
files = Dir.glob(@glob_pattern)
|
33
|
+
sources = Reek::Source::SourceLocator.new(files).all_sources
|
34
|
+
examined_files = sources.map {|src| Reek::Examiner.new(src, []) }
|
35
|
+
document = to_checkstyle(examined_files)
|
36
|
+
Pathname.new(@output).dirname.mkpath
|
37
|
+
File.open(@output, 'w+') do |file|
|
38
|
+
document.write(file, REXML_PRETTY_PRINT_INDENT)
|
39
|
+
end
|
40
|
+
puts "Reek Checkstyle XML written to #{self.output}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_checkstyle(examined_files)
|
44
|
+
REXML::Document.new.tap do |document_node|
|
45
|
+
document_node << REXML::XMLDecl.new
|
46
|
+
REXML::Element.new('checkstyle', document_node).tap do |checkstyle_node|
|
47
|
+
examined_files.each do |examined_file|
|
48
|
+
add_file(checkstyle_node, examined_file)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_file(checkstyle_node, examined_file)
|
55
|
+
if examined_file.smells.length > 0
|
56
|
+
REXML::Element.new('file', checkstyle_node).tap do |file_node|
|
57
|
+
file_node.attributes['name'] = File.join(examined_file.description)
|
58
|
+
examined_file.smells.each do |smell|
|
59
|
+
if smell.status['is_active']
|
60
|
+
[*smell.location['lines']].each do |line|
|
61
|
+
add_smell(file_node, smell, line)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_smell(file_node, smell, line)
|
70
|
+
REXML::Element.new('error', file_node).tap do |error|
|
71
|
+
error.attributes['line'] = line
|
72
|
+
error.attributes['column'] = 0
|
73
|
+
error.attributes['severity'] = smell_severity(smell)
|
74
|
+
error.attributes['message'] = smell_message(smell)
|
75
|
+
#error.attributes['source'] = File.join(@project_dir, smell.source)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def smell_message(smell)
|
80
|
+
"<em>#{smell_anchor(smell)}</em> - #{smell.message}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def smell_anchor(smell)
|
84
|
+
url = smell_url(smell)
|
85
|
+
"<a href='#{url}'>#{smell.smell['subclass']}</a>"
|
86
|
+
end
|
87
|
+
|
88
|
+
def smell_url(smell)
|
89
|
+
smell_page_name = (smell.smell['subclass']).scan(/[A-Z][^A-Z]*/).join('-')
|
90
|
+
[@smell_doc_url, smell_page_name].join("/")
|
91
|
+
end
|
92
|
+
|
93
|
+
def smell_severity(smell)
|
94
|
+
@smell_severities[smell.smell['subclass']] || 'warning'
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'reek/rake/task'
|
2
|
+
require 'reek-checkstyle-formatter'
|
3
|
+
|
4
|
+
Reek::Rake::Task.new do |t|
|
5
|
+
t.fail_on_error = false
|
6
|
+
t.reek_opts = '-y -n'
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :reek do
|
10
|
+
desc 'Generate checkstyle XML for code smells analyzed by reek.'
|
11
|
+
task :checkstyle do
|
12
|
+
Reek::CheckstyleFormatter.new({
|
13
|
+
:glob_pattern => "#{Dir.pwd}/lib/**/*.rb",
|
14
|
+
:output => "#{Dir.pwd}/reek_checkstyle.xml",
|
15
|
+
:smell_doc_url => 'https://github.com/troessner/reek/wiki',
|
16
|
+
}.merge(Reek::CheckstyleFormatter.rake_task_options)).run
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'reek-checkstyle-formatter/version'
|
5
|
+
|
6
|
+
s = Gem::Specification.new
|
7
|
+
|
8
|
+
s.name = "reek-checkstyle-formatter"
|
9
|
+
s.version = Reek::CheckstyleFormatter::VERSION
|
10
|
+
s.authors = ["Ruben Jenster"]
|
11
|
+
s.email = ["r.jenster@drachenfels.de"]
|
12
|
+
s.description = %q{Checkstyle formatter for reek}
|
13
|
+
s.summary = %q{Checkstyle formatter for reek}
|
14
|
+
s.homepage = "http://github.com/Drachenfels-GmbH/reek-checkstyle-formatter"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split($/)
|
17
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "simplecov"
|
23
|
+
s.add_development_dependency "simplecov-rcov"
|
24
|
+
|
25
|
+
s.add_dependency 'reek'
|
26
|
+
|
27
|
+
s
|
28
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'simplecov-rcov'
|
3
|
+
|
4
|
+
SimpleCov.start do
|
5
|
+
formatter SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
SimpleCov::Formatter::RcovFormatter,
|
8
|
+
]
|
9
|
+
add_filter "/spec/"
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'timeout'
|
13
|
+
require "rspec"
|
14
|
+
require_relative "../lib/reek-checkstyle-formatter"
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.color_enabled = true
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'stringio'
|
21
|
+
# TODO if an error happens during capture everything is lost
|
22
|
+
def capture(stream_name)
|
23
|
+
result = nil
|
24
|
+
begin
|
25
|
+
eval("$#{stream_name} = StringIO.new")
|
26
|
+
yield
|
27
|
+
result = eval("$#{stream_name}").string
|
28
|
+
ensure
|
29
|
+
eval("$#{stream_name} = #{stream_name.upcase}")
|
30
|
+
end
|
31
|
+
result
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: reek-checkstyle-formatter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ruben Jenster
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-08-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: simplecov
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: simplecov-rcov
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: reek
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: Checkstyle formatter for reek
|
79
|
+
email:
|
80
|
+
- r.jenster@drachenfels.de
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- Gemfile
|
87
|
+
- README.md
|
88
|
+
- Rakefile
|
89
|
+
- lib/reek-checkstyle-formatter.rb
|
90
|
+
- lib/reek-checkstyle-formatter/rake_task.rb
|
91
|
+
- lib/reek-checkstyle-formatter/version.rb
|
92
|
+
- reek-checkstyle-formatter.gemspec
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
homepage: http://github.com/Drachenfels-GmbH/reek-checkstyle-formatter
|
95
|
+
licenses: []
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
hash: 3108404625103376616
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
hash: 3108404625103376616
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 1.8.25
|
121
|
+
signing_key:
|
122
|
+
specification_version: 3
|
123
|
+
summary: Checkstyle formatter for reek
|
124
|
+
test_files:
|
125
|
+
- spec/spec_helper.rb
|