pra 0.1.1
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 +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