reek-checkstyle-formatter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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