salt-lint 0.1.2 → 0.1.4.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.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/doc/list_tests.md +22 -12
- data/lib/salt-lint/actions.rb +35 -7
- data/lib/salt-lint/options.rb +12 -0
- data/lib/salt-lint/tests.rb +61 -35
- data/lib/salt-lint/version.rb +1 -1
- data/shippable.yml +1 -0
- data/spec/files_spec.rb +14 -5
- data/spec/tests_spec.rb +22 -9
- data/tests/file_with_multiple_errors.sls +2 -0
- data/tests/well_formatted_top.sls +2 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06b6748f8fb4a05737347e3b730b460e62804f43
|
4
|
+
data.tar.gz: 916bad67abd80bc6f01e3ceb4ac0669a7d03e8f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56db23b66967baa8f52f5e0b121c4dbae2a59afcd3c9f45e54bf63bf3b7f449b733605ea07e088f05f949bb4478933e47878b841e49ffcce163a58052196f55e
|
7
|
+
data.tar.gz: 6f7b73c95725063538f928039062ede88e123c49abde456627a676221728773781393cb5fdae94ed2b06bce599388d11f6d82f78bb68cfed4c2f387398110cc5
|
data/README.md
CHANGED
@@ -13,4 +13,10 @@ Development: [ to interpret any results returned.
|
15
15
|
|
16
|
+
## Running within git repo with its git files only
|
17
|
+
|
18
|
+
```
|
19
|
+
git ls-files | grep sls | xargs -I {} salt-lint -f {}
|
20
|
+
```
|
21
|
+
|
16
22
|
## Do not use it until version >= 0.5
|
data/doc/list_tests.md
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
# Salt-lint tests
|
1
|
+
# Salt-lint tests results.
|
2
2
|
|
3
|
-
* [Using double quotes with no variables](#
|
4
|
-
* [Line length above 80 characters](#
|
5
|
-
* [Found single line declaration](#
|
6
|
-
* [No newline at the end of the file](#
|
7
|
-
* [Trailing whitespace character found](#
|
3
|
+
* [Using double quotes with no variables](#double-quotes)
|
4
|
+
* [Line length above 80 characters](#line-length)
|
5
|
+
* [Found single line declaration](#single-declaration)
|
6
|
+
* [No newline at the end of the file](#no-newline)
|
7
|
+
* [Trailing whitespace character found](#trailing-whitespace)
|
8
|
+
* [Found tabs used instead of spaces](#found-tabs)
|
8
9
|
|
9
|
-
### Using double quotes with no variables
|
10
|
+
### <a name="double-quotes"></a>Using double quotes with no variables
|
10
11
|
In general - it's a bad idea. All the strings which does not contain dynamic content ( variables ) should use single quote instead of double.
|
11
12
|
|
12
13
|
##### Bad
|
@@ -21,10 +22,10 @@ dev:
|
|
21
22
|
'*'
|
22
23
|
```
|
23
24
|
|
24
|
-
### Line length above 80 characters
|
25
|
+
### <a name="line-length"></a>Line length above 80 characters
|
25
26
|
As a 'standard code width limit' and for historical reasons - [IBM punch card](http://en.wikipedia.org/wiki/Punched_card) had exactly 80 columns.
|
26
27
|
|
27
|
-
### Found single line declaration
|
28
|
+
### <a name="single-declaration"></a>Found single line declaration
|
28
29
|
Avoid extending your code by adding single-line declarations. It makes your code much cleaner and easier to parse / grep while searching for those declarations.
|
29
30
|
|
30
31
|
##### Bad
|
@@ -40,8 +41,17 @@ Avoid extending your code by adding single-line declarations. It makes your code
|
|
40
41
|
pkg.installed
|
41
42
|
```
|
42
43
|
|
43
|
-
### No newline at the end of the file
|
44
|
+
### <a name="no-newline"></a>No newline at the end of the file
|
44
45
|
Each line should be terminated in a newline character, including the last one. Some programs have problems processing the last line of a file if it isn't newline terminated. [Stackoverflow thread](http://stackoverflow.com/questions/729692/why-should-files-end-with-a-newline)
|
45
46
|
|
46
|
-
### Trailing whitespace character found
|
47
|
-
Trailing whitespaces take more spaces than necessary, any regexp based searches won't return lines as a result due to trailing whitespace(s).
|
47
|
+
### <a name="trailing-whitespace"></a>Trailing whitespace character found
|
48
|
+
Trailing whitespaces take more spaces than necessary, any regexp based searches won't return lines as a result due to trailing whitespace(s).
|
49
|
+
|
50
|
+
### <a name="quoted-booleans"></a>Quoted boolean found
|
51
|
+
Boolean values behave differently when quoted as they're interpreted as strings which you obviously don't want.
|
52
|
+
|
53
|
+
### <a name="filename-quoted"></a>Unquoted file mode found
|
54
|
+
Unquoted file modes are interpreted as integers and evaluated as octal.
|
55
|
+
|
56
|
+
### <a name="found-tabs"></a>Found tabs used instead of spaces
|
57
|
+
[PEP-8](http://legacy.python.org/dev/peps/pep-0008/#tabs-or-spaces) says "spaces" so we require those instead of tabs as Salt is python-friendly ( said guy who wrote a Salt linter in Ruby ).
|
data/lib/salt-lint/actions.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'find'
|
2
|
+
|
1
3
|
module SaltLint
|
2
4
|
# Executing appropriate actions
|
3
5
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
@@ -13,10 +15,30 @@ module SaltLint
|
|
13
15
|
test_suite_methods = SaltLint::Tests.methods(false).sort - [ :check_for_regexp ]
|
14
16
|
line_counter = 1
|
15
17
|
File.readlines(f).each do |l|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
skip = false
|
19
|
+
tmp_l = l.gsub(/\s+/, '')
|
20
|
+
# Comments
|
21
|
+
if tmp_l =~ /\{?#(.+)?\}?/
|
22
|
+
skip = true
|
23
|
+
# Empty lines
|
24
|
+
elsif tmp_l =~ /^$/
|
25
|
+
skip = true
|
26
|
+
# Functions
|
27
|
+
elsif tmp_l =~ /\{+.+\(.+\).+\}+/
|
28
|
+
skip = true
|
29
|
+
# Variables
|
30
|
+
elsif tmp_l =~ /\{\{.+\}\}/
|
31
|
+
l = l.gsub(/\{\{.+\}\}/, 'random_string')
|
32
|
+
# If / Else blocks
|
33
|
+
elsif tmp_l =~ /^\{\%.*\%\}$/
|
34
|
+
skip = true
|
35
|
+
end
|
36
|
+
if ! skip
|
37
|
+
test_suite_methods.each do |m|
|
38
|
+
if ! $invalid_yaml[f]
|
39
|
+
checks_went_fine_tmp = SaltLint::Tests.send(m, line_counter, l, f)
|
40
|
+
checks_went_fine_tmp == false ? checks_went_fine = false : nil
|
41
|
+
end
|
20
42
|
end
|
21
43
|
end
|
22
44
|
line_counter += 1
|
@@ -27,9 +49,15 @@ module SaltLint
|
|
27
49
|
|
28
50
|
# Scans folder specified as argument --scan for SLS files and returns array
|
29
51
|
def self.scan
|
30
|
-
files = Dir.glob( $arguments.scan + "
|
31
|
-
|
32
|
-
|
52
|
+
# files = Dir.glob( $arguments.scan + "**/*")
|
53
|
+
files_to_return = Array.new
|
54
|
+
Find.find($arguments.scan).to_a.each do |f|
|
55
|
+
if f =~ /.*\.sls$/
|
56
|
+
files_to_return.push(f)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
if files_to_return.count > 0
|
60
|
+
return files_to_return
|
33
61
|
else
|
34
62
|
Printer.print('error', 'No salt state files found.')
|
35
63
|
exit 1
|
data/lib/salt-lint/options.rb
CHANGED
@@ -14,6 +14,8 @@ module SaltLint
|
|
14
14
|
SaltLint::Actions.check_rules(f)
|
15
15
|
end
|
16
16
|
end
|
17
|
+
elsif $arguments.file_given
|
18
|
+
SaltLint::Actions.check_rules($arguments.file)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -32,6 +34,16 @@ EOS
|
|
32
34
|
opt :debug, 'Enable debug mode', default: 0
|
33
35
|
opt :file, 'File to check against', type: :string
|
34
36
|
opt :scan, 'Traversal scan of current directory and sub dirs', type: :string
|
37
|
+
|
38
|
+
opt :check_newlines, 'Check for newline at the end of the file', default: true, short: :none
|
39
|
+
opt :check_double_quotes, 'Check for double quotes without variables', default: true, short: :none
|
40
|
+
opt :check_whitespaces, 'Check for whitespaces at the end of the line', default: true, short: :none
|
41
|
+
opt :check_line_length, 'Check lines length', default: true, short: :none
|
42
|
+
opt :check_single_word, 'Check for single word declaration', default: true, short: :none
|
43
|
+
opt :check_quoted_boolean, 'Check for quoted booleans', default: true, short: :none
|
44
|
+
opt :check_quoted_file_mode, 'Check for unquoted file modes', default: true, short: :none
|
45
|
+
opt :check_tabs, 'Check if tabs used instead of spaces', default: true, short: :none
|
46
|
+
|
35
47
|
end
|
36
48
|
$debug = opts.debug.to_i
|
37
49
|
return opts
|
data/lib/salt-lint/tests.rb
CHANGED
@@ -6,9 +6,8 @@ module SaltLint
|
|
6
6
|
|
7
7
|
# Helper: Checking for whitespaces
|
8
8
|
def self.check_for_regexp(line_number, line, file, regex, debug_msg, warning_msg)
|
9
|
-
is_ok = true
|
10
9
|
Printer.print('debug', debug_msg, 5)
|
11
|
-
line.
|
10
|
+
! (line =~ Regexp.new(regex)).nil? ? is_ok = false : is_ok = true
|
12
11
|
if ! is_ok
|
13
12
|
Printer.print('warning', warning_msg)
|
14
13
|
end
|
@@ -18,14 +17,16 @@ module SaltLint
|
|
18
17
|
# Test content: Check context and block all the single-word declarations
|
19
18
|
def self.check_if_single_word_declaration(line_number, line, file)
|
20
19
|
is_ok = true
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
if $arguments.check_single_word
|
21
|
+
Printer.print('debug', "Looking for single word declarations in #{file}", 5)
|
22
|
+
if line =~ /(pkg|file|service):\n/
|
23
|
+
f = File.readlines(file)[line_number-1..line_number+2]
|
24
|
+
( f[2] =~ /^\n$/ && f[1] =~ /- \w+\n$/ ) ? is_ok = true : is_ok = false
|
25
|
+
if ! $invalid_oneword.has_key?(file) && is_ok == false
|
26
|
+
Printer.print('warning', "Found single line declaration in #{file}:#{line_number-1}-#{line_number+1}")
|
27
|
+
$invalid_oneword[file] = is_ok
|
28
|
+
end
|
29
|
+
end
|
29
30
|
end
|
30
31
|
return is_ok
|
31
32
|
end
|
@@ -33,51 +34,76 @@ module SaltLint
|
|
33
34
|
# Test content: Checking given file for no newline at the end of the file.
|
34
35
|
def self.check_for_no_newline(line_number, line, file)
|
35
36
|
is_ok = true
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
if $arguments.check_newlines
|
38
|
+
Printer.print('debug', "Checking for no-newline at the end of the file in file #{file}", 5)
|
39
|
+
f = File.readlines(file).last
|
40
|
+
f.match(/^\n$/) ? is_ok = true : is_ok = false
|
41
|
+
if ! $invalid_newline.has_key?(file) && is_ok == false
|
42
|
+
Printer.print('warning', "No newline at the end of the file #{file}")
|
43
|
+
$invalid_newline[file] = is_ok
|
44
|
+
end
|
42
45
|
end
|
43
46
|
return is_ok
|
44
47
|
end
|
45
48
|
|
46
|
-
# Test content: Checking if given
|
47
|
-
def self.
|
49
|
+
# Test content: Checking if given line isn't longer than 80 characters.
|
50
|
+
def self.check_line_length(line_number, line, file)
|
48
51
|
is_ok = true
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
Printer.print('warning', "File #{file} is not YAML. Unable to parse.")
|
55
|
-
$invalid_yaml[file] = true
|
52
|
+
if $arguments.check_line_length
|
53
|
+
Printer.print('debug', "Checking line length: #{line_number}", 5)
|
54
|
+
line.length > 80 ? is_ok = false : nil
|
55
|
+
if ! is_ok
|
56
|
+
Printer.print('warning', "Line length above 80 characters: #{file}:#{line_number}")
|
56
57
|
end
|
57
58
|
end
|
58
59
|
return is_ok
|
59
60
|
end
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
|
63
|
+
# Test content: Check for tabs used instead of spaces.
|
64
|
+
def self.check_if_tabs_used(line_number, line, file)
|
65
|
+
if $arguments.check_tabs
|
66
|
+
check_for_regexp(line_number, line, file, /^[\t]+/, "Checking for tabs presence: #{line_number}", "Found tabs used instead of spaces: #{file}:#{line_number}")
|
67
|
+
else
|
68
|
+
return true
|
68
69
|
end
|
69
|
-
return is_ok
|
70
70
|
end
|
71
71
|
|
72
72
|
# Test content: Checking given line for trailing whitespaces.
|
73
73
|
def self.check_trailing_whitespace(line_number, line, file)
|
74
|
-
|
74
|
+
if $arguments.check_whitespaces
|
75
|
+
check_for_regexp(line_number, line, file, /[ \t]+$/, "Checking for trailing whitespaces: #{line_number}", "Trailing whitespace character found: #{file}:#{line_number}")
|
76
|
+
else
|
77
|
+
return true
|
78
|
+
end
|
75
79
|
end
|
76
80
|
|
77
81
|
# Test content: Checking if given line contains double quoted content without
|
78
82
|
# variable.
|
79
83
|
def self.check_double_quotes(line_number, line, file)
|
80
|
-
|
84
|
+
if $arguments.check_double_quotes
|
85
|
+
check_for_regexp(line_number, line, file, /\"(?!{+).*(?!}+)\"/, "Checking for double quotes: #{line_number}", "Using double quotes with no variables: #{file}:#{line_number}")
|
86
|
+
else
|
87
|
+
return true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Test content: Checking if there's quoted boolean value present.
|
92
|
+
def self.check_quoted_boolean(line_number, line, file)
|
93
|
+
if $arguments.check_quoted_boolean
|
94
|
+
check_for_regexp(line_number, line, file, /\s+(\"|\')(true|false)(\"|\')$/, "Checking for quoted booleans: #{line_number}", "Quoted boolean found: #{file}:#{line_number}")
|
95
|
+
else
|
96
|
+
return true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Test content: Check if file mode with leading zero is wrapped into single quotes
|
101
|
+
def self.check_file_mode_single_quotes(line_number, line, file)
|
102
|
+
if $arguments.check_quoted_file_mode
|
103
|
+
check_for_regexp(line_number, line, file, /mode\:\s\d{3,4}$/, "Checking if file mode is wrapped in single quotes: #{line_number}", "Unquoted file mode found: #{file}:#{line_number}")
|
104
|
+
else
|
105
|
+
return true
|
106
|
+
end
|
81
107
|
end
|
82
108
|
end
|
83
109
|
end
|
data/lib/salt-lint/version.rb
CHANGED
data/shippable.yml
CHANGED
data/spec/files_spec.rb
CHANGED
@@ -1,22 +1,31 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
+
$arguments = OpenStruct.new({ file: 'tests/file_with_multiple_errors.sls', file_given: true,
|
4
|
+
check_newlines: true, check_double_quotes: true, check_whitespaces: true,
|
5
|
+
check_line_length: true, check_single_word: true, check_quoted_booleans: true })
|
6
|
+
|
7
|
+
$debug = 0
|
8
|
+
|
3
9
|
describe 'Files operations' do
|
4
10
|
|
5
11
|
it 'scans all the files within "tests" directory' do
|
6
|
-
$arguments =
|
12
|
+
$arguments.file_given = false
|
13
|
+
$arguments.scan_given = true
|
14
|
+
$arguments.scan = 'tests'
|
7
15
|
list_of_sls_files = SaltLint::Actions.scan
|
8
16
|
expect(list_of_sls_files.grep(/well_formatted_top\.sls/).any?).to eq true
|
9
17
|
end
|
10
18
|
|
11
19
|
it 'checks well formatted file' do
|
12
|
-
$arguments =
|
13
|
-
$
|
20
|
+
$arguments.file = 'tests/well_formatted_top.sls'
|
21
|
+
$arguments.file_given = true
|
22
|
+
$arguments.scan_given = false
|
14
23
|
expect(SaltLint::Actions.check_rules($arguments.file)).to eq true
|
15
24
|
end
|
16
25
|
|
17
26
|
it 'checks file with multiple errors' do
|
18
|
-
$arguments =
|
19
|
-
$
|
27
|
+
$arguments.scan_given = false
|
28
|
+
$arguments.file = 'tests/file_with_multiple_errors.sls'
|
20
29
|
expect(SaltLint::Actions.check_rules($arguments.file)).to eq false
|
21
30
|
end
|
22
31
|
end
|
data/spec/tests_spec.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
+
$arguments = OpenStruct.new({ file: 'tests/file_with_multiple_errors.sls', file_given: true,
|
4
|
+
check_newlines: true, check_double_quotes: true, check_whitespaces: true,
|
5
|
+
check_line_length: true, check_single_word: true, check_quoted_boolean: true,
|
6
|
+
check_quoted_file_mode: true, check_tabs: true })
|
7
|
+
|
3
8
|
test_file_good = 'tests/well_formatted_top.sls'
|
4
9
|
test_file_bad_yaml = 'tests/non_yaml_file.sls'
|
5
10
|
test_file_bad = 'tests/file_with_multiple_errors.sls'
|
6
11
|
|
7
12
|
describe 'Tests suite checks if' do
|
8
|
-
it 'file is in YAML format (incorrect)' do
|
9
|
-
expect(SaltLint::Tests.check_if_proper_yaml(0, 0, test_file_bad_yaml)).to eq false
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'file is in YAML format (correct)' do
|
13
|
-
expect(SaltLint::Tests.check_if_proper_yaml(0, 0, test_file_good)).to eq true
|
14
|
-
end
|
15
|
-
|
16
13
|
it 'won\'t allow lines longer than 80 characters' do
|
17
14
|
expect(SaltLint::Tests.check_line_length(0, 'xG9H2z8dOK0n3fTX1g4bWS5a6lRI7t6jCsY58mLJ2pqU9N3k4rBD0woA17iMyP90eEZ2u3cFbQ47uYD5lmM16' , test_file_good)).to eq false
|
18
15
|
end
|
@@ -37,4 +34,20 @@ describe 'Tests suite checks if' do
|
|
37
34
|
it 'will allow condensed declarations' do
|
38
35
|
expect(SaltLint::Tests.check_if_single_word_declaration(5, "pkg.installed\n", test_file_good)).to eq true
|
39
36
|
end
|
40
|
-
|
37
|
+
|
38
|
+
it 'won\'t allow quoted booleans' do
|
39
|
+
expect(SaltLint::Tests.check_quoted_boolean(5, 'potato: "true"', test_file_bad)).to eq false
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'won\'t allow unquoted file modes' do
|
43
|
+
expect(SaltLint::Tests.check_file_mode_single_quotes(8, 'mode: 0744', test_file_bad)).to eq false
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'won\'t allow using tabs instead of spaces' do
|
47
|
+
expect(SaltLint::Tests.check_if_tabs_used(8, "\ttest_value", test_file_bad)).to eq false
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'will allow using spaces instead of tabs' do
|
51
|
+
expect(SaltLint::Tests.check_if_tabs_used(8, " test_value", test_file_good)).to eq true
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: salt-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukasz Raczylo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -151,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
153
|
rubyforge_project:
|
154
|
-
rubygems_version: 2.4.
|
154
|
+
rubygems_version: 2.4.6
|
155
155
|
signing_key:
|
156
156
|
specification_version: 4
|
157
157
|
summary: Salt linter written in Ruby
|
@@ -160,4 +160,3 @@ test_files:
|
|
160
160
|
- spec/files_spec.rb
|
161
161
|
- spec/spec_helper.rb
|
162
162
|
- spec/tests_spec.rb
|
163
|
-
has_rdoc:
|