pra 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog.md +9 -0
- data/README.md +31 -0
- data/lib/pra/app.rb +16 -2
- data/lib/pra/config.rb +4 -0
- data/lib/pra/curses_window_system.rb +15 -5
- data/lib/pra/error_log.rb +12 -0
- data/lib/pra/pull_request_service/fetch_status.rb +37 -0
- data/lib/pra/pull_request_service.rb +9 -3
- data/lib/pra/version.rb +1 -1
- data/lib/pra/window_system.rb +8 -0
- data/spec/lib/pra/app_spec.rb +33 -14
- data/spec/lib/pra/config_spec.rb +9 -0
- data/spec/lib/pra/error_log_spec.rb +30 -0
- data/spec/lib/pra/pull_request_service/fetch_status_spec.rb +127 -0
- data/spec/lib/pra/pull_request_service_spec.rb +53 -13
- data/spec/lib/pra/window_system_spec.rb +6 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2be92bf55869e2dd6b07043ef8bd1826698895d
|
4
|
+
data.tar.gz: 105bfd005ecf099bb7b25a8b61131a4155b0a724
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f83912cc359bfd70f36747b7c7493ed06906073fc2715b91dcede0fb9b42eb6be1212b8c519c42f4ba4acaa4445217705cc747011815543d3dc2b8f5514350c4
|
7
|
+
data.tar.gz: 85833ebe12ef250ed4c355d183ae2aced925c4e6e8b7fbaea22f804e698133d398eca30f8a0ba7f8174cd81b3f80520a24b7a7d25e001ff10a32f196447b52fd
|
data/ChangeLog.md
CHANGED
@@ -6,6 +6,15 @@ versions as well as provide a rough history.
|
|
6
6
|
|
7
7
|
#### Next Release
|
8
8
|
|
9
|
+
#### v1.0.0
|
10
|
+
|
11
|
+
* Added connection failure handling so it stays running
|
12
|
+
([\#1](https://github.com/reachlocal/pra/issues/1))
|
13
|
+
* Added user notification of connection failures
|
14
|
+
([\#1](https://github.com/reachlocal/pra/issues/1))
|
15
|
+
* Added error logging to `~/.pra.error.log`
|
16
|
+
([\#1](https://github.com/reachlocal/pra/issues/1))
|
17
|
+
|
9
18
|
#### v0.1.1
|
10
19
|
|
11
20
|
* Fixed up the gemspec to include homepage on rubygems.org
|
data/README.md
CHANGED
@@ -57,6 +57,37 @@ file to get you started. Then simply replace the appropriate fields and the
|
|
57
57
|
**repositories** sections for all the pull sources with the repository
|
58
58
|
information for the repositories you want to watch for open pull requests.
|
59
59
|
|
60
|
+
### GitHub Authentication
|
61
|
+
|
62
|
+
#### Multi-Factor Authentication
|
63
|
+
|
64
|
+
Sadly, at the moment `pra` doesn't support GitHub's Multi-Factor
|
65
|
+
Authentication. There is a ticket for this
|
66
|
+
( [\#5](https://github.com/reachlocal/pra/issues/5) ).
|
67
|
+
|
68
|
+
#### OAuth
|
69
|
+
|
70
|
+
It is also lacking support for GitHub's OAuth mechanism. There is a ticket for
|
71
|
+
this ( [\#6](https://github.com/reachlocal/pra/issues/6) ).
|
72
|
+
|
73
|
+
#### HTTP Basic Auth
|
74
|
+
|
75
|
+
The HTTP Basic Auth will work as long as you don't have multi-factor
|
76
|
+
authentication enabled for your account.
|
77
|
+
|
78
|
+
#### Personal Access Token
|
79
|
+
|
80
|
+
Personal Access Token authentication is currently supported and this is the
|
81
|
+
recommended authentication mechanism to use right now. It is the only
|
82
|
+
authentication mechanism you can use at the moment if you have multi-factor
|
83
|
+
authentication enabled.
|
84
|
+
|
85
|
+
Simply go to your GitHub **Account Settings**, select **Applications**, click
|
86
|
+
the **Create new token** button in the **Personal Access Token** section. Give
|
87
|
+
it the name "Pra" and submit. This will generate your personal access token.
|
88
|
+
Then simply put your personal access token in the `~/.pra.json` as your GitHub
|
89
|
+
username and "x-oauth-basic" as your GitHub password.
|
90
|
+
|
60
91
|
## Usage
|
61
92
|
|
62
93
|
Once you have configured `pra` as described above you can launch it by simply
|
data/lib/pra/app.rb
CHANGED
@@ -2,6 +2,7 @@ require 'thread'
|
|
2
2
|
|
3
3
|
require 'pra/window_system_factory'
|
4
4
|
require 'pra/pull_request_service'
|
5
|
+
require 'pra/error_log'
|
5
6
|
|
6
7
|
Thread.abort_on_exception=true
|
7
8
|
|
@@ -22,8 +23,21 @@ module Pra
|
|
22
23
|
|
23
24
|
def fetch_and_refresh_pull_requests
|
24
25
|
@window_system.fetching_pull_requests
|
25
|
-
|
26
|
-
|
26
|
+
new_pull_requests = []
|
27
|
+
|
28
|
+
Pra::PullRequestService.fetch_pull_requests do |fetch|
|
29
|
+
fetch.on_success do |pull_requests|
|
30
|
+
new_pull_requests += pull_requests
|
31
|
+
end
|
32
|
+
|
33
|
+
fetch.on_error do |error|
|
34
|
+
Pra::ErrorLog.log(error)
|
35
|
+
@window_system.fetch_failed
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
@window_system.refresh_pull_requests(new_pull_requests)
|
40
|
+
|
27
41
|
Kernel.sleep(5 * 60)
|
28
42
|
end
|
29
43
|
|
data/lib/pra/config.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'pra/window_system'
|
2
|
+
require 'pra/config'
|
2
3
|
require 'launchy'
|
3
4
|
require 'curses'
|
4
5
|
require 'thread'
|
@@ -22,6 +23,12 @@ module Pra
|
|
22
23
|
|
23
24
|
def fetching_pull_requests
|
24
25
|
output_string(3, 0, "Fetching pull requests...")
|
26
|
+
Curses.setpos(4,0)
|
27
|
+
Curses.clrtoeol
|
28
|
+
end
|
29
|
+
|
30
|
+
def fetch_failed
|
31
|
+
output_string(4, 0, "Failed to fetch pull requests on 1 or more pull sources. Check #{Pra::Config.error_log_path} for details.")
|
25
32
|
end
|
26
33
|
|
27
34
|
def refresh_pull_requests(pull_requests)
|
@@ -99,13 +106,16 @@ module Pra
|
|
99
106
|
}
|
100
107
|
end
|
101
108
|
|
109
|
+
HEADER_LINE = 6
|
110
|
+
LIST_START_LINE = HEADER_LINE + 2
|
111
|
+
|
102
112
|
def draw_current_pull_requests
|
103
113
|
@state_lock.synchronize {
|
104
114
|
output_string(3, 0, "#{@current_pull_requests.length} Pull Requests")
|
105
|
-
output_string(
|
106
|
-
output_string(
|
115
|
+
output_string(HEADER_LINE, 0, "repository title from_reference to_reference author service")
|
116
|
+
output_string(HEADER_LINE + 1, 0, "--------------------------------------------------------------------------------------------------------------------------------")
|
107
117
|
|
108
|
-
(
|
118
|
+
(LIST_START_LINE...LIST_START_LINE+@previous_number_of_pull_requests).each do |i|
|
109
119
|
Curses.setpos(i,0)
|
110
120
|
Curses.clrtoeol
|
111
121
|
Curses.refresh
|
@@ -113,9 +123,9 @@ module Pra
|
|
113
123
|
|
114
124
|
@current_pull_requests.each_with_index do |pull_request, index|
|
115
125
|
if index == @selected_pull_request_index
|
116
|
-
output_highlighted_string(
|
126
|
+
output_highlighted_string(LIST_START_LINE + 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
127
|
else
|
118
|
-
output_string(
|
128
|
+
output_string(LIST_START_LINE + 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
129
|
end
|
120
130
|
end
|
121
131
|
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Pra
|
2
|
+
module PullRequestService
|
3
|
+
class FetchStatus
|
4
|
+
attr_reader :status, :pull_requests, :error
|
5
|
+
|
6
|
+
def self.success(pull_requests)
|
7
|
+
new(:success, pull_requests)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.error(error)
|
11
|
+
new(:error, :no_pull_requests, error)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(status, pull_requests, error = nil)
|
15
|
+
@status = status
|
16
|
+
@pull_requests = pull_requests
|
17
|
+
@error = error
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_success &block
|
21
|
+
yield(@pull_requests) if success?
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_error &block
|
25
|
+
yield(@error) if error?
|
26
|
+
end
|
27
|
+
|
28
|
+
def success?
|
29
|
+
status == :success
|
30
|
+
end
|
31
|
+
|
32
|
+
def error?
|
33
|
+
status == :error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,14 +1,20 @@
|
|
1
1
|
require 'pra/config'
|
2
2
|
require 'pra/pull_source_factory'
|
3
|
+
require 'pra/pull_request_service/fetch_status'
|
3
4
|
|
4
5
|
module Pra
|
5
6
|
module PullRequestService
|
6
7
|
def self.fetch_pull_requests
|
7
|
-
pull_requests = []
|
8
8
|
pull_sources.each do |pull_source|
|
9
|
-
|
9
|
+
yield fetch_with_status(pull_source)
|
10
10
|
end
|
11
|
-
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.fetch_with_status(pull_source)
|
14
|
+
pull_requests = pull_source.pull_requests
|
15
|
+
FetchStatus.success(pull_requests)
|
16
|
+
rescue Exception => error
|
17
|
+
FetchStatus.error(error)
|
12
18
|
end
|
13
19
|
|
14
20
|
def self.pull_sources
|
data/lib/pra/version.rb
CHANGED
data/lib/pra/window_system.rb
CHANGED
@@ -18,6 +18,14 @@ module Pra
|
|
18
18
|
raise PureVirtualMethodNotImplemented, "the 'fetching_pull_requests' method needs to be implemented."
|
19
19
|
end
|
20
20
|
|
21
|
+
# This method is a pure virtual method and is called by the system
|
22
|
+
# when an error occurs while fetching pull requests. It is intended to
|
23
|
+
# be a notification to the window system so that it can notify the user
|
24
|
+
# that fetching pull requests failed.
|
25
|
+
def fetch_failed
|
26
|
+
raise PureVirtualMethodNotImplemented, "the 'fetch_failed' method needs to be implemented."
|
27
|
+
end
|
28
|
+
|
21
29
|
# This method is a pure virtual method and is intendend for the inheriting
|
22
30
|
# class to implement it to handle refreshing the pull requests within in
|
23
31
|
# the window system. This method is called evertime the pull request
|
data/spec/lib/pra/app_spec.rb
CHANGED
@@ -34,30 +34,49 @@ describe Pra::App do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
describe "#fetch_and_refresh_pull_requests" do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
let(:pull_request_one) { double }
|
38
|
+
let(:pull_request_two) { double }
|
39
|
+
let(:error) { double('error fetching pull requests', message: double('error message'), backtrace: double('backtrace')) }
|
40
|
+
let(:good_source_one) { double('good pull source one', :pull_requests => [pull_request_one]) }
|
41
|
+
let(:good_source_two) { double('good pull source two', :pull_requests => [pull_request_two])}
|
42
|
+
let(:bad_source) { double('bad pull source') }
|
43
|
+
let(:success_status_one) { Pra::PullRequestService::FetchStatus.success([pull_request_one]) }
|
44
|
+
let(:success_status_two) { Pra::PullRequestService::FetchStatus.success([pull_request_two])}
|
45
|
+
let(:error_status) { Pra::PullRequestService::FetchStatus.error(error) }
|
46
|
+
let(:window_system_double) { double('window system', refresh_pull_requests: nil, fetch_failed: nil, fetching_pull_requests: nil) }
|
47
|
+
|
48
|
+
before do
|
49
|
+
allow(Kernel).to receive(:sleep)
|
50
|
+
allow(Pra::PullRequestService).to receive(:fetch_pull_requests).
|
51
|
+
and_yield(success_status_one).
|
52
|
+
and_yield(error_status).
|
53
|
+
and_yield(success_status_two)
|
54
|
+
allow(Pra::ErrorLog).to receive(:log)
|
41
55
|
subject.instance_variable_set(:@window_system, window_system_double)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "notifies the window system it is starting to fetch pull requests" do
|
42
59
|
expect(window_system_double).to receive(:fetching_pull_requests)
|
43
60
|
subject.fetch_and_refresh_pull_requests
|
44
61
|
end
|
45
62
|
|
46
63
|
it "fetches the pull requests from all of the sources" do
|
47
|
-
Kernel.stub(:sleep)
|
48
|
-
window_system_double = double('window system', refresh_pull_requests: nil, fetching_pull_requests: nil)
|
49
|
-
subject.instance_variable_set(:@window_system, window_system_double)
|
50
64
|
expect(Pra::PullRequestService).to receive(:fetch_pull_requests)
|
51
65
|
subject.fetch_and_refresh_pull_requests
|
52
66
|
end
|
53
67
|
|
54
|
-
it "tells the window system to refresh pull requests" do
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
expect(window_system_double).to receive(:
|
68
|
+
it "tells the window system to refresh with the fetched pull requests" do
|
69
|
+
expect(window_system_double).to receive(:refresh_pull_requests).with([pull_request_one, pull_request_two])
|
70
|
+
subject.fetch_and_refresh_pull_requests
|
71
|
+
end
|
72
|
+
|
73
|
+
it "tells the window system about failures" do
|
74
|
+
expect(window_system_double).to receive(:fetch_failed)
|
75
|
+
subject.fetch_and_refresh_pull_requests
|
76
|
+
end
|
77
|
+
|
78
|
+
it "logs the errors for pull sources that could not be fetched" do
|
79
|
+
expect(Pra::ErrorLog).to receive(:log).with(error)
|
61
80
|
subject.fetch_and_refresh_pull_requests
|
62
81
|
end
|
63
82
|
|
data/spec/lib/pra/config_spec.rb
CHANGED
@@ -93,6 +93,15 @@ describe Pra::Config do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
+
describe ".error_log_path" do
|
97
|
+
subject { Pra::Config }
|
98
|
+
|
99
|
+
it "returns the joined users home directory and .pra.error.log to create the path" do
|
100
|
+
allow(subject).to receive(:users_home_directory).and_return('/home/someuser')
|
101
|
+
expect(subject.error_log_path).to eq('/home/someuser/.pra.errors.log')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
96
105
|
describe ".users_home_directory" do
|
97
106
|
subject { Pra::Config }
|
98
107
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pra/error_log'
|
2
|
+
|
3
|
+
describe Pra::ErrorLog do
|
4
|
+
describe '.log' do
|
5
|
+
let(:log_path) { double('log path') }
|
6
|
+
let(:file) { double('file object', puts: nil) }
|
7
|
+
let(:message) { double('error message') }
|
8
|
+
let(:backtrace) { ['backtrace line 1', 'backtrace line 2'] }
|
9
|
+
let(:error) { double('error', message: message, backtrace: backtrace) }
|
10
|
+
|
11
|
+
it 'opens the log file for appending' do
|
12
|
+
allow(Pra::Config).to receive(:error_log_path).and_return(log_path)
|
13
|
+
expect(File).to receive(:open).with(log_path, 'a')
|
14
|
+
Pra::ErrorLog.log(double)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'prints the error message to the file' do
|
18
|
+
allow(File).to receive(:open).and_yield(file)
|
19
|
+
expect(file).to receive(:puts).with(message)
|
20
|
+
Pra::ErrorLog.log(error)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'prints the backtrace to the file' do
|
24
|
+
allow(File).to receive(:open).and_yield(file)
|
25
|
+
expect(file).to receive(:puts).with('backtrace line 1')
|
26
|
+
expect(file).to receive(:puts).with('backtrace line 2')
|
27
|
+
Pra::ErrorLog.log(error)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'pra/pull_request_service/fetch_status'
|
2
|
+
|
3
|
+
describe Pra::PullRequestService::FetchStatus do
|
4
|
+
describe '.new' do
|
5
|
+
it 'assigns the status' do
|
6
|
+
status = double
|
7
|
+
fetch = Pra::PullRequestService::FetchStatus.new(status, double)
|
8
|
+
expect(fetch.status).to eq(status)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'assigns the pull requests' do
|
12
|
+
pulls = [double]
|
13
|
+
fetch = Pra::PullRequestService::FetchStatus.new(double, pulls)
|
14
|
+
expect(fetch.pull_requests).to eq(pulls)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'assigns the error' do
|
18
|
+
error = double
|
19
|
+
fetch = Pra::PullRequestService::FetchStatus.new(double, double, error)
|
20
|
+
expect(fetch.error).to eq(error)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.success' do
|
25
|
+
let(:pulls) { double }
|
26
|
+
subject { Pra::PullRequestService::FetchStatus.success(pulls) }
|
27
|
+
|
28
|
+
it 'sets the status to success' do
|
29
|
+
expect(subject.status).to eq(:success)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'assigns the pull requests' do
|
33
|
+
expect(subject.pull_requests).to eq(pulls)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.error' do
|
38
|
+
let(:error) { double }
|
39
|
+
subject { Pra::PullRequestService::FetchStatus.error(error) }
|
40
|
+
|
41
|
+
it 'sets the status to error' do
|
42
|
+
expect(subject.status).to eq(:error)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'sets the pull requests to a dummy value' do
|
46
|
+
expect(subject.pull_requests).to eq(:no_pull_requests)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#success?' do
|
51
|
+
context 'when status is :success' do
|
52
|
+
subject { Pra::PullRequestService::FetchStatus.new(:success, double) }
|
53
|
+
|
54
|
+
it 'returns true' do
|
55
|
+
expect(subject.success?).to be_true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when status is not :success' do
|
60
|
+
subject { Pra::PullRequestService::FetchStatus.new(double, double) }
|
61
|
+
|
62
|
+
it 'returns false' do
|
63
|
+
expect(subject.success?).to be_false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#error?' do
|
69
|
+
context 'when status is :error' do
|
70
|
+
subject { Pra::PullRequestService::FetchStatus.new(:error, double) }
|
71
|
+
|
72
|
+
it 'returns true' do
|
73
|
+
expect(subject.error?).to be_true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when status is not :error' do
|
78
|
+
subject { Pra::PullRequestService::FetchStatus.new(double, double) }
|
79
|
+
|
80
|
+
it 'returns false' do
|
81
|
+
expect(subject.error?).to be_false
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#on_success' do
|
87
|
+
let(:pulls) { double }
|
88
|
+
let(:error) { double }
|
89
|
+
|
90
|
+
context 'when status is success' do
|
91
|
+
subject { Pra::PullRequestService::FetchStatus.success(pulls) }
|
92
|
+
|
93
|
+
it 'yields the pull requests to the block' do
|
94
|
+
expect { |success_block| subject.on_success(&success_block) }.to yield_with_args(pulls)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when status is not success' do
|
99
|
+
subject { Pra::PullRequestService::FetchStatus.error(double) }
|
100
|
+
|
101
|
+
it 'does not yield' do
|
102
|
+
expect {|success_block| subject.on_success(&success_block) }.not_to yield_control
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#on_error' do
|
108
|
+
let(:pulls) { double }
|
109
|
+
let(:error) { double }
|
110
|
+
|
111
|
+
context 'when status is error' do
|
112
|
+
subject { Pra::PullRequestService::FetchStatus.error(error) }
|
113
|
+
|
114
|
+
it 'yields the error to the block' do
|
115
|
+
expect { |error_block| subject.on_error(&error_block) }.to yield_with_args(error)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when status is not error' do
|
120
|
+
subject { Pra::PullRequestService::FetchStatus.success(double) }
|
121
|
+
|
122
|
+
it 'does not yield' do
|
123
|
+
expect {|error_block| subject.on_error(&error_block) }.not_to yield_control
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -2,27 +2,67 @@ require_relative '../../../lib/pra/pull_request_service'
|
|
2
2
|
|
3
3
|
describe Pra::PullRequestService do
|
4
4
|
describe ".fetch_pull_requests" do
|
5
|
+
let(:pull_request_one) { double('pull request one') }
|
6
|
+
let(:pull_request_two) { double('pull request two') }
|
7
|
+
let(:pull_source_one) { double('good pull source one', :pull_requests => [pull_request_one]) }
|
8
|
+
let(:pull_source_two) { double('good pull source two', :pull_requests => [pull_request_two]) }
|
9
|
+
|
5
10
|
it "gets all the pull-request sources" do
|
6
11
|
subject.should_receive(:pull_sources).and_return([])
|
7
12
|
subject.fetch_pull_requests
|
8
13
|
end
|
9
14
|
|
10
15
|
it "gets the pull requests from each pull-request source" do
|
11
|
-
|
12
|
-
|
13
|
-
subject.
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
allow(subject).to receive(:pull_sources).and_return([pull_source_one, pull_source_two])
|
17
|
+
expect(subject).to receive(:fetch_with_status).with(pull_source_one)
|
18
|
+
expect(subject).to receive(:fetch_with_status).with(pull_source_two)
|
19
|
+
subject.fetch_pull_requests {}
|
20
|
+
end
|
21
|
+
|
22
|
+
it "yields each pull source with its fetch status object" do
|
23
|
+
status1 = double
|
24
|
+
status2 = double
|
25
|
+
allow(subject).to receive(:pull_sources).and_return([pull_source_one, pull_source_two])
|
26
|
+
allow(subject).to receive(:fetch_with_status).with(pull_source_one).and_return(status1)
|
27
|
+
allow(subject).to receive(:fetch_with_status).with(pull_source_two).and_return(status2)
|
28
|
+
expect { |b| subject.fetch_pull_requests(&b) }.to yield_successive_args(status1, status2)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.fetch_with_status' do
|
33
|
+
let(:pulls) { double('pull requests') }
|
34
|
+
let(:error) { Exception.new('error fetching pull requests') }
|
35
|
+
let(:good_source) { double('good pull source', :pull_requests => pulls) }
|
36
|
+
let(:bad_source) { double('bad pull source') }
|
37
|
+
|
38
|
+
before do
|
39
|
+
allow(bad_source).to receive(:pull_requests).and_raise(error)
|
17
40
|
end
|
18
41
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
42
|
+
context 'when it fetches successfully' do
|
43
|
+
it 'builds a success status object for the requests from each pull source' do
|
44
|
+
expect(Pra::PullRequestService::FetchStatus).to receive(:success).with(pulls)
|
45
|
+
subject.fetch_with_status(good_source)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns the status object' do
|
49
|
+
status = double('success status object')
|
50
|
+
allow(Pra::PullRequestService::FetchStatus).to receive(:success).with(pulls).and_return(status)
|
51
|
+
expect(subject.fetch_with_status(good_source)).to eq(status)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when fetching raises an exception' do
|
56
|
+
it 'builds an error status object with the error' do
|
57
|
+
expect(Pra::PullRequestService::FetchStatus).to receive(:error).with(error)
|
58
|
+
subject.fetch_with_status(bad_source)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns the status object' do
|
62
|
+
status = double('error status object')
|
63
|
+
allow(Pra::PullRequestService::FetchStatus).to receive(:error).and_return(status)
|
64
|
+
expect(subject.fetch_with_status(bad_source)).to eq(status)
|
65
|
+
end
|
26
66
|
end
|
27
67
|
end
|
28
68
|
|
@@ -13,6 +13,12 @@ describe Pra::WindowSystem do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
describe "#fetch_failed" do
|
17
|
+
it "raises a message stating that the pure virtual method has not been implemented" do
|
18
|
+
expect { subject.fetch_failed }.to raise_error(Pra::WindowSystem::PureVirtualMethodNotImplemented)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
16
22
|
describe "#refresh_pull_requests" do
|
17
23
|
it "raises a message stating that the pure virtual method has not been implemented" do
|
18
24
|
expect { subject.refresh_pull_requests(double('pull requests')) }.to raise_error(Pra::WindowSystem::PureVirtualMethodNotImplemented)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew De Ponte
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -102,9 +102,11 @@ files:
|
|
102
102
|
- lib/pra/app.rb
|
103
103
|
- lib/pra/config.rb
|
104
104
|
- lib/pra/curses_window_system.rb
|
105
|
+
- lib/pra/error_log.rb
|
105
106
|
- lib/pra/github_pull_source.rb
|
106
107
|
- lib/pra/pull_request.rb
|
107
108
|
- lib/pra/pull_request_service.rb
|
109
|
+
- lib/pra/pull_request_service/fetch_status.rb
|
108
110
|
- lib/pra/pull_source.rb
|
109
111
|
- lib/pra/pull_source_factory.rb
|
110
112
|
- lib/pra/stash_pull_source.rb
|
@@ -115,7 +117,9 @@ files:
|
|
115
117
|
- spec/lib/pra/app_spec.rb
|
116
118
|
- spec/lib/pra/config_spec.rb
|
117
119
|
- spec/lib/pra/curses_window_system_spec.rb
|
120
|
+
- spec/lib/pra/error_log_spec.rb
|
118
121
|
- spec/lib/pra/github_pull_source_spec.rb
|
122
|
+
- spec/lib/pra/pull_request_service/fetch_status_spec.rb
|
119
123
|
- spec/lib/pra/pull_request_service_spec.rb
|
120
124
|
- spec/lib/pra/pull_request_spec.rb
|
121
125
|
- spec/lib/pra/pull_source_factory_spec.rb
|
@@ -152,7 +156,9 @@ test_files:
|
|
152
156
|
- spec/lib/pra/app_spec.rb
|
153
157
|
- spec/lib/pra/config_spec.rb
|
154
158
|
- spec/lib/pra/curses_window_system_spec.rb
|
159
|
+
- spec/lib/pra/error_log_spec.rb
|
155
160
|
- spec/lib/pra/github_pull_source_spec.rb
|
161
|
+
- spec/lib/pra/pull_request_service/fetch_status_spec.rb
|
156
162
|
- spec/lib/pra/pull_request_service_spec.rb
|
157
163
|
- spec/lib/pra/pull_request_spec.rb
|
158
164
|
- spec/lib/pra/pull_source_factory_spec.rb
|