umarell 1.0.1 → 1.4.0
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 +7 -1
- data/assets/umarell.jpg +0 -0
- data/exe/umarell +1 -1
- data/lib/umarell/arguments.rb +72 -0
- data/lib/umarell/cli.rb +27 -33
- data/lib/umarell/command.rb +34 -0
- data/lib/umarell/version.rb +1 -1
- metadata +54 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aec9d84e7f8feb7fb54ceff15c9eb028cc92258602f0102b97ffcc21ceeb7dc7
|
4
|
+
data.tar.gz: 1a7f7f05b4934b865e6e61231b8ad1ddb47591dc6f1fa77a5124d144c380049b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42cd9dbdb8acea615108a921a702d426fc0caef629c82c0cbfee9971789b3eed754451dc68eba1d902a7a9c7a323686e0fccedc08bf10164fc4c104da6b5ecf7
|
7
|
+
data.tar.gz: 7b819f44f0e460d825c2c4499ee6c2abe88fadca91e646ac8644a8e182fe4bd0312b7973a9aad89dad30539ae2807f14593e2e153f45c8ed65a0e6f2a6d74ae6
|
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Umarell
|
2
2
|
|
3
3
|
Umarell is an all in one Ruby static code analyzer.
|
4
|
+
Umarell gives you (*unwanted?*) advice on your code just like an [italian old man watching a construction site](https://en.wikipedia.org/wiki/Umarell).
|
5
|
+
|
6
|
+

|
4
7
|
|
5
8
|
## Installation
|
6
9
|
|
@@ -29,7 +32,9 @@ $ umarell /path/to/ruby-application
|
|
29
32
|
$ umarell -h
|
30
33
|
|
31
34
|
usage: umarell [options] [target]
|
32
|
-
|
35
|
+
-a, --autofix Autofix violations (if supported)
|
36
|
+
-m, --modified Run on modified files
|
37
|
+
-v, --version Show version
|
33
38
|
```
|
34
39
|
|
35
40
|
## Requirements
|
@@ -42,6 +47,7 @@ Umarell runs the following tools:
|
|
42
47
|
- [bundler-audit](https://github.com/rubysec/bundler-audit)
|
43
48
|
- [brakeman](https://github.com/presidentbeef/brakeman)
|
44
49
|
- [rubocop](https://github.com/rubocop-hq/rubocop)
|
50
|
+
- [erb-lint](https://github.com/Shopify/erb-lint)
|
45
51
|
- [reek](https://github.com/troessner/reek)
|
46
52
|
- [rails_best_practices](https://github.com/flyerhzm/rails_best_practices)
|
47
53
|
- [fasterer](https://github.com/DamirSvrtan/fasterer)
|
data/assets/umarell.jpg
ADDED
Binary file
|
data/exe/umarell
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
module Umarell
|
6
|
+
# The class responsible of parsing command line arguments
|
7
|
+
class Arguments
|
8
|
+
attr_reader :autofix, :target
|
9
|
+
|
10
|
+
alias autofix? autofix
|
11
|
+
|
12
|
+
DEFAULT_TARGET = './'
|
13
|
+
MODIFIED_FILES_TARGET = '`git ls-files -mo --exclude-standard %s`'
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@autofix = false
|
17
|
+
@modified = false
|
18
|
+
@target = DEFAULT_TARGET
|
19
|
+
end
|
20
|
+
|
21
|
+
# Parse command line arguments
|
22
|
+
def parse
|
23
|
+
parse_options
|
24
|
+
parse_target
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def parse_options
|
30
|
+
OptionParser.new do |opts|
|
31
|
+
opts.banner = 'Usage: umarell [options] [target]'
|
32
|
+
on_autofix(opts)
|
33
|
+
on_modified(opts)
|
34
|
+
on_version(opts)
|
35
|
+
end.parse!
|
36
|
+
rescue OptionParser::InvalidOption => e
|
37
|
+
exit_with_message("#{e.message}, see 'umarell --help'", 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse_target
|
41
|
+
last_argument = ARGV.pop || DEFAULT_TARGET
|
42
|
+
@target = if @modified
|
43
|
+
MODIFIED_FILES_TARGET % last_argument
|
44
|
+
else
|
45
|
+
last_argument
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def on_autofix(opts)
|
50
|
+
opts.on('-a', '--autofix', 'Autofix violations (if supported)') do
|
51
|
+
@autofix = true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def on_modified(opts)
|
56
|
+
opts.on('-m', '--modified', 'Run on modified files') do
|
57
|
+
@modified = true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_version(opts)
|
62
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
63
|
+
exit_with_message(Version::STRING)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def exit_with_message(message, code = 0)
|
68
|
+
puts "umarell: #{message}"
|
69
|
+
exit code
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/umarell/cli.rb
CHANGED
@@ -1,60 +1,54 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative 'arguments'
|
4
|
+
require_relative 'command'
|
4
5
|
|
5
6
|
module Umarell
|
6
7
|
TOOLS = {
|
7
|
-
|
8
|
-
brakeman
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
'bundler-audit' => ['check', '--update'],
|
9
|
+
'brakeman' => ['-w2', '-q', '--no-pager', '--no-summary'],
|
10
|
+
'rubocop' => [],
|
11
|
+
'erblint' => [],
|
12
|
+
'reek' => [],
|
13
|
+
'rails_best_practices': [],
|
14
|
+
'fasterer' => []
|
13
15
|
}.freeze
|
14
16
|
|
17
|
+
AUTOFIX_SUPPORT = %w[rubocop erblint].freeze
|
18
|
+
|
15
19
|
# The class responsible of handling command line logic
|
16
20
|
class CLI
|
17
|
-
def initialize(tools = TOOLS)
|
21
|
+
def initialize(tools = TOOLS, arguments = Arguments.new)
|
18
22
|
@tools = tools
|
19
|
-
@
|
20
|
-
@args = {}
|
21
|
-
@target = ''
|
23
|
+
@arguments = arguments
|
22
24
|
end
|
23
25
|
|
24
26
|
# Entry point to start the application
|
25
27
|
def run
|
26
|
-
|
27
|
-
create_args
|
28
|
+
@arguments.parse
|
28
29
|
run_commands
|
29
30
|
end
|
30
31
|
|
31
32
|
private
|
32
33
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@autofix = true
|
39
|
-
end
|
40
|
-
end.parse!
|
41
|
-
|
42
|
-
@target = ARGV.pop
|
34
|
+
def run_commands
|
35
|
+
@tools.each do |name, options|
|
36
|
+
arguments = command_arguments(name, options)
|
37
|
+
Command.new(name, arguments).run
|
38
|
+
end
|
43
39
|
end
|
44
40
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
41
|
+
def command_arguments(name, options)
|
42
|
+
command_arguments = command_options(name, options)
|
43
|
+
return command_arguments unless @arguments.target
|
48
44
|
|
49
|
-
|
50
|
-
@tools.each do |name, command|
|
51
|
-
run_command(name, command, @args.fetch(name) { [] })
|
52
|
-
end
|
45
|
+
command_arguments + [@arguments.target]
|
53
46
|
end
|
54
47
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
48
|
+
def command_options(name, base_options)
|
49
|
+
return base_options unless AUTOFIX_SUPPORT.include?(name)
|
50
|
+
|
51
|
+
base_options + ['-a']
|
58
52
|
end
|
59
53
|
end
|
60
54
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Umarell
|
4
|
+
# The class responsible for running commands
|
5
|
+
class Command
|
6
|
+
def initialize(name, arguments = [])
|
7
|
+
@name = name
|
8
|
+
@arguments = arguments
|
9
|
+
end
|
10
|
+
|
11
|
+
# Run the command
|
12
|
+
def run
|
13
|
+
system "echo '#{header}'; #{self}; echo '#{footer}'"
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"#{@name} #{@arguments.join(' ')}"
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def header
|
23
|
+
decorate_message("Running #{@name}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def footer
|
27
|
+
decorate_message("#{@name} run complete\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
def decorate_message(string)
|
31
|
+
"\e[1;94m~~~~~~~ [Umarell] #{string}\e[0m"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/umarell/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: umarell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Filippo Liverani
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: brakeman
|
@@ -16,182 +16,182 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler-audit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0.8'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: erb_lint
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: fasterer
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "<"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '0.9'
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "<"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '0.9'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rails_best_practices
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1'
|
75
|
+
version: '1.20'
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1'
|
82
|
+
version: '1.20'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: reek
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
89
|
+
version: '6.0'
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '6.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rubocop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- - "
|
101
|
+
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '1'
|
103
|
+
version: '1.12'
|
90
104
|
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- - "
|
108
|
+
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '1'
|
110
|
+
version: '1.12'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rubocop-performance
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1'
|
117
|
+
version: '1.10'
|
104
118
|
type: :runtime
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1'
|
124
|
+
version: '1.10'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rubocop-rails
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: '2'
|
131
|
+
version: '2.9'
|
118
132
|
type: :runtime
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: '2'
|
138
|
+
version: '2.9'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rubocop-rake
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "<"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '1'
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "<"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '1'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rubocop-rspec
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
145
|
+
version: '0.5'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
152
|
+
version: '0.5'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
154
|
+
name: rubocop-rspec
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: '2'
|
160
|
-
type: :
|
159
|
+
version: '2.2'
|
160
|
+
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: '2'
|
166
|
+
version: '2.2'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: rake
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: '13'
|
173
|
+
version: '13.0'
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '13'
|
180
|
+
version: '13.0'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rspec
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: '3'
|
187
|
+
version: '3.10'
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: '3'
|
194
|
+
version: '3.10'
|
195
195
|
description: All in one Ruby static code analyzer
|
196
196
|
email: hello@nebulab.it
|
197
197
|
executables:
|
@@ -203,15 +203,18 @@ extra_rdoc_files:
|
|
203
203
|
files:
|
204
204
|
- LICENSE.txt
|
205
205
|
- README.md
|
206
|
+
- assets/umarell.jpg
|
206
207
|
- exe/umarell
|
207
208
|
- lib/umarell.rb
|
209
|
+
- lib/umarell/arguments.rb
|
208
210
|
- lib/umarell/cli.rb
|
211
|
+
- lib/umarell/command.rb
|
209
212
|
- lib/umarell/version.rb
|
210
213
|
homepage: https://github.com/nebulab/umarell
|
211
214
|
licenses:
|
212
215
|
- MIT
|
213
216
|
metadata: {}
|
214
|
-
post_install_message:
|
217
|
+
post_install_message:
|
215
218
|
rdoc_options: []
|
216
219
|
require_paths:
|
217
220
|
- lib
|
@@ -219,15 +222,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
219
222
|
requirements:
|
220
223
|
- - ">="
|
221
224
|
- !ruby/object:Gem::Version
|
222
|
-
version: 2.
|
225
|
+
version: 2.5.0
|
223
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
224
227
|
requirements:
|
225
228
|
- - ">="
|
226
229
|
- !ruby/object:Gem::Version
|
227
230
|
version: '0'
|
228
231
|
requirements: []
|
229
|
-
rubygems_version: 3.
|
230
|
-
signing_key:
|
232
|
+
rubygems_version: 3.2.16
|
233
|
+
signing_key:
|
231
234
|
specification_version: 4
|
232
235
|
summary: All in one Ruby static code analyzer
|
233
236
|
test_files: []
|