code_quality 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +22 -8
- data/README.md +3 -0
- data/app/views/code_quality/index.html.erb +20 -0
- data/bin/travis-update-gh-pages.sh +35 -0
- data/lib/code_quality/version.rb +1 -1
- data/lib/tasks/code_quality.rake +54 -18
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c97a301536ac1e5078182bd45230e6adfa3a2c472bdceee4982844e27d536441
|
4
|
+
data.tar.gz: 98a33f7a35c23d1a787f534e2847c3b664310b7751d1864ef109b9c88412b841
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d394a0c35a8ee45ca255f071b279a8eb6effda067333e9c5df9b938b3f1c2c27c281516147f0a91efa4939dd53280c27caa5e34d01adf3758d0bc7cd3863c040
|
7
|
+
data.tar.gz: d6a4d1502a04558ba0d6be06bdf0d080723b10d18203edf21268798af22a621d398026b84103808f958b00ff1c53738e95233882f15b422b604ddea54229da01
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -4,12 +4,26 @@ rvm:
|
|
4
4
|
- 2.4.3
|
5
5
|
before_install: gem install bundler -v 1.16.0
|
6
6
|
|
7
|
-
#
|
7
|
+
# config GitHub OAuth Token
|
8
|
+
env:
|
9
|
+
global:
|
10
|
+
secure: HLfW6QDOiyxaM7wBRDzdF9ud0Ey1EVL/rdnvt8TvM7VUbtUt4wLlCbUcIIASbxrv0AV/MtpkS4n9O/WIk3rcdndoUzoPtYBNIKI9McJuunoSxzY2pwlF7scZz0aE64OJCCshCEeaNRR5p8yw7Lw4gptsdFmceIVXyPfGEG924arSwFcAhMUnWxaIBFamH9/j2KXrq0RkagX2b4+HUqH1at4cfc/otFUbvQxaGL5eaxI+ReZU3MwO3uxAvdoWoiWpAS3NDTxJKN9GMT6a67wzbxGPERj2G75sGubwVJfvRhdh+BgjAOJjgSMaUMYn2HA9phN5Mkb0z9yaZu2RuBzEscHv8Cq8pSVHb75IvjBdk2Ovsq3R25D/jFdTPnLnJxsrWYVLDDSyJvpyc1aOcws/Ry7MEX8v+Lt0gWJraleTcfn51ulZY/cWlD8utVqvTjfjGjKEZrmYXn5nu0xTJ3vYHMttqKavh6nQxcc7cDRLbVDE5GI9PUjENNP+ZxY0ldiSQiYm+S/1OuHZP9/z6DXMhIDUFZBNSIy3dkKW5bUFQNeb40mi0muS8elqoKQ/fkumU7YmKEVrdkP6wyL6LEa4HYqFAy/glktcb1r9PTSPpE/Z40rx0wemUaPSyY/2SYp1CMoSJpIHvt2IHzrlPaSuK9UTObmtH02CRqB9R8/cURU=
|
11
|
+
|
8
12
|
deploy:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
# automatically release Ruby gem to RubyGems after a successful build with `git push --tags`
|
14
|
+
- provider: rubygems
|
15
|
+
api_key:
|
16
|
+
secure: mzjlQXKByIn4jdGzUayX65Xqnl9zSkvJJZZnoqZuVnRjz93veVm9mwfUGGcSNQj9dvQTedrxMLyOKINJMIH+SlveHUeU04a7QxbM6i7o+sWRFEq98p7DauSpJJTB4fDINSwjcHU8t43PjhBItA6n4PLUrCuIzXqxvY4VLHgGLGkXV17ngdHBRRFFDuMS0npsTLLfaqaFtyYx/mer/z9pSGR9g4ETsfVFSBNafPfDAoXfK3WRLbqS8EkB7SXCSliOUuzLBEOSLy8xMOAS682dEsPZzUvUGBMrXLYhxVBECfzAMzk2VxRX0MujJxzQyGiKZUShLkDVSulkah+aHhcMqcQ0VewcELihNj86tPEtT7Uiwd6aSe0J9WrgeVE2jkaPcIZyN3eAfZ4QhQrdrHeCnjmhcMsKopzc4FLOq9B7j1WCbmeGx3scXsZkjcugwnAUm07imlUQzHO85tVxZuDbPvBQ/J/vBhuUIl1E7ptUx0eUXrVWTGDsM7RIgt87O96QXthGgVg9NYmTmvMAjts8W0zfhAQIc/13QZUYvXQ6qX95Xu4RkmeTX7T63hpqKlwSCbYbQTBF3T5X9xyKkeF0BLHZ1jMIyoOoKZFsZL+ESrpCEeq8ZDaod6Az2rIa3KgszKxV/w5vyIInhg+lzX9RF5JL8X9q9hVEvIIx5BGQWXI=
|
17
|
+
gem: code_quality
|
18
|
+
on:
|
19
|
+
tags: true
|
20
|
+
repo: rainchen/code_quality
|
21
|
+
|
22
|
+
# publish generated files to GitHub pages
|
23
|
+
- provider: script
|
24
|
+
skip_cleanup: true
|
25
|
+
script: bin/travis-update-gh-pages.sh
|
26
|
+
on:
|
27
|
+
branch: master
|
28
|
+
tags: true
|
29
|
+
condition: $TRAVIS_PULL_REQUEST = "false"
|
data/README.md
CHANGED
@@ -4,6 +4,7 @@ Run code quality and security audit report with one rake task as `rake code_qual
|
|
4
4
|
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/code_quality.svg)](https://badge.fury.io/rb/code_quality)
|
6
6
|
[![Build Status](https://travis-ci.org/rainchen/code_quality.svg)](https://travis-ci.org/rainchen/code_quality)
|
7
|
+
[![HitCount](http://hits.dwyl.io/rainchen/code_quality.svg)](http://hits.dwyl.io/rainchen/code_quality)
|
7
8
|
|
8
9
|
## Principle
|
9
10
|
|
@@ -47,6 +48,8 @@ Generated by code_quality (v0.1.3) @ 2018-01-12 16:32:20 +0800
|
|
47
48
|
|
48
49
|
[Code Quality Report Example](doc/code_quality_report_example.md)
|
49
50
|
|
51
|
+
[Code Quality Report Details Example](https://rainchen.github.io/code_quality/)
|
52
|
+
|
50
53
|
### Two major audit tasks
|
51
54
|
|
52
55
|
There are 2 types of audit tasks: `security_audit` and `quality_audit`, each sub task can be run separately.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Code Quality Report</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>Code Quality Report</h1>
|
8
|
+
|
9
|
+
<ul>
|
10
|
+
<% @audit_tasks.each do |task_name, report| %>
|
11
|
+
<li>[<%= report[:failure].empty? ? "✓" : "✗" %>] <a href="<%= report[:report_path] %>"><%= task_name %></a> <%= report[:failure] %></li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
|
15
|
+
<footer>
|
16
|
+
Generated by code_quality (v<%= CodeQuality::VERSION %>) @ <%= Time.now %>
|
17
|
+
</footer>
|
18
|
+
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# This script is used to run on Travis CI to publish generated files to GitHub pages
|
3
|
+
if [ ${TRAVIS} = "true" ]; then
|
4
|
+
echo "Starting to update gh-pages"
|
5
|
+
|
6
|
+
#copy data we're interested in to other place
|
7
|
+
mkdir $HOME/tmp
|
8
|
+
cp -R tmp/code_quality $HOME/tmp/code_quality
|
9
|
+
|
10
|
+
#go to home
|
11
|
+
cd $HOME
|
12
|
+
|
13
|
+
#using token clone gh-pages branch
|
14
|
+
git clone --quiet --branch=gh-pages https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages > /dev/null
|
15
|
+
|
16
|
+
#go into diractory and copy data we're interested in to that directory
|
17
|
+
cd gh-pages
|
18
|
+
cp -Rf $HOME/tmp/code_quality/* .
|
19
|
+
|
20
|
+
#setup git user
|
21
|
+
git config user.email "travis@travis-ci.org"
|
22
|
+
git config user.name "Travis CI"
|
23
|
+
|
24
|
+
#add, commit and push files
|
25
|
+
travis_build_url="https://travis-ci.org/${TRAVIS_REPO_SLUG}/builds/${TRAVIS_BUILD_ID}"
|
26
|
+
git add -f .
|
27
|
+
git commit -m "Travis CI build $travis_build_url pushed to gh-pages"
|
28
|
+
git push -fq origin gh-pages > /dev/null
|
29
|
+
|
30
|
+
#display GitHub Project Pages url
|
31
|
+
owner_name=`echo $TRAVIS_REPO_SLUG|cut -d / -f 1`
|
32
|
+
repo_name=`echo $TRAVIS_REPO_SLUG|cut -d / -f 2`
|
33
|
+
gh_pages_url="https://$owner_name.github.io/$repo_name"
|
34
|
+
echo "Push to $gh_pages_url"
|
35
|
+
fi
|
data/lib/code_quality/version.rb
CHANGED
data/lib/tasks/code_quality.rake
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
desc "Generate security audit and code quality report"
|
2
|
+
# e.g.: rake code_quality lowest_score=90 max_offenses=100 metrics=stats,rails_best_practices,roodi rails_best_practices_max_offenses=10 roodi_max_offenses=10
|
2
3
|
task :code_quality => :"code_quality:default" do; end
|
3
4
|
namespace :code_quality do
|
4
|
-
task :default => [:summary, :security_audit, :quality_audit] do; end
|
5
|
+
task :default => [:summary, :security_audit, :quality_audit, :generate_index] do; end
|
5
6
|
|
6
7
|
# desc "show summary"
|
7
8
|
task :summary do
|
@@ -9,6 +10,23 @@ namespace :code_quality do
|
|
9
10
|
puts "Generated by code_quality (v#{CodeQuality::VERSION}) @ #{Time.now}", "\n"
|
10
11
|
end
|
11
12
|
|
13
|
+
# desc "generate a report index page"
|
14
|
+
task :generate_index => :helpers do
|
15
|
+
require "erb"
|
16
|
+
prepare_dir "tmp/code_quality"
|
17
|
+
gem_app_dir = File.expand_path("../../../app", __FILE__)
|
18
|
+
erb_file = "#{gem_app_dir}/views/code_quality/index.html.erb"
|
19
|
+
index_path = "tmp/code_quality/index.html"
|
20
|
+
|
21
|
+
# render view
|
22
|
+
erb = ERB.new(File.read(erb_file))
|
23
|
+
output = erb.result(binding)
|
24
|
+
|
25
|
+
File.open(index_path, 'w') {|f| f.write output }
|
26
|
+
# puts "Generate report index to #{index_path}"
|
27
|
+
show_in_browser File.realpath(index_path)
|
28
|
+
end
|
29
|
+
|
12
30
|
desc "security audit using bundler-audit, brakeman"
|
13
31
|
task :security_audit => [:"security_audit:default"] do; end
|
14
32
|
namespace :security_audit do
|
@@ -26,22 +44,24 @@ namespace :code_quality do
|
|
26
44
|
end
|
27
45
|
|
28
46
|
desc "bundler audit"
|
29
|
-
task :bundler_audit => :prepare do
|
30
|
-
run_audit "bundler audit - checks for vulnerable versions of gems in Gemfile.lock" do
|
47
|
+
task :bundler_audit => :prepare do |task|
|
48
|
+
run_audit task, "bundler audit - checks for vulnerable versions of gems in Gemfile.lock" do
|
31
49
|
# Update the ruby-advisory-db and check Gemfile.lock
|
32
50
|
report = `bundle audit check --update`
|
33
|
-
|
51
|
+
@report_path = "#{report_dir}/bundler-audit-report.txt"
|
52
|
+
File.open(@report_path, 'w') {|f| f.write report }
|
34
53
|
puts report
|
35
54
|
audit_faild "Must fix vulnerabilities ASAP" unless report =~ /No vulnerabilities found/
|
36
55
|
end
|
37
56
|
end
|
38
57
|
|
39
58
|
desc "brakeman"
|
40
|
-
task :brakeman => :prepare do
|
59
|
+
task :brakeman => :prepare do |task|
|
41
60
|
require 'json'
|
42
|
-
run_audit "Brakeman audit - checks Ruby on Rails applications for security vulnerabilities" do
|
43
|
-
|
44
|
-
|
61
|
+
run_audit task, "Brakeman audit - checks Ruby on Rails applications for security vulnerabilities" do
|
62
|
+
@report_path = "#{report_dir}/brakeman-report.txt"
|
63
|
+
`brakeman -o #{@report_path} -o #{report_dir}/brakeman-report.json`
|
64
|
+
puts `cat #{@report_path}`
|
45
65
|
report = JSON.parse(File.read("#{report_dir}/brakeman-report.json"))
|
46
66
|
audit_faild "There are #{report["errors"].size} errors, must fix them ASAP." if report["errors"].any?
|
47
67
|
end
|
@@ -81,12 +101,12 @@ namespace :code_quality do
|
|
81
101
|
|
82
102
|
desc "rubycritic"
|
83
103
|
# e.g.: rake code_quality:quality_audit:rubycritic lowest_score=94.5
|
84
|
-
task :rubycritic => :prepare do
|
104
|
+
task :rubycritic => :prepare do |task|
|
85
105
|
options = options_from_env(:lowest_score)
|
86
|
-
run_audit "Rubycritic - static analysis gems such as Reek, Flay and Flog to provide a quality report of your Ruby code." do
|
106
|
+
run_audit task, "Rubycritic - static analysis gems such as Reek, Flay and Flog to provide a quality report of your Ruby code." do
|
87
107
|
report = `rubycritic -p #{report_dir}/rubycritic app lib --no-browser`
|
88
108
|
puts report
|
89
|
-
report_path = "#{report_dir}/rubycritic/overview.html"
|
109
|
+
@report_path = report_path = "#{report_dir}/rubycritic/overview.html"
|
90
110
|
show_in_browser File.realpath(report_path)
|
91
111
|
|
92
112
|
# if config lowest_score then audit it with report score
|
@@ -106,8 +126,8 @@ namespace :code_quality do
|
|
106
126
|
# config_formula: use which formula for config, supports "github, "rails" or path_to_your_local_config.yml, default is "github"
|
107
127
|
# cli_options: pass extract options, e.g.: cli_options="--show-cops"
|
108
128
|
# max_offenses: if config max_offenses then audit it with detected offenses number in report, e.g.: max_offenses=100
|
109
|
-
task :rubocop => :prepare do
|
110
|
-
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
|
129
|
+
task :rubocop => :prepare do |task|
|
130
|
+
run_audit task, "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
|
111
131
|
options = options_from_env(:config_formula, :cli_options, :max_offenses)
|
112
132
|
|
113
133
|
config_formulas = {
|
@@ -125,7 +145,7 @@ namespace :code_quality do
|
|
125
145
|
config_file = "#{gem_config_dir}/rubocop-#{config_formula}.yml"
|
126
146
|
puts "Using config formula: [#{config_formula}](#{config_formulas[config_formula]})"
|
127
147
|
end
|
128
|
-
report_path = "#{report_dir}/rubocop-report.html"
|
148
|
+
@report_path = report_path = "#{report_dir}/rubocop-report.html"
|
129
149
|
|
130
150
|
# generate report
|
131
151
|
report = `rubocop -c #{config_file} -S -R -P #{options[:cli_options]} --format offenses --format html -o #{report_path}`
|
@@ -153,7 +173,7 @@ namespace :code_quality do
|
|
153
173
|
# rails_best_practices_max_offenses: offenses number for audit
|
154
174
|
# reek_max_offenses: offenses number for audit
|
155
175
|
# roodi_max_offenses: offenses number for audit
|
156
|
-
task :metric_fu => :prepare do
|
176
|
+
task :metric_fu => :prepare do |task|
|
157
177
|
metrics_offenses_patterns = {
|
158
178
|
"flay" => /Total Score (\d+)/,
|
159
179
|
"cane" => /Total Violations (\d+)/,
|
@@ -163,7 +183,7 @@ namespace :code_quality do
|
|
163
183
|
}
|
164
184
|
metrics_have_offenses = metrics_offenses_patterns.keys.map { |metric| "#{metric}_max_offenses".to_sym }
|
165
185
|
options = options_from_env(:metrics, *metrics_have_offenses)
|
166
|
-
run_audit "metric_fu - Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)" do
|
186
|
+
run_audit task, "metric_fu - Code metrics from Flog, Flay, Saikuro, Churn, Reek, Roodi, Code Statistics, and Rails Best Practices. (and optionally RCov)" do
|
167
187
|
report_path = "#{report_dir}/metric_fu"
|
168
188
|
available_metrics = %w{cane churn flay flog hotspots rails_best_practices rcov reek roodi saikuro stats}
|
169
189
|
metric_fu_opts = ""
|
@@ -183,6 +203,7 @@ namespace :code_quality do
|
|
183
203
|
puts report
|
184
204
|
puts "Report generated to #{report_path}"
|
185
205
|
show_in_browser File.realpath(report_path)
|
206
|
+
@report_path = "#{report_path}/index.html"
|
186
207
|
|
187
208
|
# audit report result
|
188
209
|
report_result_path = "tmp/metric_fu/report.yml"
|
@@ -225,10 +246,25 @@ namespace :code_quality do
|
|
225
246
|
|
226
247
|
# desc "helper methods"
|
227
248
|
task :helpers do
|
228
|
-
def run_audit(title, &block)
|
249
|
+
def run_audit(task, title, &block)
|
250
|
+
task_name = task.name.split(":").last
|
251
|
+
@audit_tasks ||= {}
|
252
|
+
@audit_tasks[task_name] ||= {
|
253
|
+
report_path: "",
|
254
|
+
failure: "",
|
255
|
+
}
|
256
|
+
|
229
257
|
puts "## #{title}"
|
230
258
|
puts "", "```"
|
231
|
-
|
259
|
+
begin
|
260
|
+
realtime(&block)
|
261
|
+
rescue SystemExit => exc
|
262
|
+
# audit faild
|
263
|
+
@audit_tasks[task_name][:failure] = exc.message.gsub(/(\e\[\d+m)/, "")
|
264
|
+
ensure
|
265
|
+
# get @report_path set in each audit task
|
266
|
+
@audit_tasks[task_name][:report_path] = @report_path.sub("tmp/code_quality/", "")
|
267
|
+
end
|
232
268
|
puts "```", ""
|
233
269
|
end
|
234
270
|
|
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.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RainChen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler-audit
|
@@ -151,8 +151,10 @@ files:
|
|
151
151
|
- README.md
|
152
152
|
- Rakefile
|
153
153
|
- app/readme
|
154
|
+
- app/views/code_quality/index.html.erb
|
154
155
|
- bin/console
|
155
156
|
- bin/setup
|
157
|
+
- bin/travis-update-gh-pages.sh
|
156
158
|
- code_quality.gemspec
|
157
159
|
- config/rubocop-github.yml
|
158
160
|
- config/rubocop-rails.yml
|