code_quality 0.1.1 → 0.1.2

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: 2aad6bae79b3c4e3ed57dcbd8441768630056e0e
4
- data.tar.gz: f54a234cff30d6713b1d6614380796975b560ce9
3
+ metadata.gz: '0468a907d1a5093eb7a55189993c91b7db4dc35c'
4
+ data.tar.gz: d976a2903996a791e5fc83596194f93813ed819f
5
5
  SHA512:
6
- metadata.gz: c04a6210d08688e077c8c3a40462381040bd91c82f869aa7776b24001e44026e3a5adcd625f00328876df8e1a3b5e8854d30e90f98330a5fa5398c1146fa0c81
7
- data.tar.gz: b1d39e7d4ac9350b48bcfedee9e982d9f56334646b9fd4cc7877c3dbe936a9f4d5502bd9693bc6f8d33ec93a03b13fe5659e55e4d39e5c67b9af68b815a74201
6
+ metadata.gz: e0987639e46edab9cb64d36c1231fa8b0c34f0db415442a1db5b6da4b899d7c71402bef53e102bf19361345756dc954da9c2015ec31b989313a5157935862d23
7
+ data.tar.gz: 62f47cffc1f28847bb182edf16b150470373337d2e13a2b35c41387d3259dca766426ee16ebc8a4fa117effcd965f071a2c1a4e4468ce5fc17fcc1e0a18f837c
data/code_quality.gemspec CHANGED
@@ -23,7 +23,10 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency "bundler-audit"
25
25
  spec.add_dependency "brakeman"
26
- spec.add_dependency "rubycritic"
26
+ spec.add_dependency "rubycritic", "~> 3.3.0"
27
+ spec.add_dependency "rubocop", "~> 0.52.0"
28
+ spec.add_dependency "rubocop-github", "~> 0.8.1"
29
+ spec.add_dependency "code_metric_fu", "~> 4.14.3"
27
30
 
28
31
  spec.add_development_dependency "bundler", "~> 1.16"
29
32
  spec.add_development_dependency "rake", "~> 10.0"
@@ -0,0 +1,5 @@
1
+ # https://github.com/github/rubocop-github
2
+ inherit_gem:
3
+ rubocop-github:
4
+ - config/default.yml
5
+ - config/rails.yml
@@ -0,0 +1,3 @@
1
+ # https://github.com/rails/rails/blob/master/.rubocop.yml
2
+ inherit_from:
3
+ - https://rawgit.com/rails/rails/master/.rubocop.yml
@@ -1,3 +1,3 @@
1
1
  module CodeQuality
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -58,7 +58,7 @@ namespace :code_quality do
58
58
  task :quality_audit => [:"quality_audit:default"] do; end
59
59
  namespace :quality_audit do
60
60
  # default tasks
61
- task :default => [:rubycritic] do; end
61
+ task :default => [:rubycritic, :rubocop, :metric_fu] do; end
62
62
 
63
63
  # desc "prepare dir"
64
64
  task :prepare => :helpers do
@@ -88,6 +88,110 @@ namespace :code_quality do
88
88
  end
89
89
  end
90
90
  end
