flog 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +14 -0
- data/Rakefile +3 -0
- data/lib/flog.rb +20 -9
- data/lib/flog_task.rb +11 -4
- data/test/test_flog.rb +25 -1
- metadata +10 -10
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
=== 3.1.0 / 2012-11-16
|
2
|
+
|
3
|
+
* 4 minor enhancements:
|
4
|
+
|
5
|
+
* --quiet option is now false by default, and changed to silence parse warnings.
|
6
|
+
* Added max_score and max_method. (aselder)
|
7
|
+
* FlogTask can now take a method to use to figure out score, allowing for total or max_score.
|
8
|
+
* Switched to capturing RubyParser::SyntaxError (RP 3.0 change).
|
9
|
+
|
10
|
+
* 2 bug fixes:
|
11
|
+
|
12
|
+
* Avoid redefined warning for File::RUBY19. (svendahlstrand)
|
13
|
+
* Fixed flog to default to RubyParser if not specified. Allows cleaner programmatic access.
|
14
|
+
|
1
15
|
=== 3.0.0 / 2012-11-02
|
2
16
|
|
3
17
|
* 1 minor enhancement:
|
data/Rakefile
CHANGED
data/lib/flog.rb
CHANGED
@@ -5,7 +5,7 @@ require 'optparse'
|
|
5
5
|
require 'timeout'
|
6
6
|
|
7
7
|
class File
|
8
|
-
RUBY19 = "<3".respond_to? :encoding
|
8
|
+
RUBY19 = "<3".respond_to? :encoding unless defined? RUBY19
|
9
9
|
|
10
10
|
class << self
|
11
11
|
alias :binread :read unless RUBY19
|
@@ -13,7 +13,7 @@ class File
|
|
13
13
|
end
|
14
14
|
|
15
15
|
class Flog < SexpProcessor
|
16
|
-
VERSION = '3.
|
16
|
+
VERSION = '3.1.0'
|
17
17
|
|
18
18
|
THRESHOLD = 0.60
|
19
19
|
SCORES = Hash.new 1
|
@@ -132,7 +132,7 @@ class Flog < SexpProcessor
|
|
132
132
|
|
133
133
|
def self.parse_options args = ARGV
|
134
134
|
option = {
|
135
|
-
:quiet =>
|
135
|
+
:quiet => false,
|
136
136
|
:continue => false,
|
137
137
|
:parser => RubyParser,
|
138
138
|
}
|
@@ -175,7 +175,7 @@ class Flog < SexpProcessor
|
|
175
175
|
option[:methods] = true
|
176
176
|
end
|
177
177
|
|
178
|
-
opts.on("-q", "--quiet", "Don't show
|
178
|
+
opts.on("-q", "--quiet", "Don't show parse errors.") do
|
179
179
|
option[:quiet] = true
|
180
180
|
end
|
181
181
|
|
@@ -256,7 +256,7 @@ class Flog < SexpProcessor
|
|
256
256
|
ruby = file == '-' ? $stdin.read : File.binread(file)
|
257
257
|
warn "** flogging #{file}" if option[:verbose]
|
258
258
|
|
259
|
-
@parser = option[:parser].new
|
259
|
+
@parser = (option[:parser] || RubyParser).new
|
260
260
|
|
261
261
|
begin
|
262
262
|
ast = @parser.process(ruby, file)
|
@@ -267,18 +267,21 @@ class Flog < SexpProcessor
|
|
267
267
|
next unless ast
|
268
268
|
mass[file] = ast.mass
|
269
269
|
process ast
|
270
|
-
rescue
|
270
|
+
rescue RubyParser::SyntaxError, Racc::ParseError => e
|
271
|
+
q = option[:quiet]
|
271
272
|
if e.inspect =~ /<\%|%\>/ or ruby =~ /<\%|%\>/ then
|
273
|
+
return if q
|
272
274
|
warn "#{e.inspect} at #{e.backtrace.first(5).join(', ')}"
|
273
275
|
warn "\n...stupid lemmings and their bad erb templates... skipping"
|
274
276
|
else
|
275
|
-
warn "ERROR: parsing ruby file #{file}"
|
277
|
+
warn "ERROR: parsing ruby file #{file}" unless q
|
276
278
|
unless option[:continue] then
|
277
279
|
warn "ERROR! Aborting. You may want to run with --continue."
|
278
280
|
raise e
|
279
281
|
end
|
280
|
-
|
281
|
-
warn "
|
282
|
+
return if q
|
283
|
+
warn "%s: %s at:\n %s" % [e.class, e.message.strip,
|
284
|
+
e.backtrace.first(5).join("\n ")]
|
282
285
|
end
|
283
286
|
end
|
284
287
|
end
|
@@ -487,6 +490,14 @@ class Flog < SexpProcessor
|
|
487
490
|
@total_score
|
488
491
|
end
|
489
492
|
|
493
|
+
def max_score
|
494
|
+
max_method.last
|
495
|
+
end
|
496
|
+
|
497
|
+
def max_method
|
498
|
+
totals.max_by { |_, score| score }
|
499
|
+
end
|
500
|
+
|
490
501
|
##
|
491
502
|
# Return the total score and populates @totals.
|
492
503
|
|
data/lib/flog_task.rb
CHANGED
@@ -3,11 +3,13 @@ class FlogTask < Rake::TaskLib
|
|
3
3
|
attr_accessor :dirs
|
4
4
|
attr_accessor :threshold
|
5
5
|
attr_accessor :verbose
|
6
|
+
attr_accessor :method
|
6
7
|
|
7
|
-
def initialize name = :flog, threshold = 200, dirs = nil
|
8
|
+
def initialize name = :flog, threshold = 200, dirs = nil, method = nil
|
8
9
|
@name = name
|
9
10
|
@dirs = dirs || %w(app bin lib spec test)
|
10
11
|
@threshold = threshold
|
12
|
+
@method = method || :total
|
11
13
|
@verbose = Rake.application.options.trace
|
12
14
|
|
13
15
|
yield self if block_given?
|
@@ -21,13 +23,18 @@ class FlogTask < Rake::TaskLib
|
|
21
23
|
desc "Analyze for code complexity in: #{dirs.join(', ')}"
|
22
24
|
task name do
|
23
25
|
require "flog"
|
24
|
-
flog = Flog.new
|
26
|
+
flog = Flog.new :continue => true, :quiet => true
|
25
27
|
flog.flog(*dirs)
|
28
|
+
|
29
|
+
desc, score = flog.send method
|
30
|
+
desc, score = "total", desc unless score # total only returns a number
|
31
|
+
|
26
32
|
flog.report if verbose
|
27
33
|
|
28
|
-
raise "Flog
|
29
|
-
|
34
|
+
raise "Flog score for #{desc} is too high! #{score} > #{threshold}" if
|
35
|
+
score > threshold
|
30
36
|
end
|
37
|
+
|
31
38
|
self
|
32
39
|
end
|
33
40
|
end
|
data/test/test_flog.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'flog'
|
3
3
|
|
4
|
+
class Flog
|
5
|
+
attr_writer :calls
|
6
|
+
end
|
7
|
+
|
4
8
|
class TestFlog < MiniTest::Unit::TestCase
|
5
9
|
def setup
|
6
10
|
@flog = Flog.new :parser => RubyParser
|
@@ -37,7 +41,7 @@ class TestFlog < MiniTest::Unit::TestCase
|
|
37
41
|
def test_cls_parse_options
|
38
42
|
# defaults
|
39
43
|
opts = Flog.parse_options
|
40
|
-
assert_equal
|
44
|
+
assert_equal false, opts[:quiet]
|
41
45
|
assert_equal false, opts[:continue]
|
42
46
|
|
43
47
|
{
|
@@ -672,6 +676,26 @@ class TestFlog < MiniTest::Unit::TestCase
|
|
672
676
|
assert_equal 2.0, @flog.total
|
673
677
|
end
|
674
678
|
|
679
|
+
def test_max_method
|
680
|
+
@flog.calls = {
|
681
|
+
"main#none" => {"foo" => 2.0, "bar" => 4.0},
|
682
|
+
"main#meth_one" => {"foo" => 1.0, "bar" => 1.0},
|
683
|
+
"main#meth_two" => {"foo" => 2.0, "bar" => 14.0},
|
684
|
+
}
|
685
|
+
|
686
|
+
assert_equal ["main#meth_two", 16.0], @flog.max_method
|
687
|
+
end
|
688
|
+
|
689
|
+
def test_max_score
|
690
|
+
@flog.calls = {
|
691
|
+
"main#none" => {"foo" => 2.0, "bar" => 4.0},
|
692
|
+
"main#meth_one" => {"foo" => 1.0, "bar" => 1.0},
|
693
|
+
"main#meth_two" => {"foo" => 2.0, "bar" => 14.0},
|
694
|
+
}
|
695
|
+
|
696
|
+
assert_equal 16.0, @flog.max_score
|
697
|
+
end
|
698
|
+
|
675
699
|
def util_process sexp, score = -1, hash = {}
|
676
700
|
setup
|
677
701
|
@flog.process sexp
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 3.0.0
|
10
|
+
version: 3.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Davis
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
FBHgymkyj/AOSqKRIpXPhjC6
|
37
37
|
-----END CERTIFICATE-----
|
38
38
|
|
39
|
-
date: 2012-11-
|
39
|
+
date: 2012-11-17 00:00:00 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sexp_processor
|
@@ -77,11 +77,11 @@ dependencies:
|
|
77
77
|
requirements:
|
78
78
|
- - ~>
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
hash:
|
80
|
+
hash: 31
|
81
81
|
segments:
|
82
82
|
- 4
|
83
|
-
-
|
84
|
-
version: "4.
|
83
|
+
- 2
|
84
|
+
version: "4.2"
|
85
85
|
type: :development
|
86
86
|
version_requirements: *id003
|
87
87
|
- !ruby/object:Gem::Dependency
|
@@ -107,11 +107,11 @@ dependencies:
|
|
107
107
|
requirements:
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
hash:
|
110
|
+
hash: 1
|
111
111
|
segments:
|
112
112
|
- 3
|
113
|
-
-
|
114
|
-
version: "3.
|
113
|
+
- 3
|
114
|
+
version: "3.3"
|
115
115
|
type: :development
|
116
116
|
version_requirements: *id005
|
117
117
|
description: |-
|
metadata.gz.sig
CHANGED
Binary file
|