banalize 0.0.2 → 0.0.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/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: []
|