codeclimate 0.1.4 → 0.1.5
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/lib/cc/analyzer/config.rb +1 -1
- data/lib/cc/analyzer/engine.rb +4 -10
- data/lib/cc/analyzer/engine_registry.rb +13 -2
- data/lib/cc/analyzer/engines_runner.rb +80 -0
- data/lib/cc/analyzer/formatters/formatter.rb +3 -0
- data/lib/cc/analyzer/path_patterns.rb +26 -0
- data/lib/cc/analyzer.rb +11 -3
- data/lib/cc/cli/analyze.rb +13 -74
- data/lib/cc/cli.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed633d34c37b17d582f70edcf4e105f66125b66f
|
4
|
+
data.tar.gz: 196920672b0465ed7ad5b36c073eb6ed26f7721e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed1f6e059f66b75db9c2ca1ec7a7f68de47344060addd304579a3403bee95410f5b6baac4d6520b9549d34234c9458103e4348cc89d640ec636ed88cfccf022a
|
7
|
+
data.tar.gz: 547ec662b6daac3235675a42b83677f6ba9e716bc05046c32f5ef4d33e9f1ec795a3bb52a8e52759d3672978cfd1f1b72ceb8830844b7a7f91bc82f2a465ccbb
|
data/lib/cc/analyzer/config.rb
CHANGED
data/lib/cc/analyzer/engine.rb
CHANGED
@@ -8,11 +8,11 @@ module CC
|
|
8
8
|
|
9
9
|
TIMEOUT = 15 * 60 # 15m
|
10
10
|
|
11
|
-
def initialize(name, metadata, code_path,
|
11
|
+
def initialize(name, metadata, code_path, config, label)
|
12
12
|
@name = name
|
13
13
|
@metadata = metadata
|
14
14
|
@code_path = code_path
|
15
|
-
@
|
15
|
+
@config = config
|
16
16
|
@label = label.to_s
|
17
17
|
end
|
18
18
|
|
@@ -102,7 +102,7 @@ module CC
|
|
102
102
|
|
103
103
|
def config_file
|
104
104
|
path = File.join("/tmp/cc", SecureRandom.uuid)
|
105
|
-
File.write(path, @
|
105
|
+
File.write(path, @config.to_json)
|
106
106
|
path
|
107
107
|
end
|
108
108
|
|
@@ -115,13 +115,7 @@ module CC
|
|
115
115
|
end
|
116
116
|
|
117
117
|
def output_filter
|
118
|
-
@output_filter ||= EngineOutputFilter.new(config)
|
119
|
-
end
|
120
|
-
|
121
|
-
def config
|
122
|
-
# N.B. there is no expected scenario where this would fail so a
|
123
|
-
# parser-error rescue has been omitted intentionally
|
124
|
-
JSON.parse(@config_json)
|
118
|
+
@output_filter ||= EngineOutputFilter.new(@config)
|
125
119
|
end
|
126
120
|
|
127
121
|
CommandFailure = Class.new(StandardError)
|
@@ -3,18 +3,29 @@ require "safe_yaml"
|
|
3
3
|
module CC
|
4
4
|
module Analyzer
|
5
5
|
class EngineRegistry
|
6
|
-
def initialize
|
6
|
+
def initialize(dev_mode = false)
|
7
7
|
@path = File.expand_path("../../../../config/engines.yml", __FILE__)
|
8
8
|
@config = YAML.safe_load_file(@path)
|
9
|
+
@dev_mode = dev_mode
|
9
10
|
end
|
10
11
|
|
11
12
|
def [](engine_name)
|
12
|
-
|
13
|
+
if dev_mode?
|
14
|
+
{ "image" => "codeclimate/codeclimate-#{engine_name}:latest" }
|
15
|
+
else
|
16
|
+
@config[engine_name]
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
def list
|
16
21
|
@config
|
17
22
|
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def dev_mode?
|
27
|
+
@dev_mode
|
28
|
+
end
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
3
|
+
module CC
|
4
|
+
module Analyzer
|
5
|
+
class EnginesRunner
|
6
|
+
InvalidEngineName = Class.new(StandardError)
|
7
|
+
NoEnabledEngines = Class.new(StandardError)
|
8
|
+
|
9
|
+
def initialize(registry, formatter, source_dir, config, container_label = nil)
|
10
|
+
@registry = registry
|
11
|
+
@formatter = formatter
|
12
|
+
@source_dir = source_dir
|
13
|
+
@config = config
|
14
|
+
@container_label = container_label
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
raise NoEnabledEngines if engines.empty?
|
19
|
+
|
20
|
+
Analyzer.logger.info("running #{engines.size} engines")
|
21
|
+
|
22
|
+
@formatter.started
|
23
|
+
|
24
|
+
engines.each { |engine| run_engine(engine) }
|
25
|
+
|
26
|
+
@formatter.finished
|
27
|
+
ensure
|
28
|
+
@formatter.close
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def run_engine(engine)
|
34
|
+
Analyzer.logger.info("starting engine #{engine.name}")
|
35
|
+
|
36
|
+
Analyzer.statsd.time("engines.time") do
|
37
|
+
Analyzer.statsd.time("engines.names.#{engine.name}.time") do
|
38
|
+
@formatter.engine_running(engine) do
|
39
|
+
engine.run(@formatter)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Analyzer.logger.info("finished engine #{engine.name}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def engines
|
48
|
+
@engines ||= enabled_engines.map do |name, config|
|
49
|
+
metadata = registry_lookup(name)
|
50
|
+
label = @container_label || SecureRandom.uuid
|
51
|
+
engine_config = config.merge!(exclude_paths: exclude_paths)
|
52
|
+
|
53
|
+
Engine.new(name, metadata, @source_dir, engine_config, label)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def enabled_engines
|
58
|
+
{}.tap do |ret|
|
59
|
+
@config.engines.each do |name, config|
|
60
|
+
if config.enabled?
|
61
|
+
ret[name] = config
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def registry_lookup(engine_name)
|
68
|
+
if (metadata = @registry[engine_name])
|
69
|
+
metadata
|
70
|
+
else
|
71
|
+
raise InvalidEngineName, "unknown engine name: #{engine_name}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def exclude_paths
|
76
|
+
PathPatterns.new(@config.exclude_paths || []).expanded
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module CC
|
2
|
+
module Analyzer
|
3
|
+
class PathPatterns
|
4
|
+
def initialize(patterns, root = Dir.pwd)
|
5
|
+
@patterns = patterns
|
6
|
+
@root = root
|
7
|
+
end
|
8
|
+
|
9
|
+
def expanded
|
10
|
+
@expanded ||= expand
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def expand
|
16
|
+
results = Dir.chdir(@root) do
|
17
|
+
@patterns.flat_map do |pattern|
|
18
|
+
Dir.glob(pattern)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
results.sort.uniq
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/cc/analyzer.rb
CHANGED
@@ -5,23 +5,31 @@ module CC
|
|
5
5
|
autoload :Engine, "cc/analyzer/engine"
|
6
6
|
autoload :EngineClient, "cc/analyzer/engine_client"
|
7
7
|
autoload :EngineOutputFilter, "cc/analyzer/engine_output_filter"
|
8
|
-
autoload :EngineProcess, "cc/analyzer/engine_process"
|
9
8
|
autoload :EngineRegistry, "cc/analyzer/engine_registry"
|
9
|
+
autoload :EnginesRunner, "cc/analyzer/engines_runner"
|
10
10
|
autoload :Filesystem, "cc/analyzer/filesystem"
|
11
11
|
autoload :Formatters, "cc/analyzer/formatters"
|
12
12
|
autoload :IssueSorter, "cc/analyzer/issue_sorter"
|
13
13
|
autoload :LocationDescription,"cc/analyzer/location_description"
|
14
14
|
autoload :NullConfig, "cc/analyzer/null_config"
|
15
|
+
autoload :PathPatterns, "cc/analyzer/path_patterns"
|
15
16
|
autoload :SourceBuffer, "cc/analyzer/source_buffer"
|
16
17
|
autoload :UnitName, "cc/analyzer/unit_name"
|
17
18
|
|
18
19
|
class DummyStatsd
|
19
|
-
def method_missing(*
|
20
|
+
def method_missing(*)
|
20
21
|
yield if block_given?
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
+
class DummyLogger
|
26
|
+
def method_missing(*)
|
27
|
+
yield if block_given?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
cattr_accessor :statsd, :logger
|
25
32
|
self.statsd = DummyStatsd.new
|
33
|
+
self.logger = DummyLogger.new
|
26
34
|
end
|
27
35
|
end
|
data/lib/cc/cli/analyze.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
require "securerandom"
|
2
|
-
|
3
1
|
module CC
|
4
2
|
module CLI
|
5
3
|
class Analyze < Command
|
6
4
|
include CC::Analyzer
|
7
5
|
|
8
|
-
def initialize(
|
6
|
+
def initialize(_args = [])
|
9
7
|
super
|
10
8
|
|
11
9
|
process_args
|
@@ -13,23 +11,14 @@ module CC
|
|
13
11
|
|
14
12
|
def run
|
15
13
|
require_codeclimate_yml
|
16
|
-
if engines.empty?
|
17
|
-
fatal("No engines enabled. Add some to your .codeclimate.yml file!")
|
18
|
-
end
|
19
|
-
|
20
|
-
formatter.started
|
21
|
-
|
22
|
-
engines.each do |engine|
|
23
|
-
formatter.engine_running(engine) do
|
24
|
-
engine.run(formatter)
|
25
|
-
end
|
26
|
-
end
|
27
14
|
|
28
|
-
formatter
|
29
|
-
|
15
|
+
runner = EnginesRunner.new(registry, formatter, source_dir, config)
|
16
|
+
runner.run
|
30
17
|
|
31
|
-
|
32
|
-
|
18
|
+
rescue EnginesRunner::InvalidEngineName => ex
|
19
|
+
fatal(ex.message)
|
20
|
+
rescue EnginesRunner::NoEnabledEngines
|
21
|
+
fatal("No enabled engines. Add some to your .codeclimate.yml file!")
|
33
22
|
end
|
34
23
|
|
35
24
|
private
|
@@ -47,71 +36,21 @@ module CC
|
|
47
36
|
fatal(e.message)
|
48
37
|
end
|
49
38
|
|
50
|
-
def
|
51
|
-
|
52
|
-
config_body = filesystem.read_path(CODECLIMATE_YAML)
|
53
|
-
config = Config.new(config_body)
|
54
|
-
else
|
55
|
-
config = NullConfig.new
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def engine_registry
|
60
|
-
@engine_registry ||= EngineRegistry.new
|
61
|
-
end
|
62
|
-
|
63
|
-
def engine_config(engine_name)
|
64
|
-
config.engine_config(engine_name).
|
65
|
-
merge!(exclude_paths: exclude_paths).to_json
|
66
|
-
end
|
67
|
-
|
68
|
-
def exclude_paths
|
69
|
-
if config.exclude_paths
|
70
|
-
filesystem.files_matching(config.exclude_paths)
|
71
|
-
else
|
72
|
-
[]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def engines
|
77
|
-
@engines ||= config.engine_names.map do |engine_name|
|
78
|
-
entry = registry_entry(engine_name)
|
79
|
-
if entry.nil?
|
80
|
-
fatal("unknown engine name: #{engine_name}")
|
81
|
-
else
|
82
|
-
Engine.new(
|
83
|
-
engine_name,
|
84
|
-
entry,
|
85
|
-
path,
|
86
|
-
engine_config(engine_name),
|
87
|
-
SecureRandom.uuid
|
88
|
-
)
|
89
|
-
end
|
90
|
-
end.compact
|
39
|
+
def registry
|
40
|
+
EngineRegistry.new(@dev_mode)
|
91
41
|
end
|
92
42
|
|
93
43
|
def formatter
|
94
44
|
@formatter ||= Formatters::PlainTextFormatter.new
|
95
45
|
end
|
96
46
|
|
97
|
-
def
|
98
|
-
ENV[
|
99
|
-
end
|
100
|
-
|
101
|
-
def registry_entry(engine_name)
|
102
|
-
if @dev_mode
|
103
|
-
dev_registry_entry(engine_name)
|
104
|
-
else
|
105
|
-
engine_registry[engine_name]
|
106
|
-
end
|
47
|
+
def source_dir
|
48
|
+
ENV["CODE_PATH"]
|
107
49
|
end
|
108
50
|
|
109
|
-
def
|
110
|
-
|
111
|
-
"image"=>"codeclimate/codeclimate-#{engine_name}:latest"
|
112
|
-
}
|
51
|
+
def config
|
52
|
+
CC::Yaml.parse(filesystem.read_path(CODECLIMATE_YAML))
|
113
53
|
end
|
114
|
-
|
115
54
|
end
|
116
55
|
end
|
117
56
|
end
|
data/lib/cc/cli.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codeclimate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code Climate
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -194,6 +194,7 @@ files:
|
|
194
194
|
- lib/cc/analyzer/engine.rb
|
195
195
|
- lib/cc/analyzer/engine_output_filter.rb
|
196
196
|
- lib/cc/analyzer/engine_registry.rb
|
197
|
+
- lib/cc/analyzer/engines_runner.rb
|
197
198
|
- lib/cc/analyzer/filesystem.rb
|
198
199
|
- lib/cc/analyzer/formatters.rb
|
199
200
|
- lib/cc/analyzer/formatters/formatter.rb
|
@@ -203,6 +204,7 @@ files:
|
|
203
204
|
- lib/cc/analyzer/issue_sorter.rb
|
204
205
|
- lib/cc/analyzer/location_description.rb
|
205
206
|
- lib/cc/analyzer/null_config.rb
|
207
|
+
- lib/cc/analyzer/path_patterns.rb
|
206
208
|
- lib/cc/analyzer/source_buffer.rb
|
207
209
|
- lib/cc/analyzer/unit_name.rb
|
208
210
|
- lib/cc/cli.rb
|