goodcheck 1.3.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/CHANGELOG.md +5 -0
- data/README.md +41 -0
- data/goodcheck.gemspec +1 -0
- data/lib/goodcheck.rb +6 -0
- data/lib/goodcheck/cli.rb +49 -2
- data/lib/goodcheck/commands/check.rb +35 -19
- data/lib/goodcheck/commands/config_loading.rb +3 -2
- data/lib/goodcheck/commands/test.rb +7 -2
- data/lib/goodcheck/config_loader.rb +42 -5
- data/lib/goodcheck/home_path.rb +9 -0
- data/lib/goodcheck/import_loader.rb +89 -0
- data/lib/goodcheck/logger.rb +8 -0
- data/lib/goodcheck/reporters/json.rb +0 -3
- data/lib/goodcheck/version.rb +1 -1
- data/sample.yml +14 -16
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f4ea78ef7a3b4901947a2f42fd9a66789bcba33
|
4
|
+
data.tar.gz: 9a0b7b9028ae1c17ee38b0fd1225fb5e7dbca6f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24db9a20284d894904e8fc8e4a631b2472363c958a9ee4bd3d007b1abad9eec0c00815d3e92b55b51f108011ec8d599132333b0af39857904818274134abd836
|
7
|
+
data.tar.gz: bd81681a1bee7c60a689f4ff9c3f4dd8f9296716dd5c16fda2af51ec55b92f4fa8b9d652821514ea4905bc7192ba5d955911a7fccd974a12459c1a4ac1a7a5ea
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -154,6 +154,26 @@ If you write a string as a `glob`, the string value can be the `pattern` of the
|
|
154
154
|
|
155
155
|
If you omit `glob` attribute in a rule, the rule will be applied to all files given to `goodcheck`.
|
156
156
|
|
157
|
+
## Importing rules
|
158
|
+
|
159
|
+
`goodcheck.yml` can have optional `import` attribute.
|
160
|
+
|
161
|
+
```yaml
|
162
|
+
rules: []
|
163
|
+
import:
|
164
|
+
- /usr/share/goodcheck/rules.yml
|
165
|
+
- lib/goodcheck/rules.yml
|
166
|
+
- https://some.host/shared/rules.yml
|
167
|
+
```
|
168
|
+
|
169
|
+
Value of `import` can be an array of:
|
170
|
+
|
171
|
+
- A string which represents an absolute file path,
|
172
|
+
- A string which represents an relative file path from config file, or
|
173
|
+
- A http/https URL which represents the location of rules
|
174
|
+
|
175
|
+
The rules file is a YAML file with array of rules.
|
176
|
+
|
157
177
|
## Commands
|
158
178
|
|
159
179
|
### `goodcheck init [options]`
|
@@ -180,6 +200,17 @@ Available options are:
|
|
180
200
|
* `-c [CONFIG]`, `--config=[CONFIG]` to specify the configuration file.
|
181
201
|
* `-R [rule]`, `--rule=[rule]` to specify the rules you want to check.
|
182
202
|
* `--format=[text|json]` to specify output format.
|
203
|
+
* `-v`, `--verbose` to be verbose.
|
204
|
+
* `--debug` to print all debug messages.
|
205
|
+
* `--force` to ignore downloaded caches
|
206
|
+
|
207
|
+
`goodcheck check` exits with:
|
208
|
+
|
209
|
+
* `0` when it does not find any matching text fragment
|
210
|
+
* `2` when it finds some matching text
|
211
|
+
* `1` when it finds some error
|
212
|
+
|
213
|
+
You can check its exit status to identify if the tool find some pattern or not.
|
183
214
|
|
184
215
|
### `goodcheck test [options]`
|
185
216
|
|
@@ -195,6 +226,16 @@ Use `test` command when you add new rule to be sure you are writing rules correc
|
|
195
226
|
Available options is:
|
196
227
|
|
197
228
|
* `-c [CONFIG]`, `--config=[CONFIG]` to specify the configuration file.
|
229
|
+
* `-v`, `--verbose` to be verbose.
|
230
|
+
* `--debug` to print all debug messages.
|
231
|
+
* `--force` to ignore downloaded caches
|
232
|
+
|
233
|
+
## Downloaded rules
|
234
|
+
|
235
|
+
Downloaded rules are cached in `cache` directory in *goodcheck home directory*.
|
236
|
+
The *goodcheck home directory* is `~/.goodcheck`, but you can customize the location with `GOODCHECK_HOME` environment variable.
|
237
|
+
|
238
|
+
The cache expires in 3 minutes.
|
198
239
|
|
199
240
|
## Docker image
|
200
241
|
|
data/goodcheck.gemspec
CHANGED
data/lib/goodcheck.rb
CHANGED
@@ -5,9 +5,14 @@ require "yaml"
|
|
5
5
|
require "json"
|
6
6
|
require "active_support/core_ext/hash/indifferent_access"
|
7
7
|
require "active_support/core_ext/integer/inflections"
|
8
|
+
require "active_support/tagged_logging"
|
8
9
|
require "rainbow"
|
10
|
+
require "digest/sha2"
|
11
|
+
require "httpclient"
|
9
12
|
|
10
13
|
require "goodcheck/version"
|
14
|
+
require "goodcheck/logger"
|
15
|
+
require "goodcheck/home_path"
|
11
16
|
|
12
17
|
require "goodcheck/glob"
|
13
18
|
require "goodcheck/buffer"
|
@@ -25,3 +30,4 @@ require "goodcheck/commands/config_loading"
|
|
25
30
|
require "goodcheck/commands/check"
|
26
31
|
require "goodcheck/commands/init"
|
27
32
|
require "goodcheck/commands/test"
|
33
|
+
require "goodcheck/import_loader"
|
data/lib/goodcheck/cli.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require "optparse"
|
2
2
|
|
3
|
+
Version = Goodcheck::VERSION
|
4
|
+
|
3
5
|
module Goodcheck
|
4
6
|
class CLI
|
5
7
|
attr_reader :stdout
|
@@ -35,11 +37,21 @@ module Goodcheck
|
|
35
37
|
1
|
36
38
|
end
|
37
39
|
|
40
|
+
def home_path
|
41
|
+
if (path = ENV["GOODCHECK_HOME"])
|
42
|
+
Pathname(path)
|
43
|
+
else
|
44
|
+
Pathname(Dir.home) + ".goodcheck"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
38
48
|
def check(args)
|
39
49
|
config_path = Pathname("goodcheck.yml")
|
40
50
|
targets = []
|
41
51
|
rules = []
|
42
52
|
format = nil
|
53
|
+
loglevel = Logger::ERROR
|
54
|
+
force_download = false
|
43
55
|
|
44
56
|
OptionParser.new("Usage: goodcheck check [options] dirs...") do |opts|
|
45
57
|
opts.on("-c CONFIG", "--config=CONFIG") do |config|
|
@@ -51,8 +63,19 @@ module Goodcheck
|
|
51
63
|
opts.on("--format=<text|json> [default: 'text']") do |f|
|
52
64
|
format = f
|
53
65
|
end
|
66
|
+
opts.on("-v", "--verbose") do
|
67
|
+
loglevel = Logger::INFO
|
68
|
+
end
|
69
|
+
opts.on("-d", "--debug") do
|
70
|
+
loglevel = Logger::DEBUG
|
71
|
+
end
|
72
|
+
opts.on("--force") do
|
73
|
+
force_download = true
|
74
|
+
end
|
54
75
|
end.parse!(args)
|
55
76
|
|
77
|
+
Goodcheck.logger.level = loglevel
|
78
|
+
|
56
79
|
if args.empty?
|
57
80
|
targets << Pathname(".")
|
58
81
|
else
|
@@ -69,19 +92,43 @@ module Goodcheck
|
|
69
92
|
return 1
|
70
93
|
end
|
71
94
|
|
72
|
-
|
95
|
+
Goodcheck.logger.info "Configuration = #{config_path}"
|
96
|
+
Goodcheck.logger.info "Rules = [#{rules.join(", ")}]"
|
97
|
+
Goodcheck.logger.info "Format = #{format}"
|
98
|
+
Goodcheck.logger.info "Targets = [#{targets.join(", ")}]"
|
99
|
+
Goodcheck.logger.info "Force download = #{force_download}"
|
100
|
+
Goodcheck.logger.info "Home path = #{home_path}"
|
101
|
+
|
102
|
+
Commands::Check.new(reporter: reporter, config_path: config_path, rules: rules, targets: targets, stderr: stderr, force_download: force_download, home_path: home_path).run
|
73
103
|
end
|
74
104
|
|
75
105
|
def test(args)
|
76
106
|
config_path = Pathname("goodcheck.yml")
|
107
|
+
loglevel = Logger::ERROR
|
108
|
+
force_download = false
|
77
109
|
|
78
110
|
OptionParser.new("Usage: goodcheck test [options]") do |opts|
|
79
111
|
opts.on("-c CONFIG", "--config=CONFIG") do |config|
|
80
112
|
config_path = Pathname(config)
|
81
113
|
end
|
114
|
+
opts.on("-v", "--verbose") do
|
115
|
+
loglevel = Logger::INFO
|
116
|
+
end
|
117
|
+
opts.on("-d", "--debug") do
|
118
|
+
loglevel = Logger::DEBUG
|
119
|
+
end
|
120
|
+
opts.on("--force") do
|
121
|
+
force_download = true
|
122
|
+
end
|
82
123
|
end.parse!(args)
|
83
124
|
|
84
|
-
|
125
|
+
Goodcheck.logger.level = loglevel
|
126
|
+
|
127
|
+
Goodcheck.logger.info "Configuration = #{config_path}"
|
128
|
+
Goodcheck.logger.info "Force download = #{force_download}"
|
129
|
+
Goodcheck.logger.info "Home path = #{home_path}"
|
130
|
+
|
131
|
+
Commands::Test.new(stdout: stdout, stderr: stderr, config_path: config_path, force_download: force_download, home_path: home_path).run
|
85
132
|
end
|
86
133
|
|
87
134
|
def init(args)
|
@@ -6,30 +6,39 @@ module Goodcheck
|
|
6
6
|
attr_reader :targets
|
7
7
|
attr_reader :reporter
|
8
8
|
attr_reader :stderr
|
9
|
+
attr_reader :force_download
|
10
|
+
attr_reader :home_path
|
9
11
|
|
10
12
|
include ConfigLoading
|
13
|
+
include HomePath
|
11
14
|
|
12
|
-
def initialize(config_path:, rules:, targets:, reporter:, stderr:)
|
15
|
+
def initialize(config_path:, rules:, targets:, reporter:, stderr:, home_path:, force_download:)
|
13
16
|
@config_path = config_path
|
14
17
|
@rules = rules
|
15
18
|
@targets = targets
|
16
19
|
@reporter = reporter
|
17
20
|
@stderr = stderr
|
21
|
+
@force_download = force_download
|
22
|
+
@home_path = home_path
|
18
23
|
end
|
19
24
|
|
20
25
|
def run
|
26
|
+
issue_reported = false
|
27
|
+
|
21
28
|
reporter.analysis do
|
22
|
-
load_config!
|
29
|
+
load_config!(force_download: force_download, cache_path: cache_dir_path)
|
23
30
|
each_check do |buffer, rule|
|
24
31
|
reporter.rule(rule) do
|
25
32
|
analyzer = Analyzer.new(rule: rule, buffer: buffer)
|
26
33
|
analyzer.scan do |issue|
|
34
|
+
issue_reported = true
|
27
35
|
reporter.issue(issue)
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
32
|
-
|
40
|
+
|
41
|
+
issue_reported ? 2 : 0
|
33
42
|
rescue Psych::Exception => exn
|
34
43
|
stderr.puts "Unexpected error happens while loading YAML file: #{exn.inspect}"
|
35
44
|
exn.backtrace.each do |trace_loc|
|
@@ -46,25 +55,32 @@ module Goodcheck
|
|
46
55
|
|
47
56
|
def each_check
|
48
57
|
targets.each do |target|
|
49
|
-
|
50
|
-
|
51
|
-
|
58
|
+
Goodcheck.logger.info "Checking target: #{target}"
|
59
|
+
Goodcheck.logger.tagged target.to_s do
|
60
|
+
each_file target, immediate: true do |path|
|
61
|
+
Goodcheck.logger.debug "Checking file: #{path}"
|
62
|
+
Goodcheck.logger.tagged path.to_s do
|
63
|
+
reporter.file(path) do
|
64
|
+
buffers = {}
|
52
65
|
|
53
|
-
|
54
|
-
|
55
|
-
|
66
|
+
config.rules_for_path(path, rules_filter: rules) do |rule, glob|
|
67
|
+
Goodcheck.logger.debug "Checking rule: #{rule.id}"
|
68
|
+
begin
|
69
|
+
encoding = glob&.encoding || Encoding.default_external.name
|
56
70
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
71
|
+
if buffers[encoding]
|
72
|
+
buffer = buffers[encoding]
|
73
|
+
else
|
74
|
+
content = path.read(encoding: encoding).encode(Encoding.default_internal || Encoding::UTF_8)
|
75
|
+
buffer = Buffer.new(path: path, content: content)
|
76
|
+
buffers[encoding] = buffer
|
77
|
+
end
|
64
78
|
|
65
|
-
|
66
|
-
|
67
|
-
|
79
|
+
yield buffer, rule
|
80
|
+
rescue ArgumentError => exn
|
81
|
+
stderr.puts "#{path}: #{exn.inspect}"
|
82
|
+
end
|
83
|
+
end
|
68
84
|
end
|
69
85
|
end
|
70
86
|
end
|
@@ -3,9 +3,10 @@ module Goodcheck
|
|
3
3
|
module ConfigLoading
|
4
4
|
attr_reader :config
|
5
5
|
|
6
|
-
def load_config!
|
6
|
+
def load_config!(force_download:, cache_path:)
|
7
|
+
import_loader = ImportLoader.new(cache_path: cache_path, force_download: force_download, config_path: config_path)
|
7
8
|
content = JSON.parse(JSON.dump(YAML.load(config_path.read, config_path.to_s)), symbolize_names: true)
|
8
|
-
loader = ConfigLoader.new(path: config_path, content: content, stderr: stderr)
|
9
|
+
loader = ConfigLoader.new(path: config_path, content: content, stderr: stderr, import_loader: import_loader)
|
9
10
|
@config = loader.load
|
10
11
|
end
|
11
12
|
end
|
@@ -2,19 +2,24 @@ module Goodcheck
|
|
2
2
|
module Commands
|
3
3
|
class Test
|
4
4
|
include ConfigLoading
|
5
|
+
include HomePath
|
5
6
|
|
6
7
|
attr_reader :stdout
|
7
8
|
attr_reader :stderr
|
8
9
|
attr_reader :config_path
|
10
|
+
attr_reader :home_path
|
11
|
+
attr_reader :force_download
|
9
12
|
|
10
|
-
def initialize(stdout:, stderr:, config_path:)
|
13
|
+
def initialize(stdout:, stderr:, config_path:, force_download:, home_path:)
|
11
14
|
@stdout = stdout
|
12
15
|
@stderr = stderr
|
13
16
|
@config_path = config_path
|
17
|
+
@force_download = force_download
|
18
|
+
@home_path = home_path
|
14
19
|
end
|
15
20
|
|
16
21
|
def run
|
17
|
-
load_config!
|
22
|
+
load_config!(cache_path: cache_dir_path, force_download: force_download)
|
18
23
|
|
19
24
|
validate_rule_uniqueness or return 1
|
20
25
|
validate_rules or return 1
|
@@ -32,28 +32,65 @@ module Goodcheck
|
|
32
32
|
|
33
33
|
let :rules, array(rule)
|
34
34
|
|
35
|
-
let :
|
35
|
+
let :import_target, string
|
36
|
+
let :imports, array(import_target)
|
37
|
+
|
38
|
+
let :config, object(rules: rules, import: optional(imports))
|
36
39
|
end
|
37
40
|
|
38
41
|
attr_reader :path
|
39
42
|
attr_reader :content
|
40
43
|
attr_reader :stderr
|
41
44
|
attr_reader :printed_warnings
|
45
|
+
attr_reader :import_loader
|
42
46
|
|
43
|
-
def initialize(path:, content:, stderr:)
|
47
|
+
def initialize(path:, content:, stderr:, import_loader:)
|
44
48
|
@path = path
|
45
49
|
@content = content
|
46
50
|
@stderr = stderr
|
47
51
|
@printed_warnings = Set.new
|
52
|
+
@import_loader = import_loader
|
48
53
|
end
|
49
54
|
|
50
55
|
def load
|
51
|
-
|
52
|
-
|
53
|
-
|
56
|
+
Goodcheck.logger.info "Loading configuration: #{path}"
|
57
|
+
Goodcheck.logger.tagged "#{path}" do
|
58
|
+
Schema.config.coerce(content)
|
59
|
+
|
60
|
+
rules = []
|
61
|
+
|
62
|
+
load_rules(rules, content[:rules])
|
63
|
+
|
64
|
+
Array(content[:import]).each do |import|
|
65
|
+
load_import rules, import
|
66
|
+
end
|
67
|
+
|
68
|
+
Config.new(rules: rules)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def load_rules(rules, array)
|
73
|
+
array.each do |hash|
|
74
|
+
rules << load_rule(hash)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def load_import(rules, import)
|
79
|
+
Goodcheck.logger.info "Importing rules from #{import}"
|
80
|
+
|
81
|
+
Goodcheck.logger.tagged import do
|
82
|
+
import_loader.load(import) do |content|
|
83
|
+
json = JSON.parse(JSON.dump(YAML.load(content, import)), symbolize_names: true)
|
84
|
+
|
85
|
+
Schema.rules.coerce json
|
86
|
+
load_rules(rules, json)
|
87
|
+
end
|
88
|
+
end
|
54
89
|
end
|
55
90
|
|
56
91
|
def load_rule(hash)
|
92
|
+
Goodcheck.logger.debug "Loading rule: #{hash[:id]}"
|
93
|
+
|
57
94
|
id = hash[:id]
|
58
95
|
patterns = retrieve_patterns(hash)
|
59
96
|
justifications = array(hash[:justification])
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Goodcheck
|
2
|
+
class ImportLoader
|
3
|
+
class UnexpectedSchemaError < StandardError
|
4
|
+
attr_reader :uri
|
5
|
+
|
6
|
+
def initialize(uri)
|
7
|
+
@uri = uri
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :cache_path
|
12
|
+
attr_reader :expires_in
|
13
|
+
attr_reader :force_download
|
14
|
+
attr_reader :config_path
|
15
|
+
|
16
|
+
def initialize(cache_path:, expires_in: 3 * 60, force_download:, config_path:)
|
17
|
+
@cache_path = cache_path
|
18
|
+
@expires_in = expires_in
|
19
|
+
@force_download = force_download
|
20
|
+
@config_path = config_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def load(name, &block)
|
24
|
+
uri = URI.parse(name)
|
25
|
+
|
26
|
+
case uri.scheme
|
27
|
+
when nil, "file"
|
28
|
+
load_file uri, &block
|
29
|
+
when "http", "https"
|
30
|
+
load_http uri, &block
|
31
|
+
else
|
32
|
+
raise UnexpectedSchemaError.new("Unexpected URI schema: #{uri.class.name}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def load_file(uri)
|
37
|
+
path = (config_path.parent + uri.path)
|
38
|
+
|
39
|
+
begin
|
40
|
+
yield path.read
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def cache_name(uri)
|
45
|
+
Digest::SHA2.hexdigest(uri.to_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
def load_http(uri)
|
49
|
+
hash = cache_name(uri)
|
50
|
+
path = cache_path + hash
|
51
|
+
|
52
|
+
Goodcheck.logger.info "Calculated cache name: #{hash}"
|
53
|
+
|
54
|
+
download = false
|
55
|
+
|
56
|
+
if force_download
|
57
|
+
Goodcheck.logger.debug "Downloading: force flag"
|
58
|
+
download = true
|
59
|
+
end
|
60
|
+
|
61
|
+
if !download && !path.file?
|
62
|
+
Goodcheck.logger.debug "Downloading: no cache found"
|
63
|
+
download = true
|
64
|
+
end
|
65
|
+
|
66
|
+
if !download && path.mtime + expires_in < Time.now
|
67
|
+
Goodcheck.logger.debug "Downloading: cache expired"
|
68
|
+
download = true
|
69
|
+
end
|
70
|
+
|
71
|
+
if download
|
72
|
+
path.rmtree if path.exist?
|
73
|
+
Goodcheck.logger.info "Downloading content..."
|
74
|
+
content = HTTPClient.new.get_content(uri)
|
75
|
+
Goodcheck.logger.debug "Downloaded content: #{content[0, 1024].inspect}#{content.size > 1024 ? "..." : ""}"
|
76
|
+
yield content
|
77
|
+
write_cache uri, content
|
78
|
+
else
|
79
|
+
Goodcheck.logger.info "Reading content from cache..."
|
80
|
+
yield path.read
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def write_cache(uri, content)
|
85
|
+
path = cache_path + cache_name(uri)
|
86
|
+
path.write(content)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -12,7 +12,6 @@ module Goodcheck
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def analysis
|
15
|
-
stderr.puts "Starting analysis..."
|
16
15
|
yield
|
17
16
|
|
18
17
|
json = issues.map do |issue|
|
@@ -34,12 +33,10 @@ module Goodcheck
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def file(path)
|
37
|
-
stderr.puts "Checking #{path}..."
|
38
36
|
yield
|
39
37
|
end
|
40
38
|
|
41
39
|
def rule(rule)
|
42
|
-
stderr.puts " Checking #{rule.id}..."
|
43
40
|
yield
|
44
41
|
end
|
45
42
|
|
data/lib/goodcheck/version.rb
CHANGED
data/sample.yml
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
rules:
|
2
|
+
- id: sample.typo
|
3
|
+
pattern:
|
4
|
+
- Github
|
5
|
+
- FaceBook
|
6
|
+
message: |
|
7
|
+
Write GitHub and Facebook
|
8
|
+
|
9
|
+
Their names are GitHub and Facebook.
|
10
|
+
Maybe, you are misspelling.
|
11
|
+
pass: GitHub
|
12
|
+
fail: Github
|
2
13
|
- id: sample.debug_print
|
3
14
|
pattern:
|
4
15
|
- token: pp
|
@@ -10,19 +21,6 @@ rules:
|
|
10
21
|
- render "app/views/welcome.html.erb"
|
11
22
|
fail:
|
12
23
|
- pp("Hello World")
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
glob: "**/*.rb"
|
17
|
-
message: |
|
18
|
-
You can use #first instead of [0]
|
19
|
-
pass: array.first
|
20
|
-
fail: array[0]
|
21
|
-
- id: sample.closed_range
|
22
|
-
pattern:
|
23
|
-
- token: ...
|
24
|
-
glob: "**/*.rb"
|
25
|
-
message: |
|
26
|
-
Generally .. is better than ...
|
27
|
-
fail: 1...3
|
28
|
-
pass: 1..4
|
24
|
+
|
25
|
+
import:
|
26
|
+
- https://gist.githubusercontent.com/soutaro/6362c89acd7d6771ae6ebfc615be402d/raw/7f04b973c2c8df70783cd7deb955ab95d1375b2d/sample.yml
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goodcheck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 3.0.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: httpclient
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 2.8.3
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.8.3
|
97
111
|
description: Regexp based customizable linter
|
98
112
|
email:
|
99
113
|
- matsumoto@soutaro.com
|
@@ -126,8 +140,11 @@ files:
|
|
126
140
|
- lib/goodcheck/config.rb
|
127
141
|
- lib/goodcheck/config_loader.rb
|
128
142
|
- lib/goodcheck/glob.rb
|
143
|
+
- lib/goodcheck/home_path.rb
|
144
|
+
- lib/goodcheck/import_loader.rb
|
129
145
|
- lib/goodcheck/issue.rb
|
130
146
|
- lib/goodcheck/location.rb
|
147
|
+
- lib/goodcheck/logger.rb
|
131
148
|
- lib/goodcheck/pattern.rb
|
132
149
|
- lib/goodcheck/reporters/json.rb
|
133
150
|
- lib/goodcheck/reporters/text.rb
|