pra 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/ChangeLog.md +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +47 -0
- data/README.md +181 -0
- data/Rakefile +1 -0
- data/bin/pra +10 -0
- data/lib/pra/app.rb +36 -0
- data/lib/pra/config.rb +40 -0
- data/lib/pra/curses_window_system.rb +124 -0
- data/lib/pra/github_pull_source.rb +36 -0
- data/lib/pra/pull_request.rb +15 -0
- data/lib/pra/pull_request_service.rb +27 -0
- data/lib/pra/pull_source.rb +17 -0
- data/lib/pra/pull_source_factory.rb +20 -0
- data/lib/pra/stash_pull_source.rb +36 -0
- data/lib/pra/version.rb +3 -0
- data/lib/pra/window_system.rb +38 -0
- data/lib/pra/window_system_factory.rb +16 -0
- data/lib/pra.rb +5 -0
- data/pra.gemspec +27 -0
- data/spec/lib/pra/app_spec.rb +72 -0
- data/spec/lib/pra/config_spec.rb +128 -0
- data/spec/lib/pra/curses_window_system_spec.rb +4 -0
- data/spec/lib/pra/github_pull_source_spec.rb +128 -0
- data/spec/lib/pra/pull_request_service_spec.rb +78 -0
- data/spec/lib/pra/pull_request_spec.rb +4 -0
- data/spec/lib/pra/pull_source_factory_spec.rb +40 -0
- data/spec/lib/pra/pull_source_spec.rb +17 -0
- data/spec/lib/pra/stash_pull_source_spec.rb +128 -0
- data/spec/lib/pra/window_system_factory_spec.rb +13 -0
- data/spec/lib/pra/window_system_spec.rb +27 -0
- data/spec/spec_helper.rb +0 -0
- metadata +163 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 990d69dd58accffc7a9a697b26589334785b0eed
|
4
|
+
data.tar.gz: e075ae03f303e947c04b7275d22cb3b58a72e03f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e6fc9ec8e865363b814e8e453a8918aeb1a483dae88ac5ad3fc37d64b5c410e7c7eb0cda259ef90f71e293eb518fd579f4a6f2369601f08c57b4f8e1f6ecdf33
|
7
|
+
data.tar.gz: f8b78ff247073c23f30e38df0a3601a6493a3c4490748572dc7d9eec0fefdee879fa9ec4293a0ac34094bddaa4b52435f10222064c4a6f900f673f84d0084c9c
|
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pra
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.0.0-p247
|
data/ChangeLog.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# ChangeLog
|
2
|
+
|
3
|
+
The following are lists of the notable changes included with each release.
|
4
|
+
This is inteded to help keep people informed about notable changes between
|
5
|
+
versions as well as provide a rough history.
|
6
|
+
|
7
|
+
#### Next Release
|
8
|
+
|
9
|
+
#### v0.1.1
|
10
|
+
|
11
|
+
* Fixed up the gemspec to include homepage on rubygems.org
|
12
|
+
|
13
|
+
#### v0.1.0
|
14
|
+
|
15
|
+
This is the first public release. It includes the following:
|
16
|
+
|
17
|
+
* Added ability to open selected pull request
|
18
|
+
* Made Pull Requests in the list selectable
|
19
|
+
* Listing of Pull Requests found to be open
|
20
|
+
* Support for pulling Pull Requests from GitHub
|
21
|
+
* Support for pulling Pull Requests from Stash
|
22
|
+
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
Copyright (c) 2013 Andrew De Ponte, ReachLocal, Inc.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
Dependency License
|
25
|
+
|
26
|
+
rest-client
|
27
|
+
|
28
|
+
Released under the MIT License: www.opensource.org/licenses/mit-license.php
|
29
|
+
|
30
|
+
launchy
|
31
|
+
|
32
|
+
ISC LICENSE - http://opensource.org/licenses/isc-license.txt
|
33
|
+
|
34
|
+
Copyright (c) 2007-2013 Jeremy Hinegardner
|
35
|
+
|
36
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
37
|
+
purpose with or without fee is hereby granted, provided that the above
|
38
|
+
copyright notice and this permission notice appear in all copies.
|
39
|
+
|
40
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
41
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
42
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
43
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
44
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
45
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
46
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
47
|
+
|
data/README.md
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# pra - The Pull-Request Aggregator
|
2
|
+
|
3
|
+
`pra` is a command line tool designed to allow developers to see the
|
4
|
+
current state of open pull-requests across multiple services. Currently, it
|
5
|
+
supports the following services:
|
6
|
+
|
7
|
+
- [GitHub](http://github.com)
|
8
|
+
- [Stash](http://www.atlassian.com/software/stash)
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
You can easily install `pra` with the following command:
|
13
|
+
|
14
|
+
$ gem install pra
|
15
|
+
|
16
|
+
## Configuration
|
17
|
+
|
18
|
+
`pra` requires one configuration, `~/.pra.json`, to exist in your home
|
19
|
+
directory. The following is an example config that can be used as a starter.
|
20
|
+
*Note:* You will need to replace **your.username**, **your.password**,
|
21
|
+
**your.stash.server**, and the **repositories** sections of each of the pull
|
22
|
+
sources.
|
23
|
+
|
24
|
+
{
|
25
|
+
"pull_sources": [
|
26
|
+
{
|
27
|
+
"type": "stash",
|
28
|
+
"config": {
|
29
|
+
"protocol": "https",
|
30
|
+
"host": "your.stash.server",
|
31
|
+
"username": "your.username",
|
32
|
+
"password": "your.password",
|
33
|
+
"repositories": [
|
34
|
+
{ "project_slug": "CAP", "repository_slug": "capture_api" },
|
35
|
+
{ "project_slug": "RELENG", "repository_slug": "ramboo" }
|
36
|
+
]
|
37
|
+
}
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"type": "github",
|
41
|
+
"config": {
|
42
|
+
"protocol": "https",
|
43
|
+
"host": "api.github.com",
|
44
|
+
"username": "your.username",
|
45
|
+
"password": "your.password",
|
46
|
+
"repositories": [
|
47
|
+
{ "owner": "reachlocal", "repository": "snapdragon" },
|
48
|
+
{ "owner": "brewster", "repository": "cequel" }
|
49
|
+
]
|
50
|
+
}
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
54
|
+
|
55
|
+
I suggest copying and pasting the above starter file into your `~/.pra.json`
|
56
|
+
file to get you started. Then simply replace the appropriate fields and the
|
57
|
+
**repositories** sections for all the pull sources with the repository
|
58
|
+
information for the repositories you want to watch for open pull requests.
|
59
|
+
|
60
|
+
## Usage
|
61
|
+
|
62
|
+
Once you have configured `pra` as described above you can launch it by simply
|
63
|
+
running the following command:
|
64
|
+
|
65
|
+
pra
|
66
|
+
|
67
|
+
Once it launches, it will use the information provided in the `~/.pra.json`
|
68
|
+
configuration file to fetch all the open pull requests and display them. Once,
|
69
|
+
the pull requests are displayed you can perorm any of the following actions.
|
70
|
+
|
71
|
+
### Move Selection Up
|
72
|
+
|
73
|
+
To move the selection up simply press either the `k` or the `up arrow` key.
|
74
|
+
|
75
|
+
### Move Selection Down
|
76
|
+
|
77
|
+
To move the selection down simply press either the `j` or `down arrow` key.
|
78
|
+
|
79
|
+
### Open Selected Pull Request
|
80
|
+
|
81
|
+
If you would like to open the currently selected pull request in your default
|
82
|
+
browser you can press either the `o` or `enter` key.
|
83
|
+
|
84
|
+
### Quit
|
85
|
+
|
86
|
+
If you decide you have had enough and want to exit `pra` press the `q` key.
|
87
|
+
|
88
|
+
## Contributing
|
89
|
+
|
90
|
+
If you would like to contribute to the `pra` project. You can do so in the
|
91
|
+
following areas:
|
92
|
+
|
93
|
+
### Bug Reporting
|
94
|
+
|
95
|
+
As with all software I am sure `pra` will have some bugs. I would very much
|
96
|
+
appreciate any contributions of bug reports. These can be reported on the
|
97
|
+
[issues page](http://github.com/reachlocal/pra/issues) of the project.
|
98
|
+
|
99
|
+
### Feature Requests
|
100
|
+
|
101
|
+
The current state of `pra` is just the MVP (minimum viable product). This
|
102
|
+
means there is always room for growth. If you would like to contribute your
|
103
|
+
thoughts on features that you would like `pra` to have you can submit them on
|
104
|
+
the [issues page](http://github.com/reachlocal/pra/issues) of the project.
|
105
|
+
|
106
|
+
### Improve Documentation
|
107
|
+
|
108
|
+
If you would like to contribute documentation improvements you should follow
|
109
|
+
the directions below.
|
110
|
+
|
111
|
+
1. Fork it
|
112
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
113
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
114
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
115
|
+
5. Create new Pull Request
|
116
|
+
|
117
|
+
### Writing Code
|
118
|
+
|
119
|
+
If you want to contribute by writing code for `pra` you need to know the
|
120
|
+
following:
|
121
|
+
|
122
|
+
##### Overview
|
123
|
+
|
124
|
+
1. Fork it
|
125
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
126
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
127
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
128
|
+
5. Create new Pull Request
|
129
|
+
|
130
|
+
##### RVM
|
131
|
+
|
132
|
+
We use [RVM](http://rvm.io/) with `pra` to encapsulate the dependency gems in our
|
133
|
+
development environments. Therefore, we have the `.ruby-version` and
|
134
|
+
`.ruby-gemset` files in the repository which define the current version of
|
135
|
+
ruby and the gemset that we are developing with.
|
136
|
+
|
137
|
+
You should have [RVM](http://rvm.io) installed of course and when you change
|
138
|
+
into the project root directory it should switch to the proper ruby version if
|
139
|
+
you have it intsalled via [RVM](http://rvm.io). It should also create and
|
140
|
+
switch to the proper gemset.
|
141
|
+
|
142
|
+
If the proper version of ruby is NOT installed via [RVM](http://rvm.io) you
|
143
|
+
should first install that version of ruby and then change out of the project
|
144
|
+
root directory, then change back into it and verify that you are in the
|
145
|
+
proper ruby version and gemset. This can be done with the following command.
|
146
|
+
|
147
|
+
rvm current
|
148
|
+
|
149
|
+
The above command should have output the following
|
150
|
+
|
151
|
+
ruby-2.0.0-p247@pra
|
152
|
+
|
153
|
+
##### Bundler
|
154
|
+
|
155
|
+
We use [Bundler](http://bundler.io/) to manage the development dependencies of
|
156
|
+
`pra`. Once you got setup with [RVM](http://rvm.io) as described above you
|
157
|
+
should be able to install all the development dependencies using the following
|
158
|
+
command:
|
159
|
+
|
160
|
+
bundle
|
161
|
+
|
162
|
+
##### Test Driven Development
|
163
|
+
|
164
|
+
I eveloped `pra` using the TDD methodology with
|
165
|
+
[RSpec](http://www.relishapp.com/rspec) as the testing tool of choice.
|
166
|
+
Therefore, if you are going to contribute code to `pra` please TDD your code
|
167
|
+
changes using [RSpec](http://www.relishapp.com/rspec). If you do not submit
|
168
|
+
your changes with test coverage your request will likely be denied requesting
|
169
|
+
you add appropriate test coverage.
|
170
|
+
|
171
|
+
##### Run Development Version Manually
|
172
|
+
|
173
|
+
If you have setup [RVM](http://rvm.io) as described above and installed the
|
174
|
+
development dependencies using [Bundler](http://bundler.io/) as described
|
175
|
+
above you should be able to run the development version of `pra` by running
|
176
|
+
the following command:
|
177
|
+
|
178
|
+
./bin/pra
|
179
|
+
|
180
|
+
*Note:* The above of course assumes that you have a `~/.pra.json` file
|
181
|
+
already configured.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/pra
ADDED
data/lib/pra/app.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
require 'pra/window_system_factory'
|
4
|
+
require 'pra/pull_request_service'
|
5
|
+
|
6
|
+
Thread.abort_on_exception=true
|
7
|
+
|
8
|
+
module Pra
|
9
|
+
class App
|
10
|
+
def run
|
11
|
+
@window_system = Pra::WindowSystemFactory.build('curses')
|
12
|
+
@window_system.setup
|
13
|
+
|
14
|
+
spawn_pull_request_fetcher
|
15
|
+
|
16
|
+
@window_system.run_loop
|
17
|
+
end
|
18
|
+
|
19
|
+
def spawn_pull_request_fetcher
|
20
|
+
Thread.new { pull_request_fetcher_thread }
|
21
|
+
end
|
22
|
+
|
23
|
+
def fetch_and_refresh_pull_requests
|
24
|
+
@window_system.fetching_pull_requests
|
25
|
+
pull_requests = Pra::PullRequestService.fetch_pull_requests
|
26
|
+
@window_system.refresh_pull_requests(pull_requests)
|
27
|
+
Kernel.sleep(5 * 60)
|
28
|
+
end
|
29
|
+
|
30
|
+
def pull_request_fetcher_thread
|
31
|
+
while( true ) do
|
32
|
+
fetch_and_refresh_pull_requests
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/pra/config.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Pra
|
4
|
+
class Config
|
5
|
+
def initialize(initial_config = {})
|
6
|
+
@initial_config = initial_config
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.load_config
|
10
|
+
return self.new(self.parse_config_file)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parse_config_file
|
14
|
+
self.json_parse(self.read_config_file)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.read_config_file
|
18
|
+
file = File.open(self.config_path, "r")
|
19
|
+
contents = file.read
|
20
|
+
file.close
|
21
|
+
return contents
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.config_path
|
25
|
+
return File.join(self.users_home_directory, '.pra.json')
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.users_home_directory
|
29
|
+
return ENV['HOME']
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.json_parse(content)
|
33
|
+
return JSON.parse(content)
|
34
|
+
end
|
35
|
+
|
36
|
+
def pull_sources
|
37
|
+
@initial_config["pull_sources"]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'pra/window_system'
|
2
|
+
require 'launchy'
|
3
|
+
require 'curses'
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
module Pra
|
7
|
+
class CursesWindowSystem < Pra::WindowSystem
|
8
|
+
ENTER_KEY = 10
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@selected_pull_request_index = 0
|
12
|
+
@current_pull_requests = []
|
13
|
+
@previous_number_of_pull_requests = 0
|
14
|
+
@state_lock = Mutex.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup
|
18
|
+
initialize_screen_settings
|
19
|
+
display_instructions
|
20
|
+
output_string(3, 0, "0 Pull Requests")
|
21
|
+
end
|
22
|
+
|
23
|
+
def fetching_pull_requests
|
24
|
+
output_string(3, 0, "Fetching pull requests...")
|
25
|
+
end
|
26
|
+
|
27
|
+
def refresh_pull_requests(pull_requests)
|
28
|
+
@previous_number_of_pull_requests = @current_pull_requests.length
|
29
|
+
|
30
|
+
@state_lock.synchronize {
|
31
|
+
@current_pull_requests = pull_requests.dup
|
32
|
+
}
|
33
|
+
draw_current_pull_requests
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_loop
|
37
|
+
c = Curses.getch()
|
38
|
+
while (c != 'q') do
|
39
|
+
case c
|
40
|
+
when 'j', Curses::Key::DOWN
|
41
|
+
move_selection_down
|
42
|
+
draw_current_pull_requests
|
43
|
+
when 'k', Curses::Key::UP
|
44
|
+
move_selection_up
|
45
|
+
draw_current_pull_requests
|
46
|
+
when 'o', ENTER_KEY
|
47
|
+
@state_lock.synchronize {
|
48
|
+
Launchy.open(@current_pull_requests[@selected_pull_request_index].link)
|
49
|
+
}
|
50
|
+
end
|
51
|
+
c = Curses.getch()
|
52
|
+
end
|
53
|
+
|
54
|
+
Curses.close_screen
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def initialize_screen_settings
|
60
|
+
Curses.noecho # do not show typed keys
|
61
|
+
Curses.init_screen
|
62
|
+
Curses.stdscr.keypad(true)
|
63
|
+
Curses.start_color
|
64
|
+
Curses.curs_set(0)
|
65
|
+
Curses.init_pair(1, Curses::COLOR_CYAN, Curses::COLOR_BLACK)
|
66
|
+
end
|
67
|
+
|
68
|
+
def output_string(row, col, str)
|
69
|
+
Curses.setpos(row, col)
|
70
|
+
Curses.clrtoeol
|
71
|
+
Curses.addstr(str)
|
72
|
+
Curses.refresh
|
73
|
+
end
|
74
|
+
|
75
|
+
def output_highlighted_string(row, col, str)
|
76
|
+
Curses.attron(Curses.color_pair(1)|Curses::A_NORMAL) {
|
77
|
+
output_string(row, col, str)
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
def display_instructions
|
82
|
+
output_string(0, 0, "Pra: Helping you own pull requests")
|
83
|
+
output_string(1, 0, "quit: q, up: k|#{"\u25B2".encode("UTF-8")}, down: j|#{"\u25BC".encode("UTF-8")}, open: o|#{"\u21A9".encode("UTF-8")}")
|
84
|
+
end
|
85
|
+
|
86
|
+
def move_selection_up
|
87
|
+
@state_lock.synchronize {
|
88
|
+
if @selected_pull_request_index > 0
|
89
|
+
@selected_pull_request_index -= 1
|
90
|
+
end
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
def move_selection_down
|
95
|
+
@state_lock.synchronize {
|
96
|
+
if @selected_pull_request_index < @current_pull_requests.length-1
|
97
|
+
@selected_pull_request_index += 1
|
98
|
+
end
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def draw_current_pull_requests
|
103
|
+
@state_lock.synchronize {
|
104
|
+
output_string(3, 0, "#{@current_pull_requests.length} Pull Requests")
|
105
|
+
output_string(5, 0, "repository title from_reference to_reference author service")
|
106
|
+
output_string(6, 0, "--------------------------------------------------------------------------------------------------------------------------------")
|
107
|
+
|
108
|
+
(7...7+@previous_number_of_pull_requests).each do |i|
|
109
|
+
Curses.setpos(i,0)
|
110
|
+
Curses.clrtoeol
|
111
|
+
Curses.refresh
|
112
|
+
end
|
113
|
+
|
114
|
+
@current_pull_requests.each_with_index do |pull_request, index|
|
115
|
+
if index == @selected_pull_request_index
|
116
|
+
output_highlighted_string(7 + index, 0, "#{pull_request.repository.ljust(15)[0..14]}\t#{pull_request.title.ljust(20)[0..19]}\t#{pull_request.from_reference.ljust(20)[0..19]}\t#{pull_request.to_reference.ljust(20)[0..19]}\t#{pull_request.author.ljust(20)[0..19]}\t#{pull_request.service_id.ljust(10)[0..9]}")
|
117
|
+
else
|
118
|
+
output_string(7 + index, 0, "#{pull_request.repository.ljust(15)[0..14]}\t#{pull_request.title.ljust(20)[0..19]}\t#{pull_request.from_reference.ljust(20)[0..19]}\t#{pull_request.to_reference.ljust(20)[0..19]}\t#{pull_request.author.ljust(20)[0..19]}\t#{pull_request.service_id.ljust(10)[0..9]}")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'pra/pull_source'
|
2
|
+
require 'pra/pull_request'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Pra
|
7
|
+
class GithubPullSource < Pra::PullSource
|
8
|
+
def pull_requests
|
9
|
+
requests = []
|
10
|
+
repositories.each do |repo_config|
|
11
|
+
requests.concat(get_repo_pull_requests(repo_config))
|
12
|
+
end
|
13
|
+
return requests
|
14
|
+
end
|
15
|
+
|
16
|
+
def repositories
|
17
|
+
@config["repositories"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_repo_pull_requests(repository_config)
|
21
|
+
requests = []
|
22
|
+
JSON.parse(rest_api_pull_request_resource(repository_config).get).each do |request|
|
23
|
+
requests << Pra::PullRequest.new(title: request["title"], from_reference: request["head"]["label"], to_reference: request["base"]["label"], author: request["user"]["login"], link: request['html_url'], service_id: 'github', repository: repository_config["repository"])
|
24
|
+
end
|
25
|
+
return requests
|
26
|
+
end
|
27
|
+
|
28
|
+
def rest_api_pull_request_url(repository_config)
|
29
|
+
"#{@config['protocol']}://#{@config['host']}/repos/#{repository_config["owner"]}/#{repository_config["repository"]}/pulls"
|
30
|
+
end
|
31
|
+
|
32
|
+
def rest_api_pull_request_resource(repository_config)
|
33
|
+
RestClient::Resource.new(rest_api_pull_request_url(repository_config), user: @config['username'], password: @config['password'], content_type: :json, accept: :json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Pra
|
2
|
+
class PullRequest
|
3
|
+
attr_accessor :title, :from_reference, :to_reference, :author, :link, :service_id, :repository
|
4
|
+
|
5
|
+
def initialize(attributes={})
|
6
|
+
@title = attributes[:title]
|
7
|
+
@from_reference = attributes[:from_reference]
|
8
|
+
@to_reference = attributes[:to_reference]
|
9
|
+
@author = attributes[:author]
|
10
|
+
@link = attributes[:link]
|
11
|
+
@service_id = attributes[:service_id]
|
12
|
+
@repository = attributes[:repository]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pra/config'
|
2
|
+
require 'pra/pull_source_factory'
|
3
|
+
|
4
|
+
module Pra
|
5
|
+
module PullRequestService
|
6
|
+
def self.fetch_pull_requests
|
7
|
+
pull_requests = []
|
8
|
+
pull_sources.each do |pull_source|
|
9
|
+
pull_requests.concat(pull_source.pull_requests)
|
10
|
+
end
|
11
|
+
return pull_requests
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.pull_sources
|
15
|
+
config = Pra::Config.load_config
|
16
|
+
return map_config_to_pull_sources(config)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.map_config_to_pull_sources(config)
|
20
|
+
sources = []
|
21
|
+
config.pull_sources.each do |pull_source_config|
|
22
|
+
sources << Pra::PullSourceFactory.build_pull_source(pull_source_config)
|
23
|
+
end
|
24
|
+
return sources
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Pra
|
2
|
+
class PullSource
|
3
|
+
class NotImplemented < RuntimeError; end
|
4
|
+
|
5
|
+
def initialize(config = {})
|
6
|
+
@config = config
|
7
|
+
end
|
8
|
+
|
9
|
+
# This method is a pure virtual method and is intended to implemented by
|
10
|
+
# all inheriting classes. It is responsible for obtaining and returning
|
11
|
+
# the opened pull requests from the pull source. Note: These should be
|
12
|
+
# returned as an array of Pra::PullRequest instances.
|
13
|
+
def pull_requests
|
14
|
+
raise NotImplemented, "The 'pull_requests' method needs to be implemented by the inheriting class"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'pra/stash_pull_source'
|
2
|
+
require 'pra/github_pull_source'
|
3
|
+
|
4
|
+
module Pra
|
5
|
+
module PullSourceFactory
|
6
|
+
def self.build_pull_source(pull_source_config)
|
7
|
+
klass = map_type_to_klass(pull_source_config["type"])
|
8
|
+
klass.new(pull_source_config["config"])
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.map_type_to_klass(type)
|
12
|
+
case type
|
13
|
+
when 'stash'
|
14
|
+
return StashPullSource
|
15
|
+
when 'github'
|
16
|
+
return GithubPullSource
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'pra/pull_source'
|
2
|
+
require 'pra/pull_request'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Pra
|
7
|
+
class StashPullSource < Pra::PullSource
|
8
|
+
def pull_requests
|
9
|
+
requests = []
|
10
|
+
repositories.each do |repo_config|
|
11
|
+
requests.concat(get_repo_pull_requests(repo_config))
|
12
|
+
end
|
13
|
+
return requests
|
14
|
+
end
|
15
|
+
|
16
|
+
def repositories
|
17
|
+
@config["repositories"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_repo_pull_requests(repository_config)
|
21
|
+
requests = []
|
22
|
+
JSON.parse(rest_api_pull_request_resource(repository_config).get)["values"].each do |request|
|
23
|
+
requests << Pra::PullRequest.new(title: request["title"], from_reference: request["fromRef"]["id"], to_reference: request["toRef"]["id"], author: request["author"]["user"]["name"], link: "#{@config['protocol']}://#{@config['host']}#{request['link']['url']}", service_id: 'stash', repository: repository_config["repository_slug"])
|
24
|
+
end
|
25
|
+
return requests
|
26
|
+
end
|
27
|
+
|
28
|
+
def rest_api_pull_request_url(repository_config)
|
29
|
+
"#{@config['protocol']}://#{@config['host']}/rest/api/1.0/projects/#{repository_config["project_slug"]}/repos/#{repository_config["repository_slug"]}/pull-requests"
|
30
|
+
end
|
31
|
+
|
32
|
+
def rest_api_pull_request_resource(repository_config)
|
33
|
+
RestClient::Resource.new(rest_api_pull_request_url(repository_config), user: @config['username'], password: @config['password'], content_type: :json, accept: :json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/pra/version.rb
ADDED