polishgeeks-dev-tools 1.1.2 → 1.1.3
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
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +14 -9
- data/README.md +2 -0
- data/Rakefile +4 -0
- data/lib/polishgeeks-dev-tools.rb +5 -0
- data/lib/polishgeeks/dev-tools/command/empty_method.rb +104 -0
- data/lib/polishgeeks/dev-tools/command/empty_method/file_parser.rb +74 -0
- data/lib/polishgeeks/dev-tools/command/empty_method/string_refinements.rb +45 -0
- data/lib/polishgeeks/dev-tools/command/final_blank_line.rb +1 -0
- data/lib/polishgeeks/dev-tools/config.rb +2 -0
- data/lib/polishgeeks/dev-tools/runner.rb +1 -1
- data/lib/polishgeeks/dev-tools/version.rb +1 -1
- data/spec/lib/polishgeeks/dev-tools/command/empty_method/file_parser_spec.rb +194 -0
- data/spec/lib/polishgeeks/dev-tools/command/empty_method/string_refinements_spec.rb +167 -0
- data/spec/lib/polishgeeks/dev-tools/command/empty_method_spec.rb +212 -0
- data/spec/lib/polishgeeks/dev-tools/runner_spec.rb +1 -1
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b6c0bc8902d3041b3290e9203d08670b816f81d
|
4
|
+
data.tar.gz: 37da8e02f5fbea0ce3f33c8ff892230b4937aa56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbf1e6be185a824c260365d8a6b872f579cd566d2dd20dc4de9fbdea41d30eb82e2739668f8c3775ac5a83cbfaef144b1a0d5bb047324696fa30964751e56f43
|
7
|
+
data.tar.gz: 4d0aa7a04328efe66cdc50b8e1e26b28bd1f81e8a29fed363dd40140b64caea9317102d511e291c0ba3e7bfd3463272d817113b047eec830e304bd9d1805646f
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
polishgeeks-dev-tools (1.1.
|
4
|
+
polishgeeks-dev-tools (1.1.3)
|
5
5
|
brakeman
|
6
6
|
faker
|
7
7
|
haml-lint
|
@@ -38,16 +38,17 @@ GEM
|
|
38
38
|
descendants_tracker (~> 0.0.4)
|
39
39
|
ice_nine (~> 0.11.0)
|
40
40
|
thread_safe (~> 0.3, >= 0.3.1)
|
41
|
-
brakeman (3.0
|
41
|
+
brakeman (3.1.0)
|
42
42
|
erubis (~> 2.6)
|
43
43
|
fastercsv (~> 1.5)
|
44
44
|
haml (>= 3.0, < 5.0)
|
45
|
-
highline (~> 1.6
|
45
|
+
highline (~> 1.6)
|
46
46
|
multi_json (~> 1.2)
|
47
|
-
ruby2ruby (
|
47
|
+
ruby2ruby (>= 2.1.1, < 2.3.0)
|
48
48
|
ruby_parser (~> 3.7.0)
|
49
49
|
sass (~> 3.0)
|
50
|
-
|
50
|
+
slim (>= 1.3.6, < 4.0)
|
51
|
+
terminal-table (~> 1.4.5)
|
51
52
|
bson (3.2.1)
|
52
53
|
builder (3.2.2)
|
53
54
|
coderay (1.1.0)
|
@@ -78,7 +79,7 @@ GEM
|
|
78
79
|
haml (~> 4.0)
|
79
80
|
rubocop (>= 0.25.0)
|
80
81
|
sysexits (~> 1.1)
|
81
|
-
highline (1.
|
82
|
+
highline (1.7.3)
|
82
83
|
i18n (0.7.0)
|
83
84
|
ice_nine (0.11.1)
|
84
85
|
json (1.8.3)
|
@@ -129,14 +130,14 @@ GEM
|
|
129
130
|
diff-lcs (>= 1.2.0, < 2.0)
|
130
131
|
rspec-support (~> 3.3.0)
|
131
132
|
rspec-support (3.3.0)
|
132
|
-
rubocop (0.
|
133
|
+
rubocop (0.34.0)
|
133
134
|
astrolabe (~> 1.3)
|
134
135
|
parser (>= 2.2.2.5, < 3.0)
|
135
136
|
powerpack (~> 0.1)
|
136
137
|
rainbow (>= 1.99.1, < 3.0)
|
137
138
|
ruby-progressbar (~> 1.4)
|
138
139
|
ruby-progressbar (1.7.5)
|
139
|
-
ruby2ruby (2.
|
140
|
+
ruby2ruby (2.2.0)
|
140
141
|
ruby_parser (~> 3.1)
|
141
142
|
sexp_processor (~> 4.0)
|
142
143
|
ruby_parser (3.7.1)
|
@@ -161,9 +162,13 @@ GEM
|
|
161
162
|
json (~> 1.8)
|
162
163
|
simplecov-html (~> 0.10.0)
|
163
164
|
simplecov-html (0.10.0)
|
165
|
+
slim (3.0.6)
|
166
|
+
temple (~> 0.7.3)
|
167
|
+
tilt (>= 1.3.3, < 2.1)
|
164
168
|
slop (3.6.0)
|
165
169
|
sysexits (1.2.0)
|
166
|
-
|
170
|
+
temple (0.7.6)
|
171
|
+
terminal-table (1.4.5)
|
167
172
|
thread_safe (0.3.5)
|
168
173
|
tilt (2.0.1)
|
169
174
|
timecop (0.8.0)
|
data/README.md
CHANGED
@@ -51,6 +51,7 @@ determine, which you can use in your project:
|
|
51
51
|
| brakeman | Rails | A static analysis security vulnerability scanner for Ruby on Rails |
|
52
52
|
| rubocop | - | Used to check Ruby syntax according to our styling |
|
53
53
|
| final_blank_line | - | Check if all files have final blank line |
|
54
|
+
| empty_method | - | Check if some files have empty methods |
|
54
55
|
| expires_in | - | Checks if there are typos like expire_in, etc that might brake app caching |
|
55
56
|
| haml_lint | - | User to check HAML syntax in the app views |
|
56
57
|
| yard | - | YARD documentation standards checking |
|
@@ -74,6 +75,7 @@ Some validators might accept additional config settings - please refer to this t
|
|
74
75
|
|-------------------------------|-----------------------|-------------------------------------------------------------------------------------------------------------|
|
75
76
|
| rspec_files_structure_ignored | rspec_files_structure | You can provide an array of files that should be ignored |
|
76
77
|
| final_blank_line_ignored | final_blank_line | You can provide an array of files (ex. lib/file.rb) or directories (ex. lib/command) that should be ignored |
|
78
|
+
| empty_method_ignored | empty_method | You can provide an array of files (ex. lib/file.rb) or directories (ex. lib/command) that should be ignored |
|
77
79
|
|
78
80
|
## Usage in any Rails/Ruby application
|
79
81
|
|
data/Rakefile
CHANGED
@@ -10,6 +10,10 @@ task :check do
|
|
10
10
|
config.expires_in_files_ignored = %w(
|
11
11
|
lib/polishgeeks/dev-tools/command/expires_in.rb
|
12
12
|
)
|
13
|
+
config.empty_method_ignored = %w(
|
14
|
+
empty_method_spec.rb
|
15
|
+
file_parser_spec.rb
|
16
|
+
)
|
13
17
|
end
|
14
18
|
|
15
19
|
PolishGeeks::DevTools::Runner.new.execute(
|
@@ -36,8 +36,13 @@ module PolishGeeks
|
|
36
36
|
end
|
37
37
|
|
38
38
|
require 'polishgeeks/dev-tools/command/base'
|
39
|
+
require 'polishgeeks/dev-tools/command/empty_method'
|
40
|
+
require 'polishgeeks/dev-tools/command/empty_method/string_refinements'
|
39
41
|
|
40
42
|
commands_path = File.dirname(__FILE__) + '/polishgeeks/dev-tools/command/*.rb'
|
41
43
|
Dir[commands_path].each { |file| require file }
|
42
44
|
|
45
|
+
commands_path = File.dirname(__FILE__) + '/polishgeeks/dev-tools/command/**/*.rb'
|
46
|
+
Dir[commands_path].each { |file| require file }
|
47
|
+
|
43
48
|
load 'polishgeeks/dev-tools/tasks/dev-tools.rake'
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module PolishGeeks
|
2
|
+
module DevTools
|
3
|
+
module Command
|
4
|
+
# Validator used to check if all '.rb' files don't have empty methods
|
5
|
+
class EmptyMethod < Base
|
6
|
+
self.type = :validator
|
7
|
+
|
8
|
+
attr_reader :counter
|
9
|
+
|
10
|
+
# Default paths which we want to exclude from analyse
|
11
|
+
DEFAULT_PATHS_TO_EXCLUDE = %w(
|
12
|
+
coverage
|
13
|
+
tmp
|
14
|
+
doc
|
15
|
+
log
|
16
|
+
vendor
|
17
|
+
public
|
18
|
+
app/assets/images
|
19
|
+
app/assets/fonts
|
20
|
+
)
|
21
|
+
|
22
|
+
# Executes this command and set output and counter variables
|
23
|
+
def execute
|
24
|
+
@output = []
|
25
|
+
@counter = 0
|
26
|
+
|
27
|
+
files_to_analyze.each do |file|
|
28
|
+
@counter += 1
|
29
|
+
empty_methods = FileParser.new(file).find_empty_methods
|
30
|
+
@output << sanitize(file) + " lines #{empty_methods}" unless empty_methods.empty?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Boolean] true if none of the files include any empty methods
|
35
|
+
def valid?
|
36
|
+
output.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String] default label for this command
|
40
|
+
def label
|
41
|
+
"Empty methods: #{counter} files checked"
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [String] message that should be printed when some files have
|
45
|
+
# empty methods
|
46
|
+
def error_message
|
47
|
+
"Following files contains blank methods: \n#{output.join("\n")}\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# @return [Array<String>] array with files to analyze
|
53
|
+
# @note method take all not excluded files
|
54
|
+
def files_to_analyze
|
55
|
+
files = files_from_path('**/*.rb')
|
56
|
+
remove_excludes files
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param [Array<String>] files list which we want analyse
|
60
|
+
# @return [Array<String>] array without excluded files
|
61
|
+
def remove_excludes(files)
|
62
|
+
excluded_paths = excludes
|
63
|
+
|
64
|
+
files.delete_if do |file|
|
65
|
+
excluded_paths.any? { |exclude| file =~ /#{exclude}/ }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Array<String>] list of files/directories that
|
70
|
+
# should be excluded from checking
|
71
|
+
# @note excluded files/directories are defined in DEFAULT_PATHS_TO_EXCLUDE
|
72
|
+
# and in configuration file
|
73
|
+
def excludes
|
74
|
+
config_excludes + DEFAULT_PATHS_TO_EXCLUDE
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [Array<String>] list of excluded files/directories from config file
|
78
|
+
def config_excludes
|
79
|
+
DevTools.config.empty_method_ignored || []
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param [String] path from which we want take files
|
83
|
+
# @return [Array<String>] list of files in path with app prefix path
|
84
|
+
# @note if path is a file return array with file path with app prefix path
|
85
|
+
def files_from_path(path)
|
86
|
+
full_path = "#{::PolishGeeks::DevTools.app_root}/#{path}"
|
87
|
+
return [full_path] if File.file?(full_path)
|
88
|
+
|
89
|
+
Dir.glob(full_path).select { |f| File.file? f }
|
90
|
+
end
|
91
|
+
|
92
|
+
# @param [String] file name that we want to sanitize
|
93
|
+
# @return [String] sanitized file name
|
94
|
+
# @example
|
95
|
+
# file = /home/something/app/lib/lib.rb,
|
96
|
+
# where /home/something/app/ is a app root path, then
|
97
|
+
# sanitize(file) #=> lib/lib.rb
|
98
|
+
def sanitize(file)
|
99
|
+
file.gsub("#{PolishGeeks::DevTools.app_root}/", '')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module PolishGeeks
|
2
|
+
module DevTools
|
3
|
+
module Command
|
4
|
+
class EmptyMethod
|
5
|
+
# Parse file and search whether it contain empty methods
|
6
|
+
class FileParser
|
7
|
+
attr_reader :empty_methods
|
8
|
+
using StringRefinements
|
9
|
+
|
10
|
+
def initialize(file)
|
11
|
+
@file = IO.readlines(file)
|
12
|
+
@empty_methods = []
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Array<Fixnum>] list of lines where empty methods are defined
|
16
|
+
# @example
|
17
|
+
# file = " class Example
|
18
|
+
# def empty_method; end
|
19
|
+
# end
|
20
|
+
# "
|
21
|
+
# FileParser.new(file).find_empty_methods => [2]
|
22
|
+
#
|
23
|
+
# file = ""
|
24
|
+
# FileParser.new(file).find_empty_methods => []
|
25
|
+
def find_empty_methods
|
26
|
+
@file.each_with_index do |line, index|
|
27
|
+
next add_empty_method(index) if line.one_line_empty_method?
|
28
|
+
check_bodies_existence(line, index)
|
29
|
+
end
|
30
|
+
empty_methods
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Adds line of empty method definition to array of empty_methods
|
36
|
+
# Remembers line where method is defined; search end of method definition
|
37
|
+
# and check whether body of method is empty or not.
|
38
|
+
# @param [String] line line to parse for empty methods definition
|
39
|
+
# @param [Fixnum] index index of line in file
|
40
|
+
def check_bodies_existence(line, index)
|
41
|
+
@method_definition_line = index if line.defines_method?
|
42
|
+
return unless @method_definition_line && line.defines_end?
|
43
|
+
|
44
|
+
if method_has_no_lines?(@method_definition_line, index)
|
45
|
+
return add_empty_method(@method_definition_line)
|
46
|
+
end
|
47
|
+
|
48
|
+
body_lines = (@method_definition_line + 1)..(index - 1)
|
49
|
+
method_body = @file[body_lines]
|
50
|
+
|
51
|
+
add_empty_method(@method_definition_line) if method_is_empty?(method_body)
|
52
|
+
@method_definition_line = nil
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [Array<String>] method_body
|
56
|
+
# @return [Boolean] whether method is empty or not
|
57
|
+
def method_is_empty?(method_body)
|
58
|
+
!method_body.inject(false) { |a, e| a || e.not_commented_or_empty? }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Adds line number of empty method to empty_methods.
|
62
|
+
# @param [Fixnum] index index of line
|
63
|
+
def add_empty_method(index)
|
64
|
+
empty_methods << index + 1
|
65
|
+
end
|
66
|
+
|
67
|
+
def method_has_no_lines?(body_begin, body_end)
|
68
|
+
body_end - body_begin < 2
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module PolishGeeks
|
2
|
+
module DevTools
|
3
|
+
module Command
|
4
|
+
class EmptyMethod
|
5
|
+
# Adds ability to check strings on specific regex matching
|
6
|
+
module StringRefinements
|
7
|
+
# Regex to determine commented or empty string
|
8
|
+
COMMENTED_OR_EMPTY = /^\s*(|#.*)$/
|
9
|
+
# Regex to determine definition of method with 'def'
|
10
|
+
DEFINITION_OF_METHOD = /^\s*def\s+\w*(\s*|\s*#.*)$/
|
11
|
+
# Regex to determine empty one-line method
|
12
|
+
EMPTY_ONE_LINE_METHOD = /^\s*def\s+.*;\s*end\s*(\s+|#.*|\n|$)$/
|
13
|
+
# Regex to determine end of method
|
14
|
+
END_REGEX = /^\s*end(\.\w+(\s+|$)|\s*#.+|\s+|$)\s*/
|
15
|
+
# Regex to determine begin of method definition through define_method
|
16
|
+
DEFINE_METHOD = '^\s*(define_method|define_singleton_method)'
|
17
|
+
# Regex to determine definition of method with do-end block
|
18
|
+
DEFINE_METHOD_WITH_DO_END =
|
19
|
+
/#{DEFINE_METHOD}(\s+|\().*do(\s*(\s*|.*\|\s*))(\s*|#.*)$/
|
20
|
+
# Regex to determine empty one-line methods
|
21
|
+
EMPTY_ONE_LINE_DEFINE_METHODS =
|
22
|
+
/#{DEFINE_METHOD}.+\s+({\s*)\s*((\|.*\|\s+})|})(\s+|\n|#|$|\.)/
|
23
|
+
|
24
|
+
refine String do
|
25
|
+
def one_line_empty_method?
|
26
|
+
match(EMPTY_ONE_LINE_METHOD) || match(EMPTY_ONE_LINE_DEFINE_METHODS)
|
27
|
+
end
|
28
|
+
|
29
|
+
def defines_method?
|
30
|
+
match(DEFINITION_OF_METHOD) || match(DEFINE_METHOD_WITH_DO_END)
|
31
|
+
end
|
32
|
+
|
33
|
+
def defines_end?
|
34
|
+
match END_REGEX
|
35
|
+
end
|
36
|
+
|
37
|
+
def not_commented_or_empty?
|
38
|
+
match(COMMENTED_OR_EMPTY).nil?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -26,6 +26,7 @@ module PolishGeeks
|
|
26
26
|
rspec_files_structure
|
27
27
|
expires_in_files
|
28
28
|
final_blank_line
|
29
|
+
empty_method
|
29
30
|
).each do |attr|
|
30
31
|
attr_accessor "#{attr}_ignored"
|
31
32
|
end
|
@@ -38,6 +39,7 @@ module PolishGeeks
|
|
38
39
|
brakeman
|
39
40
|
rubocop
|
40
41
|
final_blank_line
|
42
|
+
empty_method
|
41
43
|
haml_lint
|
42
44
|
allowed_extensions
|
43
45
|
yml_parser
|
@@ -14,7 +14,7 @@ module PolishGeeks
|
|
14
14
|
Config::COMMANDS.each do |command|
|
15
15
|
next unless DevTools.config.public_send(:"#{command}?")
|
16
16
|
|
17
|
-
klass = command.to_s.gsub(/(?<=_|^)(\w)
|
17
|
+
klass = command.to_s.gsub(/(?<=_|^)(\w)/, &:upcase).gsub(/(?:_)(\w)/, '\1')
|
18
18
|
cmd = Object.const_get("PolishGeeks::DevTools::Command::#{klass}").new
|
19
19
|
cmd.stored_output = output
|
20
20
|
cmd.execute
|
@@ -0,0 +1,194 @@
|
|
1
|
+
RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod::FileParser do
|
2
|
+
let(:file) { Tempfile.new('foo') }
|
3
|
+
subject { described_class.new(file) }
|
4
|
+
|
5
|
+
describe '#find_empty_methods' do
|
6
|
+
context 'empty define_singleton_methods' do
|
7
|
+
before do
|
8
|
+
file.write("
|
9
|
+
define_singleton_method(:a) {}
|
10
|
+
|
11
|
+
define_singleton_method('b') { |_a, _b| }
|
12
|
+
define_singleton_method :c do |_a, _b|
|
13
|
+
#
|
14
|
+
#
|
15
|
+
end
|
16
|
+
|
17
|
+
define_singleton_method :d do |_a, _b|
|
18
|
+
end
|
19
|
+
")
|
20
|
+
file.read
|
21
|
+
end
|
22
|
+
|
23
|
+
it { expect(subject.find_empty_methods).to eq([2, 4, 5, 10]) }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'empty define_methods with comments' do
|
27
|
+
before do
|
28
|
+
file.write("
|
29
|
+
define_method(:a) {} # comment
|
30
|
+
|
31
|
+
define_method('b') { |_a, _b| } # comment
|
32
|
+
define_method :c do |_a, _b| # comment
|
33
|
+
#
|
34
|
+
end
|
35
|
+
")
|
36
|
+
file.read
|
37
|
+
end
|
38
|
+
|
39
|
+
it { expect(subject.find_empty_methods).to eq([2, 4, 5]) }
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'empty define_methods' do
|
43
|
+
before do
|
44
|
+
file.write("
|
45
|
+
define_method(:a) {}
|
46
|
+
|
47
|
+
define_method('b') { |_a, _b| }
|
48
|
+
define_method :c do |_a, _b|
|
49
|
+
#
|
50
|
+
end
|
51
|
+
")
|
52
|
+
file.read
|
53
|
+
end
|
54
|
+
|
55
|
+
it { expect(subject.find_empty_methods).to eq([2, 4, 5]) }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'singleton_methods and methods are defined' do
|
59
|
+
before do
|
60
|
+
file.write("
|
61
|
+
define_singleton_method(:a) { puts rand(5) }
|
62
|
+
|
63
|
+
define_singleton_method(:ab) { |_a, _b| rand(5) }
|
64
|
+
define_singleton_method :c do |_a, _b|
|
65
|
+
rand(5)
|
66
|
+
end
|
67
|
+
define_method(:d) { puts rand(5) }
|
68
|
+
|
69
|
+
define_method(:e) { |_a, _b| rand(5) }
|
70
|
+
define_method :f do |_a, _b|
|
71
|
+
# comment
|
72
|
+
# comment
|
73
|
+
rand(5)
|
74
|
+
end")
|
75
|
+
file.read
|
76
|
+
end
|
77
|
+
|
78
|
+
it { expect(subject.find_empty_methods).to be_empty }
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'empty one line method' do
|
82
|
+
before do
|
83
|
+
file.write(' def a; end ')
|
84
|
+
file.read
|
85
|
+
end
|
86
|
+
|
87
|
+
it { expect(subject.find_empty_methods).to eq([1]) }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'empty one line method with comment' do
|
91
|
+
before do
|
92
|
+
file.write(' def a; end #comment ')
|
93
|
+
file.read
|
94
|
+
end
|
95
|
+
|
96
|
+
it { expect(subject.find_empty_methods).to eq([1]) }
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'empty body method' do
|
100
|
+
before do
|
101
|
+
file.write(" def a
|
102
|
+
end ")
|
103
|
+
file.read
|
104
|
+
end
|
105
|
+
|
106
|
+
it { expect(subject.find_empty_methods).to eq([1]) }
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'empty body method with comment' do
|
110
|
+
before do
|
111
|
+
file.write(" def a # comment
|
112
|
+
end #comment")
|
113
|
+
file.read
|
114
|
+
end
|
115
|
+
|
116
|
+
it { expect(subject.find_empty_methods).to eq([1]) }
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'empty method' do
|
120
|
+
before do
|
121
|
+
file.write(" def a
|
122
|
+
#
|
123
|
+
|
124
|
+
#
|
125
|
+
end ")
|
126
|
+
file.read
|
127
|
+
end
|
128
|
+
|
129
|
+
it { expect(subject.find_empty_methods).to eq([1]) }
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'method with comments inside' do
|
133
|
+
before do
|
134
|
+
file.write(" def a
|
135
|
+
# comment
|
136
|
+
# comment
|
137
|
+
# comment
|
138
|
+
rand(10)
|
139
|
+
end ")
|
140
|
+
file.read
|
141
|
+
end
|
142
|
+
|
143
|
+
it { expect(subject.find_empty_methods).to be_empty }
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'method which defines empty define_method inside' do
|
147
|
+
before do
|
148
|
+
file.write(" def a
|
149
|
+
define_method(:asd) {}
|
150
|
+
end ")
|
151
|
+
file.read
|
152
|
+
end
|
153
|
+
|
154
|
+
it { expect(subject.find_empty_methods).to eq([2]) }
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'method which defines empty define_singleton_method inside' do
|
158
|
+
before do
|
159
|
+
file.write(" def a
|
160
|
+
define_singleton_method(:asd) do
|
161
|
+
# comment
|
162
|
+
end
|
163
|
+
end ")
|
164
|
+
file.read
|
165
|
+
end
|
166
|
+
|
167
|
+
it { expect(subject.find_empty_methods).to eq([2]) }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'method which defines define_method inside' do
|
171
|
+
before do
|
172
|
+
file.write(" def a
|
173
|
+
define_method(:asd) { rand(150) } #
|
174
|
+
end ")
|
175
|
+
file.read
|
176
|
+
end
|
177
|
+
|
178
|
+
it { expect(subject.find_empty_methods).to be_empty }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe '#method_has_no_lines?' do
|
183
|
+
it { expect(subject.send(:method_has_no_lines?, 2, 4)).to be_falsey }
|
184
|
+
it { expect(subject.send(:method_has_no_lines?, 2, 3)).to be_truthy }
|
185
|
+
end
|
186
|
+
|
187
|
+
describe '#add_empty_method' do
|
188
|
+
it { expect(subject.send(:add_empty_method, 2)).to eq [3] }
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#add_empty_method' do
|
192
|
+
it { expect(subject.send(:add_empty_method, 2)).to eq [3] }
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod::StringRefinements do
|
2
|
+
using described_class
|
3
|
+
|
4
|
+
describe '#defines_method?' do
|
5
|
+
context 'def method' do
|
6
|
+
line = ' def method_for_calculation'
|
7
|
+
|
8
|
+
it { expect(line.defines_method?).to be_truthy }
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'define_method method without whitespace after' do
|
12
|
+
line = ' define_method(:method_for_calculation) do'
|
13
|
+
|
14
|
+
it { expect(line.defines_method?).to be_truthy }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'define_method method symbol definition' do
|
18
|
+
line = ' define_method :method_for_calculation do'
|
19
|
+
|
20
|
+
it { expect(line.defines_method?).to be_truthy }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'define_method method with string definition' do
|
24
|
+
line = ' define_method ("method_for_calculation") do'
|
25
|
+
|
26
|
+
it { expect(line.defines_method?).to be_truthy }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'define_method method with comment' do
|
30
|
+
line = ' define_method (:method_for_calculation) do #comment'
|
31
|
+
|
32
|
+
it { expect(line.defines_method?).to be_truthy }
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'define_method method with params' do
|
36
|
+
line = ' define_method (:method_for_calculation) do |a, b| '
|
37
|
+
|
38
|
+
it { expect(line.defines_method?).to be_truthy }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'define_method method with params and comment' do
|
42
|
+
line = ' define_method (:method_for_calculation) do |a, b| #comment'
|
43
|
+
|
44
|
+
it { expect(line.defines_method?).to be_truthy }
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'string that is not method definition' do
|
48
|
+
line = ' define_methods(:method_for_calculation) do |a, b| #comment'
|
49
|
+
|
50
|
+
it { expect(line.defines_method?).to be_falsey }
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'string that is not method definition' do
|
54
|
+
line = ' define_methods (:method_for_calculation) do |a, b| '
|
55
|
+
|
56
|
+
it { expect(line.defines_method?).to be_falsey }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#one_line_empty_method?' do
|
61
|
+
context 'def method' do
|
62
|
+
line = ' def method_for_calculation; end'
|
63
|
+
|
64
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'def method with comment' do
|
68
|
+
line = ' def method_for_calculation; end # comment'
|
69
|
+
|
70
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'define_method method' do
|
74
|
+
line = ' define_method :method_for_calculation {} '
|
75
|
+
|
76
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'define_method method with comment' do
|
80
|
+
line = ' define_method(:method_for_calculation) {} # comment'
|
81
|
+
|
82
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'define_method method with name as string' do
|
86
|
+
line = ' define_method "method_for_calculation" {} '
|
87
|
+
|
88
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'define_method method with block' do
|
92
|
+
line = ' define_method :method_for_calculation { |_a, _b| } # comment'
|
93
|
+
|
94
|
+
it { expect(line.one_line_empty_method?).to be_truthy }
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'define_method method with block' do
|
98
|
+
line = ' define_method :method_for_calculation { |_a, _b| "5" } # comment'
|
99
|
+
|
100
|
+
it { expect(line.one_line_empty_method?).to be_falsey }
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'not empty define_method method' do
|
104
|
+
line = ' define_method :method_for_calculation { 5 } # comment'
|
105
|
+
|
106
|
+
it { expect(line.one_line_empty_method?).to be_falsey }
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'not empty def method' do
|
110
|
+
line = ' def method_for_calculation; 5 end # comment'
|
111
|
+
|
112
|
+
it { expect(line.one_line_empty_method?).to be_falsey }
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#defines_end?' do
|
117
|
+
context 'end' do
|
118
|
+
line = 'end'
|
119
|
+
|
120
|
+
it { expect(line.defines_end?).to be_truthy }
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'end with method call' do
|
124
|
+
line = 'end.compact'
|
125
|
+
|
126
|
+
it { expect(line.defines_end?).to be_truthy }
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'end with comment' do
|
130
|
+
line = 'end.compact # compacts result array'
|
131
|
+
|
132
|
+
it { expect(line.defines_end?).to be_truthy }
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'end is commented' do
|
136
|
+
line = '# end'
|
137
|
+
|
138
|
+
it { expect(line.defines_end?).to be_falsey }
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'similar words' do
|
142
|
+
line = 'ends'
|
143
|
+
|
144
|
+
it { expect(line.defines_end?).to be_falsey }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#not_commented_or_empty?' do
|
149
|
+
context 'empty line' do
|
150
|
+
line = ' '
|
151
|
+
|
152
|
+
it { expect(line.not_commented_or_empty?).to be_falsey }
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'commented line' do
|
156
|
+
line = ' # commented line '
|
157
|
+
|
158
|
+
it { expect(line.not_commented_or_empty?).to be_falsey }
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'commented line' do
|
162
|
+
line = ' line '
|
163
|
+
|
164
|
+
it { expect(line.not_commented_or_empty?).to be_truthy }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod do
|
5
|
+
subject { described_class.new }
|
6
|
+
describe '#execute' do
|
7
|
+
let(:file) { [rand.to_s] }
|
8
|
+
|
9
|
+
before do
|
10
|
+
expect(subject)
|
11
|
+
.to receive(:files_to_analyze)
|
12
|
+
.and_return(file)
|
13
|
+
allow(described_class::FileParser)
|
14
|
+
.to receive_message_chain(:new, :find_empty_methods)
|
15
|
+
.and_return(empty_methods)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when all files are valid' do
|
19
|
+
let(:empty_methods) { [] }
|
20
|
+
before do
|
21
|
+
subject.execute
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should set appropriate variables' do
|
25
|
+
expect(subject.output).to eq []
|
26
|
+
expect(subject.counter).to eq(file.count)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when exist not valid file' do
|
31
|
+
let(:empty_methods) { [rand.to_s, rand.to_s] }
|
32
|
+
before do
|
33
|
+
expect(subject)
|
34
|
+
.to receive(:sanitize)
|
35
|
+
.with(file.first)
|
36
|
+
.and_return(file.first)
|
37
|
+
subject.execute
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should set appropriate variables' do
|
41
|
+
expect(subject.output.first).to eq "#{file.first} lines #{empty_methods}"
|
42
|
+
expect(subject.counter).to eq(file.count)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#valid?' do
|
48
|
+
before do
|
49
|
+
subject.instance_variable_set('@output', output)
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when output is empty' do
|
53
|
+
let(:output) { [] }
|
54
|
+
|
55
|
+
it { expect(subject.valid?).to eq true }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when output have some files' do
|
59
|
+
let(:output) { ['file_name'] }
|
60
|
+
|
61
|
+
it { expect(subject.valid?).to eq false }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#label' do
|
66
|
+
let(:counter) { rand(10) }
|
67
|
+
let(:expected) { "Empty methods: #{counter} files checked" }
|
68
|
+
|
69
|
+
before do
|
70
|
+
subject.instance_variable_set('@counter', counter)
|
71
|
+
end
|
72
|
+
|
73
|
+
it { expect(subject.label).to eq expected }
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#error_message' do
|
77
|
+
let(:output) { [rand.to_s, rand.to_s] }
|
78
|
+
let(:expected) { "Following files contains blank methods: \n#{output.join("\n")}\n" }
|
79
|
+
|
80
|
+
before do
|
81
|
+
subject.instance_variable_set('@output', output)
|
82
|
+
end
|
83
|
+
|
84
|
+
it { expect(subject.error_message).to eq expected }
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#files_to_analyze' do
|
88
|
+
let(:files) { [rand.to_s, rand.to_s] }
|
89
|
+
|
90
|
+
before do
|
91
|
+
expect(subject)
|
92
|
+
.to receive(:files_from_path)
|
93
|
+
.with('**/*.rb')
|
94
|
+
.and_return(files)
|
95
|
+
|
96
|
+
expect(subject)
|
97
|
+
.to receive(:remove_excludes)
|
98
|
+
.with(files)
|
99
|
+
.and_return(files)
|
100
|
+
end
|
101
|
+
|
102
|
+
it { expect(subject.send(:files_to_analyze)).to eq files }
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#remove_excludes' do
|
106
|
+
let(:files) { %w(lib/file.txt exclude.txt file.rb) }
|
107
|
+
let(:excludes) { %w(lib exclude.txt) }
|
108
|
+
|
109
|
+
before do
|
110
|
+
expect(subject)
|
111
|
+
.to receive(:excludes)
|
112
|
+
.and_return(excludes)
|
113
|
+
end
|
114
|
+
|
115
|
+
it { expect(subject.send(:remove_excludes, files)).to eq ['file.rb'] }
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#excludes' do
|
119
|
+
let(:configs) { [rand.to_s] }
|
120
|
+
let(:expected) { configs + described_class::DEFAULT_PATHS_TO_EXCLUDE }
|
121
|
+
|
122
|
+
before do
|
123
|
+
expect(subject)
|
124
|
+
.to receive(:config_excludes)
|
125
|
+
.and_return(configs)
|
126
|
+
end
|
127
|
+
|
128
|
+
it { expect(subject.send(:excludes)).to eq expected }
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#config_excludes' do
|
132
|
+
context 'empty_method_ignored is set' do
|
133
|
+
let(:paths) { ["#{rand}.rb", "#{rand}.rb"] }
|
134
|
+
let(:config) { double(empty_method_ignored: paths) }
|
135
|
+
|
136
|
+
before do
|
137
|
+
expect(PolishGeeks::DevTools)
|
138
|
+
.to receive(:config)
|
139
|
+
.and_return config
|
140
|
+
end
|
141
|
+
|
142
|
+
it { expect(subject.send(:config_excludes)).to eq paths }
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'empty_method_ignored is not set' do
|
146
|
+
let(:config) { double(empty_method_ignored: nil) }
|
147
|
+
|
148
|
+
before do
|
149
|
+
expect(PolishGeeks::DevTools)
|
150
|
+
.to receive(:config)
|
151
|
+
.and_return config
|
152
|
+
end
|
153
|
+
|
154
|
+
it { expect(subject.send(:config_excludes)).to eq [] }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe '#files_from_path' do
|
159
|
+
let(:app_root) { PolishGeeks::DevTools.app_root }
|
160
|
+
|
161
|
+
context 'path is a directory' do
|
162
|
+
let(:path) { rand.to_s }
|
163
|
+
let(:file_in_path) { "#{app_root}/#{rand}" }
|
164
|
+
let(:dir_in_path) { "#{app_root}/#{rand}" }
|
165
|
+
|
166
|
+
before do
|
167
|
+
expect(File)
|
168
|
+
.to receive(:file?)
|
169
|
+
.with("#{app_root}/#{path}")
|
170
|
+
.and_return(false)
|
171
|
+
|
172
|
+
expect(Dir)
|
173
|
+
.to receive(:glob)
|
174
|
+
.with("#{app_root}/#{path}")
|
175
|
+
.and_return([file_in_path, dir_in_path])
|
176
|
+
|
177
|
+
expect(File)
|
178
|
+
.to receive(:file?)
|
179
|
+
.with(file_in_path)
|
180
|
+
.and_return(true)
|
181
|
+
|
182
|
+
expect(File)
|
183
|
+
.to receive(:file?)
|
184
|
+
.with(dir_in_path)
|
185
|
+
.and_return(false)
|
186
|
+
end
|
187
|
+
|
188
|
+
it { expect(subject.send(:files_from_path, path)).to eq [file_in_path] }
|
189
|
+
end
|
190
|
+
|
191
|
+
context 'path is a file' do
|
192
|
+
let(:path) { rand.to_s }
|
193
|
+
|
194
|
+
before do
|
195
|
+
expect(File)
|
196
|
+
.to receive(:file?)
|
197
|
+
.with("#{app_root}/#{path}")
|
198
|
+
.and_return(true)
|
199
|
+
end
|
200
|
+
|
201
|
+
it { expect(subject.send(:files_from_path, path)).to eq ["#{app_root}/#{path}"] }
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
describe '#sanitize' do
|
206
|
+
let(:file) { rand.to_s }
|
207
|
+
let(:app_root) { PolishGeeks::DevTools.app_root }
|
208
|
+
let(:path) { "#{app_root}/#{file}" }
|
209
|
+
|
210
|
+
it { expect(subject.send(:sanitize, "#{app_root}/#{path}")).to eq file }
|
211
|
+
end
|
212
|
+
end
|
@@ -21,7 +21,7 @@ RSpec.describe PolishGeeks::DevTools::Runner do
|
|
21
21
|
PolishGeeks::DevTools::Config::COMMANDS.each do |command|
|
22
22
|
config.public_send(:"#{command}=", true)
|
23
23
|
|
24
|
-
klass_name = command.to_s.gsub(/(?<=_|^)(\w)
|
24
|
+
klass_name = command.to_s.gsub(/(?<=_|^)(\w)/, &:upcase).gsub(/(?:_)(\w)/, '\1')
|
25
25
|
klass = Object.const_get("PolishGeeks::DevTools::Command::#{klass_name}")
|
26
26
|
|
27
27
|
instance = double
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polishgeeks-dev-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maciej Mensfeld
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -230,6 +230,9 @@ files:
|
|
230
230
|
- lib/polishgeeks/dev-tools/command/base.rb
|
231
231
|
- lib/polishgeeks/dev-tools/command/brakeman.rb
|
232
232
|
- lib/polishgeeks/dev-tools/command/coverage.rb
|
233
|
+
- lib/polishgeeks/dev-tools/command/empty_method.rb
|
234
|
+
- lib/polishgeeks/dev-tools/command/empty_method/file_parser.rb
|
235
|
+
- lib/polishgeeks/dev-tools/command/empty_method/string_refinements.rb
|
233
236
|
- lib/polishgeeks/dev-tools/command/examples_comparator.rb
|
234
237
|
- lib/polishgeeks/dev-tools/command/expires_in.rb
|
235
238
|
- lib/polishgeeks/dev-tools/command/final_blank_line.rb
|
@@ -258,6 +261,9 @@ files:
|
|
258
261
|
- spec/lib/polishgeeks/dev-tools/command/base_spec.rb
|
259
262
|
- spec/lib/polishgeeks/dev-tools/command/brakeman_spec.rb
|
260
263
|
- spec/lib/polishgeeks/dev-tools/command/coverage_spec.rb
|
264
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method/file_parser_spec.rb
|
265
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method/string_refinements_spec.rb
|
266
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method_spec.rb
|
261
267
|
- spec/lib/polishgeeks/dev-tools/command/examples_comparator_spec.rb
|
262
268
|
- spec/lib/polishgeeks/dev-tools/command/expires_in_spec.rb
|
263
269
|
- spec/lib/polishgeeks/dev-tools/command/final_blank_line_spec.rb
|
@@ -309,6 +315,9 @@ test_files:
|
|
309
315
|
- spec/lib/polishgeeks/dev-tools/command/base_spec.rb
|
310
316
|
- spec/lib/polishgeeks/dev-tools/command/brakeman_spec.rb
|
311
317
|
- spec/lib/polishgeeks/dev-tools/command/coverage_spec.rb
|
318
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method/file_parser_spec.rb
|
319
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method/string_refinements_spec.rb
|
320
|
+
- spec/lib/polishgeeks/dev-tools/command/empty_method_spec.rb
|
312
321
|
- spec/lib/polishgeeks/dev-tools/command/examples_comparator_spec.rb
|
313
322
|
- spec/lib/polishgeeks/dev-tools/command/expires_in_spec.rb
|
314
323
|
- spec/lib/polishgeeks/dev-tools/command/final_blank_line_spec.rb
|
@@ -331,3 +340,4 @@ test_files:
|
|
331
340
|
- spec/lib/polishgeeks/dev-tools/shell_spec.rb
|
332
341
|
- spec/lib/polishgeeks/dev-tools/version_spec.rb
|
333
342
|
- spec/spec_helper.rb
|
343
|
+
has_rdoc:
|