codeclimate_ci 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 +22 -0
- data/.rspec +2 -0
- data/.rubocop.yml +20 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +88 -0
- data/Rakefile +20 -0
- data/bin/bootstrap +9 -0
- data/bin/build +6 -0
- data/bin/codeclimate_ci +6 -0
- data/bin/quality +5 -0
- data/bin/rspec +16 -0
- data/bin/rubocop +16 -0
- data/codeclimate_ci.gemspec +28 -0
- data/lib/codeclimate_ci.rb +13 -0
- data/lib/codeclimate_ci/api_requester.rb +21 -0
- data/lib/codeclimate_ci/cli.rb +63 -0
- data/lib/codeclimate_ci/compare_gpa.rb +29 -0
- data/lib/codeclimate_ci/configuration.rb +23 -0
- data/lib/codeclimate_ci/get_gpa.rb +57 -0
- data/lib/codeclimate_ci/report.rb +25 -0
- data/lib/codeclimate_ci/version.rb +3 -0
- data/spec/codeclimate_ci/api_requester_spec.rb +43 -0
- data/spec/codeclimate_ci/cli_spec.rb +74 -0
- data/spec/codeclimate_ci/compare_gpa_spec.rb +22 -0
- data/spec/codeclimate_ci/configuration_spec.rb +27 -0
- data/spec/codeclimate_ci/get_gpa_spec.rb +50 -0
- data/spec/spec_helper.rb +18 -0
- metadata +191 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee4a00ffa704653de7b1d23ceb5ccec2decc0139
|
4
|
+
data.tar.gz: 86709e7f8f42b75b45668ccf6ce850605af2b644
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79ff48cf5ea167945e37430cedc4998e36a7cc251053214ccae397177e74853f1af2f9b66aea6310b2fcc053456f72c9dd26deae32a6552c5b19786977dc7b40
|
7
|
+
data.tar.gz: 1b17c55c143981c362445ab6a7d6f187f3c291e4463310ab61259d67a709b355e6f669b88c4b9913ef3954190e33cec7c1fa7bd273236bf8c3448230dd09a7cf
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
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
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
AllCops:
|
2
|
+
RunRailsCops: false
|
3
|
+
Excludes:
|
4
|
+
- bin/**
|
5
|
+
- codeclimate_ci.gemspec
|
6
|
+
|
7
|
+
Documentation:
|
8
|
+
Description: 'Document classes and non-namespace modules.'
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
SymbolArray:
|
12
|
+
Description: 'Use %i or %I for arrays of symbols.'
|
13
|
+
Enabled: true
|
14
|
+
|
15
|
+
AlignParameters:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
LineLength:
|
19
|
+
Description: 'Limit lines to 120 characters.'
|
20
|
+
Max: 120
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 ildarsafin
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# Code Climate CI
|
2
|
+
|
3
|
+
[<img src="https://semaphoreapp.com/api/v1/projects/67b7f0f3-e224-43a2-afd9-b24c5176e6dd/214701/shields_badge.png">](https://semaphoreapp.com/fs/codeclimate_ci)
|
4
|
+
[](https://codeclimate.com/github/fs/codeclimate_ci)
|
5
|
+
[](https://codeclimate.com/github/fs/codeclimate_ci)
|
6
|
+
|
7
|
+
The main idea of the Code Climate CI gem is that you can implement it to your [CI script](https://github.com/fs/rails-base/blob/master/bin/ci).
|
8
|
+
|
9
|
+
Gem will compare code quality in current branch with master branch through [CodeClimate API](https://codeclimate.com/docs/api) and if code in your branch become worse then ci script will be interrupted.
|
10
|
+
|
11
|
+
You can also compare code quality in your branch using this gem right from your console.
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
Add this line to your application's Gemfile:
|
16
|
+
|
17
|
+
```bash
|
18
|
+
gem 'codeclimate_ci'
|
19
|
+
```
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
|
23
|
+
```bash
|
24
|
+
bundle
|
25
|
+
```
|
26
|
+
|
27
|
+
Or install it yourself as:
|
28
|
+
|
29
|
+
```bash
|
30
|
+
gem install codeclimate_ci
|
31
|
+
```
|
32
|
+
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
Just type in your console:
|
36
|
+
|
37
|
+
```shell
|
38
|
+
codeclimate_ci --codeclimate-api-token CODECLIMATE_API_TOKEN --repo-id REPOSITORY_ID --branch_name BRANCH
|
39
|
+
```
|
40
|
+
|
41
|
+
* For codeclimate api token you need to go to codeclimate account settings in `Integrations` tab and there you can see `API Token`.
|
42
|
+
* For repo id you need to go to your private repo and then you'll see it in you address string.
|
43
|
+
|
44
|
+
## Response examples
|
45
|
+
|
46
|
+
### If you entered wrong api-token or repo-id response will be:
|
47
|
+
|
48
|
+
```shell
|
49
|
+
Invalid credentials given. Please check your codeclimate_api_token and repo_id.
|
50
|
+
```
|
51
|
+
|
52
|
+
### If GPA in your branch became worse than in master response will be:
|
53
|
+
|
54
|
+
```shell
|
55
|
+
Code in your branch became worse on %diff_point% points
|
56
|
+
```
|
57
|
+
### If GPA in your branch became better than in master response will be:
|
58
|
+
|
59
|
+
```shell
|
60
|
+
Gpa score has improved to %diff_point% points. Go on...
|
61
|
+
```
|
62
|
+
|
63
|
+
## Quality tools
|
64
|
+
|
65
|
+
* `bin/quality` based on [RuboCop](https://github.com/bbatsov/rubocop)
|
66
|
+
* `.rubocop.yml` describes active checks
|
67
|
+
|
68
|
+
## Development
|
69
|
+
|
70
|
+
* `bin/bootstrap` install gems
|
71
|
+
* `bin/build` check your specs and runs quality tools
|
72
|
+
|
73
|
+
## Contributing
|
74
|
+
|
75
|
+
1. Fork it ( https://github.com/[my-github-username]/codeclimate_ci/fork )
|
76
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
77
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
78
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
79
|
+
5. Create a new Pull Request
|
80
|
+
|
81
|
+
## Credits
|
82
|
+
|
83
|
+
Code Climate CI is maintained by [Ildar Safin](http://github.com/ildarsafin).
|
84
|
+
It was written by [Flatstack](http://www.flatstack.com) with the help of our
|
85
|
+
[contributors](http://github.com/fs/codeclimate_ci/contributors).
|
86
|
+
|
87
|
+
|
88
|
+
[](http://www.flatstack.com)
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
Bundler.setup
|
5
|
+
|
6
|
+
require 'rake'
|
7
|
+
require 'rspec'
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
|
10
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
11
|
+
require 'codeclimate_ci/version'
|
12
|
+
|
13
|
+
# Default directory to look in is `/specs`
|
14
|
+
# Run with `rake spec`
|
15
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
16
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
17
|
+
end
|
18
|
+
|
19
|
+
task default: :spec
|
20
|
+
task test: :spec
|
data/bin/bootstrap
ADDED
data/bin/build
ADDED
data/bin/codeclimate_ci
ADDED
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/bin/rubocop
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rubocop' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rubocop', 'rubocop')
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.expand_path('../lib/codeclimate_ci/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = 'codeclimate_ci'
|
6
|
+
spec.version = CodeclimateCi::VERSION
|
7
|
+
spec.authors = ['FlatStack team']
|
8
|
+
spec.summary = %q{Simple gem for checking your code with CodeClimate}
|
9
|
+
spec.description = %q{ Gem that allows You to check your code quality with CodeClimate and integrate it with your CI scripts }
|
10
|
+
spec.license = 'MIT'
|
11
|
+
spec.homepage = 'https://github.com/fs/codeclimate_ci'
|
12
|
+
spec.email = 'fs-admin@flatstack.com'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
15
|
+
spec.executables = ['codeclimate_ci']
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
20
|
+
spec.add_development_dependency 'rake', '~> 10.3'
|
21
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
22
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
23
|
+
spec.add_development_dependency 'rubocop', '~> 0.25'
|
24
|
+
spec.add_development_dependency 'webmock', '~> 1.18'
|
25
|
+
|
26
|
+
spec.add_dependency 'thor', '~> 0.19'
|
27
|
+
spec.add_dependency 'httparty', '~> 0.13'
|
28
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'codeclimate_ci/version'
|
2
|
+
require 'codeclimate_ci/cli'
|
3
|
+
require 'codeclimate_ci/configuration'
|
4
|
+
require 'codeclimate_ci/get_gpa'
|
5
|
+
require 'codeclimate_ci/compare_gpa'
|
6
|
+
require 'codeclimate_ci/api_requester'
|
7
|
+
require 'codeclimate_ci/report'
|
8
|
+
|
9
|
+
module CodeclimateCi
|
10
|
+
def self.configuration
|
11
|
+
@configuration ||= Configuration.new
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module CodeclimateCi
|
4
|
+
class ApiRequester
|
5
|
+
include HTTParty
|
6
|
+
CODECLIMATE_URI = 'https://codeclimate.com/api/repos'
|
7
|
+
|
8
|
+
def initialize(token, repo_id)
|
9
|
+
self.class.base_uri "#{CODECLIMATE_URI}/#{repo_id}"
|
10
|
+
self.class.default_params api_token: token
|
11
|
+
end
|
12
|
+
|
13
|
+
def branch_info(branch)
|
14
|
+
self.class.get("/branches/#{branch}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def connection_established?
|
18
|
+
@connection_established ||= self.class.get('/').code == 200
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module CodeclimateCi
|
4
|
+
class CLI < Thor
|
5
|
+
method_option :codeclimate_api_token, required: true
|
6
|
+
method_option :repo_id, required: true
|
7
|
+
method_option :branch_name, required: true
|
8
|
+
method_option :retry_count
|
9
|
+
method_option :sleep_time
|
10
|
+
|
11
|
+
desc('check', 'Check code quality with CodeClimate')
|
12
|
+
|
13
|
+
def check
|
14
|
+
CodeclimateCi.configuration.load_from_options(options)
|
15
|
+
|
16
|
+
exit_invalid_credentials! unless api_requester.connection_established?
|
17
|
+
|
18
|
+
if compare_gpa.worse?(branch_name)
|
19
|
+
exit_worse_code!
|
20
|
+
else
|
21
|
+
exit_good_code!
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
default_task :check
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def compare_gpa
|
30
|
+
@compare_gpa ||= CompareGpa.new(api_requester)
|
31
|
+
end
|
32
|
+
|
33
|
+
def api_requester
|
34
|
+
@api_requester ||= ApiRequester.new(
|
35
|
+
CodeclimateCi.configuration.codeclimate_api_token,
|
36
|
+
CodeclimateCi.configuration.repo_id
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def diff
|
41
|
+
compare_gpa.diff(branch_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def branch_name
|
45
|
+
CodeclimateCi.configuration.branch_name
|
46
|
+
end
|
47
|
+
|
48
|
+
def exit_worse_code!
|
49
|
+
Report.worse_code(diff)
|
50
|
+
exit(1)
|
51
|
+
end
|
52
|
+
|
53
|
+
def exit_good_code!
|
54
|
+
Report.good_code(diff)
|
55
|
+
exit(0)
|
56
|
+
end
|
57
|
+
|
58
|
+
def exit_invalid_credentials!
|
59
|
+
Report.invalid_credentials
|
60
|
+
exit(1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CodeclimateCi
|
2
|
+
class CompareGpa
|
3
|
+
def initialize(api_requester)
|
4
|
+
@api_requester = api_requester
|
5
|
+
end
|
6
|
+
|
7
|
+
def worse?(branch_name)
|
8
|
+
diff(branch_name) < 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def diff(branch_name)
|
12
|
+
branch_gpa(branch_name) - master_gpa
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def master_gpa
|
18
|
+
@master_gpa ||= gpa('master').gpa
|
19
|
+
end
|
20
|
+
|
21
|
+
def branch_gpa(branch_name)
|
22
|
+
@branch_gpa ||= gpa(branch_name).gpa
|
23
|
+
end
|
24
|
+
|
25
|
+
def gpa(branch_name)
|
26
|
+
GetGpa.new(@api_requester, branch_name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CodeclimateCi
|
2
|
+
class Configuration
|
3
|
+
OPTIONS = %i(codeclimate_api_token repo_id branch_name retry_count sleep_time)
|
4
|
+
DEFAULTS = {
|
5
|
+
'retry_count' => '3',
|
6
|
+
'sleep_time' => '5'
|
7
|
+
}
|
8
|
+
|
9
|
+
attr_accessor(*OPTIONS)
|
10
|
+
|
11
|
+
def load_from_options(options)
|
12
|
+
OPTIONS.each do |option|
|
13
|
+
send("#{option}=", value_or_default(options, option))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def value_or_default(options, option)
|
20
|
+
options[option.to_s] || DEFAULTS[option.to_s]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module CodeclimateCi
|
2
|
+
class GetGpa
|
3
|
+
NULL_VALUE = 0
|
4
|
+
|
5
|
+
def initialize(api_requester, branch)
|
6
|
+
@api_requester, @branch = api_requester, branch
|
7
|
+
end
|
8
|
+
|
9
|
+
def gpa
|
10
|
+
retry_count.times do
|
11
|
+
return last_snapshot_gpa if analyzed?
|
12
|
+
wait_and_refresh!
|
13
|
+
end
|
14
|
+
|
15
|
+
NULL_VALUE
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def wait_and_refresh!
|
21
|
+
Report.result_not_ready(@retry_counter, @branch)
|
22
|
+
|
23
|
+
increment_retry_counter
|
24
|
+
sleep(sleep_time)
|
25
|
+
refresh!
|
26
|
+
end
|
27
|
+
|
28
|
+
def increment_retry_counter
|
29
|
+
@retry_counter ||= 0
|
30
|
+
@retry_counter += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def retry_count
|
34
|
+
CodeclimateCi.configuration.retry_count.to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def sleep_time
|
38
|
+
CodeclimateCi.configuration.sleep_time.to_i
|
39
|
+
end
|
40
|
+
|
41
|
+
def last_snapshot_gpa
|
42
|
+
branch_info['last_snapshot']['gpa'].to_f
|
43
|
+
end
|
44
|
+
|
45
|
+
def analyzed?
|
46
|
+
branch_info.include?('last_snapshot')
|
47
|
+
end
|
48
|
+
|
49
|
+
def branch_info
|
50
|
+
@branch_info ||= @api_requester.branch_info(@branch)
|
51
|
+
end
|
52
|
+
|
53
|
+
def refresh!
|
54
|
+
@branch_info = nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CodeclimateCi
|
2
|
+
module Report
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def result_not_ready(retry_count, branch)
|
6
|
+
puts "Retry #{retry_count}. #{branch} branch analyze is not ready or branch does not exist"
|
7
|
+
end
|
8
|
+
|
9
|
+
def worse_code(gpa_diff)
|
10
|
+
puts "Code in your branch became worse on #{rounded_diff_value(gpa_diff)} points"
|
11
|
+
end
|
12
|
+
|
13
|
+
def good_code(gpa_diff)
|
14
|
+
puts "Gpa score has improved to #{rounded_diff_value(gpa_diff)} points. Go on..."
|
15
|
+
end
|
16
|
+
|
17
|
+
def invalid_credentials
|
18
|
+
puts 'Invalid credentials given. Please check your codeclimate_api_token and repo_id.'
|
19
|
+
end
|
20
|
+
|
21
|
+
def rounded_diff_value(gpa_diff)
|
22
|
+
gpa_diff.abs.round(2)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CodeclimateCi::ApiRequester do
|
4
|
+
let(:token) { 'token' }
|
5
|
+
let(:repo_id) { 'repo-id' }
|
6
|
+
let(:api_requester) { CodeclimateCi::ApiRequester.new(token, repo_id) }
|
7
|
+
|
8
|
+
describe '#branch_info' do
|
9
|
+
let(:branch) { 'master' }
|
10
|
+
|
11
|
+
let(:endpoint) do
|
12
|
+
"https://codeclimate.com/api/repos/#{repo_id}/branches/#{branch}?api_token=#{token}"
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
stub_request(:get, endpoint)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'requests correct API endpoint' do
|
20
|
+
api_requester.branch_info(branch)
|
21
|
+
expect(WebMock).to have_requested(:get, endpoint)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#connection_established?' do
|
26
|
+
let(:endpoint) do
|
27
|
+
"https://codeclimate.com/api/repos/#{repo_id}/?api_token=#{token}"
|
28
|
+
end
|
29
|
+
|
30
|
+
before do
|
31
|
+
stub_request(:get, endpoint).to_return(status: 404)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'requests correct API endpoint' do
|
35
|
+
api_requester.connection_established?
|
36
|
+
expect(WebMock).to have_requested(:get, endpoint)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns false' do
|
40
|
+
expect(api_requester.connection_established?).to be_falsey
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CodeclimateCi::CLI do
|
4
|
+
let(:args) { ['--branch_name', 'master'] }
|
5
|
+
|
6
|
+
let(:cli) { CodeclimateCi::CLI.new(args) }
|
7
|
+
let(:api_requester) { double(CodeclimateCi::ApiRequester) }
|
8
|
+
let(:compare_gpa) { double(CodeclimateCi::CompareGpa, diff: 0) }
|
9
|
+
|
10
|
+
def do_check
|
11
|
+
cli.check
|
12
|
+
rescue SystemExit => e
|
13
|
+
@exit = e.status
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(CodeclimateCi::ApiRequester).to receive(:new) { api_requester }
|
18
|
+
allow(CodeclimateCi::CompareGpa).to receive(:new) { compare_gpa }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when connection is not established' do
|
22
|
+
before do
|
23
|
+
allow(api_requester).to receive(:connection_established?) { false }
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'reports invalid credentials' do
|
27
|
+
expect(CodeclimateCi::Report).to receive(:invalid_credentials)
|
28
|
+
do_check
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'exits with 1' do
|
32
|
+
do_check
|
33
|
+
expect(@exit).to eql(1)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when connection is established' do
|
38
|
+
before do
|
39
|
+
allow(api_requester).to receive(:connection_established?) { true }
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when code is worse' do
|
43
|
+
before do
|
44
|
+
allow(compare_gpa).to receive(:worse?) { true }
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'reports worse code' do
|
48
|
+
expect(CodeclimateCi::Report).to receive(:worse_code)
|
49
|
+
do_check
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'exits with 1' do
|
53
|
+
do_check
|
54
|
+
expect(@exit).to eql(1)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when code is better' do
|
59
|
+
before do
|
60
|
+
allow(compare_gpa).to receive(:worse?) { false }
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'reports good code' do
|
64
|
+
expect(CodeclimateCi::Report).to receive(:good_code)
|
65
|
+
do_check
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'exits with 0' do
|
69
|
+
do_check
|
70
|
+
expect(@exit).to eql(0)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CodeclimateCi::CompareGpa do
|
4
|
+
let(:api_requester) { double(CodeclimateCi::ApiRequester) }
|
5
|
+
|
6
|
+
let(:codeclimate_ci) { CodeclimateCi::CompareGpa.new(api_requester) }
|
7
|
+
let(:configuration) { double(CodeclimateCi::Configuration, retry_count: '2', sleep_time: '1') }
|
8
|
+
|
9
|
+
let(:good_branch_info) { { 'last_snapshot' => { 'gpa' => '4' } } }
|
10
|
+
let(:bad_branch_info) { { 'last_snapshot' => { 'gpa' => '1' } } }
|
11
|
+
|
12
|
+
before do
|
13
|
+
allow(CodeclimateCi).to receive(:configuration) { configuration }
|
14
|
+
|
15
|
+
allow(api_requester).to receive(:branch_info).with('master') { good_branch_info }
|
16
|
+
allow(api_requester).to receive(:branch_info).with('another_branch') { bad_branch_info }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'properly defines branch with worse code quality' do
|
20
|
+
expect(codeclimate_ci.worse?('another_branch')).to be_truthy
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CodeclimateCi::Configuration do
|
4
|
+
let(:options) do
|
5
|
+
{
|
6
|
+
'codeclimate_api_token' => '12345678',
|
7
|
+
'repo_id' => '124356',
|
8
|
+
'branch_name' => 'new-feature'
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:configuration) { CodeclimateCi::Configuration.new }
|
13
|
+
|
14
|
+
describe '#load_from_options(options)' do
|
15
|
+
before do
|
16
|
+
configuration.load_from_options(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'properly setups options' do
|
20
|
+
expect(configuration.codeclimate_api_token).to eq('12345678')
|
21
|
+
expect(configuration.repo_id).to eq('124356')
|
22
|
+
expect(configuration.branch_name).to eq('new-feature')
|
23
|
+
expect(configuration.retry_count).to eq('3')
|
24
|
+
expect(configuration.sleep_time).to eq('5')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CodeclimateCi::GetGpa do
|
4
|
+
let(:codeclimate_ci) { CodeclimateCi::GetGpa.new(api_requester, 'repo1') }
|
5
|
+
let(:api_requester) { double(CodeclimateCi::ApiRequester) }
|
6
|
+
let(:configuration) { double(CodeclimateCi::Configuration, retry_count: '3', sleep_time: '5') }
|
7
|
+
let(:analyzed_branch_info) { { 'last_snapshot' => { 'gpa' => 3 } } }
|
8
|
+
let(:empty_branch_info) { '' }
|
9
|
+
|
10
|
+
before { allow(CodeclimateCi).to receive(:configuration) { configuration } }
|
11
|
+
|
12
|
+
context 'when task is analyzed' do
|
13
|
+
before do
|
14
|
+
allow(api_requester).to receive(:branch_info) { analyzed_branch_info }
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns correct gpa value' do
|
18
|
+
expect(codeclimate_ci.gpa).to eq 3
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when task is not analyzed' do
|
23
|
+
let(:configuration) do
|
24
|
+
double(CodeclimateCi::Configuration, retry_count: '2', sleep_time: '0')
|
25
|
+
end
|
26
|
+
|
27
|
+
before do
|
28
|
+
allow(api_requester).to receive(:branch_info) { empty_branch_info }
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns correct gpa value' do
|
32
|
+
expect(codeclimate_ci.gpa).to eq 0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when task analyzed after retry' do
|
37
|
+
let(:configuration) do
|
38
|
+
double(CodeclimateCi::Configuration, retry_count: '2', sleep_time: '0')
|
39
|
+
end
|
40
|
+
|
41
|
+
before do
|
42
|
+
allow(api_requester).to receive(:branch_info).and_return(empty_branch_info, analyzed_branch_info)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns correct gpa value after retry' do
|
46
|
+
expect(api_requester).to receive(:branch_info).twice
|
47
|
+
expect(codeclimate_ci.gpa).to eq 3
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Run codeclimate-test-reporter only in CI
|
2
|
+
if ENV['CI']
|
3
|
+
require 'codeclimate-test-reporter'
|
4
|
+
CodeClimate::TestReporter.start
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rspec'
|
8
|
+
require 'codeclimate_ci'
|
9
|
+
require 'webmock/rspec'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.filter_run focus: true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
|
15
|
+
config.after(:all) do
|
16
|
+
WebMock.allow_net_connect!
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: codeclimate_ci
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- FlatStack team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.10'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.25'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.25'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: webmock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.18'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.18'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: thor
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.19'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.19'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: httparty
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.13'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.13'
|
125
|
+
description: " Gem that allows You to check your code quality with CodeClimate and
|
126
|
+
integrate it with your CI scripts "
|
127
|
+
email: fs-admin@flatstack.com
|
128
|
+
executables:
|
129
|
+
- codeclimate_ci
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".rubocop.yml"
|
136
|
+
- Gemfile
|
137
|
+
- LICENSE.txt
|
138
|
+
- README.md
|
139
|
+
- Rakefile
|
140
|
+
- bin/bootstrap
|
141
|
+
- bin/build
|
142
|
+
- bin/codeclimate_ci
|
143
|
+
- bin/quality
|
144
|
+
- bin/rspec
|
145
|
+
- bin/rubocop
|
146
|
+
- codeclimate_ci.gemspec
|
147
|
+
- lib/codeclimate_ci.rb
|
148
|
+
- lib/codeclimate_ci/api_requester.rb
|
149
|
+
- lib/codeclimate_ci/cli.rb
|
150
|
+
- lib/codeclimate_ci/compare_gpa.rb
|
151
|
+
- lib/codeclimate_ci/configuration.rb
|
152
|
+
- lib/codeclimate_ci/get_gpa.rb
|
153
|
+
- lib/codeclimate_ci/report.rb
|
154
|
+
- lib/codeclimate_ci/version.rb
|
155
|
+
- spec/codeclimate_ci/api_requester_spec.rb
|
156
|
+
- spec/codeclimate_ci/cli_spec.rb
|
157
|
+
- spec/codeclimate_ci/compare_gpa_spec.rb
|
158
|
+
- spec/codeclimate_ci/configuration_spec.rb
|
159
|
+
- spec/codeclimate_ci/get_gpa_spec.rb
|
160
|
+
- spec/spec_helper.rb
|
161
|
+
homepage: https://github.com/fs/codeclimate_ci
|
162
|
+
licenses:
|
163
|
+
- MIT
|
164
|
+
metadata: {}
|
165
|
+
post_install_message:
|
166
|
+
rdoc_options: []
|
167
|
+
require_paths:
|
168
|
+
- lib
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
requirements: []
|
180
|
+
rubyforge_project:
|
181
|
+
rubygems_version: 2.2.2
|
182
|
+
signing_key:
|
183
|
+
specification_version: 4
|
184
|
+
summary: Simple gem for checking your code with CodeClimate
|
185
|
+
test_files:
|
186
|
+
- spec/codeclimate_ci/api_requester_spec.rb
|
187
|
+
- spec/codeclimate_ci/cli_spec.rb
|
188
|
+
- spec/codeclimate_ci/compare_gpa_spec.rb
|
189
|
+
- spec/codeclimate_ci/configuration_spec.rb
|
190
|
+
- spec/codeclimate_ci/get_gpa_spec.rb
|
191
|
+
- spec/spec_helper.rb
|