polishgeeks-dev-tools 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -2
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +6 -3
- data/README.md +5 -3
- data/lib/polishgeeks/dev-tools/command/final_blank_line.rb +116 -0
- data/lib/polishgeeks/dev-tools/config.rb +9 -2
- data/lib/polishgeeks/dev-tools/version.rb +1 -1
- data/spec/lib/polishgeeks/dev-tools/command/final_blank_line_spec.rb +269 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5834fe9ee7e13366bca4384980932e6953e31b63
|
4
|
+
data.tar.gz: d75fc73b8bfca128506f6770bec0f22cf9e465fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c13b0baae9e0177a17bb35d5e0965a8936e2c2a865635fd2242375816686d873ce879b0b890842c346573ed24d107bd10ed2781a9bb53703298fef79f07659d
|
7
|
+
data.tar.gz: b6631dbe2d166773049bd2821f46d900df4d41ce6ba7164e566a2f876e4a39d0d7b64e119a46e7d3a107c862be0a6cc5f76fb55d95c982ebf6afa28ee63b7545
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.2.
|
1
|
+
ruby-2.2.3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
polishgeeks-dev-tools (1.
|
4
|
+
polishgeeks-dev-tools (1.1.0)
|
5
5
|
brakeman
|
6
6
|
faker
|
7
7
|
haml-lint
|
@@ -63,7 +63,7 @@ GEM
|
|
63
63
|
docile (1.1.5)
|
64
64
|
equalizer (0.0.11)
|
65
65
|
erubis (2.7.0)
|
66
|
-
faker (1.
|
66
|
+
faker (1.5.0)
|
67
67
|
i18n (~> 0.5)
|
68
68
|
fastercsv (1.5.5)
|
69
69
|
flay (2.4.0)
|
@@ -95,7 +95,7 @@ GEM
|
|
95
95
|
mongoid (~> 4.0.0)
|
96
96
|
rake
|
97
97
|
rspec (~> 3.1)
|
98
|
-
moped (2.0.
|
98
|
+
moped (2.0.7)
|
99
99
|
bson (~> 3.0)
|
100
100
|
connection_pool (~> 2.0)
|
101
101
|
optionable (~> 0.2.0)
|
@@ -191,3 +191,6 @@ DEPENDENCIES
|
|
191
191
|
bundler
|
192
192
|
polishgeeks-dev-tools!
|
193
193
|
rake
|
194
|
+
|
195
|
+
BUNDLED WITH
|
196
|
+
1.10.6
|
data/README.md
CHANGED
@@ -50,6 +50,7 @@ determine, which you can use in your project:
|
|
50
50
|
|-----------------------|-----------|---------------------------------------------------------------------------------------|
|
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
|
+
| final_blank_line | - | Check if all files have final blank line |
|
53
54
|
| expires_in | - | Checks if there are typos like expire_in, etc that might brake app caching |
|
54
55
|
| haml_lint | - | User to check HAML syntax in the app views |
|
55
56
|
| yard | - | YARD documentation standards checking |
|
@@ -69,9 +70,10 @@ determine, which you can use in your project:
|
|
69
70
|
|
70
71
|
Some validators might accept additional config settings - please refer to this table for a description on how to use them:
|
71
72
|
|
72
|
-
| Option | Validator | Description
|
73
|
-
|
74
|
-
| rspec_files_structure_ignored | rspec_files_structure | You can provide an array of files that should be ignored
|
73
|
+
| Option | Validator | Description |
|
74
|
+
|-------------------------------|-----------------------|-----------------------------------------------------------------------------------------------------|
|
75
|
+
| rspec_files_structure_ignored | rspec_files_structure | You can provide an array of files that should be ignored |
|
76
|
+
| final_blank_line_ignored | final_blank_line | You can provide an array of files (ex. lib/file.rb) or paths (ex. lib/\*\*/\*) that should be ignored |
|
75
77
|
|
76
78
|
## Usage in any Rails/Ruby application
|
77
79
|
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module PolishGeeks
|
2
|
+
module DevTools
|
3
|
+
module Command
|
4
|
+
# Validator used to check if all files have final blank line
|
5
|
+
class FinalBlankLine < 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
|
+
log
|
15
|
+
vendor
|
16
|
+
public
|
17
|
+
app/assets/images
|
18
|
+
app/assets/fonts
|
19
|
+
)
|
20
|
+
|
21
|
+
# Executes this command and set output and counter variables
|
22
|
+
def execute
|
23
|
+
@output = []
|
24
|
+
@counter = 0
|
25
|
+
|
26
|
+
files_to_analyze.each do |file|
|
27
|
+
@counter += 1
|
28
|
+
@output << sanitize(file) unless file_valid?(file)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Boolean] true if all files have final blank line
|
33
|
+
def valid?
|
34
|
+
output.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String] default label for this command
|
38
|
+
def label
|
39
|
+
"Final blank line: #{counter} files checked"
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String] message that should be printed when some files don't have
|
43
|
+
# final blank line
|
44
|
+
def error_message
|
45
|
+
"Following files don't have final blank line: \n#{output.join("\n")}\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# @return [Array<String>] array with files to analyze
|
51
|
+
def files_to_analyze
|
52
|
+
# expression {*,.*} is needed because glob method don't take unix-like hidden files
|
53
|
+
files_from_path('**/{*,.*}') - excludes
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Array<String>] list of files that
|
57
|
+
# should be excluded from checking
|
58
|
+
def excludes
|
59
|
+
(default_excludes + config_excludes).flatten
|
60
|
+
end
|
61
|
+
|
62
|
+
# @return [Array<String>] list of default excluded files
|
63
|
+
# defined in DEFAULT_PATHS_TO_EXCLUDE
|
64
|
+
def default_excludes
|
65
|
+
excluded_files = []
|
66
|
+
|
67
|
+
DEFAULT_PATHS_TO_EXCLUDE.each do |path|
|
68
|
+
excluded_files << files_from_path("#{path}/**/{*,.*}")
|
69
|
+
end
|
70
|
+
|
71
|
+
excluded_files
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [Array<String>] list of excluded files from config file
|
75
|
+
def config_excludes
|
76
|
+
excluded_files = []
|
77
|
+
config_paths = DevTools.config.final_blank_line_ignored
|
78
|
+
return [] unless config_paths
|
79
|
+
|
80
|
+
config_paths.each do |path|
|
81
|
+
excluded_files << files_from_path(path)
|
82
|
+
end
|
83
|
+
|
84
|
+
excluded_files
|
85
|
+
end
|
86
|
+
|
87
|
+
# @param [String] path from which we want take files
|
88
|
+
# @return [Array<String>] list of files in path with app prefix path
|
89
|
+
# @note if path is a file return array with file path with app prefix path
|
90
|
+
def files_from_path(path)
|
91
|
+
full_path = "#{::PolishGeeks::DevTools.app_root}/#{path}"
|
92
|
+
return [full_path] if File.file?(full_path)
|
93
|
+
|
94
|
+
Dir.glob(full_path).select { |f| File.file? f }
|
95
|
+
end
|
96
|
+
|
97
|
+
# @param [String] file name that we want to sanitize
|
98
|
+
# @return [String] sanitized file name
|
99
|
+
# @example
|
100
|
+
# file = /home/something/app/lib/lib.rb,
|
101
|
+
# where /home/something/app/ is a app root path, then
|
102
|
+
# sanitize(file) #=> lib/lib.rb
|
103
|
+
def sanitize(file)
|
104
|
+
file.gsub("#{PolishGeeks::DevTools.app_root}/", '')
|
105
|
+
end
|
106
|
+
|
107
|
+
# @param [String] file name which we want validate
|
108
|
+
# @return [Boolean] true if file is empty or has final blank line.
|
109
|
+
# Otherwise return false.
|
110
|
+
def file_valid?(file)
|
111
|
+
File.size(file) == 0 || IO.readlines(file).last[-1] == "\n"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -21,8 +21,14 @@ module PolishGeeks
|
|
21
21
|
end
|
22
22
|
|
23
23
|
attr_accessor :simplecov_threshold
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
%i(
|
26
|
+
rspec_files_structure
|
27
|
+
expires_in_files
|
28
|
+
final_blank_line
|
29
|
+
).each do |attr|
|
30
|
+
attr_accessor "#{attr}_ignored"
|
31
|
+
end
|
26
32
|
|
27
33
|
# Available commands
|
28
34
|
# All commands will be executed in this order (first rubocop, then rspec, etc)
|
@@ -31,6 +37,7 @@ module PolishGeeks
|
|
31
37
|
expires_in
|
32
38
|
brakeman
|
33
39
|
rubocop
|
40
|
+
final_blank_line
|
34
41
|
haml_lint
|
35
42
|
allowed_extensions
|
36
43
|
yml_parser
|
@@ -0,0 +1,269 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PolishGeeks::DevTools::Command::FinalBlankLine do
|
4
|
+
subject { described_class.new }
|
5
|
+
|
6
|
+
describe '#execute' do
|
7
|
+
let(:files) { [rand.to_s, rand.to_s] }
|
8
|
+
|
9
|
+
before do
|
10
|
+
expect(subject)
|
11
|
+
.to receive(:files_to_analyze)
|
12
|
+
.and_return(files)
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when all files are valid' do
|
16
|
+
before do
|
17
|
+
expect(subject)
|
18
|
+
.to receive(:file_valid?)
|
19
|
+
.exactly(files.count).times
|
20
|
+
.and_return true
|
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(files.count)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when exist not valid file' do
|
31
|
+
before do
|
32
|
+
expect(subject)
|
33
|
+
.to receive(:file_valid?)
|
34
|
+
.exactly(files.count).times
|
35
|
+
.and_return false
|
36
|
+
|
37
|
+
files.each do |file|
|
38
|
+
expect(subject)
|
39
|
+
.to receive(:sanitize)
|
40
|
+
.with(file)
|
41
|
+
.and_return(file)
|
42
|
+
end
|
43
|
+
subject.execute
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should set appropriate variables' do
|
47
|
+
expect(subject.output).to eq files
|
48
|
+
expect(subject.counter).to eq(files.count)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#valid?' do
|
54
|
+
before do
|
55
|
+
subject.instance_variable_set('@output', output)
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when output is empty' do
|
59
|
+
let(:output) { [] }
|
60
|
+
it { expect(subject.valid?).to eq true }
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when output have some files' do
|
64
|
+
let(:output) { ['file_name'] }
|
65
|
+
it { expect(subject.valid?).to eq false }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#label' do
|
70
|
+
let(:counter) { rand(10) }
|
71
|
+
let(:expected) { "Final blank line: #{counter} files checked" }
|
72
|
+
|
73
|
+
before do
|
74
|
+
subject.instance_variable_set('@counter', counter)
|
75
|
+
end
|
76
|
+
|
77
|
+
it { expect(subject.label).to eq expected }
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#error_message' do
|
81
|
+
let(:output) { [rand.to_s, rand.to_s] }
|
82
|
+
let(:expected) { "Following files don't have final blank line: \n#{output.join("\n")}\n" }
|
83
|
+
|
84
|
+
before do
|
85
|
+
subject.instance_variable_set('@output', output)
|
86
|
+
end
|
87
|
+
|
88
|
+
it { expect(subject.error_message).to eq expected }
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#files_to_analyze' do
|
92
|
+
let(:files) { [rand.to_s, rand.to_s] }
|
93
|
+
let(:excludes) { [files[0]] }
|
94
|
+
let(:expected) { [files[1]] }
|
95
|
+
|
96
|
+
before do
|
97
|
+
expect(subject)
|
98
|
+
.to receive(:files_from_path)
|
99
|
+
.with('**/{*,.*}')
|
100
|
+
.and_return(files)
|
101
|
+
|
102
|
+
expect(subject)
|
103
|
+
.to receive(:excludes)
|
104
|
+
.and_return(excludes)
|
105
|
+
end
|
106
|
+
|
107
|
+
it { expect(subject.send(:files_to_analyze)).to eq expected }
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#excludes' do
|
111
|
+
let(:defaults) { [rand.to_s, rand.to_s] }
|
112
|
+
let(:configs) { [rand.to_s] }
|
113
|
+
let(:expected) { (defaults + configs).flatten }
|
114
|
+
|
115
|
+
before do
|
116
|
+
expect(subject)
|
117
|
+
.to receive(:default_excludes)
|
118
|
+
.and_return(defaults)
|
119
|
+
|
120
|
+
expect(subject)
|
121
|
+
.to receive(:config_excludes)
|
122
|
+
.and_return(configs)
|
123
|
+
end
|
124
|
+
|
125
|
+
it { expect(subject.send(:excludes)).to eq expected }
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#default_excludes' do
|
129
|
+
before do
|
130
|
+
described_class::DEFAULT_PATHS_TO_EXCLUDE.each do |path|
|
131
|
+
expect(subject)
|
132
|
+
.to receive(:files_from_path)
|
133
|
+
.with("#{path}/**/{*,.*}")
|
134
|
+
.and_return(path)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
it { expect(subject.send(:default_excludes)).to eq described_class::DEFAULT_PATHS_TO_EXCLUDE }
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#config_excludes' do
|
142
|
+
context 'final_blank_line_ignored is set' do
|
143
|
+
let(:paths) { [rand.to_s, rand.to_s] }
|
144
|
+
let(:config) { double(final_blank_line_ignored: paths) }
|
145
|
+
|
146
|
+
before do
|
147
|
+
expect(PolishGeeks::DevTools)
|
148
|
+
.to receive(:config)
|
149
|
+
.and_return config
|
150
|
+
|
151
|
+
paths.each do |path|
|
152
|
+
expect(subject)
|
153
|
+
.to receive(:files_from_path)
|
154
|
+
.with("#{path}")
|
155
|
+
.and_return(path)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
it { expect(subject.send(:config_excludes)).to eq paths }
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'final_blank_line_ignored is not set' do
|
163
|
+
let(:config) { double(final_blank_line_ignored: nil) }
|
164
|
+
before do
|
165
|
+
expect(PolishGeeks::DevTools)
|
166
|
+
.to receive(:config)
|
167
|
+
.and_return config
|
168
|
+
end
|
169
|
+
it { expect(subject.send(:config_excludes)).to eq [] }
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe '#files_from_path' do
|
174
|
+
let(:app_root) { PolishGeeks::DevTools.app_root }
|
175
|
+
|
176
|
+
context 'path is a directory' do
|
177
|
+
let(:path) { rand.to_s }
|
178
|
+
let(:file_in_path) { "#{app_root}/#{rand}" }
|
179
|
+
let(:dir_in_path) { "#{app_root}/#{rand}" }
|
180
|
+
before do
|
181
|
+
expect(File)
|
182
|
+
.to receive(:file?)
|
183
|
+
.with("#{app_root}/#{path}")
|
184
|
+
.and_return(false)
|
185
|
+
|
186
|
+
expect(Dir)
|
187
|
+
.to receive(:glob)
|
188
|
+
.with("#{app_root}/#{path}")
|
189
|
+
.and_return([file_in_path, dir_in_path])
|
190
|
+
|
191
|
+
expect(File)
|
192
|
+
.to receive(:file?)
|
193
|
+
.with(file_in_path)
|
194
|
+
.and_return(true)
|
195
|
+
|
196
|
+
expect(File)
|
197
|
+
.to receive(:file?)
|
198
|
+
.with(dir_in_path)
|
199
|
+
.and_return(false)
|
200
|
+
end
|
201
|
+
it { expect(subject.send(:files_from_path, path)).to eq [file_in_path] }
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'path is a file' do
|
205
|
+
let(:path) { rand.to_s }
|
206
|
+
before do
|
207
|
+
expect(File)
|
208
|
+
.to receive(:file?)
|
209
|
+
.with("#{app_root}/#{path}")
|
210
|
+
.and_return(true)
|
211
|
+
end
|
212
|
+
it { expect(subject.send(:files_from_path, path)).to eq ["#{app_root}/#{path}"] }
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
describe '#sanitize' do
|
217
|
+
let(:file) { rand.to_s }
|
218
|
+
let(:app_root) { PolishGeeks::DevTools.app_root }
|
219
|
+
let(:path) { "#{app_root}/#{file}" }
|
220
|
+
|
221
|
+
it { expect(subject.send(:sanitize, "#{app_root}/#{path}")).to eq file }
|
222
|
+
end
|
223
|
+
|
224
|
+
describe '#file_valid?' do
|
225
|
+
let(:file) { rand.to_s }
|
226
|
+
|
227
|
+
context 'file is not empty' do
|
228
|
+
before do
|
229
|
+
expect(File)
|
230
|
+
.to receive(:size)
|
231
|
+
.with(file)
|
232
|
+
.and_return(1)
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'file has final blank line' do
|
236
|
+
before do
|
237
|
+
expect(IO)
|
238
|
+
.to receive(:readlines)
|
239
|
+
.with(file)
|
240
|
+
.and_return([rand.to_s + "\n"])
|
241
|
+
end
|
242
|
+
|
243
|
+
it { expect(subject.send(:file_valid?, file)).to eq true }
|
244
|
+
end
|
245
|
+
|
246
|
+
context 'file does not have final blank line' do
|
247
|
+
before do
|
248
|
+
expect(IO)
|
249
|
+
.to receive(:readlines)
|
250
|
+
.with(file)
|
251
|
+
.and_return([rand.to_s + 'end'])
|
252
|
+
end
|
253
|
+
|
254
|
+
it { expect(subject.send(:file_valid?, file)).to eq false }
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
context 'file is empty' do
|
259
|
+
before do
|
260
|
+
expect(File)
|
261
|
+
.to receive(:size?)
|
262
|
+
.with(file)
|
263
|
+
.and_return(0)
|
264
|
+
|
265
|
+
it { expect(subject.send(:file_valid?, file)).to eq true }
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
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.
|
4
|
+
version: 1.1.0
|
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-08-
|
11
|
+
date: 2015-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -217,6 +217,7 @@ files:
|
|
217
217
|
- ".ruby-gemset"
|
218
218
|
- ".ruby-version"
|
219
219
|
- ".travis.yml"
|
220
|
+
- CHANGELOG.md
|
220
221
|
- Gemfile
|
221
222
|
- Gemfile.lock
|
222
223
|
- README.md
|
@@ -231,6 +232,7 @@ files:
|
|
231
232
|
- lib/polishgeeks/dev-tools/command/coverage.rb
|
232
233
|
- lib/polishgeeks/dev-tools/command/examples_comparator.rb
|
233
234
|
- lib/polishgeeks/dev-tools/command/expires_in.rb
|
235
|
+
- lib/polishgeeks/dev-tools/command/final_blank_line.rb
|
234
236
|
- lib/polishgeeks/dev-tools/command/haml_lint.rb
|
235
237
|
- lib/polishgeeks/dev-tools/command/readme.rb
|
236
238
|
- lib/polishgeeks/dev-tools/command/rspec.rb
|
@@ -258,6 +260,7 @@ files:
|
|
258
260
|
- spec/lib/polishgeeks/dev-tools/command/coverage_spec.rb
|
259
261
|
- spec/lib/polishgeeks/dev-tools/command/examples_comparator_spec.rb
|
260
262
|
- spec/lib/polishgeeks/dev-tools/command/expires_in_spec.rb
|
263
|
+
- spec/lib/polishgeeks/dev-tools/command/final_blank_line_spec.rb
|
261
264
|
- spec/lib/polishgeeks/dev-tools/command/haml_lint_spec.rb
|
262
265
|
- spec/lib/polishgeeks/dev-tools/command/readme_spec.rb
|
263
266
|
- spec/lib/polishgeeks/dev-tools/command/rspec_files_names_spec.rb
|
@@ -308,6 +311,7 @@ test_files:
|
|
308
311
|
- spec/lib/polishgeeks/dev-tools/command/coverage_spec.rb
|
309
312
|
- spec/lib/polishgeeks/dev-tools/command/examples_comparator_spec.rb
|
310
313
|
- spec/lib/polishgeeks/dev-tools/command/expires_in_spec.rb
|
314
|
+
- spec/lib/polishgeeks/dev-tools/command/final_blank_line_spec.rb
|
311
315
|
- spec/lib/polishgeeks/dev-tools/command/haml_lint_spec.rb
|
312
316
|
- spec/lib/polishgeeks/dev-tools/command/readme_spec.rb
|
313
317
|
- spec/lib/polishgeeks/dev-tools/command/rspec_files_names_spec.rb
|