flay 2.7.0 → 2.8.0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.txt +11 -0
- data/README.txt +5 -0
- data/Rakefile +13 -23
- data/bin/flay +1 -6
- data/lib/flay.rb +14 -51
- data/lib/flay_task.rb +3 -4
- data/lib/gauntlet_flay.rb +1 -5
- data/test/test_flay.rb +0 -48
- metadata +36 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83938e425e7da6168fc862af2d5ecaa7f8c3cfc4
|
4
|
+
data.tar.gz: 0cecc5f44a897b0695ac0f638aee67535dedcff7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 233071084997a9e3a585704098514fb245590987aa0ec9f8317e4defe0555c1196b83e6646e73eb9607f2b5923c94d608f88c8635494285a7a50f92b4fca4c05
|
7
|
+
data.tar.gz: ede337e5a5968d0d8097d2a14f1eb42d58ef63f9cbeccdeaee57ae23a4a54e50753dc445ba1fbd7c751ffae426b8ab2b771f21565ce4521b0ab648f04c3b26a5
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 2.8.0 / 2016-05-16
|
2
|
+
|
3
|
+
* 1 minor enhancement:
|
4
|
+
|
5
|
+
* Switched to path_expander to deal with cmdline args. See path_expander for details.
|
6
|
+
|
7
|
+
* 2 bug fixes:
|
8
|
+
|
9
|
+
* Added dev deps and bundler plugin to make flavorjones happy. (flavorjones)
|
10
|
+
* Explictly require rake/tasklib in flay_task.rb. (jasonkarns)
|
11
|
+
|
1
12
|
=== 2.7.0 / 2016-01-21
|
2
13
|
|
3
14
|
* 1 minor enhancement:
|
data/README.txt
CHANGED
@@ -25,6 +25,10 @@ braces vs do/end, etc are all ignored. Making this totally rad.
|
|
25
25
|
* Ships with .rb and .erb.
|
26
26
|
* javascript and others will be available separately.
|
27
27
|
* Includes FlayTask for Rakefiles.
|
28
|
+
* Uses path_expander, so you can use:
|
29
|
+
* dir_arg -- expand a directory automatically
|
30
|
+
* @file_of_args -- persist arguments in a file
|
31
|
+
* -path_to_subtract -- ignore intersecting subsets of files/directories
|
28
32
|
* Skips files matched via patterns in .flayignore (subset format of .gitignore).
|
29
33
|
* Totally rad.
|
30
34
|
|
@@ -86,6 +90,7 @@ braces vs do/end, etc are all ignored. Making this totally rad.
|
|
86
90
|
|
87
91
|
* ruby_parser
|
88
92
|
* sexp_processor
|
93
|
+
* path_expander
|
89
94
|
* ruby2ruby -- soft dependency: only if you want to use --diff
|
90
95
|
|
91
96
|
== INSTALL:
|
data/Rakefile
CHANGED
@@ -7,10 +7,12 @@ Hoe::add_include_dirs("../../sexp_processor/dev/lib",
|
|
7
7
|
"../../ruby_parser/dev/lib",
|
8
8
|
"../../ruby2ruby/dev/lib",
|
9
9
|
"../../ZenTest/dev/lib",
|
10
|
+
"../../path_expander/dev/lib",
|
10
11
|
"lib")
|
11
12
|
|
12
13
|
Hoe.plugin :seattlerb
|
13
14
|
Hoe.plugin :isolate
|
15
|
+
Hoe.plugin :bundler
|
14
16
|
|
15
17
|
Hoe.spec "flay" do
|
16
18
|
developer "Ryan Davis", "ryand-ruby@zenspider.com"
|
@@ -19,6 +21,10 @@ Hoe.spec "flay" do
|
|
19
21
|
dependency "sexp_processor", "~> 4.0"
|
20
22
|
dependency "ruby_parser", "~> 3.0"
|
21
23
|
dependency "erubis", "~> 2.7.0"
|
24
|
+
dependency "path_expander", "~> 1.0"
|
25
|
+
|
26
|
+
dependency "minitest", "~> 5.8.0", :dev
|
27
|
+
dependency "ruby2ruby", "~> 2.2.0", :dev
|
22
28
|
|
23
29
|
self.flay_threshold = 250
|
24
30
|
end
|
@@ -27,30 +33,14 @@ task :debug => :isolate do
|
|
27
33
|
require "flay"
|
28
34
|
|
29
35
|
file = ENV["F"]
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
opts = Flay.parse_options
|
36
|
-
opts[:mass] = mass.to_i if mass
|
37
|
-
opts[:diff] = diff.to_i if diff
|
38
|
-
opts[:liberal] = true if libr
|
39
|
-
opts[:verbose] = true if ver
|
40
|
-
|
41
|
-
flay = Flay.new opts
|
42
|
-
flay.process(*Flay.expand_dirs_to_files(file))
|
43
|
-
flay.report
|
44
|
-
end
|
45
|
-
|
46
|
-
task :run do
|
47
|
-
file = ENV["F"]
|
48
|
-
fuzz = ENV["Z"] && "-f #{ENV["Z"]}"
|
49
|
-
mass = ENV["M"] && "-m #{ENV["M"]}"
|
50
|
-
diff = ENV["D"] && "-d"
|
51
|
-
libr = ENV["L"] && "-l"
|
36
|
+
fuzz = ENV["Z"] && ["-f", ENV["Z"]]
|
37
|
+
mass = ENV["M"] && ["-m", ENV["M"]]
|
38
|
+
diff = ENV["D"] && ["-d"]
|
39
|
+
libr = ENV["L"] && ["-l"]
|
40
|
+
ver = ENV["V"] && ["-v"]
|
52
41
|
|
53
|
-
|
42
|
+
flay = Flay.run [mass, fuzz, diff, libr, file, ver].flatten.compact
|
43
|
+
flay.report
|
54
44
|
end
|
55
45
|
|
56
46
|
# vim: syntax=ruby
|
data/bin/flay
CHANGED
data/lib/flay.rb
CHANGED
@@ -4,6 +4,7 @@ require "optparse"
|
|
4
4
|
require "rubygems"
|
5
5
|
require "sexp_processor"
|
6
6
|
require "ruby_parser"
|
7
|
+
require "path_expander"
|
7
8
|
require "timeout"
|
8
9
|
|
9
10
|
class File
|
@@ -15,7 +16,7 @@ class File
|
|
15
16
|
end
|
16
17
|
|
17
18
|
class Flay
|
18
|
-
VERSION = "2.
|
19
|
+
VERSION = "2.8.0" # :nodoc:
|
19
20
|
|
20
21
|
class Item < Struct.new(:structural_hash, :name, :bonus, :mass, :locations)
|
21
22
|
alias identical? bonus
|
@@ -25,6 +26,18 @@ class Flay
|
|
25
26
|
alias fuzzy? fuzzy
|
26
27
|
end
|
27
28
|
|
29
|
+
def self.run args = ARGV
|
30
|
+
extensions = ["rb"] + Flay.load_plugins
|
31
|
+
glob = "**/*.{#{extensions.join ","}}"
|
32
|
+
|
33
|
+
expander = PathExpander.new args, glob
|
34
|
+
files = expander.filter_files expander.process, DEFAULT_IGNORE
|
35
|
+
|
36
|
+
flay = Flay.new Flay.parse_options args
|
37
|
+
flay.process(*files)
|
38
|
+
flay
|
39
|
+
end
|
40
|
+
|
28
41
|
##
|
29
42
|
# Returns the default options.
|
30
43
|
|
@@ -120,59 +133,9 @@ class Flay
|
|
120
133
|
options
|
121
134
|
end
|
122
135
|
|
123
|
-
##
|
124
|
-
# Expands +*dirs+ to all files within that match ruby and rake extensions.
|
125
|
-
# --
|
126
|
-
# REFACTOR: from flog
|
127
|
-
|
128
|
-
def self.expand_dirs_to_files *dirs
|
129
|
-
extensions = ["rb"] + Flay.load_plugins
|
130
|
-
|
131
|
-
dirs.flatten.map { |p|
|
132
|
-
if File.directory? p then
|
133
|
-
Dir[File.join(p, "**", "*.{#{extensions.join(",")}}")]
|
134
|
-
else
|
135
|
-
p
|
136
|
-
end
|
137
|
-
}.flatten.map { |s| s.sub(/^\.\//, "") } # strip "./" from paths
|
138
|
-
end
|
139
|
-
|
140
136
|
# so I can move this to flog wholesale
|
141
137
|
DEFAULT_IGNORE = ".flayignore" # :nodoc:
|
142
138
|
|
143
|
-
##
|
144
|
-
# A file filter mechanism similar to, but not as extensive as,
|
145
|
-
# .gitignore files:
|
146
|
-
#
|
147
|
-
# + If a pattern does not contain a slash, it is treated as a shell glob.
|
148
|
-
# + If a pattern ends in a slash, it matches on directories (and contents).
|
149
|
-
# + Otherwise, it matches on relative paths.
|
150
|
-
#
|
151
|
-
# File.fnmatch is used throughout, so glob patterns work for all 3 types.
|
152
|
-
|
153
|
-
def self.filter_files files, ignore = DEFAULT_IGNORE
|
154
|
-
ignore_paths = if ignore.respond_to? :read then
|
155
|
-
ignore.read
|
156
|
-
elsif File.exists? ignore then
|
157
|
-
File.read ignore
|
158
|
-
end
|
159
|
-
|
160
|
-
if ignore_paths then
|
161
|
-
nonglobs, globs = ignore_paths.split("\n").partition { |p| p.include? "/" }
|
162
|
-
dirs, ifiles = nonglobs.partition { |p| p.end_with? "/" }
|
163
|
-
dirs = dirs.map { |s| s.chomp "/" }
|
164
|
-
|
165
|
-
only_paths = File::FNM_PATHNAME
|
166
|
-
files = files.reject { |f|
|
167
|
-
dirs.any? { |i| File.fnmatch?(i, File.dirname(f), only_paths) } ||
|
168
|
-
globs.any? { |i| File.fnmatch?(i, f) } ||
|
169
|
-
ifiles.any? { |i| File.fnmatch?(i, f, only_paths) }
|
170
|
-
}
|
171
|
-
end
|
172
|
-
|
173
|
-
files
|
174
|
-
end
|
175
|
-
|
176
139
|
##
|
177
140
|
# Loads all flay plugins. Files must be named "flay_*.rb".
|
178
141
|
|
data/lib/flay_task.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rake/tasklib'
|
2
|
+
|
1
3
|
class FlayTask < Rake::TaskLib
|
2
4
|
##
|
3
5
|
# The name of the task. Defaults to :flay
|
@@ -42,10 +44,7 @@ class FlayTask < Rake::TaskLib
|
|
42
44
|
def define
|
43
45
|
desc "Analyze for code duplication in: #{dirs.join(", ")}"
|
44
46
|
task name do
|
45
|
-
|
46
|
-
flay = Flay.new
|
47
|
-
files = Flay.filter_files Flay.expand_dirs_to_files dirs
|
48
|
-
flay.process(*files)
|
47
|
+
flay = Flay.run
|
49
48
|
flay.report if verbose
|
50
49
|
|
51
50
|
raise "Flay total too high! #{flay.total} > #{threshold}" if
|
data/lib/gauntlet_flay.rb
CHANGED
@@ -78,13 +78,9 @@ class FlayGauntlet < Gauntlet
|
|
78
78
|
############################################################
|
79
79
|
|
80
80
|
def score_for dir
|
81
|
-
# files = `find #{dir} -name \\*.rb | grep -v gen.*templ`.split(/\n/)
|
82
|
-
flayer = Flay.new
|
83
|
-
|
84
81
|
dirs = %w(app lib test spec).reject { |f| ! File.directory? f }
|
85
82
|
|
86
|
-
flay = Flay.
|
87
|
-
flay.process(*Flay.expand_dirs_to_files(dirs))
|
83
|
+
flay = Flay.run dirs
|
88
84
|
flay.total
|
89
85
|
rescue Interrupt
|
90
86
|
# let us break out
|
data/test/test_flay.rb
CHANGED
@@ -436,52 +436,4 @@ class TestSexp < Minitest::Test
|
|
436
436
|
|
437
437
|
assert_equal exp, flay.n_way_diff(*dog_and_cat).gsub(/^ {3}$/, "")
|
438
438
|
end
|
439
|
-
|
440
|
-
def test_cls_expand_dirs_to_files
|
441
|
-
Dir.mktmpdir do |dir|
|
442
|
-
Dir.chdir dir do
|
443
|
-
FileUtils.touch "dog_and_cat.rb"
|
444
|
-
|
445
|
-
files = Flay.expand_dirs_to_files "."
|
446
|
-
assert_equal %w[dog_and_cat.rb], files
|
447
|
-
end
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
def assert_filter_files exp, filter, files = %w[test/dog_and_cat.rb]
|
452
|
-
ignore = StringIO.new filter
|
453
|
-
act = Flay.filter_files files, ignore
|
454
|
-
assert_equal exp, act
|
455
|
-
end
|
456
|
-
|
457
|
-
def test_cls_filter_files_dir
|
458
|
-
assert_filter_files [], "test/"
|
459
|
-
end
|
460
|
-
|
461
|
-
def test_cls_filter_files_files
|
462
|
-
assert_filter_files [], "test/*.rb"
|
463
|
-
|
464
|
-
example = %w[test/file.rb test/sub/file.rb top/test/perf.rb]
|
465
|
-
|
466
|
-
assert_filter_files example[1..-1], "test/*.rb", example
|
467
|
-
end
|
468
|
-
|
469
|
-
def test_cls_filter_files_glob
|
470
|
-
assert_filter_files [], "test*"
|
471
|
-
assert_filter_files [], "test*", ["test/lib/woot.rb"]
|
472
|
-
assert_filter_files [], "*.rb"
|
473
|
-
assert_filter_files [], "*dog*.rb"
|
474
|
-
end
|
475
|
-
|
476
|
-
def test_cls_filter_files_glob_miss
|
477
|
-
miss = %w[test/dog_and_cat.rb]
|
478
|
-
assert_filter_files miss, "test"
|
479
|
-
assert_filter_files miss, "nope"
|
480
|
-
end
|
481
|
-
|
482
|
-
def test_expand_dirs_on_frozen_string
|
483
|
-
s = "./foo"
|
484
|
-
s.freeze
|
485
|
-
assert_equal Flay.expand_dirs_to_files([s]), ["foo"]
|
486
|
-
end
|
487
439
|
end
|
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: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
qx3h45R1CAsObX0SQDIT+rRbQrtKz1GHIZTOFYvEJjUY1XmRTZupD3CJ8Q7sDqSy
|
30
30
|
NLq5jm1fq6Y9Uolu3RJbmycf
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2016-
|
32
|
+
date: 2016-05-16 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
@@ -74,19 +74,19 @@ dependencies:
|
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 2.7.0
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
|
-
name:
|
77
|
+
name: path_expander
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
-
type: :
|
82
|
+
version: '1.0'
|
83
|
+
type: :runtime
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '1.0'
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
91
|
name: rdoc
|
92
92
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,20 +101,48 @@ dependencies:
|
|
101
101
|
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '4.0'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: minitest
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 5.8.0
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 5.8.0
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: ruby2ruby
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.2.0
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.2.0
|
104
132
|
- !ruby/object:Gem::Dependency
|
105
133
|
name: hoe
|
106
134
|
requirement: !ruby/object:Gem::Requirement
|
107
135
|
requirements:
|
108
136
|
- - ~>
|
109
137
|
- !ruby/object:Gem::Version
|
110
|
-
version: '3.
|
138
|
+
version: '3.15'
|
111
139
|
type: :development
|
112
140
|
prerelease: false
|
113
141
|
version_requirements: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
143
|
- - ~>
|
116
144
|
- !ruby/object:Gem::Version
|
117
|
-
version: '3.
|
145
|
+
version: '3.15'
|
118
146
|
description: |-
|
119
147
|
Flay analyzes code for structural similarities. Differences in literal
|
120
148
|
values, variable, class, method names, whitespace, programming style,
|
metadata.gz.sig
CHANGED
Binary file
|