codeclimate 0.14.1 → 0.14.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7d10a3e340b114a674a576928f4fcfecf003804
4
- data.tar.gz: f457eb3fc54b3e7e63aeb3d64010b57736c4165d
3
+ metadata.gz: 72cddaaaf2d406b672e5dcf23810a2c3c12d5bf1
4
+ data.tar.gz: 8d59b60cd8907a9ac2f797c355aaf74cc8c28e1e
5
5
  SHA512:
6
- metadata.gz: 7abfdf98943e97e6a5c43cb5a63f767e15b98a5b2b67ad2353ed417e3ce2835f8478dbe7b38f7de025128c5f79245db70c67e2faacbff2538e7a237cb0e00265
7
- data.tar.gz: f97c25a43e0e1b44b1f05c6e5bbff19fbbbe5a018bd4008dcadadf28ff233c9951c981c6c7a556cae2ef23a540792854afc22ef74a3f0c8c147b045e724c09e0
6
+ metadata.gz: dcae9739365b050502e5dbeded10610040236b0f9c8ca84b5a5559955f28c34101be489363874bd469748ec61218365f8cfd4fa0b89e6f67dfba122ae72b6609
7
+ data.tar.gz: ffa9d0a75f6fdd2e615e5c1dc02b156c03f35e3f723d40845b9063f4016dbc4d09435fb0c43603cbeaf7cd9905378106bca83fb28409e0b630d8204a0c45ebb0
data/config/engines.yml CHANGED
@@ -12,9 +12,11 @@
12
12
  brakeman:
13
13
  image: codeclimate/codeclimate-brakeman
14
14
  description: Static analysis tool which checks Ruby on Rails applications for security vulnerabilities.
15
- community: true
15
+ community: false
16
+ upgrade_languages:
17
+ - Ruby
16
18
  enable_regexps:
17
- - \.rb$
19
+ - ^script\/rails$
18
20
  default_ratings_paths:
19
21
  - "app/**"
20
22
  - "**.rb"
@@ -114,7 +116,9 @@ nodesecurity:
114
116
  pep8:
115
117
  image: codeclimate/codeclimate-pep8
116
118
  description: Static analysis tool to check Python code against the style conventions outlined in PEP-8.
117
- community: true
119
+ community: false
120
+ upgrade_languages:
121
+ - Python
118
122
  enable_regexps:
119
123
  - \.py$
120
124
  default_ratings_paths:
@@ -150,7 +154,9 @@ phpmd:
150
154
  radon:
151
155
  image: codeclimate/codeclimate-radon
152
156
  description: Python tool used to compute Cyclomatic Complexity.
153
- community: true
157
+ community: false
158
+ upgrade_languages:
159
+ - Python
154
160
  enable_regexps:
155
161
  - \.py$
156
162
  default_ratings_paths:
@@ -1,4 +1,5 @@
1
1
  require "posix/spawn"
2
+ require "thread"
2
3
 
3
4
  module CC
4
5
  module Analyzer
@@ -11,9 +12,17 @@ module CC
11
12
  :stderr, # stderr, for a finished event
12
13
  )
13
14
  ImageRequired = Class.new(StandardError)
14
- Result = Struct.new(:exit_status, :timed_out?, :duration, :stderr)
15
+ Result = Struct.new(
16
+ :exit_status,
17
+ :timed_out?,
18
+ :duration,
19
+ :maximum_output_exceeded?,
20
+ :output_byte_count,
21
+ :stderr,
22
+ )
15
23
 
16
24
  DEFAULT_TIMEOUT = 15 * 60 # 15m
25
+ DEFAULT_MAXIMUM_OUTPUT_BYTES = 500_000_000
17
26
 
18
27
  def initialize(image:, name:, command: nil, listener: ContainerListener.new)
19
28
  raise ImageRequired if image.blank?
@@ -24,7 +33,10 @@ module CC
24
33
  @output_delimeter = "\n"
25
34
  @on_output = ->(*) {}
26
35
  @timed_out = false
36
+ @maximum_output_exceeded = false
27
37
  @stderr_io = StringIO.new
38
+ @output_byte_count = 0
39
+ @counter_mutex = Mutex.new
28
40
  end
29
41
 
30
42
  def on_output(delimeter = "\n", &block)
@@ -43,14 +55,23 @@ module CC
43
55
  t_timeout = timeout_thread
44
56
 
45
57
  _, status = Process.waitpid2(pid)
58
+
46
59
  if @timed_out
