circlemator 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/Gemfile +4 -0
- data/Guardfile +14 -0
- data/README.md +24 -4
- data/Rakefile +2 -1
- data/circle.yml +4 -0
- data/circlemator.gemspec +20 -13
- data/exe/circlemator +16 -5
- data/lib/circlemator.rb +2 -1
- data/lib/circlemator/build_canceler.rb +3 -2
- data/lib/circlemator/github_repo.rb +55 -0
- data/lib/circlemator/pr_finder.rb +37 -0
- data/lib/circlemator/self_merger.rb +12 -52
- data/lib/circlemator/style_checker.rb +27 -0
- data/lib/circlemator/version.rb +2 -1
- metadata +108 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bc105b86b626325f97f0d06877e60e7d6e0751c
|
4
|
+
data.tar.gz: 8d8d411aa9f82022ea83ff19c7c827225ac7a497
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6de47e2288045df12d26553f8d2815cdb14faa9af8b9540b0a19d874656f21a73b2c2b06441becb107a6e5a03de8b89a7ea45e8d8351b763c83ba3f34d4a16bd
|
7
|
+
data.tar.gz: adb99ddcae2c9956bc8171ba99e3b4fb29580629a6a5fa85d79a13c4452a3bdc836bff4da6af07fc7e3754122ac06d732742615a4c01abd8cc400cd0eee55511
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
3
|
+
require 'guard/rspec/dsl'
|
4
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
5
|
+
|
6
|
+
rspec = dsl.rspec
|
7
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
8
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
9
|
+
watch(rspec.spec_files)
|
10
|
+
|
11
|
+
# Ruby files
|
12
|
+
ruby = dsl.ruby
|
13
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
14
|
+
end
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Circlemator
|
1
|
+
# Circlemator [![Circle CI](https://circleci.com/gh/rainforestapp/circlemator.png?style=badge&circle-token=0b39cf33b52e34ef6bb29cf2f2a1c071fef3f26f)](https://circleci.com/gh/rainforestapp/circlemator)
|
2
2
|
|
3
3
|
Circlemator is a bucket of tricks for working with CircleCI and Github
|
4
|
-
used internally at Rainforest QA.
|
4
|
+
used internally at [Rainforest QA](http://www.rainforestqa.com).
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
@@ -50,6 +50,26 @@ to be set in CircleCI:
|
|
50
50
|
- `CIRCLE_API_TOKEN`: Your CircleCI API token. (Can also be set with
|
51
51
|
the `-t` option.)
|
52
52
|
|
53
|
+
### Style check
|
54
|
+
|
55
|
+
Think of this as a poor man's HoundCI: it runs Rubocop (and/or more
|
56
|
+
linters/checkers TBD) and comments on the Github pull request using
|
57
|
+
the excellent [Pronto](https://github.com/mmozuras/pronto). Use it
|
58
|
+
like so:
|
59
|
+
|
60
|
+
```yml
|
61
|
+
test:
|
62
|
+
pre:
|
63
|
+
- bundle exec circlemator style-check --base-branch=develop
|
64
|
+
```
|
65
|
+
|
66
|
+
(It probably makes sense in either the `pre` or `override` steps.)
|
67
|
+
|
68
|
+
`style-check` requires the following environment variable to be set:
|
69
|
+
|
70
|
+
- `GITHUB_ACCESS_TOKEN`: A Github API auth token for a user with commit
|
71
|
+
access to your repo. (Can also be set with the `-g` option.)
|
72
|
+
|
53
73
|
### Self-merge release branch
|
54
74
|
|
55
75
|
Preamble: at Rainforest, our process for getting code into production
|
@@ -59,7 +79,7 @@ looks like this:
|
|
59
79
|
2. Run unit tests and get code review (repeat 1-2 as necessary).
|
60
80
|
3. Merge feature branch to `develop`.
|
61
81
|
4. Open release pull request from `develop` to `master`.
|
62
|
-
5. Run unit tests + Rainforest against `develop`.
|
82
|
+
5. Run unit tests + [Rainforest](http://www.rainforestqa.com) against `develop`.
|
63
83
|
6. Merge `develop` into `master` if everything's green.
|
64
84
|
7. Deploy from `master`.
|
65
85
|
|
@@ -92,7 +112,7 @@ request.
|
|
92
112
|
|
93
113
|
`self-merge` requires the following environment variable to be set:
|
94
114
|
|
95
|
-
- `
|
115
|
+
- `GITHUB_ACCESS_TOKEN`: A Github API auth token for a user with commit
|
96
116
|
access to your repo. (Can also be set with the `-g` option.)
|
97
117
|
|
98
118
|
Also, unfortunately branch protection cannot be enabled on your
|
data/Rakefile
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'bundler/gem_tasks'
|
data/circle.yml
ADDED
data/circlemator.gemspec
CHANGED
@@ -1,28 +1,35 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require 'circlemator/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'circlemator'
|
8
8
|
spec.version = Circlemator::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Emanuel Evans']
|
10
|
+
spec.email = ['emanuel@rainforestqa.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description = <<-EOF
|
12
|
+
spec.summary = 'A bucket of tricks for CircleCI and Github.'
|
13
|
+
spec.description = <<-EOF.strip
|
14
14
|
A few utilities for CircleCI to improve your CI workflow.
|
15
15
|
EOF
|
16
|
-
spec.homepage =
|
17
|
-
spec.license =
|
16
|
+
spec.homepage = 'https://github.com/rainforestapp/circlemator'
|
17
|
+
spec.license = 'MIT'
|
18
18
|
|
19
19
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
-
spec.bindir =
|
20
|
+
spec.bindir = 'exe'
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
-
spec.require_paths = [
|
22
|
+
spec.require_paths = ['lib']
|
23
23
|
|
24
|
-
spec.add_dependency
|
24
|
+
spec.add_dependency 'httparty', '~> 0.13.7'
|
25
|
+
spec.add_dependency 'pronto', '~> 0.5.3'
|
26
|
+
spec.add_dependency 'pronto-rubocop', '~> 0.5.2'
|
25
27
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
29
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
30
|
+
spec.add_development_dependency 'rubocop'
|
31
|
+
spec.add_development_dependency 'vcr', '~> 3.0.1'
|
32
|
+
spec.add_development_dependency 'webmock', '~> 1.22.6'
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.4.0'
|
34
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.6.4'
|
28
35
|
end
|
data/exe/circlemator
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
require 'optparse'
|
3
4
|
require_relative '../lib/circlemator/build_canceler'
|
4
5
|
require_relative '../lib/circlemator/self_merger'
|
6
|
+
require_relative '../lib/circlemator/github_repo'
|
7
|
+
require_relative '../lib/circlemator/style_checker'
|
5
8
|
|
6
9
|
options = {}
|
7
10
|
parser = OptionParser.new do |opts|
|
8
|
-
opts.banner =
|
11
|
+
opts.banner = 'Usage: circlemator (self-merge|cancel-old) [options]'
|
9
12
|
|
10
13
|
opts.on('-bBRANCH', '--base-branch=BRANCH', 'Base branch for merging') do |b|
|
11
14
|
options[:base_branch] = b
|
@@ -42,7 +45,7 @@ end
|
|
42
45
|
|
43
46
|
def require_opt(opts, key)
|
44
47
|
if !opts[key]
|
45
|
-
puts "Option #{key.gsub(/_/, '-')} is required!"
|
48
|
+
puts "Option #{key.to_s.gsub(/_/, '-')} is required!"
|
46
49
|
exit 1
|
47
50
|
end
|
48
51
|
end
|
@@ -54,14 +57,16 @@ end
|
|
54
57
|
|
55
58
|
options[:user] = require_env 'CIRCLE_PROJECT_USERNAME'
|
56
59
|
options[:repo] = require_env 'CIRCLE_PROJECT_REPONAME'
|
60
|
+
options[:github_auth_token] ||= ENV['GITHUB_ACCESS_TOKEN']
|
61
|
+
options[:github_auth_token] ||= ENV['GITHUB_AUTH_TOKEN']
|
57
62
|
|
58
63
|
case ARGV[0]
|
59
64
|
when 'self-merge'
|
60
65
|
options[:sha] = require_env 'CIRCLE_SHA1'
|
61
|
-
options[:github_auth_token] ||= ENV['GITHUB_AUTH_TOKEN']
|
62
66
|
require_opt options, :github_auth_token
|
63
67
|
require_opt options, :base_branch
|
64
68
|
require_opt options, :compare_branch
|
69
|
+
options[:github_repo] = Circlemator::GithubRepo.new(options)
|
65
70
|
|
66
71
|
Circlemator::SelfMerger.new(options).merge!
|
67
72
|
when 'cancel-old'
|
@@ -70,12 +75,18 @@ when 'cancel-old'
|
|
70
75
|
require_opt options, :circle_api_token
|
71
76
|
|
72
77
|
Circlemator::BuildCanceler.new(options).cancel_old_builds!
|
78
|
+
when 'style-check'
|
79
|
+
options[:sha] = require_env 'CIRCLE_SHA1'
|
80
|
+
options[:compare_branch] ||= require_env 'CIRCLE_BRANCH'
|
81
|
+
require_opt options, :github_auth_token
|
82
|
+
require_opt options, :base_branch
|
83
|
+
options[:github_repo] = Circlemator::GithubRepo.new(options)
|
84
|
+
|
85
|
+
Circlemator::StyleChecker.new(options).check!
|
73
86
|
else
|
74
87
|
puts parser
|
75
88
|
end
|
76
89
|
|
77
|
-
|
78
|
-
|
79
90
|
# Local Variables:
|
80
91
|
# major-mode: ruby-mode
|
81
92
|
# End:
|
data/lib/circlemator.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'httparty'
|
2
3
|
require 'json'
|
3
4
|
|
4
5
|
module Circlemator
|
5
6
|
class BuildCanceler
|
6
|
-
def initialize(user: , repo: , current_build: , circle_api_token: )
|
7
|
+
def initialize(user: , repo: , current_build: , circle_api_token: , **_opts)
|
7
8
|
@user = user
|
8
9
|
@repo = repo
|
9
10
|
@current_build = current_build
|
@@ -30,7 +31,7 @@ module Circlemator
|
|
30
31
|
end
|
31
32
|
|
32
33
|
if cancel_self
|
33
|
-
puts
|
34
|
+
puts 'Daisy, Daisy, give me your answer, do...'
|
34
35
|
HTTParty.post "https://circleci.com/api/v1/project/#{@user}/#{@repo}/#{@current_build}/cancel",
|
35
36
|
circle_auth
|
36
37
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
module Circlemator
|
5
|
+
class GithubRepo
|
6
|
+
include HTTParty
|
7
|
+
|
8
|
+
class InvalidPath < StandardError
|
9
|
+
def initialize(path)
|
10
|
+
super "Path #{path} is not valid for repo"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class WrongRepo < StandardError
|
15
|
+
def initialize(url, repo)
|
16
|
+
super "URL #{url} does not belong to repo #{repo}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
base_uri 'https://api.github.com/repos'
|
21
|
+
|
22
|
+
def initialize(user: , repo: , github_auth_token: , **_opts)
|
23
|
+
@user = user
|
24
|
+
@repo = repo
|
25
|
+
@auth_token = github_auth_token
|
26
|
+
end
|
27
|
+
|
28
|
+
def get(path, opts = {})
|
29
|
+
self.class.get(fix_path(path), opts.merge(basic_auth: auth))
|
30
|
+
end
|
31
|
+
|
32
|
+
def put(path, opts = {})
|
33
|
+
self.class.put(fix_path(path), opts.merge(basic_auth: auth))
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def fix_path(path)
|
39
|
+
case path
|
40
|
+
when %r(\A#{self.class.base_uri}(/#{@user}/#{@repo}.*)\z)
|
41
|
+
$1
|
42
|
+
when %r(\A#{self.class.base_uri})
|
43
|
+
raise WrongRepo.new(path, "#{@user}/#{@repo}")
|
44
|
+
when %r(\A/.*)
|
45
|
+
"/#{@user}/#{@repo}#{path}"
|
46
|
+
else
|
47
|
+
raise InvalidPath, path
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def auth
|
52
|
+
{ username: @auth_token, password: 'x-oauth-basic' }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'circlemator/github_repo'
|
3
|
+
|
4
|
+
module Circlemator
|
5
|
+
class PrFinder
|
6
|
+
class BadResponseError < StandardError
|
7
|
+
def initialize(response)
|
8
|
+
super "Bad response from github: #{response.inspect}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(github_repo: , base_branch: , compare_branch: , sha: , **_opts)
|
13
|
+
@github_repo = github_repo
|
14
|
+
@base_branch = base_branch
|
15
|
+
@compare_branch = compare_branch
|
16
|
+
@sha = sha
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_pr
|
20
|
+
response = @github_repo.get '/pulls', query: { base: @base_branch }
|
21
|
+
if response.code != 200
|
22
|
+
raise BadResponseError, response
|
23
|
+
end
|
24
|
+
|
25
|
+
prs = JSON.parse(response.body)
|
26
|
+
target_pr = prs.find do |pr|
|
27
|
+
pr.fetch('head').fetch('ref') == @compare_branch &&
|
28
|
+
pr.fetch('head').fetch('sha') == @sha &&
|
29
|
+
pr.fetch('base').fetch('ref') == @base_branch
|
30
|
+
end
|
31
|
+
|
32
|
+
return if target_pr.nil?
|
33
|
+
|
34
|
+
[target_pr.fetch('number'), target_pr.fetch('url')]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,69 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'httparty'
|
2
3
|
require 'json'
|
3
4
|
|
4
5
|
module Circlemator
|
5
6
|
class SelfMerger
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@sha = sha
|
15
|
-
@auth_token = github_auth_token
|
16
|
-
@base_branch = base_branch
|
17
|
-
@compare_branch = compare_branch
|
7
|
+
MESSAGE = 'Auto-merge by Circlemator!'
|
8
|
+
def initialize(opts)
|
9
|
+
github_repo = opts.fetch(:github_repo)
|
10
|
+
raise "#{github_repo} is invalid" unless github_repo.is_a? GithubRepo
|
11
|
+
|
12
|
+
@github_repo = github_repo
|
13
|
+
@sha = opts.fetch(:sha)
|
14
|
+
@opts = opts
|
18
15
|
end
|
19
16
|
|
20
17
|
def merge!
|
21
|
-
pr_number, pr_url = find_pr
|
18
|
+
pr_number, pr_url = PrFinder.new(@opts).find_pr
|
22
19
|
return if pr_number.nil? || pr_url.nil?
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
body: { commit_message: msg, sha: @sha }.to_json,
|
27
|
-
basic_auth: github_auth
|
21
|
+
response = @github_repo.put "#{pr_url}/merge",
|
22
|
+
body: { commit_message: MESSAGE, sha: @sha }.to_json
|
28
23
|
if response.code != 200
|
29
24
|
body = JSON.parse(response.body)
|
30
25
|
raise "Merge failed: #{body.fetch('message')}"
|
31
26
|
end
|
32
27
|
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def find_pr
|
37
|
-
response = HTTParty.get "https://api.github.com/repos/#{github_repo}/pulls",
|
38
|
-
query: { base: @base_branch },
|
39
|
-
basic_auth: github_auth
|
40
|
-
if response.code != 200
|
41
|
-
raise "Bad response from Github: #{response.inspect}"
|
42
|
-
end
|
43
|
-
|
44
|
-
prs = JSON.parse(response.body)
|
45
|
-
pr = prs.find do |pr|
|
46
|
-
pr.fetch('head').fetch('ref') == @compare_branch &&
|
47
|
-
pr.fetch('head').fetch('sha') == @sha &&
|
48
|
-
pr.fetch('base').fetch('ref') == @base_branch
|
49
|
-
end
|
50
|
-
|
51
|
-
if pr.nil?
|
52
|
-
puts 'No release PR. Not merging.'
|
53
|
-
return
|
54
|
-
end
|
55
|
-
|
56
|
-
[pr.fetch('number'), pr.fetch('url')]
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
def github_repo
|
61
|
-
"#{@user}/#{@repo}"
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
def github_auth
|
66
|
-
{ username: @auth_token, password: 'x-oauth-basic' }
|
67
|
-
end
|
68
28
|
end
|
69
29
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'httparty'
|
3
|
+
require 'json'
|
4
|
+
require 'pronto'
|
5
|
+
require 'pronto/rubocop'
|
6
|
+
require 'circlemator/pr_finder'
|
7
|
+
|
8
|
+
module Circlemator
|
9
|
+
class StyleChecker
|
10
|
+
def initialize(opts)
|
11
|
+
@opts = opts
|
12
|
+
@base_branch = opts.fetch(:base_branch)
|
13
|
+
end
|
14
|
+
|
15
|
+
def check!
|
16
|
+
pr_number, _ = PrFinder.new(@opts).find_pr
|
17
|
+
if pr_number
|
18
|
+
ENV['PULL_REQUEST_ID'] = pr_number.to_s
|
19
|
+
formatter = ::Pronto::Formatter::GithubPullRequestFormatter.new
|
20
|
+
else
|
21
|
+
formatter = ::Pronto::Formatter::GithubFormatter.new
|
22
|
+
end
|
23
|
+
|
24
|
+
::Pronto.run(@base_branch, '.', formatter)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/circlemator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circlemator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emanuel Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.13.7
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pronto
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.5.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.5.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pronto-rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.5.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.5.2
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bundler
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +80,77 @@ dependencies:
|
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '10.0'
|
55
|
-
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: vcr
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.0.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.22.6
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.22.6
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 3.4.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 3.4.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: guard-rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 4.6.4
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 4.6.4
|
153
|
+
description: A few utilities for CircleCI to improve your CI workflow.
|
56
154
|
email:
|
57
155
|
- emanuel@rainforestqa.com
|
58
156
|
executables:
|
@@ -61,18 +159,25 @@ extensions: []
|
|
61
159
|
extra_rdoc_files: []
|
62
160
|
files:
|
63
161
|
- ".gitignore"
|
162
|
+
- ".rspec"
|
163
|
+
- ".rubocop.yml"
|
64
164
|
- ".ruby-version"
|
65
165
|
- Gemfile
|
166
|
+
- Guardfile
|
66
167
|
- LICENSE
|
67
168
|
- README.md
|
68
169
|
- Rakefile
|
69
170
|
- bin/console
|
70
171
|
- bin/setup
|
172
|
+
- circle.yml
|
71
173
|
- circlemator.gemspec
|
72
174
|
- exe/circlemator
|
73
175
|
- lib/circlemator.rb
|
74
176
|
- lib/circlemator/build_canceler.rb
|
177
|
+
- lib/circlemator/github_repo.rb
|
178
|
+
- lib/circlemator/pr_finder.rb
|
75
179
|
- lib/circlemator/self_merger.rb
|
180
|
+
- lib/circlemator/style_checker.rb
|
76
181
|
- lib/circlemator/version.rb
|
77
182
|
homepage: https://github.com/rainforestapp/circlemator
|
78
183
|
licenses:
|