codacy-coverage 0.0.1
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 +7 -0
- data/.gitignore +23 -0
- data/Gemfile +8 -0
- data/codacy-coverage.gemspec +24 -0
- data/lib/codacy-coverage.rb +6 -0
- data/lib/codacy/client.rb +52 -0
- data/lib/codacy/configuration.rb +40 -0
- data/lib/codacy/formatter.rb +19 -0
- data/lib/codacy/git.rb +30 -0
- data/lib/codacy/parser.rb +39 -0
- data/lib/codacy/reporter.rb +10 -0
- data/ruby-codacy-coverage.iml +9 -0
- data/spec/codacy/git_spec.rb +18 -0
- data/spec/spec_helper.rb +12 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ed371108f2d9c6b2f61a19b7ea7aba4e9557e194
|
4
|
+
data.tar.gz: 0727932b29163f3e42e9754cfbc56d21beb74bdf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a6adaf3d319cc860ac86d290900db388031ddf20f7fbb1b0b1925aa2d34493ac272661d274e9e75c7ba87f1d20de6b4db6892d8d5c3f4a6eddcea0f0ecbc1716
|
7
|
+
data.tar.gz: e562e27817edb1926519cc1c51ed38411be78a640c5b80338a6af2a189d6f9fba17da643c27985dfc36e3f44206c4a2f7ccbd7cc8c93601e231dbc6fdbe1c956
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
|
19
|
+
.idea/
|
20
|
+
.idea_modules/
|
21
|
+
|
22
|
+
.DS_Store
|
23
|
+
/vendor/
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Nuno Teixeira"]
|
6
|
+
gem.email = ["nuno@codacy.com"]
|
7
|
+
gem.description = "Post code coverage results to Codacy."
|
8
|
+
gem.summary = "Post code coverage results to Codacy."
|
9
|
+
gem.homepage = "https://codacy.com"
|
10
|
+
gem.license = "MIT"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split($\)
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
+
gem.name = "codacy-coverage"
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.version = '0.0.1'
|
18
|
+
|
19
|
+
gem.required_ruby_version = '>= 1.8.7'
|
20
|
+
|
21
|
+
gem.add_dependency 'simplecov', '~> 0.10.0'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'bundler', '~> 1.7'
|
24
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'rest_client'
|
3
|
+
|
4
|
+
module Codacy
|
5
|
+
module ClientAPI
|
6
|
+
def self.post_results(parsed_result)
|
7
|
+
logger.info('Preparing payload...')
|
8
|
+
logger.debug(parsed_result)
|
9
|
+
|
10
|
+
project_token = ENV['CODACY_PROJECT_TOKEN']
|
11
|
+
codacy_base_api = ENV['CODACY_BASE_API_URL'] || 'https://api.codacy.com'
|
12
|
+
commit = Codacy::Git.commit_id
|
13
|
+
url = codacy_base_api + '/2.0/coverage/' + commit + '/ruby'
|
14
|
+
|
15
|
+
result = parsed_result.to_json
|
16
|
+
|
17
|
+
if project_token.to_s == ''
|
18
|
+
logger.error 'Could not find Codacy API token, make sure you have it configured in your environment.'
|
19
|
+
false
|
20
|
+
elsif commit.to_s == ''
|
21
|
+
logger.error 'Could not find the current commit, make sure that you are running inside a git project.'
|
22
|
+
false
|
23
|
+
else
|
24
|
+
logger.info('Posting ' + result.to_s.bytes.length.to_s + ' bytes to ' + url)
|
25
|
+
response = send_request(url, result, project_token)
|
26
|
+
|
27
|
+
logger.info(response)
|
28
|
+
response.to_s.include? 'success'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.send_request(url, request, project_token, redirects = 3)
|
33
|
+
RestClient.post(
|
34
|
+
url,
|
35
|
+
request,
|
36
|
+
'project_token' => project_token,
|
37
|
+
:content_type => :json
|
38
|
+
) do |resp, req, result, &block|
|
39
|
+
if [301, 302, 307].include? resp.code and redirects > 0
|
40
|
+
redirected_url = resp.headers[:location]
|
41
|
+
send_request(redirected_url, req, project_token, redirects - 1)
|
42
|
+
else
|
43
|
+
resp.return!(req, result, &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.logger
|
49
|
+
Codacy::Configuration.logger
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module Codacy
|
5
|
+
module Configuration
|
6
|
+
|
7
|
+
def self.logger
|
8
|
+
log_filename = self.temp_dir + 'codacy-coverage_' + Date.today.to_s + '.log'
|
9
|
+
log_file = File.open(log_filename, 'a')
|
10
|
+
|
11
|
+
logger_file = Logger.new(log_file)
|
12
|
+
logger_file.level = Logger::DEBUG
|
13
|
+
|
14
|
+
logger_stdout = Logger.new(STDOUT)
|
15
|
+
logger_stdout.level = Logger::INFO
|
16
|
+
|
17
|
+
log = MultiLogger.new(logger_stdout, logger_file)
|
18
|
+
|
19
|
+
log
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.temp_dir
|
23
|
+
directory_name = Dir.tmpdir + "/codacy-coverage/"
|
24
|
+
Dir.mkdir(directory_name) unless File.exists?(directory_name)
|
25
|
+
directory_name
|
26
|
+
end
|
27
|
+
|
28
|
+
class MultiLogger
|
29
|
+
def initialize(*targets)
|
30
|
+
@targets = targets
|
31
|
+
end
|
32
|
+
|
33
|
+
%w(log debug info warn error fatal unknown).each do |m|
|
34
|
+
define_method(m) do |*args|
|
35
|
+
@targets.map { |t| t.send(m, *args) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Codacy
|
2
|
+
class Formatter
|
3
|
+
|
4
|
+
def format(result)
|
5
|
+
parse_result = Codacy::Parser.parse_file(result)
|
6
|
+
Codacy::ClientAPI.post_results(parse_result)
|
7
|
+
rescue => ex
|
8
|
+
logger.fatal(ex)
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def logger
|
15
|
+
Codacy::Configuration.logger
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/codacy/git.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Codacy
|
2
|
+
class Git
|
3
|
+
def self.commit_id
|
4
|
+
|
5
|
+
commit = ENV['TRAVIS_COMMIT'] ||
|
6
|
+
ENV['DRONE_COMMIT'] ||
|
7
|
+
ENV['GIT_COMMIT'] ||
|
8
|
+
ENV['CIRCLE_SHA1'] ||
|
9
|
+
ENV['CI_COMMIT_ID'] ||
|
10
|
+
ENV['WERCKER_GIT_COMMIT'] ||
|
11
|
+
git_commit
|
12
|
+
|
13
|
+
commit
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def self.git_commit
|
19
|
+
git("log -1 --pretty=format:'%H'")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.git_dir
|
23
|
+
return Dir.pwd
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.git(command)
|
27
|
+
`git --git-dir="#{git_dir}/.git" #{command}`
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Codacy
|
2
|
+
module Parser
|
3
|
+
|
4
|
+
def self.parse_file(simplecov_result)
|
5
|
+
project_dir = Dir.pwd
|
6
|
+
|
7
|
+
logger.info("Parsing simplecov result to Codacy format...")
|
8
|
+
logger.debug(simplecov_result.original_result)
|
9
|
+
|
10
|
+
file_reports = simplecov_result.original_result.map do |k, v|
|
11
|
+
file_dir = k.sub(project_dir, "").sub("/", "")
|
12
|
+
coverage_lines = v.each_with_index.map do |covered, lineNr|
|
13
|
+
if !covered.nil? && covered > 0
|
14
|
+
[(lineNr + 1).to_s, covered]
|
15
|
+
else
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end.compact
|
19
|
+
lines_covered = v.compact.length == 0 ? 0 : ((coverage_lines.length.to_f / v.compact.length) * 100).round
|
20
|
+
Hash[
|
21
|
+
[['filename', file_dir],
|
22
|
+
['total', lines_covered],
|
23
|
+
['coverage', Hash[coverage_lines]]]
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
total = simplecov_result.source_files.covered_percent.round
|
28
|
+
|
29
|
+
Hash[[['total', total], ['fileReports', file_reports]]]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def self.logger
|
36
|
+
Codacy::Configuration.logger
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
4
|
+
<exclude-output />
|
5
|
+
<content url="file://$MODULE_DIR$" />
|
6
|
+
<orderEntry type="inheritedJdk" />
|
7
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
8
|
+
</component>
|
9
|
+
</module>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Codacy::Git do
|
4
|
+
describe 'commit hash' do
|
5
|
+
it 'recognizes CI environment variable.' do
|
6
|
+
expected_git_hash = "123456789"
|
7
|
+
|
8
|
+
original_val = ENV['TRAVIS_COMMIT']
|
9
|
+
ENV['TRAVIS_COMMIT'] = expected_git_hash
|
10
|
+
|
11
|
+
result = Codacy::Git.commit_id
|
12
|
+
|
13
|
+
ENV['TRAVIS_COMMIT'] = original_val
|
14
|
+
|
15
|
+
expect(result).to eq expected_git_hash
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: codacy-coverage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nuno Teixeira
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: simplecov
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.10.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.10.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.7'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.7'
|
41
|
+
description: Post code coverage results to Codacy.
|
42
|
+
email:
|
43
|
+
- nuno@codacy.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- codacy-coverage.gemspec
|
51
|
+
- lib/codacy-coverage.rb
|
52
|
+
- lib/codacy/client.rb
|
53
|
+
- lib/codacy/configuration.rb
|
54
|
+
- lib/codacy/formatter.rb
|
55
|
+
- lib/codacy/git.rb
|
56
|
+
- lib/codacy/parser.rb
|
57
|
+
- lib/codacy/reporter.rb
|
58
|
+
- ruby-codacy-coverage.iml
|
59
|
+
- spec/codacy/git_spec.rb
|
60
|
+
- spec/spec_helper.rb
|
61
|
+
homepage: https://codacy.com
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
metadata: {}
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.8.7
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.0.14
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Post code coverage results to Codacy.
|
85
|
+
test_files:
|
86
|
+
- spec/codacy/git_spec.rb
|
87
|
+
- spec/spec_helper.rb
|