circlemator 0.1.1 → 0.2.0
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 +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 [](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:
|