banalize 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +13 -0
- data/bin/banalize +3 -1
- data/lib/banalize/parser.rb +10 -7
- data/lib/banalize/parser/variables.rb +30 -0
- data/lib/banalize/policy.rb +1 -1
- data/lib/banalize/runner.rb +2 -0
- data/lib/commands/dir.rb +22 -13
- data/lib/commands/file.rb +3 -5
- data/lib/policies/braces_for_variables.rb +37 -0
- data/lib/policies/comment_coverage.rb +1 -1
- data/lib/policies/define_path.rb +8 -9
- data/lib/policies/uninitialized_variables.rb +45 -0
- data/version.txt +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b0087481450fe823d7653961d51e65a77d1c204
|
4
|
+
data.tar.gz: d0c17b02bfb921f7b9c66f30891b24cd48cc1606
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11e7fe1cc961b17e79fab3d8d3c3db3fb9fa36912d7664330c013b12cdb0b7f1d797c7b6a66dfc9df74cd390c2194c414b31a05db8ae4158f2a83204a7edd0c7
|
7
|
+
data.tar.gz: 4c417850b591635872e6b272b781dda161e4a06cdb8ff9a369f070e8cd161e01f621c169c002fa5fff2ff845e9aa91986036ce40692ecaca7b67d2cf5efaac45
|
data/History.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## v.0.0.3
|
2
|
+
|
3
|
+
* Thu Mar 28 2013 -- Dmytro Kovalov
|
4
|
+
|
5
|
+
- Filtering files by extension list: comma separated
|
6
|
+
- Add default sorting to policy search
|
7
|
+
- Policy to check braces ${a} around variables
|
8
|
+
with test for it
|
9
|
+
- Add template for ruby policy in the docs directory
|
10
|
+
- Policy to check uninitialized variables
|
11
|
+
- Currently processed bash: Add error reporting on exit of currently processed bash file.
|
12
|
+
- ShellVariables module for parser
|
13
|
+
Find all shell variables in script into array and accessor `variables`
|
1
14
|
|
2
15
|
## v.0.0.2
|
3
16
|
|
data/bin/banalize
CHANGED
@@ -60,7 +60,8 @@ pre do |global,command,options,args|
|
|
60
60
|
# - results of checks
|
61
61
|
# - count of failed checks
|
62
62
|
# - total count of checks
|
63
|
-
|
63
|
+
# - current - name of the currently processed bash file
|
64
|
+
$res, $status, $total, $current = { }, 0, 0, ''
|
64
65
|
true
|
65
66
|
end
|
66
67
|
|
@@ -115,6 +116,7 @@ end
|
|
115
116
|
|
116
117
|
on_error do |exception|
|
117
118
|
unless ENV['GLI_DEBUG'] == 'true'
|
119
|
+
puts "Current bash file #{$current}"
|
118
120
|
exit_now! exception.message unless exception.is_a? GLI::BadCommandLine
|
119
121
|
end
|
120
122
|
true
|
data/lib/banalize/parser.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Banalize
|
2
2
|
|
3
3
|
require_relative 'parser/pod_comments'
|
4
|
+
require_relative 'parser/variables'
|
4
5
|
|
5
6
|
# Instance attributes
|
6
7
|
# -----------
|
@@ -14,14 +15,16 @@ module Banalize
|
|
14
15
|
|
15
16
|
class Parser
|
16
17
|
|
17
|
-
include
|
18
|
+
include PodStyleComments
|
19
|
+
include ShellVariables
|
18
20
|
|
19
21
|
def initialize path
|
20
|
-
@lines
|
21
|
-
@shebang
|
22
|
-
@comments
|
23
|
-
@code
|
24
|
-
|
22
|
+
@lines = IO.read(path).force_encoding("utf-8").split($/)
|
23
|
+
@shebang = Numbered.new
|
24
|
+
@comments = Numbered.new
|
25
|
+
@code = Numbered.new
|
26
|
+
@variables = []
|
27
|
+
|
25
28
|
@shebang.add @lines.shift if @lines.first =~ /^#!/
|
26
29
|
|
27
30
|
@lines.each_index do |idx|
|
@@ -37,7 +40,7 @@ module Banalize
|
|
37
40
|
end
|
38
41
|
end
|
39
42
|
pod_comments
|
40
|
-
|
43
|
+
shell_variables
|
41
44
|
end
|
42
45
|
|
43
46
|
# Lines of the tested bash file, split by \n's
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Banalize
|
2
|
+
class Parser
|
3
|
+
|
4
|
+
##
|
5
|
+
# Parse and detect all shell variables used in script. Set
|
6
|
+
# instance level accessor `variables`.
|
7
|
+
#
|
8
|
+
module ShellVariables
|
9
|
+
|
10
|
+
##
|
11
|
+
# Parse and detect all shell variables used in script.
|
12
|
+
#
|
13
|
+
# @return [Array]
|
14
|
+
def shell_variables
|
15
|
+
ln = code.grep(/\$\{?\w+\}?/).map(&:last).join " "
|
16
|
+
|
17
|
+
vars = ln.scan(/\$\{?\w+\}?/)
|
18
|
+
vars.map! { |x| x.gsub(/[${}]/,'') }
|
19
|
+
vars.reject! { |x| x =~ /^\d$/}
|
20
|
+
|
21
|
+
@variables = vars || []
|
22
|
+
@variables.uniq!
|
23
|
+
end
|
24
|
+
|
25
|
+
# All variables used in shell script
|
26
|
+
attr_accessor :variables
|
27
|
+
|
28
|
+
end # ShellVariables
|
29
|
+
end # Parser
|
30
|
+
end # Banalize
|
data/lib/banalize/policy.rb
CHANGED
data/lib/banalize/runner.rb
CHANGED
data/lib/commands/dir.rb
CHANGED
@@ -3,20 +3,14 @@ desc 'Banalize file(s) from single or multiple directories. Can use wildcards an
|
|
3
3
|
arg_name 'dir', :multiple
|
4
4
|
command [:directory, :dir] do |c|
|
5
5
|
|
6
|
-
c.desc "Show all results, by default only failures shown (only for long format)"
|
7
|
-
c.switch [:a,:all]
|
8
6
|
|
9
|
-
c.desc "
|
10
|
-
c.switch [:
|
7
|
+
c.switch [:a,:all], desc: "Show all results, not only failures (for long format)"
|
8
|
+
c.switch [:dots, :d], desc: "Short dotted output format"
|
9
|
+
c.switch [:recursive, :recur, :r], desc: "Recursive scan directories for files"
|
10
|
+
c.switch [:allow_files, :f], desc: "Allow use of file paths together with directory paths"
|
11
11
|
|
12
|
-
c.desc "
|
13
|
-
c.
|
14
|
-
|
15
|
-
c.switch [:allow_files, :f], :desc => "Allow use of file paths together with directory paths"
|
16
|
-
|
17
|
-
c.desc "Wildcard for file lists"
|
18
|
-
c.default_value "*"
|
19
|
-
c.flag [:wildcard, :w]
|
12
|
+
c.flag [:wildcard, :w], desc: "Wildcard for file lists", default_value: "*"
|
13
|
+
c.flag [:except, :ex], desc: "Skip files with listed extensions (comma-separated)"
|
20
14
|
|
21
15
|
c.desc "With 'no-' do not show errors, only name of failed check"
|
22
16
|
c.default_value true
|
@@ -32,8 +26,23 @@ command [:directory, :dir] do |c|
|
|
32
26
|
files += Dir.glob("#{dir}/#{ options[:r] ? '**/' : ''}#{options[:wildcard]}").select { |x| File.file? x}
|
33
27
|
end
|
34
28
|
}
|
29
|
+
##
|
30
|
+
# Filter out files by extentions
|
31
|
+
#
|
32
|
+
if options[:except]
|
33
|
+
|
34
|
+
extensions = options[:except]
|
35
|
+
|
36
|
+
extensions = extensions.split(/\s*,\s*/) if
|
37
|
+
extensions.is_a? String
|
38
|
+
|
39
|
+
extensions.each do |ext|
|
40
|
+
files.reject! { |file| file =~ /.*\.#{ext}/ }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
35
44
|
files.each { |file| $res[file] = Banalize.run(file, $search) }
|
45
|
+
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
39
|
-
|
data/lib/commands/file.rb
CHANGED
@@ -2,12 +2,10 @@ desc 'Run banalize on a single file or multiple files'
|
|
2
2
|
|
3
3
|
arg_name 'filename', :multiple
|
4
4
|
command [:file, :fl] do |c|
|
5
|
-
|
6
|
-
c.desc "Show all results, by default only failures shown (only for long format)"
|
7
|
-
c.switch [:a,:all]
|
8
5
|
|
9
|
-
|
10
|
-
c.switch [:
|
6
|
+
|
7
|
+
c.switch [:a,:all], desc: "Show all results, not only failures (for long format)"
|
8
|
+
c.switch [:dots, :d], desc: "Short dotted output format"
|
11
9
|
|
12
10
|
c.desc "With 'no-' do not show errors, only name of failed check"
|
13
11
|
c.default_value true
|
@@ -0,0 +1,37 @@
|
|
1
|
+
banalizer File.basename(__FILE__, '.rb').to_sym do
|
2
|
+
|
3
|
+
synopsis 'Always use braces to isolate variables ${a}'
|
4
|
+
severity :stern
|
5
|
+
style :bugs
|
6
|
+
|
7
|
+
description <<-DESC
|
8
|
+
|
9
|
+
Use braces around variables
|
10
|
+
---------------------------
|
11
|
+
|
12
|
+
To prevent wrong expansion of variables always use braces around
|
13
|
+
variables. I.e.
|
14
|
+
|
15
|
+
Good: ${VARIABLE}
|
16
|
+
Bad: $VARIABLE
|
17
|
+
|
18
|
+
foo=sun
|
19
|
+
echo $fooshine # $fooshine is undefined
|
20
|
+
echo ${foo}shine # displays the word "sunshine"
|
21
|
+
|
22
|
+
DESC
|
23
|
+
|
24
|
+
def run
|
25
|
+
|
26
|
+
variables.each do |var|
|
27
|
+
|
28
|
+
if code.has?(/\$#{var}/)
|
29
|
+
errors.add "Variable $#{var} used without braces"
|
30
|
+
errors.add " Lines: #{code.lines}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
errors.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -15,7 +15,7 @@ banalizer File.basename(__FILE__, '.rb').to_sym do
|
|
15
15
|
|
16
16
|
else
|
17
17
|
pct = ((comments.size.to_f / code.size) * 100).to_i
|
18
|
-
errors.add "Code
|
18
|
+
errors.add "Code comment coverage #{pct}%" if pct < default[:percent]
|
19
19
|
end
|
20
20
|
|
21
21
|
errors.empty?
|
data/lib/policies/define_path.rb
CHANGED
@@ -5,13 +5,14 @@ banalizer :explicitly_define_path_variable do
|
|
5
5
|
|
6
6
|
description <<-EOF
|
7
7
|
|
8
|
-
PATH varaible
|
8
|
+
PATH varaible should be defined explicitly in the script. It should
|
9
|
+
*only* list absolute path names and does not have $PATH variable.
|
9
10
|
|
10
|
-
|
11
|
+
Ref.: http://hub.opensolaris.org/bin/view/Community+Group+on/shellstyle#HPathnames
|
11
12
|
|
12
|
-
It
|
13
|
-
pathnames
|
14
|
-
correctly even
|
13
|
+
It is always a good idea to be careful about $PATH settings and
|
14
|
+
pathnames when writing shell scripts. This allows them to function
|
15
|
+
correctly even when the user invoking your script has some strange
|
15
16
|
$PATH set in their environment.
|
16
17
|
|
17
18
|
There are two acceptable ways to do this:
|
@@ -27,13 +28,11 @@ PATH=/usr/bin; export PATH
|
|
27
28
|
chown root bar
|
28
29
|
chgrp sys bar
|
29
30
|
|
30
|
-
DO NOT
|
31
|
-
|
31
|
+
DO NOT use a mixture of (1) and (2) in the same script. Pick one
|
32
|
+
method and use it consistently.
|
32
33
|
|
33
34
|
EOF
|
34
35
|
|
35
|
-
|
36
|
-
|
37
36
|
parser :bash
|
38
37
|
|
39
38
|
def run
|
@@ -0,0 +1,45 @@
|
|
1
|
+
banalizer File.basename(__FILE__, '.rb').to_sym do
|
2
|
+
|
3
|
+
synopsis 'Variables should be explicitly initialized'
|
4
|
+
severity :gentle
|
5
|
+
style :security
|
6
|
+
|
7
|
+
description <<-DESC
|
8
|
+
|
9
|
+
Variable initialization
|
10
|
+
------------------------
|
11
|
+
|
12
|
+
As in C, it's always a good idea to initialize your variables, though,
|
13
|
+
the shell will initialize fresh variables itself (better: Unset
|
14
|
+
variables will generally behave like variables containing a
|
15
|
+
nullstring).
|
16
|
+
|
17
|
+
It's no problem to pass a variable you use as environment to the
|
18
|
+
script. If you blindly assume that all variables you use are empty for
|
19
|
+
the first time, somebody can inject a variable content by just passing
|
20
|
+
it in the environment.
|
21
|
+
|
22
|
+
The solution is simple and effective: Initialize them
|
23
|
+
|
24
|
+
my_input=""
|
25
|
+
my_array=()
|
26
|
+
my_number=0
|
27
|
+
|
28
|
+
If you do that for every variable you use, then you also have a kind
|
29
|
+
of documentation for them.
|
30
|
+
|
31
|
+
Ref: http://wiki.bash-hackers.org/scripting/style#variable_initialization
|
32
|
+
|
33
|
+
DESC
|
34
|
+
|
35
|
+
def run
|
36
|
+
|
37
|
+
variables.each do |var|
|
38
|
+
errors.add "Variable ${#{var}} used without initializing" if
|
39
|
+
code.dont_have? /#{var}=/
|
40
|
+
end
|
41
|
+
|
42
|
+
errors.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: banalize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmytro Kovalov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- ./lib/banalize/files.rb
|
85
85
|
- ./lib/banalize/parser/numbered.rb
|
86
86
|
- ./lib/banalize/parser/pod_comments.rb
|
87
|
+
- ./lib/banalize/parser/variables.rb
|
87
88
|
- ./lib/banalize/parser.rb
|
88
89
|
- ./lib/banalize/policy/severity.rb
|
89
90
|
- ./lib/banalize/policy.rb
|
@@ -96,6 +97,7 @@ files:
|
|
96
97
|
- ./lib/commands/list.rb
|
97
98
|
- ./lib/core_extensions/string.rb
|
98
99
|
- ./lib/helpers/beautify.rb
|
100
|
+
- ./lib/policies/braces_for_variables.rb
|
99
101
|
- ./lib/policies/comment_coverage.rb
|
100
102
|
- ./lib/policies/consistent_indents.rb
|
101
103
|
- ./lib/policies/define_path.rb
|
@@ -105,6 +107,7 @@ files:
|
|
105
107
|
- ./lib/policies/max_line_length.rb
|
106
108
|
- ./lib/policies/shebang_format.rb
|
107
109
|
- ./lib/policies/trailing_spaces.rb
|
110
|
+
- ./lib/policies/uninitialized_variables.rb
|
108
111
|
- ./lib/policies/minus_n_syntax_check
|
109
112
|
homepage: http://wizcorp.jp
|
110
113
|
licenses: []
|