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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c813019d9366200fd764c399fa6736d7e0d690e5
4
- data.tar.gz: b2692e0b581a721cbe5854ba21cdb932552cbe32
3
+ metadata.gz: 0bc105b86b626325f97f0d06877e60e7d6e0751c
4
+ data.tar.gz: 8d8d411aa9f82022ea83ff19c7c827225ac7a497
5
5
  SHA512:
6
- metadata.gz: c0a99bfe944824eb9e5dffb63ab81c8352e7cc63fb42dd1f8229b8535144c6f9998c13a2dabab405f269fab975778e1defefb71866c9383a5d504f6a265414c3
7
- data.tar.gz: 70629c129f63f0646a1a9d185b2d8b6da8377584b93c5dacf70eacaa77f2ecf8a2c333d481c17674e14e73c561b47d56a81919e541470b49a4b931a5771eba2e
6
+ metadata.gz: 6de47e2288045df12d26553f8d2815cdb14faa9af8b9540b0a19d874656f21a73b2c2b06441becb107a6e5a03de8b89a7ea45e8d8351b763c83ba3f34d4a16bd
7
+ data.tar.gz: adb99ddcae2c9956bc8171ba99e3b4fb29580629a6a5fa85d79a13c4452a3bdc836bff4da6af07fc7e3754122ac06d732742615a4c01abd8cc400cd0eee55511
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,2 @@
1
+ inherit_gem:
2
+ rf-stylez: ruby/rubocop.yml
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in circlemator.gemspec
4
5
  gemspec
6
+
7
+ gem 'rf-stylez'
8
+ gem 'rspec_junit_formatter'
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
- - `GITHUB_AUTH_TOKEN`: A Github API auth token for a user with commit
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
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
data/circle.yml ADDED
@@ -0,0 +1,4 @@
1
+ test:
2
+ pre:
3
+ - bundle exec exe/circlemator cancel-old
4
+ - bundle exec exe/circlemator style-check --base-branch=master
data/circlemator.gemspec CHANGED
@@ -1,28 +1,35 @@
1
- # coding: utf-8
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 = "circlemator"
7
+ spec.name = 'circlemator'
8
8
  spec.version = Circlemator::VERSION
9
- spec.authors = ["Emanuel Evans"]
10
- spec.email = ["emanuel@rainforestqa.com"]
9
+ spec.authors = ['Emanuel Evans']
10
+ spec.email = ['emanuel@rainforestqa.com']
11
11
 
12
- spec.summary = %q{A bucket of tricks for CircleCI and Github.}
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 = "https://github.com/rainforestapp/circlemator"
17
- spec.license = "MIT"
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 = "exe"
20
+ spec.bindir = 'exe'
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
23
23
 
24
- spec.add_dependency "httparty", "~> 0.13.7"
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 "bundler", "~> 1.10"
27
- spec.add_development_dependency "rake", "~> 10.0"
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 = "Usage: circlemator (self-merge|cancel-old) [options]"
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,4 +1,5 @@
1
- require "circlemator/version"
1
+ # frozen_string_literal: true
2
+ require 'circlemator/version'
2
3
 
3
4
  module Circlemator
4
5
  end
@@ -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 "Daisy, Daisy, give me your answer, do..."
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
- def initialize(user: ,
7
- repo: ,
8
- sha: ,
9
- github_auth_token: ,
10
- base_branch: ,
11
- compare_branch: )
12
- @user = user
13
- @repo = repo
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
- msg = "Auto-merge by Circlemator!"
25
- response = HTTParty.put "#{pr_url}/merge",
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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Circlemator
2
- VERSION = "0.1.1"
3
+ VERSION = '0.2.0'
3
4
  end
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.1.1
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-01-23 00:00:00.000000000 Z
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
- description: " A few utilities for CircleCI to improve your CI workflow.\n"
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: