pronto 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -4
- data/README.md +54 -16
- data/lib/pronto/bitbucket.rb +76 -0
- data/lib/pronto/cli.rb +8 -2
- data/lib/pronto/clients/bitbucket_client.rb +55 -0
- data/lib/pronto/comment.rb +13 -0
- data/lib/pronto/config.rb +9 -1
- data/lib/pronto/config_file.rb +6 -0
- data/lib/pronto/formatter/bitbucket_formatter.rb +17 -0
- data/lib/pronto/formatter/bitbucket_pull_request_formatter.rb +13 -0
- data/lib/pronto/formatter/colorizable.rb +17 -0
- data/lib/pronto/formatter/commit_formatter.rb +21 -0
- data/lib/pronto/formatter/formatter.rb +3 -0
- data/lib/pronto/formatter/git_formatter.rb +96 -0
- data/lib/pronto/formatter/github_formatter.rb +8 -20
- data/lib/pronto/formatter/github_pull_request_formatter.rb +5 -28
- data/lib/pronto/formatter/github_status_formatter/inflector.rb +17 -0
- data/lib/pronto/formatter/github_status_formatter/sentence.rb +42 -0
- data/lib/pronto/formatter/github_status_formatter/status_builder.rb +76 -0
- data/lib/pronto/formatter/github_status_formatter.rb +28 -0
- data/lib/pronto/formatter/gitlab_formatter.rb +8 -19
- data/lib/pronto/formatter/json_formatter.rb +1 -0
- data/lib/pronto/formatter/pull_request_formatter.rb +20 -0
- data/lib/pronto/formatter/text_formatter.rb +27 -5
- data/lib/pronto/gem_names.rb +9 -4
- data/lib/pronto/github.rb +9 -13
- data/lib/pronto/gitlab.rb +11 -15
- data/lib/pronto/runner.rb +1 -1
- data/lib/pronto/status.rb +14 -0
- data/lib/pronto/version.rb +1 -1
- data/lib/pronto.rb +14 -0
- data/pronto.gemspec +4 -0
- metadata +72 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed857182c87afee371e2822b26f8303a42cd848a
|
4
|
+
data.tar.gz: 152bd31948ddf2b999dbc7334c5292842e99ffcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c06cb847d4a953da70c9b79944a55d7b93058c49e737cd898d7247ca803ea00960b8343395b0376cea0efc2c2d18bda55ae6cd52a65aa60d391e55aa95b16a86
|
7
|
+
data.tar.gz: 181ab9b31d663a84e3a49c38d4e59826cda02f7cf047813dc92c8d4350ea81c6940da803b5109c7c031f918edd5c2cb79f31992179c922b76a1dcbe34a95a020
|
data/CHANGELOG.md
CHANGED
@@ -2,11 +2,31 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
|
6
|
+
## 0.7.0
|
7
|
+
|
8
|
+
### New features
|
9
|
+
|
10
|
+
* [#135](https://github.com/mmozuras/pronto/pull/135): add Bitbucket formatter.
|
11
|
+
* [#135](https://github.com/mmozuras/pronto/pull/135): add Bitbucket pull request formatter.
|
12
|
+
* [#134](https://github.com/mmozuras/pronto/pull/134): colorize text formatter.
|
13
|
+
* [#144](https://github.com/mmozuras/pronto/pull/144): add GitHub status formatter.
|
14
|
+
* [#157](https://github.com/mmozuras/pronto/pull/157): ability to run pronto CLI from within subdirectories of a git repository.
|
15
|
+
* [#154](https://github.com/mmozuras/pronto/pull/154): add an option to consolidate pull request comments.
|
16
|
+
|
17
|
+
### Changes
|
18
|
+
|
19
|
+
* [#162](https://github.com/mmozuras/pronto/pull/162): don't count info messages for error exit code.
|
20
|
+
|
21
|
+
### Bugs fixed
|
22
|
+
|
23
|
+
* [#153](https://github.com/mmozuras/pronto/pull/153): correctly get repo_path.
|
24
|
+
|
5
25
|
## 0.6.0
|
6
26
|
|
7
27
|
### New features
|
8
28
|
|
9
|
-
*
|
29
|
+
* Add `-V/--verbose-version` option that displays Ruby version.
|
10
30
|
* [#127](https://github.com/mmozuras/pronto/pull/127): ability to specify `max_warnings` via configuration or environment variable.
|
11
31
|
* [#18](https://github.com/mmozuras/pronto/issues/18): ability to specify `verbose` via configuration, which can provide more output for debugging purposes.
|
12
32
|
* [#83](https://github.com/mmozuras/pronto/issues/83): support multiple formatters as an option to `pronto run`.
|
@@ -14,9 +34,9 @@
|
|
14
34
|
### Changes
|
15
35
|
|
16
36
|
* `--version` only displays the version itself without any additional text.
|
17
|
-
*
|
18
|
-
* [#116](https://github.com/mmozuras/pronto/pull/116):
|
19
|
-
* [#123](https://github.com/mmozuras/pronto/pull/126):
|
37
|
+
* Replace `Pronto.gem_names` with `Pronto::GemNames.new.to_a`.
|
38
|
+
* [#116](https://github.com/mmozuras/pronto/pull/116): improve GitHub formatter error output.
|
39
|
+
* [#123](https://github.com/mmozuras/pronto/pull/126): add runner attribute to message initialization.
|
20
40
|
* Runner expects to receive patches/commit via `initialize(patches, commit)`, instead of `run(patches, commit)`.
|
21
41
|
|
22
42
|
### Bugs fixed
|
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# Pronto
|
2
2
|
|
3
|
-
[![Code Climate](https://codeclimate.com/github/mmozuras/pronto.
|
4
|
-
[![Build Status](https://secure.travis-ci.org/mmozuras/pronto.
|
5
|
-
[![Gem Version](https://badge.fury.io/rb/pronto.
|
6
|
-
[![Dependency Status](https://gemnasium.com/mmozuras/pronto.
|
7
|
-
[![Inline docs](http://inch-ci.org/github/mmozuras/pronto.
|
3
|
+
[![Code Climate](https://codeclimate.com/github/mmozuras/pronto.svg)](https://codeclimate.com/github/mmozuras/pronto)
|
4
|
+
[![Build Status](https://secure.travis-ci.org/mmozuras/pronto.svg)](http://travis-ci.org/mmozuras/pronto)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/pronto.svg)](http://badge.fury.io/rb/pronto)
|
6
|
+
[![Dependency Status](https://gemnasium.com/mmozuras/pronto.svg)](https://gemnasium.com/mmozuras/pronto)
|
7
|
+
[![Inline docs](http://inch-ci.org/github/mmozuras/pronto.svg)](http://inch-ci.org/github/mmozuras/pronto)
|
8
8
|
|
9
9
|
**Pronto** runs analysis quickly by checking only the relevant changes. Created to
|
10
|
-
be used on [pull requests](#github-integration), but also works [locally](#local-changes) and integrates with [GitLab](#gitlab-integration).
|
10
|
+
be used on [pull requests](#github-integration), but also works [locally](#local-changes) and integrates with [GitLab](#gitlab-integration) and [Bitbucket](#bitbucket-integration).
|
11
11
|
Perfect if want to find out quickly if branch introduces changes that conform
|
12
12
|
to your [styleguide](https://github.com/mmozuras/pronto-rubocop), [are DRY](https://github.com/mmozuras/pronto-flay), [don't introduce security holes](https://github.com/mmozuras/pronto-brakeman) and [more](#runners).
|
13
13
|
|
@@ -18,6 +18,7 @@ to your [styleguide](https://github.com/mmozuras/pronto-rubocop), [are DRY](http
|
|
18
18
|
* [Local Changes](#local-changes)
|
19
19
|
* [GitHub Integration](#github-integration)
|
20
20
|
* [GitLab Integration](#gitlab-integration)
|
21
|
+
* [Bitbucket Integration](#bitbucket-integration)
|
21
22
|
* [Configuration](#configuration)
|
22
23
|
* [Runners](#runners)
|
23
24
|
* [Articles](#articles)
|
@@ -100,7 +101,20 @@ $ GITHUB_ACCESS_TOKEN=token pronto run -f github -c origin/master
|
|
100
101
|
or, if you want comments to appear on pull request diff, instead of commit:
|
101
102
|
|
102
103
|
```sh
|
103
|
-
$ GITHUB_ACCESS_TOKEN=token
|
104
|
+
$ GITHUB_ACCESS_TOKEN=token pronto run -f github_pr -c origin/master
|
105
|
+
```
|
106
|
+
|
107
|
+
Use `GithubStatusFormatter` to submit [commit status](https://github.com/blog/1227-commit-status-api):
|
108
|
+
|
109
|
+
```sh
|
110
|
+
$ GITHUB_ACCESS_TOKEN=token pronto run -f github_status -c origin/master
|
111
|
+
```
|
112
|
+
|
113
|
+
It's possible to combine multiple formatters.
|
114
|
+
To get both pull request comments and commit status summary use:
|
115
|
+
|
116
|
+
```sh
|
117
|
+
$ GITHUB_ACCESS_TOKEN=token PULL_REQUEST_ID=id pronto run -f github_status github_pr -c origin/master
|
104
118
|
```
|
105
119
|
|
106
120
|
As an alternative, you can also set up a rake task:
|
@@ -109,7 +123,9 @@ As an alternative, you can also set up a rake task:
|
|
109
123
|
Pronto::GemNames.new.to_a.each { |gem_name| require "pronto/#{gem_name}" }
|
110
124
|
|
111
125
|
formatter = Pronto::Formatter::GithubFormatter.new # or GithubPullRequestFormatter
|
112
|
-
Pronto.
|
126
|
+
status_formatter = Pronto::Formatter::GithubStatusFormatter.new
|
127
|
+
formatters = [formatter, status_formatter]
|
128
|
+
Pronto.run('origin/master', '.', formatters)
|
113
129
|
```
|
114
130
|
|
115
131
|
### GitLab Integration
|
@@ -131,13 +147,26 @@ Then just run it:
|
|
131
147
|
$ GITLAB_API_ENDPOINT="https://gitlab.com/api/v3" GITLAB_API_PRIVATE_TOKEN=token pronto run -f gitlab -c origin/master
|
132
148
|
```
|
133
149
|
|
134
|
-
|
150
|
+
### Bitbucket Integration
|
135
151
|
|
136
|
-
|
137
|
-
|
152
|
+
You can run Pronto as a step of your CI builds and get the results as comments
|
153
|
+
on Bitbucket commits using `BitbucketFormatter` or `BitbucketPullRequestFormatter`.
|
154
|
+
|
155
|
+
Add Pronto runners you want to use to your Gemfile:
|
156
|
+
|
157
|
+
Set the BITBUCKET_USERNAME and BITBUCKET_PASSWORD environment variables or values in `.pronto.yml`.
|
158
|
+
.
|
159
|
+
|
160
|
+
Then just run it:
|
138
161
|
|
139
|
-
|
140
|
-
|
162
|
+
```sh
|
163
|
+
$ BITBUCKET_USERNAME=user BITBUCKET_PASSWORD=pass pronto run -f bitbucket -c origin/master
|
164
|
+
```
|
165
|
+
|
166
|
+
or, if you want comments to appear on pull request diff, instead of commit:
|
167
|
+
|
168
|
+
```sh
|
169
|
+
$ BITBUCKET_USERNAME=user BITBUCKET_PASSWORD=pass pronto run -f bitbucket_pr -c origin/master
|
141
170
|
```
|
142
171
|
|
143
172
|
## Configuration
|
@@ -157,9 +186,14 @@ github:
|
|
157
186
|
api_endpoint: https://api.github.com/
|
158
187
|
web_endpoint: https://github.com/
|
159
188
|
gitlab:
|
160
|
-
slug: mmozuras/
|
161
|
-
api_private_token: 46751
|
189
|
+
slug: mmozuras/42
|
190
|
+
api_private_token: 46751
|
162
191
|
api_endpoint: https://api.vinted.com/gitlab
|
192
|
+
bitbucket:
|
193
|
+
slug: mmozuras/pronto
|
194
|
+
username: user
|
195
|
+
password: pass
|
196
|
+
web_endpoint: https://bitbucket.org/
|
163
197
|
max_warnings: 150
|
164
198
|
verbose: false
|
165
199
|
```
|
@@ -176,13 +210,16 @@ Currently available:
|
|
176
210
|
|
177
211
|
* [pronto-brakeman](https://github.com/mmozuras/pronto-brakeman)
|
178
212
|
* [pronto-coffeelint](https://github.com/siebertm/pronto-coffeelint)
|
213
|
+
* [pronto-credo](https://github.com/carakan/pronto-credo)
|
179
214
|
* [pronto-eslint](https://github.com/mmozuras/pronto-eslint)
|
180
215
|
* [pronto-fasterer](https://github.com/mmozuras/pronto-fasterer)
|
181
216
|
* [pronto-flay](https://github.com/mmozuras/pronto-flay)
|
182
217
|
* [pronto-foodcritic](https://github.com/mmozuras/pronto-foodcritic)
|
218
|
+
* [pronto-haml](https://github.com/mmozuras/pronto-haml)
|
183
219
|
* [pronto-jscs](https://github.com/spajus/pronto-jscs)
|
184
220
|
* [pronto-jshint](https://github.com/mmozuras/pronto-jshint)
|
185
|
-
* [pronto-
|
221
|
+
* [pronto-json](https://github.com/deees/pronto-json)
|
222
|
+
* [pronto-luacheck](https://github.com/seikichi/pronto-luacheck)
|
186
223
|
* [pronto-poper](https://github.com/mmozuras/pronto-poper)
|
187
224
|
* [pronto-rails_best_practices](https://github.com/mmozuras/pronto-rails_best_practices)
|
188
225
|
* [pronto-rails_schema](https://github.com/raimondasv/pronto-rails_schema)
|
@@ -202,6 +239,7 @@ Articles to help you to get started:
|
|
202
239
|
* [Continuous Static Analysis using Pronto](http://codingfearlessly.com/2014/11/06/continuous-static-analysis/)
|
203
240
|
* [Pronto and git hooks](http://elliotthilaire.net/gem-pronto-and-git-hooks/)
|
204
241
|
* [How to end fruitless dev discussions about your project’s code style?](https://medium.com/appaloosa-store-engineering/how-to-end-fruitless-dev-discussions-about-your-project-s-code-style-245070bff6d4)
|
242
|
+
* [Free automated code reviews using Pronto](https://hovancik.net/blog/2016/04/11/free-automated-code-reviews-using-pronto.html)
|
205
243
|
|
206
244
|
Make a Pull Request to add something you wrote or found useful.
|
207
245
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Pronto
|
2
|
+
class Bitbucket
|
3
|
+
def initialize(repo)
|
4
|
+
@repo = repo
|
5
|
+
@config = Config.new
|
6
|
+
@comment_cache = {}
|
7
|
+
@pull_id_cache = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def pull_comments(sha)
|
11
|
+
@comment_cache["#{pull_id}/#{sha}"] ||= begin
|
12
|
+
client.pull_comments(slug, pull_id).map do |comment|
|
13
|
+
Comment.new(sha, comment.content, comment.filename, comment.line_to)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def commit_comments(sha)
|
19
|
+
@comment_cache[sha.to_s] ||= begin
|
20
|
+
client.commit_comments(slug, sha).map do |comment|
|
21
|
+
Comment.new(sha, comment.content, comment.filename, comment.line_to)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_commit_comment(comment)
|
27
|
+
@config.logger.log("Creating commit comment on #{comment.sha}")
|
28
|
+
client.create_commit_comment(slug, comment.sha, comment.body,
|
29
|
+
comment.path, comment.position)
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_pull_comment(comment)
|
33
|
+
@config.logger.log("Creating pull request comment on #{pull_id}")
|
34
|
+
client.create_pull_comment(slug, pull_id, comment.body,
|
35
|
+
comment.path, comment.position)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def slug
|
41
|
+
return @config.bitbucket_slug if @config.bitbucket_slug
|
42
|
+
@slug ||= begin
|
43
|
+
@repo.remote_urls.map do |url|
|
44
|
+
hostname = Regexp.escape(@config.bitbucket_hostname)
|
45
|
+
match = %r{.*#{hostname}(:|\/)(?<slug>.*?)(?:\.git)?\z}.match(url)
|
46
|
+
match[:slug] if match
|
47
|
+
end.compact.first
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def client
|
52
|
+
@client ||= BitbucketClient.new(@config.bitbucket_username,
|
53
|
+
@config.bitbucket_password)
|
54
|
+
end
|
55
|
+
|
56
|
+
def pull_id
|
57
|
+
pull ? pull.id.to_i : env_pull_id.to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def env_pull_id
|
61
|
+
ENV['PULL_REQUEST_ID']
|
62
|
+
end
|
63
|
+
|
64
|
+
def pull
|
65
|
+
@pull ||= if env_pull_id
|
66
|
+
pull_requests.find { |pr| pr.id.to_i == env_pull_id.to_i }
|
67
|
+
elsif @repo.branch
|
68
|
+
pull_requests.find { |pr| pr.branch['name'] == @repo.branch }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def pull_requests
|
73
|
+
@pull_requests ||= client.pull_requests(slug)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/pronto/cli.rb
CHANGED
@@ -49,8 +49,14 @@ module Pronto
|
|
49
49
|
|
50
50
|
formatters = ::Pronto::Formatter.get(options[:formatters])
|
51
51
|
commit = options[:index] ? :index : options[:commit]
|
52
|
-
|
53
|
-
|
52
|
+
repo_workdir = ::Rugged::Repository.discover('.').workdir
|
53
|
+
messages = Dir.chdir(repo_workdir) do
|
54
|
+
::Pronto.run(commit, '.', formatters, path)
|
55
|
+
end
|
56
|
+
if options[:'exit-code']
|
57
|
+
error_messages_count = messages.count { |m| m.level != :info }
|
58
|
+
exit(error_messages_count)
|
59
|
+
end
|
54
60
|
rescue Rugged::RepositoryError
|
55
61
|
puts '"pronto" should be run from a git repository'
|
56
62
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class BitbucketClient
|
2
|
+
include HTTParty
|
3
|
+
base_uri 'https://api.bitbucket.org/1.0/repositories'
|
4
|
+
|
5
|
+
def initialize(username, password)
|
6
|
+
credentials = { username: username, password: password }
|
7
|
+
@headers = { basic_auth: credentials }
|
8
|
+
end
|
9
|
+
|
10
|
+
def commit_comments(slug, sha)
|
11
|
+
response = self.class.get("/#{slug}/changesets/#{sha}/comments", @headers)
|
12
|
+
openstruct(response.parsed_response)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_commit_comment(slug, sha, body, path, position)
|
16
|
+
options = {
|
17
|
+
body: {
|
18
|
+
content: body,
|
19
|
+
line_to: position,
|
20
|
+
filename: path
|
21
|
+
}
|
22
|
+
}
|
23
|
+
options.merge!(@headers)
|
24
|
+
self.class.post("/#{slug}/changesets/#{sha}/comments", options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def pull_comments(slug, pr_id)
|
28
|
+
url = "/#{slug}/pullrequests/#{pr_id}/comments"
|
29
|
+
response = self.class.get(url, @headers)
|
30
|
+
openstruct(response.parsed_response)
|
31
|
+
end
|
32
|
+
|
33
|
+
def pull_requests(slug)
|
34
|
+
base = 'https://api.bitbucket.org/2.0/repositories'
|
35
|
+
url = "#{base}/#{slug}/pullrequests?state=OPEN"
|
36
|
+
response = self.class.get(url, @headers)
|
37
|
+
openstruct(response.parsed_response['values'])
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_pull_comment(slug, pull_id, body, path, position)
|
41
|
+
options = {
|
42
|
+
body: {
|
43
|
+
content: body,
|
44
|
+
line_to: position,
|
45
|
+
filename: path
|
46
|
+
}
|
47
|
+
}
|
48
|
+
options.merge!(@headers)
|
49
|
+
self.class.post("/#{slug}/pullrequests/#{pull_id}/comments", options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def openstruct(response)
|
53
|
+
response.map { |r| OpenStruct.new(r) }
|
54
|
+
end
|
55
|
+
end
|
data/lib/pronto/config.rb
CHANGED
@@ -4,13 +4,17 @@ module Pronto
|
|
4
4
|
@config_hash = config_hash
|
5
5
|
end
|
6
6
|
|
7
|
-
%w(github gitlab).each do |service|
|
7
|
+
%w(github gitlab bitbucket).each do |service|
|
8
8
|
ConfigFile::EMPTY[service].each do |key, _|
|
9
9
|
name = "#{service}_#{key}"
|
10
10
|
define_method(name) { ENV[name.upcase] || @config_hash[service][key] }
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def consolidate_comments?
|
15
|
+
!@config_hash['consolidate_comments'].nil?
|
16
|
+
end
|
17
|
+
|
14
18
|
def excluded_files
|
15
19
|
@excluded_files ||= Array(exclude)
|
16
20
|
.flat_map { |path| Dir[path.to_s] }
|
@@ -21,6 +25,10 @@ module Pronto
|
|
21
25
|
URI.parse(github_web_endpoint).host
|
22
26
|
end
|
23
27
|
|
28
|
+
def bitbucket_hostname
|
29
|
+
URI.parse(bitbucket_web_endpoint).host
|
30
|
+
end
|
31
|
+
|
24
32
|
def max_warnings
|
25
33
|
@config_hash['max_warnings']
|
26
34
|
end
|
data/lib/pronto/config_file.rb
CHANGED
@@ -16,6 +16,12 @@ module Pronto
|
|
16
16
|
'api_private_token' => nil,
|
17
17
|
'api_endpoint' => nil
|
18
18
|
},
|
19
|
+
'bitbucket' => {
|
20
|
+
'slug' => nil,
|
21
|
+
'username' => nil,
|
22
|
+
'password' => nil,
|
23
|
+
'web_endpoint' => 'https://bitbucket.org/'
|
24
|
+
},
|
19
25
|
'runners' => [],
|
20
26
|
'formatters' => [],
|
21
27
|
'max_warnings' => nil,
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
module Colorizable
|
4
|
+
def colorize(string, color)
|
5
|
+
rainbow.wrap(string).color(color)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def rainbow
|
11
|
+
@rainbow ||= Rainbow.new.tap do |rainbow|
|
12
|
+
rainbow.enabled = $stdout.tty?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
class CommitFormatter < GitFormatter
|
4
|
+
def existing_comments(client, sha)
|
5
|
+
comments = client.commit_comments(sha)
|
6
|
+
grouped_comments(comments)
|
7
|
+
end
|
8
|
+
|
9
|
+
def line_number(message)
|
10
|
+
message.line.new_lineno
|
11
|
+
end
|
12
|
+
|
13
|
+
def submit_comments(client, comments)
|
14
|
+
comments.each { |comment| client.create_commit_comment(comment) }
|
15
|
+
rescue Octokit::UnprocessableEntity, HTTParty::Error => e
|
16
|
+
$stderr.puts "Failed to post: #{e.message}"
|
17
|
+
$stderr.puts e.inspect
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -12,8 +12,11 @@ module Pronto
|
|
12
12
|
|
13
13
|
FORMATTERS = {
|
14
14
|
'github' => GithubFormatter,
|
15
|
+
'github_status' => GithubStatusFormatter,
|
15
16
|
'github_pr' => GithubPullRequestFormatter,
|
16
17
|
'gitlab' => GitlabFormatter,
|
18
|
+
'bitbucket' => BitbucketFormatter,
|
19
|
+
'bitbucket_pr' => BitbucketPullRequestFormatter,
|
17
20
|
'json' => JsonFormatter,
|
18
21
|
'checkstyle' => CheckstyleFormatter,
|
19
22
|
'text' => TextFormatter,
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
class GitFormatter
|
4
|
+
def format(messages, repo, patches)
|
5
|
+
client = client_module.new(repo)
|
6
|
+
head = repo.head_commit_sha
|
7
|
+
existing = existing_comments(client, head)
|
8
|
+
comments = new_comments(messages, patches, head)
|
9
|
+
additions = remove_duplicate_comments(existing, comments)
|
10
|
+
submit_comments(client, additions)
|
11
|
+
|
12
|
+
"#{additions.count} Pronto messages posted to #{pretty_name}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def client_module
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
def pretty_name
|
20
|
+
raise NotImplementedError
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def existing_comments(*)
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
def line_number(*)
|
30
|
+
raise NotImplementedError
|
31
|
+
end
|
32
|
+
|
33
|
+
def submit_comments(*)
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def grouped_comments(comments)
|
40
|
+
comments.group_by { |comment| [comment.path, comment.position] }
|
41
|
+
end
|
42
|
+
|
43
|
+
def config
|
44
|
+
@config ||= Config.new
|
45
|
+
end
|
46
|
+
|
47
|
+
def consolidate_comments(comments)
|
48
|
+
comment = comments.first
|
49
|
+
if comments.length > 1
|
50
|
+
joined_body = join_comments(comments)
|
51
|
+
Comment.new(comment.sha, joined_body, comment.path, comment.position)
|
52
|
+
else
|
53
|
+
comment
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def dedupe_comments(existing, comments)
|
58
|
+
body = existing.map(&:body).join(' ')
|
59
|
+
comments.select { |comment| !body.include?(comment.body) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def join_comments(comments)
|
63
|
+
comments.map { |comment| "- #{comment.body}" }.join("\n")
|
64
|
+
end
|
65
|
+
|
66
|
+
def new_comment(message, _patches, sha)
|
67
|
+
body = message.msg
|
68
|
+
path = message.path
|
69
|
+
lineno = line_number(message)
|
70
|
+
|
71
|
+
Comment.new(sha, body, path, lineno)
|
72
|
+
end
|
73
|
+
|
74
|
+
def new_comments(messages, patches, sha)
|
75
|
+
comments = messages
|
76
|
+
.uniq
|
77
|
+
.map { |message| new_comment(message, patches, sha) }
|
78
|
+
grouped_comments(comments)
|
79
|
+
end
|
80
|
+
|
81
|
+
def remove_duplicate_comments(old_comments, new_comments)
|
82
|
+
new_comments.each_with_object([]) do |(key, comments), memo|
|
83
|
+
existing = old_comments[key]
|
84
|
+
comments = dedupe_comments(existing, comments) if existing
|
85
|
+
|
86
|
+
if config.consolidate_comments?
|
87
|
+
comment = consolidate_comments(comments)
|
88
|
+
memo.push(comment)
|
89
|
+
else
|
90
|
+
memo.concat(comments)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -1,28 +1,16 @@
|
|
1
1
|
module Pronto
|
2
2
|
module Formatter
|
3
|
-
class GithubFormatter
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
commit_messages = messages.uniq.map do |message|
|
8
|
-
sha = message.commit_sha
|
9
|
-
body = message.msg
|
10
|
-
path = message.path
|
11
|
-
position = message.line.commit_line.position if message.line
|
12
|
-
|
13
|
-
create_comment(client, sha, body, path, position)
|
14
|
-
end
|
15
|
-
|
16
|
-
"#{commit_messages.compact.count} Pronto messages posted to GitHub"
|
3
|
+
class GithubFormatter < CommitFormatter
|
4
|
+
def client_module
|
5
|
+
Github
|
17
6
|
end
|
18
7
|
|
19
|
-
|
8
|
+
def pretty_name
|
9
|
+
'GitHub'
|
10
|
+
end
|
20
11
|
|
21
|
-
def
|
22
|
-
|
23
|
-
comments = client.commit_comments(sha)
|
24
|
-
existing = comments.any? { |c| comment == c }
|
25
|
-
client.create_commit_comment(comment) unless existing
|
12
|
+
def line_number(message)
|
13
|
+
message.line.commit_line.position
|
26
14
|
end
|
27
15
|
end
|
28
16
|
end
|
@@ -1,35 +1,12 @@
|
|
1
1
|
module Pronto
|
2
2
|
module Formatter
|
3
|
-
class GithubPullRequestFormatter
|
4
|
-
def
|
5
|
-
|
6
|
-
head = repo.head_commit_sha
|
7
|
-
|
8
|
-
commit_messages = messages.uniq.map do |message|
|
9
|
-
body = message.msg
|
10
|
-
path = message.path
|
11
|
-
line = patches.find_line(message.full_path, message.line.new_lineno)
|
12
|
-
|
13
|
-
create_comment(client, head, body, path, line.position)
|
14
|
-
end
|
15
|
-
|
16
|
-
"#{commit_messages.compact.count} Pronto messages posted to GitHub"
|
3
|
+
class GithubPullRequestFormatter < PullRequestFormatter
|
4
|
+
def client_module
|
5
|
+
Github
|
17
6
|
end
|
18
7
|
|
19
|
-
|
20
|
-
|
21
|
-
def create_comment(client, sha, body, path, position)
|
22
|
-
comment = Github::Comment.new(sha, body, path, position)
|
23
|
-
comments = client.pull_comments(sha)
|
24
|
-
existing = comments.any? { |c| comment == c }
|
25
|
-
client.create_pull_comment(comment) unless existing
|
26
|
-
rescue Octokit::UnprocessableEntity => e
|
27
|
-
# The diff output of the local git version and Github is not always
|
28
|
-
# consistent, especially in areas where file renames happened, Github
|
29
|
-
# tends to recognize these better, leading to messages we can't post
|
30
|
-
# because their diff position is non-existent on Github.
|
31
|
-
# Ignore such occasions and continue posting other messages.
|
32
|
-
$stderr.puts "Failed to post: #{comment} with #{e.message}"
|
8
|
+
def pretty_name
|
9
|
+
'GitHub'
|
33
10
|
end
|
34
11
|
end
|
35
12
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
class GithubStatusFormatter
|
4
|
+
class Inflector
|
5
|
+
def self.underscore(camel_cased_word)
|
6
|
+
return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
|
7
|
+
word = camel_cased_word.to_s.gsub(/::/, '/')
|
8
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
9
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
10
|
+
word.tr!('-', '_')
|
11
|
+
word.downcase!
|
12
|
+
word
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
class GithubStatusFormatter
|
4
|
+
class Sentence
|
5
|
+
def initialize(words)
|
6
|
+
@words = words
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
case words.size
|
11
|
+
when 0
|
12
|
+
''
|
13
|
+
when 1
|
14
|
+
words[0].to_s.dup
|
15
|
+
when 2
|
16
|
+
"#{words[0]}#{WORD_CONNECTORS[:two_words_connector]}#{words[1]}"
|
17
|
+
else
|
18
|
+
to_oxford_comma_sentence
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :words
|
25
|
+
|
26
|
+
WORD_CONNECTORS = {
|
27
|
+
words_connector: ', ',
|
28
|
+
two_words_connector: ' and ',
|
29
|
+
last_word_connector: ', and '
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
private_constant :WORD_CONNECTORS
|
33
|
+
|
34
|
+
def to_oxford_comma_sentence
|
35
|
+
"#{words[0...-1].join(WORD_CONNECTORS[:words_connector])}"\
|
36
|
+
"#{WORD_CONNECTORS[:last_word_connector]}"\
|
37
|
+
"#{words[-1]}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require_relative 'sentence'
|
2
|
+
require_relative 'inflector'
|
3
|
+
|
4
|
+
module Pronto
|
5
|
+
module Formatter
|
6
|
+
class GithubStatusFormatter
|
7
|
+
class StatusBuilder
|
8
|
+
def initialize(runner, messages)
|
9
|
+
@runner = runner
|
10
|
+
@messages = messages
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
desc = map_description
|
15
|
+
desc.empty? ? NO_ISSUES_DESCRIPTION : "Found #{desc}."
|
16
|
+
end
|
17
|
+
|
18
|
+
def state
|
19
|
+
failure? ? :failure : :success
|
20
|
+
end
|
21
|
+
|
22
|
+
def context
|
23
|
+
Inflector.underscore(@runner.name)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def failure?
|
29
|
+
@messages.any? { |message| failure_message?(message) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def failure_message?(message)
|
33
|
+
message_state(message) == :failure
|
34
|
+
end
|
35
|
+
|
36
|
+
def message_state(message)
|
37
|
+
DEFAULT_LEVEL_TO_STATE_MAPPING[message.level]
|
38
|
+
end
|
39
|
+
|
40
|
+
def map_description
|
41
|
+
words = count_issue_types.map do |issue_type, issue_count|
|
42
|
+
pluralize(issue_count, issue_type)
|
43
|
+
end
|
44
|
+
|
45
|
+
Sentence.new(words).to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def count_issue_types
|
49
|
+
counts = @messages.each_with_object(Hash.new(0)) do |message, r|
|
50
|
+
r[message.level] += 1
|
51
|
+
end
|
52
|
+
order_by_severity(counts)
|
53
|
+
end
|
54
|
+
|
55
|
+
def order_by_severity(counts)
|
56
|
+
Hash[counts.sort_by { |k, _v| Pronto::Message::LEVELS.index(k) }]
|
57
|
+
end
|
58
|
+
|
59
|
+
def pluralize(count, word)
|
60
|
+
"#{count} #{word}#{count > 1 ? 's' : ''}"
|
61
|
+
end
|
62
|
+
|
63
|
+
DEFAULT_LEVEL_TO_STATE_MAPPING = {
|
64
|
+
info: :success,
|
65
|
+
warning: :failure,
|
66
|
+
error: :failure,
|
67
|
+
fatal: :failure
|
68
|
+
}.freeze
|
69
|
+
|
70
|
+
NO_ISSUES_DESCRIPTION = 'Coast is clear!'.freeze
|
71
|
+
|
72
|
+
private_constant :DEFAULT_LEVEL_TO_STATE_MAPPING, :NO_ISSUES_DESCRIPTION
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'github_status_formatter/status_builder'
|
2
|
+
|
3
|
+
module Pronto
|
4
|
+
module Formatter
|
5
|
+
class GithubStatusFormatter
|
6
|
+
def format(messages, repo, _)
|
7
|
+
client = Github.new(repo)
|
8
|
+
head = repo.head_commit_sha
|
9
|
+
|
10
|
+
messages_by_runner = messages.uniq.group_by(&:runner)
|
11
|
+
|
12
|
+
Runner.runners.each do |runner|
|
13
|
+
create_status(client, head, runner, messages_by_runner[runner] || [])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def create_status(client, sha, runner, messages)
|
20
|
+
builder = StatusBuilder.new(runner, messages)
|
21
|
+
status = Status.new(sha, builder.state,
|
22
|
+
builder.context, builder.description)
|
23
|
+
|
24
|
+
client.create_commit_status(status)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,27 +1,16 @@
|
|
1
1
|
module Pronto
|
2
2
|
module Formatter
|
3
|
-
class GitlabFormatter
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
commit_messages = messages.uniq.map do |message|
|
8
|
-
create_comment(client,
|
9
|
-
message.commit_sha,
|
10
|
-
message.msg,
|
11
|
-
message.path,
|
12
|
-
message.line.commit_line.new_lineno)
|
13
|
-
end
|
14
|
-
|
15
|
-
"#{commit_messages.compact.count} Pronto messages posted to GitLab"
|
3
|
+
class GitlabFormatter < CommitFormatter
|
4
|
+
def client_module
|
5
|
+
Gitlab
|
16
6
|
end
|
17
7
|
|
18
|
-
|
8
|
+
def pretty_name
|
9
|
+
'GitLab'
|
10
|
+
end
|
19
11
|
|
20
|
-
def
|
21
|
-
|
22
|
-
comments = client.commit_comments(sha)
|
23
|
-
existing = comments.any? { |c| comment == c }
|
24
|
-
client.create_commit_comment(comment) unless existing
|
12
|
+
def line_number(message)
|
13
|
+
message.line.commit_line.new_lineno
|
25
14
|
end
|
26
15
|
end
|
27
16
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Pronto
|
2
|
+
module Formatter
|
3
|
+
class PullRequestFormatter < GitFormatter
|
4
|
+
def existing_comments(client, sha)
|
5
|
+
comments = client.pull_comments(sha)
|
6
|
+
grouped_comments(comments)
|
7
|
+
end
|
8
|
+
|
9
|
+
def line_number(message)
|
10
|
+
message.line.line.new_lineno
|
11
|
+
end
|
12
|
+
|
13
|
+
def submit_comments(client, comments)
|
14
|
+
comments.each { |comment| client.create_pull_comment(comment) }
|
15
|
+
rescue Octokit::UnprocessableEntity, HTTParty::Error => e
|
16
|
+
$stderr.puts "Failed to post: #{e.message}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,22 +1,44 @@
|
|
1
1
|
module Pronto
|
2
2
|
module Formatter
|
3
3
|
class TextFormatter
|
4
|
+
include Colorizable
|
5
|
+
|
6
|
+
LOCATION_COLOR = :cyan
|
7
|
+
|
8
|
+
LEVEL_COLORS = {
|
9
|
+
info: :yellow,
|
10
|
+
warning: :magenta,
|
11
|
+
error: :red,
|
12
|
+
fatal: :red
|
13
|
+
}.freeze
|
14
|
+
|
4
15
|
def format(messages, _, _)
|
5
16
|
messages.map do |message|
|
6
|
-
|
7
|
-
"#{location(message)} #{level}: #{message.msg}"
|
17
|
+
"#{format_location(message)} #{format_level(message)}: #{message.msg}".strip
|
8
18
|
end
|
9
19
|
end
|
10
20
|
|
11
21
|
private
|
12
22
|
|
13
|
-
def
|
23
|
+
def format_location(message)
|
14
24
|
line = message.line
|
15
25
|
lineno = line.new_lineno if line
|
16
26
|
path = message.path
|
17
|
-
commit_sha = message.commit_sha
|
27
|
+
commit_sha = message.commit_sha
|
28
|
+
|
29
|
+
if path || lineno
|
30
|
+
path = colorize(path, LOCATION_COLOR) if path
|
31
|
+
"#{path}:#{lineno}"
|
32
|
+
elsif commit_sha
|
33
|
+
colorize(commit_sha[0..6], LOCATION_COLOR)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def format_level(message)
|
38
|
+
level = message.level
|
39
|
+
color = LEVEL_COLORS.fetch(level)
|
18
40
|
|
19
|
-
(
|
41
|
+
colorize(level[0].upcase, color)
|
20
42
|
end
|
21
43
|
end
|
22
44
|
end
|
data/lib/pronto/gem_names.rb
CHANGED
@@ -1,16 +1,21 @@
|
|
1
1
|
module Pronto
|
2
2
|
class GemNames
|
3
3
|
def to_a
|
4
|
-
gems
|
4
|
+
gems.map { |gem| gem.name.sub(/^pronto-/, '') }.uniq.sort
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def gems
|
10
|
+
Gem::Specification.find_all.select do |gem|
|
5
11
|
if gem.name =~ /^pronto-/
|
6
12
|
true
|
7
13
|
elsif gem.name != 'pronto'
|
8
|
-
runner_path = File.join(gem.full_gem_path,
|
14
|
+
runner_path = File.join(gem.full_gem_path,
|
15
|
+
"lib/pronto/#{gem.name}.rb")
|
9
16
|
File.exist?(runner_path)
|
10
17
|
end
|
11
18
|
end
|
12
|
-
|
13
|
-
gems.map { |gem| gem.name.sub(/^pronto-/, '') }.uniq.sort
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
data/lib/pronto/github.rb
CHANGED
@@ -37,6 +37,14 @@ module Pronto
|
|
37
37
|
comment.path, comment.position)
|
38
38
|
end
|
39
39
|
|
40
|
+
def create_commit_status(status)
|
41
|
+
sha = pull_sha || status.sha
|
42
|
+
@config.logger.log("Creating comment status on #{sha}")
|
43
|
+
client.create_status(slug,
|
44
|
+
sha,
|
45
|
+
status.state, context: status.context, description: status.description)
|
46
|
+
end
|
47
|
+
|
40
48
|
private
|
41
49
|
|
42
50
|
def slug
|
@@ -44,7 +52,7 @@ module Pronto
|
|
44
52
|
@slug ||= begin
|
45
53
|
@repo.remote_urls.map do |url|
|
46
54
|
hostname = Regexp.escape(@config.github_hostname)
|
47
|
-
match =
|
55
|
+
match = %r{.*#{hostname}(:|\/)(?<slug>.*?)(?:\.git)?\z}.match(url)
|
48
56
|
match[:slug] if match
|
49
57
|
end.compact.first
|
50
58
|
end
|
@@ -80,17 +88,5 @@ module Pronto
|
|
80
88
|
def pull_requests
|
81
89
|
@pull_requests ||= client.pull_requests(slug)
|
82
90
|
end
|
83
|
-
|
84
|
-
Comment = Struct.new(:sha, :body, :path, :position) do
|
85
|
-
def ==(other)
|
86
|
-
position == other.position &&
|
87
|
-
path == other.path &&
|
88
|
-
body == other.body
|
89
|
-
end
|
90
|
-
|
91
|
-
def to_s
|
92
|
-
"[#{sha}] #{path}:#{position} - #{body}"
|
93
|
-
end
|
94
|
-
end
|
95
91
|
end
|
96
92
|
end
|
data/lib/pronto/gitlab.rb
CHANGED
@@ -16,8 +16,8 @@ module Pronto
|
|
16
16
|
|
17
17
|
def create_commit_comment(comment)
|
18
18
|
@config.logger.log("Creating commit comment on #{comment.sha}")
|
19
|
-
client.create_commit_comment(slug, comment.sha, comment.
|
20
|
-
path: comment.path, line: comment.
|
19
|
+
client.create_commit_comment(slug, comment.sha, comment.body,
|
20
|
+
path: comment.path, line: comment.position,
|
21
21
|
line_type: 'new')
|
22
22
|
end
|
23
23
|
|
@@ -27,17 +27,21 @@ module Pronto
|
|
27
27
|
return @config.gitlab_slug if @config.gitlab_slug
|
28
28
|
@slug ||= begin
|
29
29
|
slug = @repo.remote_urls.map do |url|
|
30
|
-
match =
|
31
|
-
/.*#{host}(:[0-9]+)?(:|\/)(?<slug>.*).git/.match(url)
|
32
|
-
else
|
33
|
-
/.*#{host}(:|\/)(?<slug>.*).git/.match(url)
|
34
|
-
end
|
30
|
+
match = slug_regex(url).match(url)
|
35
31
|
match[:slug] if match
|
36
32
|
end.compact.first
|
37
33
|
URI.escape(slug, '/') if slug
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
37
|
+
def slug_regex(url)
|
38
|
+
if url =~ %r{^ssh:\/\/}
|
39
|
+
%r{.*#{host}(:[0-9]+)?(:|\/)(?<slug>.*).git}
|
40
|
+
else
|
41
|
+
%r{.*#{host}(:|\/)(?<slug>.*).git}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
41
45
|
def host
|
42
46
|
@host ||= URI.split(gitlab_api_endpoint)[2, 2].compact.join(':')
|
43
47
|
end
|
@@ -54,13 +58,5 @@ module Pronto
|
|
54
58
|
def gitlab_api_endpoint
|
55
59
|
@config.gitlab_api_endpoint
|
56
60
|
end
|
57
|
-
|
58
|
-
Comment = Struct.new(:sha, :note, :path, :line) do
|
59
|
-
def ==(other)
|
60
|
-
line == other.line &&
|
61
|
-
path == other.path &&
|
62
|
-
note == other.note
|
63
|
-
end
|
64
|
-
end
|
65
61
|
end
|
66
62
|
end
|
data/lib/pronto/runner.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Pronto
|
2
|
+
Status = Struct.new(:sha, :state, :context, :description) do
|
3
|
+
def ==(other)
|
4
|
+
sha == other.sha &&
|
5
|
+
state == other.state &&
|
6
|
+
context == other.context &&
|
7
|
+
description == other.description
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"[#{sha}] #{context} #{state} - #{description}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/pronto/version.rb
CHANGED
data/lib/pronto.rb
CHANGED
@@ -2,6 +2,8 @@ require 'rugged'
|
|
2
2
|
require 'octokit'
|
3
3
|
require 'gitlab'
|
4
4
|
require 'forwardable'
|
5
|
+
require 'httparty'
|
6
|
+
require 'rainbow'
|
5
7
|
|
6
8
|
require 'pronto/gem_names'
|
7
9
|
|
@@ -9,6 +11,8 @@ require 'pronto/logger'
|
|
9
11
|
require 'pronto/config_file'
|
10
12
|
require 'pronto/config'
|
11
13
|
|
14
|
+
require 'pronto/clients/bitbucket_client'
|
15
|
+
|
12
16
|
require 'pronto/git/repository'
|
13
17
|
require 'pronto/git/patches'
|
14
18
|
require 'pronto/git/patch'
|
@@ -16,16 +20,26 @@ require 'pronto/git/line'
|
|
16
20
|
|
17
21
|
require 'pronto/plugin'
|
18
22
|
require 'pronto/message'
|
23
|
+
require 'pronto/comment'
|
24
|
+
require 'pronto/status'
|
19
25
|
require 'pronto/runner'
|
20
26
|
require 'pronto/runners'
|
21
27
|
require 'pronto/github'
|
22
28
|
require 'pronto/gitlab'
|
29
|
+
require 'pronto/bitbucket'
|
23
30
|
|
31
|
+
require 'pronto/formatter/colorizable'
|
24
32
|
require 'pronto/formatter/text_formatter'
|
25
33
|
require 'pronto/formatter/json_formatter'
|
34
|
+
require 'pronto/formatter/git_formatter'
|
35
|
+
require 'pronto/formatter/commit_formatter'
|
36
|
+
require 'pronto/formatter/pull_request_formatter'
|
26
37
|
require 'pronto/formatter/github_formatter'
|
38
|
+
require 'pronto/formatter/github_status_formatter'
|
27
39
|
require 'pronto/formatter/github_pull_request_formatter'
|
28
40
|
require 'pronto/formatter/gitlab_formatter'
|
41
|
+
require 'pronto/formatter/bitbucket_formatter'
|
42
|
+
require 'pronto/formatter/bitbucket_pull_request_formatter'
|
29
43
|
require 'pronto/formatter/checkstyle_formatter'
|
30
44
|
require 'pronto/formatter/null_formatter'
|
31
45
|
require 'pronto/formatter/formatter'
|
data/pronto.gemspec
CHANGED
@@ -44,10 +44,14 @@ Gem::Specification.new do |s|
|
|
44
44
|
s.add_runtime_dependency('thor', '~> 0.19.0')
|
45
45
|
s.add_runtime_dependency('octokit', '~> 4.3', '>= 4.1.0')
|
46
46
|
s.add_runtime_dependency('gitlab', '~> 3.6', '>= 3.4.0')
|
47
|
+
s.add_runtime_dependency('httparty', '~> 0.13.7')
|
48
|
+
s.add_runtime_dependency('rainbow', '~> 2.1')
|
47
49
|
s.add_development_dependency('rake', '~> 11.0')
|
48
50
|
s.add_development_dependency('rspec', '~> 3.4')
|
49
51
|
s.add_development_dependency('rspec-its', '~> 1.2')
|
50
52
|
s.add_development_dependency('rspec-expectations', '~> 3.4')
|
51
53
|
s.add_development_dependency('bundler', '~> 1.3')
|
52
54
|
s.add_development_dependency('simplecov', '~> 0.11')
|
55
|
+
s.add_development_dependency('rubocop', '~> 0.39.0')
|
56
|
+
s.add_development_dependency('pronto-rubocop', '~> 0.6.2')
|
53
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pronto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mindaugas Mozūras
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rugged
|
@@ -84,6 +84,34 @@ dependencies:
|
|
84
84
|
- - ">="
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: 3.4.0
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: httparty
|
89
|
+
requirement: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.13.7
|
94
|
+
type: :runtime
|
95
|
+
prerelease: false
|
96
|
+
version_requirements: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 0.13.7
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: rainbow
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - "~>"
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '2.1'
|
108
|
+
type: :runtime
|
109
|
+
prerelease: false
|
110
|
+
version_requirements: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - "~>"
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '2.1'
|
87
115
|
- !ruby/object:Gem::Dependency
|
88
116
|
name: rake
|
89
117
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,6 +196,34 @@ dependencies:
|
|
168
196
|
- - "~>"
|
169
197
|
- !ruby/object:Gem::Version
|
170
198
|
version: '0.11'
|
199
|
+
- !ruby/object:Gem::Dependency
|
200
|
+
name: rubocop
|
201
|
+
requirement: !ruby/object:Gem::Requirement
|
202
|
+
requirements:
|
203
|
+
- - "~>"
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 0.39.0
|
206
|
+
type: :development
|
207
|
+
prerelease: false
|
208
|
+
version_requirements: !ruby/object:Gem::Requirement
|
209
|
+
requirements:
|
210
|
+
- - "~>"
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: 0.39.0
|
213
|
+
- !ruby/object:Gem::Dependency
|
214
|
+
name: pronto-rubocop
|
215
|
+
requirement: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - "~>"
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: 0.6.2
|
220
|
+
type: :development
|
221
|
+
prerelease: false
|
222
|
+
version_requirements: !ruby/object:Gem::Requirement
|
223
|
+
requirements:
|
224
|
+
- - "~>"
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: 0.6.2
|
171
227
|
description: |2
|
172
228
|
Pronto runs analysis quickly by checking only the relevant changes. Created
|
173
229
|
to be used on pull requests, but suited for other scenarios as well. Perfect
|
@@ -187,16 +243,29 @@ files:
|
|
187
243
|
- README.md
|
188
244
|
- bin/pronto
|
189
245
|
- lib/pronto.rb
|
246
|
+
- lib/pronto/bitbucket.rb
|
190
247
|
- lib/pronto/cli.rb
|
248
|
+
- lib/pronto/clients/bitbucket_client.rb
|
249
|
+
- lib/pronto/comment.rb
|
191
250
|
- lib/pronto/config.rb
|
192
251
|
- lib/pronto/config_file.rb
|
252
|
+
- lib/pronto/formatter/bitbucket_formatter.rb
|
253
|
+
- lib/pronto/formatter/bitbucket_pull_request_formatter.rb
|
193
254
|
- lib/pronto/formatter/checkstyle_formatter.rb
|
255
|
+
- lib/pronto/formatter/colorizable.rb
|
256
|
+
- lib/pronto/formatter/commit_formatter.rb
|
194
257
|
- lib/pronto/formatter/formatter.rb
|
258
|
+
- lib/pronto/formatter/git_formatter.rb
|
195
259
|
- lib/pronto/formatter/github_formatter.rb
|
196
260
|
- lib/pronto/formatter/github_pull_request_formatter.rb
|
261
|
+
- lib/pronto/formatter/github_status_formatter.rb
|
262
|
+
- lib/pronto/formatter/github_status_formatter/inflector.rb
|
263
|
+
- lib/pronto/formatter/github_status_formatter/sentence.rb
|
264
|
+
- lib/pronto/formatter/github_status_formatter/status_builder.rb
|
197
265
|
- lib/pronto/formatter/gitlab_formatter.rb
|
198
266
|
- lib/pronto/formatter/json_formatter.rb
|
199
267
|
- lib/pronto/formatter/null_formatter.rb
|
268
|
+
- lib/pronto/formatter/pull_request_formatter.rb
|
200
269
|
- lib/pronto/formatter/text_formatter.rb
|
201
270
|
- lib/pronto/gem_names.rb
|
202
271
|
- lib/pronto/git/line.rb
|
@@ -211,6 +280,7 @@ files:
|
|
211
280
|
- lib/pronto/rake_task/travis_pull_request.rb
|
212
281
|
- lib/pronto/runner.rb
|
213
282
|
- lib/pronto/runners.rb
|
283
|
+
- lib/pronto/status.rb
|
214
284
|
- lib/pronto/version.rb
|
215
285
|
- pronto.gemspec
|
216
286
|
homepage: http://github.com/mmozuras/pronto
|