91
+
92
+ desc "rubocop - audit coding style"
93
+ # e.g.: rake code_quality:quality_audit:rubocop max_offenses=100
94
+ # options:
95
+ # config_formula: use which formula for config, supports "github, "rails" or path_to_your_local_config.yml, default is "github"
96
+ # cli_options: pass extract options, e.g.: cli_options="--show-cops"
97
+ # max_offenses: if config max_offenses then audit it with detected offenses number in report, e.g.: max_offenses=100
98
+ task :rubocop => :prepare do
99
+ run_audit "rubocop - RuboCop is a Ruby static code analyzer. Out of the box it will enforce many of the guidelines outlined in the community Ruby Style Guide." do
100
+ options = options_from_env(:config_formula, :cli_options, :max_offenses)
101
+
102
+ config_formulas = {
103
+ 'github' => 'https://github.com/github/rubocop-github',
104
+ 'rails' => 'https://github.com/rails/rails/blob/master/.rubocop.yml'
105
+ }
106
+
107
+ # prepare cli options
108
+ config_formula = options.fetch(:config_formula, 'github')
109
+ if config_formula && File.exists?(config_formula)
110
+ config_file = config_formula
111
+ puts "Using config file: #{config_file}"
112
+ else
113
+ gem_config_dir = File.expand_path("../../../config", __FILE__)
114
+ config_file = "#{gem_config_dir}/rubocop-#{config_formula}.yml"
115
+ puts "Using config formula: [#{config_formula}](#{config_formulas[config_formula]})"
116
+ end
117
+ report_path = "#{report_dir}/rubocop-report.html"
118
+
119
+ # generate report
120
+ report = `rubocop -c #{config_file} -S -R -P #{options[:cli_options]} --format offenses --format html -o #{report_path}`
121
+ puts report
122
+ puts "Report generated to #{report_path}"
123
+ show_in_browser File.realpath(report_path)
124
+
125
+ # if config max_offenses then audit it with detected offenses number in report
126
+ if options[:max_offenses]
127
+ if report.last(20) =~ /(\d+) *Total/
128
+ detected_offenses = $1.to_i
129
+ max_offenses = options[:max_offenses].to_i
130
+ audit_faild "Detected offenses #{colorize(detected_offenses, :yellow)} is more then #{colorize(max_offenses, :yellow)}, must improve your code quality or set a lower #{colorize("max_offenses", :black, :white)}" if detected_offenses > max_offenses
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ desc "metric_fu - many kinds of metrics"
137
+ # e.g.: rake code_quality:quality_audit:metric_fu metrics=stats,rails_best_practices,roodi rails_best_practices_max_offenses=9 roodi_max_offenses=10
138
+ # options:
139
+ # metrics: default to run all metrics, can be config as: cane,churn,flay,flog,hotspots,rails_best_practices,rcov,reek,roodi,saikuro,stats
140
+ # flay_max_offenses: offenses number for audit
141
+ # cane_max_offenses: offenses number for audit
142
+ # rails_best_practices_max_offenses: offenses number for audit
143
+ # reek_max_offenses: offenses number for audit
144
+ # roodi_max_offenses: offenses number for audit
145
+ task :metric_fu => :prepare do
146
+ metrics_offenses_patterns = {
147
+ "flay" => /Total Score (\d+)/,
148
+ "cane" => /Total Violations (\d+)/,
149
+ "rails_best_practices" => /Found (\d+) errors/,
150
+ "reek" => /Found (\d+) code smells/,
151
+ "roodi" => /Found (\d+) errors/,
152
+ }
153
+ metrics_have_offenses = metrics_offenses_patterns.keys.map { |metric| "#{metric}_max_offenses".to_sym }
154
+ options = options_from_env(:metrics, *metrics_have_offenses)
155
+ run_audit "metric_fu - Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)" do
156
+ report_path = "#{report_dir}/metric_fu"
157
+ available_metrics = %w{cane churn flay flog hotspots rails_best_practices rcov reek roodi saikuro stats}
158
+ metric_fu_opts = ""
159
+ selected_metrics = available_metrics
160
+ if options[:metrics]
161
+ selected_metrics = options[:metrics].split(",")
162
+ disable_metrics = available_metrics - selected_metrics
163
+ selected_metrics_opt = selected_metrics.map { |m| "--#{m}" }.join(" ")
164
+ disable_metrics_opt = disable_metrics.map { |m| "--no-#{m}" }.join(" ")
165
+ metric_fu_opts = "#{selected_metrics_opt} #{disable_metrics_opt}"
166
+ puts "for metrics: #{selected_metrics.join(",")}"
167
+ end
168
+ # geneate report
169
+ report = `bundle exec metric_fu --no-open #{metric_fu_opts}`
170
+ FileUtils.remove_dir(report_path) if Dir.exists? report_path
171
+ FileUtils.mv("tmp/metric_fu/output", report_path, force: true)
172
+ puts report
173
+ puts "Report generated to #{report_path}"
174
+ show_in_browser File.realpath(report_path)
175
+
176
+ # audit report result
177
+ report_result_path = "tmp/metric_fu/report.yml"
178
+ if File.exists? report_result_path
179
+ report_result = YAML.load_file(report_result_path)
180
+ # if config #{metric}_max_offenses then audit it with report result
181
+ audit_failures = []
182
+ metrics_offenses_patterns.each do |metric, pattern|
183
+ option_key = "#{metric}_max_offenses".to_sym
184
+ if options[option_key]
185
+ detected_offenses = report_result[metric.to_sym][:total].to_s.match(pattern)[1].to_i rescue 0
186
+ max_offenses = options[option_key].to_i
187
+ puts "Metric #{colorize(metric, :green)} detected offenses #{colorize(detected_offenses, :yellow)} is more then #{colorize(max_offenses, :yellow)}, must improve your code quality or set a lower #{colorize(option_key, :black, :white)}" if detected_offenses > max_offenses
188
+ audit_failures << {metric: metric, detected_offenses: detected_offenses, max_offenses: max_offenses}
189
+ end
190
+ end
191
+ audit_faild "#{audit_failures.size} of #{selected_metrics.size} metrics audit failed" if audit_failures.any?
192
+ end
193
+ end
194
+ end
91
195
  end
92
196
 
93
197
  # desc "helper methods"
@@ -147,6 +251,19 @@ namespace :code_quality do
147
251
  ansi = cov.call(ansi, bg, bgcode) if bg.to_s != "default"
148
252
  ansi
149
253
  end
254
+
255
+ def show_in_browser(dir)
256
+ require "launchy"
257
+ uri = URI.escape("file://#{dir}/")
258
+ if File.directory?(dir)
259
+ uri = URI.join(uri, "index.html")
260
+ end
261
+ Launchy.open(uri) if open_in_browser?
262
+ end
263
+
264
+ def open_in_browser?
265
+ ENV["CI"].nil?
266
+ end
150
267
  end
151
268
 
152
269
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code_quality
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - RainChen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-22 00:00:00.000000000 Z
11
+ date: 2017-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler-audit
@@ -42,16 +42,58 @@ dependencies:
42
42
  name: rubycritic
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 3.3.0
48
48
  type: :runtime
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: '0'
54
+ version: 3.3.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.52.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.52.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-github
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: code_metric_fu
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 4.14.3
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 4.14.3
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: bundler
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -111,6 +153,8 @@ files:
111
153
  - bin/console
112
154
  - bin/setup
113
155
  - code_quality.gemspec
156
+ - config/rubocop-github.yml
157
+ - config/rubocop-rails.yml
114
158
  - lib/code_quality.rb
115
159
  - lib/code_quality/railtie.rb
116
160
  - lib/code_quality/version.rb
@@ -140,3 +184,4 @@ signing_key:
140
184
  specification_version: 4
141
185
  summary: run code quality and security audit report with one rake task
142
186
  test_files: []
187
+ has_rdoc: