dkubb-yardstick 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +1 -1
- data/.gitignore +1 -0
- data/README.markdown +69 -0
- data/VERSION +1 -1
- data/lib/yardstick.rb +7 -7
- data/lib/yardstick/autoload.rb +9 -5
- data/lib/yardstick/cli.rb +8 -10
- data/lib/yardstick/measurable.rb +14 -31
- data/lib/yardstick/measurement.rb +38 -0
- data/lib/yardstick/measurement_set.rb +123 -0
- data/lib/yardstick/method.rb +25 -20
- data/lib/yardstick/ordered_set.rb +112 -0
- data/lib/yardstick/processor.rb +22 -24
- data/lib/yardstick/rule.rb +61 -0
- data/lib/yardstick/rule_set.rb +18 -0
- data/spec/public/yardstick/cli_spec.rb +108 -0
- data/spec/public/yardstick/measurement_set_spec.rb +247 -0
- data/spec/public/yardstick/measurement_spec.rb +23 -17
- data/spec/public/yardstick/method_spec.rb +351 -1
- data/spec/public/yardstick_spec.rb +65 -1
- data/spec/rcov.opts +4 -0
- data/spec/semipublic/yardstick/rule_spec.rb +28 -0
- data/spec/spec_helper.rb +45 -7
- data/tasks/ci.rake +1 -0
- data/tasks/heckle.rake +52 -0
- data/tasks/metrics.rake +5 -1
- data/tasks/spec.rake +3 -56
- data/yardstick.gemspec +82 -0
- metadata +17 -4
- data/README.rdoc +0 -16
data/.document
CHANGED
data/.gitignore
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
Yardstick 0.0.1
|
2
|
+
===============
|
3
|
+
|
4
|
+
Synopsis
|
5
|
+
--------
|
6
|
+
|
7
|
+
Yardstick is a tool that verifies YARD coverage of ruby code.
|
8
|
+
|
9
|
+
It will measure the source and provide feedback on what is missing from
|
10
|
+
the documentation and what can be improved.
|
11
|
+
|
12
|
+
Installation
|
13
|
+
------------
|
14
|
+
|
15
|
+
From Gem:
|
16
|
+
|
17
|
+
$ sudo gem install dkubb-yardstick --source http://gems.github.com/
|
18
|
+
|
19
|
+
With a local working copy:
|
20
|
+
|
21
|
+
$ git clone git://github.com/dkubb/yardstick.git
|
22
|
+
$ cd yardstick
|
23
|
+
$ rake build && sudo rake install
|
24
|
+
|
25
|
+
Usage
|
26
|
+
-----
|
27
|
+
|
28
|
+
Yardstick may be used two ways:
|
29
|
+
|
30
|
+
**1. yardstick Command-line Tool**
|
31
|
+
|
32
|
+
This is the simplest way to run yardstick. Provide it a list of files
|
33
|
+
and it will measure all of them and output suggestions for improvement,
|
34
|
+
eg:
|
35
|
+
|
36
|
+
$ yardstick lib/**/*.rb
|
37
|
+
|
38
|
+
**2. Yardstick Libraries**
|
39
|
+
|
40
|
+
Yardstick comes with several libraries that will allow you to process
|
41
|
+
lists of files, or String code fragments, eg:
|
42
|
+
|
43
|
+
# measure a list of file paths
|
44
|
+
measurements = Yardstick.measure(paths)
|
45
|
+
|
46
|
+
# measure a code fragment
|
47
|
+
measurements = Yardstick.measure_string <<-RUBY
|
48
|
+
# Displays the message provided to stdout
|
49
|
+
#
|
50
|
+
# @param [#to_str] message
|
51
|
+
# the message to display
|
52
|
+
#
|
53
|
+
# @return [undefined]
|
54
|
+
#
|
55
|
+
# @api public
|
56
|
+
def display(message)
|
57
|
+
puts message.to_str
|
58
|
+
end
|
59
|
+
RUBY
|
60
|
+
|
61
|
+
TODO
|
62
|
+
----
|
63
|
+
|
64
|
+
- Add more measurements, especially for @param, @yield and type
|
65
|
+
validation
|
66
|
+
- Create a Rake task to allow integration of Yardstick into build
|
67
|
+
processes more easily
|
68
|
+
|
69
|
+
Copyright (c) 2009 Dan Kubb. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/yardstick.rb
CHANGED
@@ -2,7 +2,7 @@ require 'pathname'
|
|
2
2
|
require 'yard'
|
3
3
|
|
4
4
|
module Yardstick
|
5
|
-
VERSION = '0.0
|
5
|
+
VERSION = '0.1.0'.freeze
|
6
6
|
ROOT = Pathname(__FILE__).dirname.parent.expand_path.freeze
|
7
7
|
|
8
8
|
# Measure a list of files
|
@@ -10,17 +10,17 @@ module Yardstick
|
|
10
10
|
# @example
|
11
11
|
# Yardstick.measure('article.rb') # => [ Measurement ]
|
12
12
|
#
|
13
|
-
# @param [Array<#
|
13
|
+
# @param [Array<#to_s>, #to_s] path
|
14
14
|
# optional list of paths to measure
|
15
15
|
# @param [Hash] options
|
16
16
|
# optional configuration
|
17
17
|
#
|
18
|
-
# @return [
|
18
|
+
# @return [MeasurementSet]
|
19
19
|
# the measurements for each file
|
20
20
|
#
|
21
21
|
# @api public
|
22
|
-
def self.measure(
|
23
|
-
Yardstick::Processor.
|
22
|
+
def self.measure(path = 'lib/**/*.rb', options = {})
|
23
|
+
Yardstick::Processor.process_path(path)
|
24
24
|
end
|
25
25
|
|
26
26
|
# Measure a string of code and YARD documentation
|
@@ -35,7 +35,7 @@ module Yardstick
|
|
35
35
|
# @param [Hash] options
|
36
36
|
# optional configuration
|
37
37
|
#
|
38
|
-
# @return [
|
38
|
+
# @return [MeasurementSet]
|
39
39
|
# the measurements for the string
|
40
40
|
#
|
41
41
|
# @api public
|
@@ -45,7 +45,7 @@ module Yardstick
|
|
45
45
|
|
46
46
|
end # module Yardstick
|
47
47
|
|
48
|
-
$LOAD_PATH
|
48
|
+
$LOAD_PATH.unshift(Yardstick::ROOT + 'lib')
|
49
49
|
|
50
50
|
require 'yardstick/core_ext/object'
|
51
51
|
require 'yardstick/yard_ext'
|
data/lib/yardstick/autoload.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module Yardstick
|
2
|
-
autoload :CLI,
|
3
|
-
autoload :Measurable,
|
4
|
-
autoload :Measurement,
|
5
|
-
autoload :
|
6
|
-
autoload :
|
2
|
+
autoload :CLI, 'yardstick/cli'
|
3
|
+
autoload :Measurable, 'yardstick/measurable'
|
4
|
+
autoload :Measurement, 'yardstick/measurement'
|
5
|
+
autoload :MeasurementSet, 'yardstick/measurement_set'
|
6
|
+
autoload :Method, 'yardstick/method'
|
7
|
+
autoload :OrderedSet, 'yardstick/ordered_set'
|
8
|
+
autoload :Processor, 'yardstick/processor'
|
9
|
+
autoload :Rule, 'yardstick/rule'
|
10
|
+
autoload :RuleSet, 'yardstick/rule_set'
|
7
11
|
end # module Yardstick
|
data/lib/yardstick/cli.rb
CHANGED
@@ -11,14 +11,14 @@ module Yardstick
|
|
11
11
|
# @param [Array] *args
|
12
12
|
# arguments passed in from the command line
|
13
13
|
#
|
14
|
-
# @return [
|
14
|
+
# @return [MeasurementSet]
|
15
15
|
# the measurement for each file
|
16
16
|
#
|
17
|
-
# @api
|
17
|
+
# @api public
|
18
18
|
def self.run(*args)
|
19
|
-
Yardstick.measure(*parse_options(args))
|
20
|
-
|
21
|
-
|
19
|
+
measurements = Yardstick.measure(*parse_options(args))
|
20
|
+
measurements.warn
|
21
|
+
measurements
|
22
22
|
end
|
23
23
|
|
24
24
|
# Parse the options provided from the command-line
|
@@ -36,7 +36,7 @@ module Yardstick
|
|
36
36
|
option_parser(options).parse!(args)
|
37
37
|
[ args, options ]
|
38
38
|
rescue OptionParser::InvalidOption => error
|
39
|
-
display_exit(error.message
|
39
|
+
display_exit(error.message)
|
40
40
|
end
|
41
41
|
|
42
42
|
# Return an OptionParser instance for the command-line app
|
@@ -51,7 +51,7 @@ module Yardstick
|
|
51
51
|
def self.option_parser(options)
|
52
52
|
opts = OptionParser.new
|
53
53
|
opts.on_tail('-v', '--version', 'print version information and exit') { display_exit("#{opts.program_name} #{Yardstick::VERSION}") }
|
54
|
-
opts.on_tail('-h', '--help', 'display this help and exit') { display_exit(opts) }
|
54
|
+
opts.on_tail('-h', '--help', 'display this help and exit') { display_exit(opts.to_s) }
|
55
55
|
opts
|
56
56
|
end
|
57
57
|
|
@@ -69,9 +69,7 @@ module Yardstick
|
|
69
69
|
end
|
70
70
|
|
71
71
|
class << self
|
72
|
-
private :option_parser
|
73
|
-
private :parse_options
|
74
|
-
private :display_exit
|
72
|
+
private :option_parser, :parse_options, :display_exit
|
75
73
|
end
|
76
74
|
|
77
75
|
end # module CLI
|
data/lib/yardstick/measurable.rb
CHANGED
@@ -4,23 +4,23 @@ module Yardstick
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
|
7
|
-
# List of
|
7
|
+
# List of rules for this class
|
8
8
|
#
|
9
|
-
# @return [
|
10
|
-
# the
|
9
|
+
# @return [RuleSet<Rule>]
|
10
|
+
# the rules for this class
|
11
11
|
#
|
12
12
|
# @api private
|
13
|
-
def
|
14
|
-
@
|
13
|
+
def rules
|
14
|
+
@rules ||= RuleSet.new
|
15
15
|
end
|
16
16
|
|
17
|
-
# Set the description for the
|
17
|
+
# Set the description for the rule
|
18
18
|
#
|
19
19
|
# @param [#to_str] description
|
20
|
-
# the
|
20
|
+
# the rule description
|
21
21
|
#
|
22
22
|
# @yield []
|
23
|
-
# the
|
23
|
+
# the rule to perform
|
24
24
|
#
|
25
25
|
# @yieldreturn [Boolean]
|
26
26
|
# return true if successful, false if not
|
@@ -28,8 +28,8 @@ module Yardstick
|
|
28
28
|
# @return [undefined]
|
29
29
|
#
|
30
30
|
# @api private
|
31
|
-
def
|
32
|
-
|
31
|
+
def rule(description, &block)
|
32
|
+
rules << Rule.new(description, &block)
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
@@ -43,8 +43,7 @@ module Yardstick
|
|
43
43
|
#
|
44
44
|
# @api private
|
45
45
|
def included(mod)
|
46
|
-
mod.extend(ClassMethods)
|
47
|
-
copy_measurements(mod)
|
46
|
+
mod.extend(ClassMethods).rules.merge(rules)
|
48
47
|
end
|
49
48
|
|
50
49
|
# Extend the docstring meta class with measurable class methods
|
@@ -56,21 +55,7 @@ module Yardstick
|
|
56
55
|
#
|
57
56
|
# @api private
|
58
57
|
def extended(docstring)
|
59
|
-
|
60
|
-
meta_class.extend(ClassMethods)
|
61
|
-
copy_measurements(meta_class)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Copy measurements from the ancestor to the descendant
|
65
|
-
#
|
66
|
-
# @param [Module] descendant
|
67
|
-
# the descendant module or class
|
68
|
-
#
|
69
|
-
# @return [undefined]
|
70
|
-
#
|
71
|
-
# @api private
|
72
|
-
def copy_measurements(descendant)
|
73
|
-
descendant.measurements.concat(measurements).uniq!
|
58
|
+
included(docstring.meta_class)
|
74
59
|
end
|
75
60
|
end # module ClassMethods
|
76
61
|
|
@@ -81,14 +66,12 @@ module Yardstick
|
|
81
66
|
# @example
|
82
67
|
# docstring.measure # => [ Measurement ]
|
83
68
|
#
|
84
|
-
# @return [
|
69
|
+
# @return [MeasurementSet]
|
85
70
|
# a collection of measurements
|
86
71
|
#
|
87
72
|
# @api public
|
88
73
|
def measure
|
89
|
-
meta_class.
|
90
|
-
Measurement.new(description, self, &block)
|
91
|
-
end
|
74
|
+
meta_class.rules.measure(self)
|
92
75
|
end
|
93
76
|
|
94
77
|
end # module Measurable
|
@@ -1,6 +1,17 @@
|
|
1
1
|
module Yardstick
|
2
2
|
class Measurement
|
3
3
|
|
4
|
+
# Return the Measurement description
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# measurement.description # => "The description"
|
8
|
+
#
|
9
|
+
# @return [String]
|
10
|
+
# the description
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
attr_reader :description
|
14
|
+
|
4
15
|
# Return a Measurement instance
|
5
16
|
#
|
6
17
|
# @example
|
@@ -87,6 +98,33 @@ module Yardstick
|
|
87
98
|
end
|
88
99
|
end
|
89
100
|
|
101
|
+
# Test if Measurement is equal to another measurement
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# measurement == equal_measurement # => true
|
105
|
+
#
|
106
|
+
# @param [Measurement] other
|
107
|
+
# the other Measurement
|
108
|
+
#
|
109
|
+
# @return [Boolean]
|
110
|
+
# true if the Measurement is equal to the other, false if not
|
111
|
+
#
|
112
|
+
# @api semipublic
|
113
|
+
def eql?(other)
|
114
|
+
@description.eql?(other.instance_variable_get(:@description)) &&
|
115
|
+
@docstring.eql?(other.instance_variable_get(:@docstring))
|
116
|
+
end
|
117
|
+
|
118
|
+
# Return hash identifier for the Measurement
|
119
|
+
#
|
120
|
+
# @return [Integer]
|
121
|
+
# the hash identifier
|
122
|
+
#
|
123
|
+
# @api private
|
124
|
+
def hash
|
125
|
+
[ @description, @docstring ].hash
|
126
|
+
end
|
127
|
+
|
90
128
|
private
|
91
129
|
|
92
130
|
# Measure the docstring using the method provided to the constructor
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'rational'
|
2
|
+
|
3
|
+
module Yardstick
|
4
|
+
class MeasurementSet < OrderedSet
|
5
|
+
|
6
|
+
# The total number of measurements
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# measurements.total # => 570
|
10
|
+
#
|
11
|
+
# @return [Integer]
|
12
|
+
# total measurements
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
def total
|
16
|
+
length
|
17
|
+
end
|
18
|
+
|
19
|
+
# The number of successful measurements
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# measurements.successful # => 561
|
23
|
+
#
|
24
|
+
# @return [Integer]
|
25
|
+
# successful measurements
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
def successful
|
29
|
+
select { |measurement| measurement.ok? }.length
|
30
|
+
end
|
31
|
+
|
32
|
+
# The number of failed measurements
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# measurements.failed # => 9
|
36
|
+
#
|
37
|
+
# @return [Integer]
|
38
|
+
# failed measurements
|
39
|
+
#
|
40
|
+
# @api public
|
41
|
+
def failed
|
42
|
+
total - successful
|
43
|
+
end
|
44
|
+
|
45
|
+
# The percentage of successful measurements
|
46
|
+
#
|
47
|
+
# @example
|
48
|
+
# measurements.coverage # => Rational(561, 570).to_f # => 98.4%
|
49
|
+
#
|
50
|
+
# @return [Integer, Rational]
|
51
|
+
# the coverage percentage
|
52
|
+
#
|
53
|
+
# @api public
|
54
|
+
def coverage
|
55
|
+
empty? ? 0 : Rational(successful, total)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Warn the unsuccessful measurements and a summary
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# measurements.warn # (outputs measurements results and summary)
|
62
|
+
#
|
63
|
+
# @return [undefined]
|
64
|
+
#
|
65
|
+
# @api public
|
66
|
+
def warn
|
67
|
+
each { |measurement| measurement.warn }
|
68
|
+
warn_summary
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# Warn the summary of all measurements
|
74
|
+
#
|
75
|
+
# @return [undefined]
|
76
|
+
#
|
77
|
+
# @api private
|
78
|
+
def warn_summary
|
79
|
+
Kernel.warn("\n#{[ coverage_text, successful_text, failed_text, total_text ].join(' ')}")
|
80
|
+
end
|
81
|
+
|
82
|
+
# The text for the coverage percentage to include in the summary
|
83
|
+
#
|
84
|
+
# @return [String]
|
85
|
+
# the coverage text
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
def coverage_text
|
89
|
+
'Coverage: %.1f%%' % (coverage * 100)
|
90
|
+
end
|
91
|
+
|
92
|
+
# The text for the successful measurements to include in the summary
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
# the successful text
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
def successful_text
|
99
|
+
'Success: %d' % successful
|
100
|
+
end
|
101
|
+
|
102
|
+
# The text for the failed measurements to include in the summary
|
103
|
+
#
|
104
|
+
# @return [String]
|
105
|
+
# the failed text
|
106
|
+
#
|
107
|
+
# @api private
|
108
|
+
def failed_text
|
109
|
+
'Failed: %d' % failed
|
110
|
+
end
|
111
|
+
|
112
|
+
# The text for the total measurements to include in the summary
|
113
|
+
#
|
114
|
+
# @return [String]
|
115
|
+
# the total text
|
116
|
+
#
|
117
|
+
# @api private
|
118
|
+
def total_text
|
119
|
+
'Total: %d' % total
|
120
|
+
end
|
121
|
+
|
122
|
+
end # class MeasurementSet
|
123
|
+
end # module Yardstick
|