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 ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "rspec"
7
+ end
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,6 @@
1
+ module Reek
2
+ class CheckstyleFormatter
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
6
+
@@ -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
+
@@ -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