47
- @listener.timed_out(container_data(duration: timeout))
48
- Result.new(status.exitstatus, true, timeout, @stderr_io.string)
60
+ duration = timeout
61
+ @listener.timed_out(container_data(duration: duration))
49
62
  else
50
63
  duration = ((Time.now - started) * 1000).round
51
64
  @listener.finished(container_data(duration: duration, status: status))
52
- Result.new(status.exitstatus, false, duration, @stderr_io.string)
53
65
  end
66
+
67
+ Result.new(
68
+ status.exitstatus,
69
+ @timed_out,
70
+ duration,
71
+ @maximum_output_exceeded,
72
+ output_byte_count,
73
+ @stderr_io.string,
74
+ )
54
75
  ensure
55
76
  t_timeout.kill if t_timeout
56
77
  if @timed_out
@@ -71,6 +92,8 @@ module CC
71
92
 
72
93
  private
73
94
 
95
+ attr_reader :output_byte_count, :counter_mutex
96
+
74
97
  def docker_run_command(options)
75
98
  [
76
99
  "docker", "run",
@@ -88,13 +111,17 @@ module CC
88
111
  output = chunk.chomp(@output_delimeter)
89
112
 
90
113
  @on_output.call(output)
114
+ check_output_bytes(output.bytesize)
91
115
  end
92
116
  end
93
117
  end
94
118
 
95
119
  def read_stderr(err)
96
120
  Thread.new do
97
- err.each_line { |line| @stderr_io.write(line) }
121
+ err.each_line do |line|
122
+ @stderr_io.write(line)
123
+ check_output_bytes(line.bytesize)
124
+ end
98
125
  end
99
126
  end
100
127
 
@@ -106,6 +133,17 @@ module CC
106
133
  end
107
134
  end
108
135
 
136
+ def check_output_bytes(last_read_byte_count)
137
+ counter_mutex.synchronize do
138
+ @output_byte_count += last_read_byte_count
139
+ end
140
+
141
+ if output_byte_count > maximum_output_bytes
142
+ @maximum_output_exceeded = true
143
+ stop
144
+ end
145
+ end
146
+
109
147
  def container_data(duration: nil, status: nil)
110
148
  ContainerData.new(@image, @name, duration, status, @stderr_io.string)
111
149
  end
@@ -116,7 +154,11 @@ module CC
116
154
  end
117
155
 
118
156
  def timeout
119
- (ENV["CONTAINER_TIMEOUT_SECONDS"] || DEFAULT_TIMEOUT).to_i
157
+ ENV.fetch("CONTAINER_TIMEOUT_SECONDS", DEFAULT_TIMEOUT).to_i
158
+ end
159
+
160
+ def maximum_output_bytes
161
+ ENV.fetch("CONTAINER_MAXIMUM_OUTPUT_BYTES", DEFAULT_MAXIMUM_OUTPUT_BYTES).to_i
120
162
  end
121
163
  end
122
164
  end
@@ -49,8 +49,8 @@ module CC
49
49
  tmp.write(File.read(".gitignore")) if File.file?(".gitignore")
50
50
  tmp << @cc_exclude_paths.join("\n")
51
51
  tmp.close
52
- tracked_and_ignored = `git ls-files -zi -X #{tmp.path}`.split("\0")
53
- untracked_and_ignored = `git ls-files -zio -X #{tmp.path}`.split("\0")
52
+ tracked_and_ignored = `git ls-files -zi -X #{tmp.path} 2>/dev/null`.split("\0")
53
+ untracked_and_ignored = `git ls-files -zio -X #{tmp.path} 2>/dev/null`.split("\0")
54
54
  tracked_and_ignored + untracked_and_ignored
55
55
  end
56
56
  end
@@ -2,7 +2,7 @@ module CC
2
2
  module CLI
3
3
  class ConfigGenerator
4
4
  CODECLIMATE_YAML = Command::CODECLIMATE_YAML
5
- AUTO_EXCLUDE_PATHS = %w(config/ db/ features/ node_modules/ script/ spec/ test/ vendor/).freeze
5
+ AUTO_EXCLUDE_PATHS = %w(config/ db/ features/ node_modules/ script/ spec/ test/ tests/ vendor/).freeze
6
6
 
7
7
  def self.for(filesystem, engine_registry, upgrade_requested)
8
8
  if upgrade_requested && upgrade_needed?(filesystem)
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.14.1
4
+ version: 0.14.2
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-11-09 00:00:00.000000000 Z
11
+ date: 2015-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport