quality 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +39 -6
- data/lib/quality/process_runner.rb +19 -0
- data/lib/quality/quality_checker.rb +9 -5
- data/lib/quality/rake/task.rb +8 -16
- data/lib/quality/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a6c78a9d29f78396f6a42f055cd86b36d675c1f
|
4
|
+
data.tar.gz: c5309355b11fa9fd5670e0608a009d50fd0e0965
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfd3d4b9748a3bb76a8de2869e108f1f1a61bf28b69a012c8c6a3b9cb49992b4d291ccc94e8ba6b23e0b8934ed30c115f94dada91840149bcf1af05f85b0adb1
|
7
|
+
data.tar.gz: eadd84bae67d01c0feabd53ed45b957efd4751de7496c4ac44b881bfc8462a58d3e66f65468b9b57531955d20ffaff2ab83e9bc8020bee2cce205bf900d09376
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
[![Build Status](https://travis-ci.org/apiology/quality.png)](https://travis-ci.org/apiology/quality)
|
2
|
+
[![Coverage Status](https://coveralls.io/repos/apiology/quality/badge.png?branch=master)](https://coveralls.io/r/apiology/quality?branch=master)
|
3
|
+
|
2
4
|
|
3
5
|
# Quality -- code quality ratchet for Ruby
|
4
6
|
|
@@ -12,7 +14,20 @@ worse over time.
|
|
12
14
|
$ gem install quality
|
13
15
|
```
|
14
16
|
|
15
|
-
|
17
|
+
or in your Gemfile:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
group :development do
|
21
|
+
gem 'quality'
|
22
|
+
end
|
23
|
+
```
|
24
|
+
and then:
|
25
|
+
|
26
|
+
```bash
|
27
|
+
$ bundle install
|
28
|
+
```
|
29
|
+
|
30
|
+
Once you have the gem, configure your Rakefile like this:
|
16
31
|
|
17
32
|
```ruby
|
18
33
|
require 'quality/rake/task'
|
@@ -52,22 +67,36 @@ Quality::Rake::Task.new { |t|
|
|
52
67
|
|
53
68
|
# Array of directory names which contain ruby files to analyze.
|
54
69
|
#
|
55
|
-
# Defaults to %w{lib test spec feature}, which translates to *.rb in the base directory, as well as
|
56
|
-
t.ruby_dirs = %w{lib test spec feature}
|
70
|
+
# Defaults to %w{app lib test spec feature}, which translates to *.rb in the base directory, as well as those directories.
|
71
|
+
t.ruby_dirs = %w{app lib test spec feature}
|
57
72
|
|
58
73
|
# Relative path to output directory where *_high_water_mark
|
59
74
|
# files will be read/written
|
60
75
|
#
|
61
|
-
# Defaults to
|
62
|
-
t.output_dir = '
|
76
|
+
# Defaults to 'metrics'
|
77
|
+
t.output_dir = 'metrics'
|
63
78
|
}
|
64
79
|
```
|
65
80
|
|
81
|
+
## Why
|
82
|
+
|
83
|
+
See [this post for more information](http://blog.apiology.cc/2014/06/scalable-quality-part-1.html) on the problem the quality gem solves.
|
84
|
+
|
85
|
+
## Maturity
|
86
|
+
|
87
|
+
Quality is rapidly evolving, but uses [semantic versioning](http://semver.org/)--any incompatible changes will come out as major number updates.
|
88
|
+
|
89
|
+
## Supported Ruby Versions
|
90
|
+
|
91
|
+
Tested against Ruby 1.9.3 and 2.1.2. Feel free to submit issues if problems are found elsewhere.
|
92
|
+
|
66
93
|
## Contributing
|
67
94
|
|
68
95
|
* Fork the repo
|
69
96
|
* Create a feature branch
|
70
|
-
* Submit a pull request
|
97
|
+
* Submit a github pull request
|
98
|
+
|
99
|
+
Many thanks to all contributors, especially [@andyw8](https://github.com/andyw8), who has contributed some great improvements.
|
71
100
|
|
72
101
|
### Dependencies
|
73
102
|
|
@@ -82,3 +111,7 @@ Quality makes use of the following other gems, which do the actual checking:
|
|
82
111
|
### Learn More
|
83
112
|
|
84
113
|
* Browse the code or install the latest development version from [https://github.com/apiology/quality/tree](https://github.com/apiology/quality/tree)
|
114
|
+
|
115
|
+
## License
|
116
|
+
|
117
|
+
Licensed under the MIT license.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'English'
|
2
|
+
|
3
|
+
module Quality
|
4
|
+
# Wrapper around IO.popen that allows exit status to be mocked in tests.
|
5
|
+
class ProcessRunner
|
6
|
+
def initialize(full_cmd,
|
7
|
+
dependencies = {})
|
8
|
+
@full_cmd = full_cmd
|
9
|
+
@popener = dependencies[:popener] || IO
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
@popener.popen(@full_cmd) do |file|
|
14
|
+
yield file
|
15
|
+
end
|
16
|
+
$CHILD_STATUS.exitstatus
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative 'command_output_processor'
|
2
|
-
|
2
|
+
require_relative 'process_runner'
|
3
3
|
|
4
4
|
module Quality
|
5
5
|
# Runs a quality-checking, command, checks it agaist the existing
|
@@ -7,7 +7,6 @@ module Quality
|
|
7
7
|
# if possible, or outputs data if the number of violations increased.
|
8
8
|
class QualityChecker
|
9
9
|
def initialize(cmd, command_options, output_dir, dependencies = {})
|
10
|
-
@popener = dependencies[:popener] || IO
|
11
10
|
@count_file = dependencies[:count_file] || File
|
12
11
|
@count_io = dependencies[:count_io] || IO
|
13
12
|
@command_output_processor_class =
|
@@ -15,7 +14,11 @@ module Quality
|
|
15
14
|
Quality::CommandOutputProcessor
|
16
15
|
@cmd = cmd
|
17
16
|
@command_options = command_options
|
17
|
+
@count_dir = dependencies[:count_dir] || Dir
|
18
|
+
@count_dir.mkdir(output_dir) unless @count_file.exists?(output_dir)
|
18
19
|
@filename = File.join(output_dir, "#{cmd}_high_water_mark")
|
20
|
+
@process_runner_class =
|
21
|
+
dependencies[:process_runner_class] || ProcessRunner
|
19
22
|
end
|
20
23
|
|
21
24
|
def execute(&count_violations_on_line)
|
@@ -35,11 +38,12 @@ module Quality
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def run_command(processor, &count_violations_on_line)
|
38
|
-
@
|
41
|
+
runner = @process_runner_class.new(full_cmd)
|
42
|
+
|
43
|
+
runner.run do |file|
|
39
44
|
processor.file = file
|
40
45
|
@command_output = processor.process(&count_violations_on_line)
|
41
46
|
end
|
42
|
-
$CHILD_STATUS.exitstatus
|
43
47
|
end
|
44
48
|
|
45
49
|
def check_exit_status(exit_status)
|
@@ -102,7 +106,7 @@ module Quality
|
|
102
106
|
|
103
107
|
def write_violations(new_violations)
|
104
108
|
@count_file.open(@filename, 'w') do |file|
|
105
|
-
file.write(new_violations.to_s)
|
109
|
+
file.write(new_violations.to_s + "\n")
|
106
110
|
end
|
107
111
|
end
|
108
112
|
end
|
data/lib/quality/rake/task.rb
CHANGED
@@ -50,8 +50,8 @@ module Quality
|
|
50
50
|
|
51
51
|
# Array of directory names which contain ruby files to analyze.
|
52
52
|
#
|
53
|
-
# Defaults to %w(lib test spec feature), which translates to *.rb in
|
54
|
-
# the base directory, as well as
|
53
|
+
# Defaults to %w(app lib test spec feature), which translates to *.rb in
|
54
|
+
# the base directory, as well as those directories.
|
55
55
|
attr_writer :ruby_dirs
|
56
56
|
|
57
57
|
# Relative path to output directory where *_high_water_mark
|
@@ -66,7 +66,7 @@ module Quality
|
|
66
66
|
|
67
67
|
@skip_tools = []
|
68
68
|
|
69
|
-
@output_dir = '
|
69
|
+
@output_dir = 'metrics'
|
70
70
|
|
71
71
|
yield self if block_given?
|
72
72
|
|
@@ -143,12 +143,10 @@ module Quality
|
|
143
143
|
installed = @gem_spec.find_all_by_name(tool).any?
|
144
144
|
suppressed = @skip_tools.include? tool
|
145
145
|
|
146
|
-
if !
|
147
|
-
puts "#{tool} not installed"
|
148
|
-
elsif suppressed
|
149
|
-
puts "Suppressing use of #{tool}"
|
150
|
-
else
|
146
|
+
if installed && !suppressed
|
151
147
|
method("quality_#{tool}".to_sym).call
|
148
|
+
elsif !installed
|
149
|
+
puts "#{tool} not installed"
|
152
150
|
end
|
153
151
|
end
|
154
152
|
|
@@ -163,12 +161,11 @@ module Quality
|
|
163
161
|
existing_violations = count_existing_violations(filename)
|
164
162
|
new_violations = [0, existing_violations - 1].max
|
165
163
|
write_violations(filename, new_violations)
|
166
|
-
tighten_standard(filename) if new_violations != existing_violations
|
167
164
|
end
|
168
165
|
|
169
166
|
def write_violations(filename, new_violations)
|
170
167
|
@count_file.open(filename, 'w') do |file|
|
171
|
-
file.write(new_violations.to_s)
|
168
|
+
file.write(new_violations.to_s + "\n")
|
172
169
|
end
|
173
170
|
end
|
174
171
|
|
@@ -178,11 +175,6 @@ module Quality
|
|
178
175
|
existing_violations
|
179
176
|
end
|
180
177
|
|
181
|
-
def tighten_standard(filename)
|
182
|
-
@cmd_runner
|
183
|
-
.system("git commit -m 'tighten quality standard' #{filename}")
|
184
|
-
end
|
185
|
-
|
186
178
|
def ratchet_quality_cmd(cmd,
|
187
179
|
command_options,
|
188
180
|
&count_violations_on_line)
|
@@ -193,7 +185,7 @@ module Quality
|
|
193
185
|
end
|
194
186
|
|
195
187
|
def ruby_dirs
|
196
|
-
@ruby_dirs ||= %w(lib test spec feature)
|
188
|
+
@ruby_dirs ||= %w(app lib test spec feature)
|
197
189
|
end
|
198
190
|
|
199
191
|
def ruby_files_glob
|
data/lib/quality/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quality
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vince Broz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cane
|
@@ -179,6 +179,7 @@ files:
|
|
179
179
|
- README.md
|
180
180
|
- Rakefile
|
181
181
|
- lib/quality/command_output_processor.rb
|
182
|
+
- lib/quality/process_runner.rb
|
182
183
|
- lib/quality/quality_checker.rb
|
183
184
|
- lib/quality/rake/task.rb
|
184
185
|
- lib/quality/tools/cane.rb
|
@@ -208,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
209
|
version: '0'
|
209
210
|
requirements: []
|
210
211
|
rubyforge_project:
|
211
|
-
rubygems_version: 2.
|
212
|
+
rubygems_version: 2.4.3
|
212
213
|
signing_key:
|
213
214
|
specification_version: 4
|
214
215
|
summary: Code quality tools for Ruby
|