flay 1.2.0 → 1.2.1
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.
- data.tar.gz.sig +0 -0
- data/History.txt +12 -0
- data/Manifest.txt +1 -0
- data/Rakefile +5 -1
- data/lib/flay.rb +18 -11
- data/lib/flay_task.rb +3 -2
- data/lib/gauntlet_flay.rb +100 -0
- metadata +4 -3
- metadata.gz.sig +3 -1
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 1.2.1 / 2009-03-16
|
2
|
+
|
3
|
+
* 3 minor enhancements:
|
4
|
+
|
5
|
+
* Added gauntlet_flay.rb
|
6
|
+
* Cached value of plugins loaded.
|
7
|
+
* Refactored and separated analysis phase from process phase
|
8
|
+
|
9
|
+
* 1 bug fix:
|
10
|
+
|
11
|
+
* Added bin dir to default dirs list in FlayTask
|
12
|
+
|
1
13
|
=== 1.2.0 / 2009-03-09
|
2
14
|
|
3
15
|
* 2 major enhancements:
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -6,7 +6,11 @@ require 'hoe'
|
|
6
6
|
Hoe::add_include_dirs("../../sexp_processor/dev/lib",
|
7
7
|
"../../ruby_parser/dev/lib")
|
8
8
|
|
9
|
-
|
9
|
+
begin
|
10
|
+
require 'flay'
|
11
|
+
rescue LoadError
|
12
|
+
load 'lib/flay.rb'
|
13
|
+
end
|
10
14
|
|
11
15
|
Hoe.new('flay', Flay::VERSION) do |flay|
|
12
16
|
flay.rubyforge_name = 'seattlerb'
|
data/lib/flay.rb
CHANGED
@@ -11,7 +11,7 @@ require 'ruby_parser'
|
|
11
11
|
abort "update rubygems to >= 1.3.1" unless Gem.respond_to? :find_files
|
12
12
|
|
13
13
|
class Flay
|
14
|
-
VERSION = '1.2.
|
14
|
+
VERSION = '1.2.1'
|
15
15
|
|
16
16
|
def self.default_options
|
17
17
|
{
|
@@ -71,17 +71,20 @@ class Flay
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.load_plugins
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
74
|
+
unless defined? @@plugins then
|
75
|
+
plugins = Gem.find_files("flay_*.rb").reject { |p| p =~ /flay_task/ }
|
76
|
+
|
77
|
+
plugins.each do |plugin|
|
78
|
+
begin
|
79
|
+
load plugin
|
80
|
+
rescue LoadError => e
|
81
|
+
warn "error loading #{plugin.inspect}: #{e.message}. skipping..."
|
82
|
+
end
|
81
83
|
end
|
82
|
-
end
|
83
84
|
|
84
|
-
|
85
|
+
@@plugins = plugins.map { |f| File.basename(f, '.rb').sub(/^flay_/, '') }
|
86
|
+
end
|
87
|
+
@@plugins
|
85
88
|
end
|
86
89
|
|
87
90
|
attr_accessor :mass_threshold, :total, :identical, :masses
|
@@ -99,7 +102,7 @@ class Flay
|
|
99
102
|
require 'ruby2ruby' if @option[:verbose]
|
100
103
|
end
|
101
104
|
|
102
|
-
def process(*files)
|
105
|
+
def process(*files) # TODO: rename from process - should act as SexpProcessor
|
103
106
|
files.each do |file|
|
104
107
|
warn "Processing #{file}"
|
105
108
|
|
@@ -127,6 +130,10 @@ class Flay
|
|
127
130
|
|
128
131
|
process_fuzzy_similarities if option[:fuzzy]
|
129
132
|
|
133
|
+
analyze
|
134
|
+
end
|
135
|
+
|
136
|
+
def analyze
|
130
137
|
self.prune
|
131
138
|
|
132
139
|
self.hashes.each do |hash,nodes|
|
data/lib/flay_task.rb
CHANGED
@@ -6,7 +6,7 @@ class FlayTask < Rake::TaskLib
|
|
6
6
|
|
7
7
|
def initialize name = :flay, threshold = 200, dirs = nil
|
8
8
|
@name = name
|
9
|
-
@dirs = dirs || %w(app lib test
|
9
|
+
@dirs = dirs || %w(app bin lib spec test)
|
10
10
|
@threshold = threshold
|
11
11
|
@verbose = Rake.application.options.trace
|
12
12
|
|
@@ -24,7 +24,8 @@ class FlayTask < Rake::TaskLib
|
|
24
24
|
flay.process(*Flay.expand_dirs_to_files(dirs))
|
25
25
|
flay.report if verbose
|
26
26
|
|
27
|
-
raise "Flay total too high! #{flay.total} > #{threshold}" if
|
27
|
+
raise "Flay total too high! #{flay.total} > #{threshold}" if
|
28
|
+
flay.total > threshold
|
28
29
|
end
|
29
30
|
self
|
30
31
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/ruby -ws
|
2
|
+
|
3
|
+
$: << 'lib' << '../../ParseTree/dev/lib' << '../../flay/dev/lib'
|
4
|
+
|
5
|
+
$v ||= false # HACK
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'flay'
|
9
|
+
|
10
|
+
require 'gauntlet'
|
11
|
+
require 'pp'
|
12
|
+
|
13
|
+
class FlayGauntlet < Gauntlet
|
14
|
+
$owners = {}
|
15
|
+
$score_file = 'flay-scores.yml'
|
16
|
+
$misc_error = {:total => -1, :average => -1, :methods => {}}
|
17
|
+
$syntax_error = {:total => -2, :average => -2, :methods => {}}
|
18
|
+
$no_gem = {:total => -4, :average => -4, :methods => {}}
|
19
|
+
|
20
|
+
# copied straight from hoedown.rb
|
21
|
+
my_projects = %w[InlineFortran ParseTree RubyInline RubyToC
|
22
|
+
ZenHacks ZenTest bfts box_layout
|
23
|
+
change_class flay flog gauntlet heckle
|
24
|
+
hoe image_science miniunit minitest
|
25
|
+
minitest_tu_shim png ruby2ruby ruby_parser
|
26
|
+
rubyforge test-unit un vlad zenprofile
|
27
|
+
zentest]
|
28
|
+
|
29
|
+
MY_PROJECTS = Regexp.union(*my_projects)
|
30
|
+
|
31
|
+
def run name
|
32
|
+
warn name
|
33
|
+
self.data[name] = score_for '.'
|
34
|
+
self.dirty = true
|
35
|
+
end
|
36
|
+
|
37
|
+
def display_report max
|
38
|
+
good_data = {}
|
39
|
+
bad_count = 0
|
40
|
+
zero_count = 0
|
41
|
+
|
42
|
+
@data.each do |name, flay|
|
43
|
+
case
|
44
|
+
when flay < 0 then
|
45
|
+
bad_count += 1
|
46
|
+
when flay == 0 then
|
47
|
+
zero_count += 1
|
48
|
+
else
|
49
|
+
good_data[name] = flay
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
scores = good_data.values
|
54
|
+
|
55
|
+
# SWEET JESUS:
|
56
|
+
#
|
57
|
+
# without zeros:
|
58
|
+
# average flay: 1487.23 +/- 7800.16
|
59
|
+
# with zeros:
|
60
|
+
# average flay: 988.69 +/- 6398.45
|
61
|
+
|
62
|
+
puts "broken projects : %d" % bad_count
|
63
|
+
puts "great projects : %d" % zero_count
|
64
|
+
puts "bad projects : %d" % good_data.size
|
65
|
+
puts "average flay : %.2f +/- %.2f" % [scores.average, scores.stddev]
|
66
|
+
|
67
|
+
top = good_data.sort_by { |name,flay| -flay }.first max
|
68
|
+
|
69
|
+
puts
|
70
|
+
top.each_with_index do |(name, flay), i|
|
71
|
+
puts "%3d: %10.2f: %s" % [ i, flay, name ]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
############################################################
|
76
|
+
# OTHER
|
77
|
+
############################################################
|
78
|
+
|
79
|
+
def score_for dir
|
80
|
+
# files = `find #{dir} -name \\*.rb | grep -v gen.*templ`.split(/\n/)
|
81
|
+
flayer = Flay.new
|
82
|
+
|
83
|
+
dirs = %w(app lib test spec).reject { |f| ! File.directory? f }
|
84
|
+
|
85
|
+
flay = Flay.new
|
86
|
+
flay.process(*Flay.expand_dirs_to_files(dirs))
|
87
|
+
flay.total
|
88
|
+
rescue Interrupt
|
89
|
+
# let us break out
|
90
|
+
rescue Exception
|
91
|
+
-1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
max = (ARGV.shift || 10).to_i
|
96
|
+
filter = ARGV.shift
|
97
|
+
filter = Regexp.new filter if filter
|
98
|
+
flayer = FlayGauntlet.new
|
99
|
+
flayer.run_the_gauntlet filter
|
100
|
+
flayer.display_report max
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
FBHgymkyj/AOSqKRIpXPhjC6
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
|
33
|
-
date: 2009-03-
|
33
|
+
date: 2009-03-16 00:00:00 -07:00
|
34
34
|
default_executable:
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
@@ -61,7 +61,7 @@ dependencies:
|
|
61
61
|
requirements:
|
62
62
|
- - ">="
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 1.
|
64
|
+
version: 1.11.0
|
65
65
|
version:
|
66
66
|
description: Flay analyzes code for structural similarities. Differences in literal values, variable, class, method names, whitespace, programming style, braces vs do/end, etc are all ignored. Making this totally rad.
|
67
67
|
email:
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/flay.rb
|
84
84
|
- lib/flay_erb.rb
|
85
85
|
- lib/flay_task.rb
|
86
|
+
- lib/gauntlet_flay.rb
|
86
87
|
- test/test_flay.rb
|
87
88
|
has_rdoc: true
|
88
89
|
homepage: http://ruby.sadi.st/
|
metadata.gz.sig
CHANGED