codeclimate_batch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a62949c60a2a8185556f4bfe335d8eb3b7bebaeb
4
+ data.tar.gz: 5bf01dc74e06b2d4e55eee340cc863679640807d
5
+ SHA512:
6
+ metadata.gz: dd5b521bf8557b733a268ea374618d0f6eba55983b6edb65204e30ee49ce18954c1ebd47bbd8beac29ebff56fe82afc9f26f08b801f6331713e717238364723c
7
+ data.tar.gz: ed12cb796cbd4c4c8123f51f448b2566ff157ded29d9d2127e4ee11d4e8d54c2b1b548218dd91c6e40686a9f81dc1a361e6d4be1c3b4396111186af167c0a2d3
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (C) 2013 Michael Grosser <michael@grosser.it>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ # report coverage to code-climate by combining reports from multiple servers
3
+
4
+ # enable local usage from cloned repo
5
+ root = File.expand_path("../..", __FILE__)
6
+ $LOAD_PATH << "#{root}/lib" if File.exist?("#{root}/Gemfile")
7
+
8
+ require 'benchmark'
9
+ require 'optparse'
10
+ require 'codeclimate_batch'
11
+
12
+ options = {}
13
+ OptionParser.new do |opts|
14
+ opts.banner = <<BANNER
15
+ Report a batch of codeclimate results by merging and from multiple servers
16
+
17
+ Usage:
18
+ codeclimate-batch --groups 4
19
+
20
+ Options:
21
+ BANNER
22
+ opts.on("--groups COUNT", Integer, "how many groups are being reports?") { |g| options[:groups] = g }
23
+ opts.on("--key KEY", String, "key to use to report to cc-amend (auto-filled with repo + build-number on travis)") { |k| options[:key] = k }
24
+ opts.on("-h", "--help","Show this.") { puts opts; exit }
25
+ opts.on('-v', '--version','Show Version'){ puts CodeclimateBatch::VERSION; exit}
26
+ end.parse!
27
+
28
+ coverage_files = "#{Dir.tmpdir}/codeclimate-test-coverage-*"
29
+ files = Dir.glob(coverage_files) # if coverage was not run there will be no files
30
+ success = true
31
+
32
+ status = if files.any?
33
+ time = Benchmark.realtime do
34
+ content = CodeclimateBatch.unify(files)
35
+ File.write('report.json', JSON.dump(content))
36
+ key = options[:key] || "#{ENV.fetch('TRAVIS_REPO_SLUG').tr('/', '-')}-#{ENV.fetch('TRAVIS_BUILD_NUMBER')}"
37
+ puts `curl -X POST --data-binary @report.json https://cc-amend.herokuapp.com/amend/#{key}?count=#{options.fetch(:groups)}`
38
+ success = $?.success?
39
+ system("rm -rf #{coverage_files} report.json") # cleanup in case we run locally
40
+ end
41
+ "#{time.round(2)}s to send #{files.size} reports"
42
+ else
43
+ "No files found to report"
44
+ end
45
+
46
+ puts "Code climate: #{status}"
47
+
48
+ exit(success ? 0 : 1)
@@ -0,0 +1,59 @@
1
+ require 'json'
2
+
3
+ module CodeclimateBatch
4
+ class << self
5
+ def unify(coverage_files)
6
+ initial, *rest = coverage_files
7
+ report = load(initial)
8
+ rest.each do |file|
9
+ merge_source_files(report.fetch("source_files"), load(file).fetch("source_files"))
10
+ end
11
+ recalculate_counters(report)
12
+ report
13
+ end
14
+
15
+ private
16
+
17
+ def load(file)
18
+ JSON.load(File.read(file))
19
+ end
20
+
21
+ def recalculate_counters(report)
22
+ source_files = report.fetch("source_files").map { |s| s["line_counts"] }
23
+ report["line_counts"].keys.each do |k|
24
+ report["line_counts"][k] = source_files.map { |s| s[k] }.inject(:+)
25
+ end
26
+ end
27
+
28
+ def merge_source_files(all, source_files)
29
+ source_files.each do |new_file|
30
+ old_file = all.detect { |source_file| source_file["name"] == new_file["name"] }
31
+
32
+ if old_file
33
+ # merge source files
34
+ coverage = merge_coverage(
35
+ JSON.load(new_file.fetch("coverage")),
36
+ JSON.load(old_file.fetch("coverage"))
37
+ )
38
+ old_file["coverage"] = JSON.dump(coverage)
39
+
40
+ total = coverage.size
41
+ missed, covered = coverage.compact.partition { |l| l == 0 }.map(&:size)
42
+ old_file["covered_percent"] = (covered == 0 ? 0.0 : covered * 100.0 / (covered + missed))
43
+ old_file["line_counts"] = {"total" => total, "covered" => covered, "missed" => missed}
44
+ else
45
+ # just use the new value
46
+ all << new_file
47
+ end
48
+ end
49
+ end
50
+
51
+ # [nil,1,0] + [nil,nil,2] -> [nil,1,2]
52
+ def merge_coverage(a,b)
53
+ b.map! do |b_count|
54
+ a_count = a.shift
55
+ (!b_count && !a_count) ? nil : b_count.to_i + a_count.to_i
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module CodeclimateBatch
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: codeclimate_batch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Grosser
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email: michael@grosser.it
29
+ executables:
30
+ - codeclimate-batch
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - MIT-LICENSE
35
+ - bin/codeclimate-batch
36
+ - lib/codeclimate_batch.rb
37
+ - lib/codeclimate_batch/version.rb
38
+ homepage: https://github.com/grosser/codeclimate_batch
39
+ licenses:
40
+ - MIT
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Report a batch of codeclimate results by merging and from multiple servers
62
+ test_files: []