update_status 0.1.7 → 0.2.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.
- data/VERSION +1 -1
- data/bin/status +9 -1
- data/lib/status/base.rb +9 -4
- data/lib/status/config.rb +32 -34
- data/lib/status/github/pull_request.rb +11 -3
- data/lib/status/github/statuses.rb +15 -7
- data/lib/status/jenkins.rb +5 -3
- data/lib/status.rb +6 -18
- data/spec/status/github/pull_request_spec.rb +4 -4
- data/spec/status/github/statuses_spec.rb +17 -12
- data/spec/status/jenkins_spec.rb +1 -5
- data/update_status.gemspec +2 -2
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/status
CHANGED
@@ -4,5 +4,13 @@
|
|
4
4
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
5
5
|
|
6
6
|
require 'status'
|
7
|
+
require 'optparse'
|
7
8
|
|
8
|
-
|
9
|
+
OptionParser.new do |o|
|
10
|
+
o.on("-s STATE", "--state", "Status of QA (default pending) [pending/pass]") {|s| $state = s }
|
11
|
+
o.on("-b BRANCH", "--branch BRANCH", "Branch name") {|b| $branch = b }
|
12
|
+
o.on("-h", "--help", "Display this screen") {puts o; exit }
|
13
|
+
o.parse!
|
14
|
+
end
|
15
|
+
|
16
|
+
Status::Base.new({:state => $state, :branch => $branch}).update
|
data/lib/status/base.rb
CHANGED
@@ -6,14 +6,19 @@ module Status
|
|
6
6
|
class Base
|
7
7
|
attr_reader :qa_status
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@qa_status =
|
11
|
-
@
|
9
|
+
def initialize(options)
|
10
|
+
@qa_status = options[:state] || "pending"
|
11
|
+
@branch = options[:branch] || branch
|
12
|
+
@statuses = Status::Github::Statuses.new(@qa_status, @branch)
|
13
|
+
end
|
14
|
+
|
15
|
+
def branch
|
16
|
+
`git rev-parse --abbrev-ref HEAD`.chomp
|
12
17
|
end
|
13
18
|
|
14
19
|
def update
|
15
20
|
puts "Updating..."
|
16
|
-
pull = Status::Github::PullRequest.new
|
21
|
+
pull = Status::Github::PullRequest.new(@branch)
|
17
22
|
pull.create_pull_request unless pull.pull_request_found?
|
18
23
|
@statuses.request
|
19
24
|
puts "Done."
|
data/lib/status/config.rb
CHANGED
@@ -1,21 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
require "yaml"
|
2
3
|
|
3
4
|
module Status
|
4
5
|
class Config
|
5
|
-
FILE = "
|
6
|
-
|
7
|
-
attr_reader :attrs
|
6
|
+
FILE = ".status.yml"
|
8
7
|
|
8
|
+
attr_reader :parsed
|
9
9
|
def initialize
|
10
|
-
bootstrap
|
11
|
-
load_config
|
10
|
+
bootstrap
|
12
11
|
validate
|
13
12
|
end
|
14
13
|
|
15
|
-
def file
|
16
|
-
FILE
|
17
|
-
end
|
18
|
-
|
19
14
|
def validate
|
20
15
|
validate_presence_of :owner
|
21
16
|
validate_presence_of :repo
|
@@ -25,37 +20,40 @@ module Status
|
|
25
20
|
validate_presence_of :password, "ci"
|
26
21
|
end
|
27
22
|
|
28
|
-
def validate_presence_of(sym, type="github")
|
29
|
-
unless attrs.include?(sym.to_s)
|
30
|
-
puts "You have not entered a #{sym} for #{type}"
|
31
|
-
attribute = gets
|
32
|
-
self.attrs = ({sym => attribute.chomp})
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
23
|
def bootstrap
|
37
|
-
@
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
abort("Config setup: Run status")
|
24
|
+
@parsed = begin
|
25
|
+
YAML.load(File.open(FILE))
|
26
|
+
rescue Exception => e
|
27
|
+
create_file
|
28
|
+
puts "Could not parse YAML file #{FILE}: #{e.message}"
|
29
|
+
abort("exit")
|
30
|
+
end
|
45
31
|
end
|
46
32
|
|
47
|
-
|
48
|
-
@attrs.merge!(attribute)
|
49
|
-
save
|
50
|
-
end
|
33
|
+
private
|
51
34
|
|
52
|
-
def
|
53
|
-
|
35
|
+
def validate_presence_of(sym, type="github")
|
36
|
+
unless parsed.include?(sym)
|
37
|
+
puts "Please update #{FILE} with a #{sym} for #{type}"
|
38
|
+
abort("exit")
|
39
|
+
end
|
54
40
|
end
|
55
41
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
42
|
+
def create_file
|
43
|
+
puts "No #{FILE} found, create one? (y/n)"
|
44
|
+
answer = gets
|
45
|
+
if answer.chomp.downcase == "y"
|
46
|
+
data = {
|
47
|
+
:username => "Jenkins username",
|
48
|
+
:password => "Jenkins password",
|
49
|
+
:ci_url => "eg. http://ci.jenkins.com",
|
50
|
+
:owner => "eg. dougdroper",
|
51
|
+
:repo => "eg. status",
|
52
|
+
:token => "Githubs API token (http://developer.github.com/v3/oauth/)"}
|
53
|
+
File.open(FILE, 'w') {|f| f.write(data.to_yaml)}
|
54
|
+
puts "Please update #{FILE} and then run status"
|
55
|
+
abort("exit")
|
56
|
+
end
|
59
57
|
end
|
60
58
|
end
|
61
59
|
end
|
@@ -3,12 +3,16 @@
|
|
3
3
|
module Status
|
4
4
|
module Github
|
5
5
|
class PullRequest
|
6
|
+
def initialize(branch)
|
7
|
+
@branch = branch
|
8
|
+
end
|
9
|
+
|
6
10
|
def pull_request_found?
|
7
|
-
!get_pull_request.select {|pull| pull["head"]["ref"] ==
|
11
|
+
!get_pull_request.select {|pull| pull["head"]["ref"] == @branch}.empty?
|
8
12
|
end
|
9
13
|
|
10
14
|
def create_pull_request
|
11
|
-
puts "
|
15
|
+
puts "No pull request found, create one? (y/n)"
|
12
16
|
answer = gets
|
13
17
|
answer.chomp.downcase == "y" ? new_pull_request : abort("exit")
|
14
18
|
end
|
@@ -22,7 +26,11 @@ module Status
|
|
22
26
|
puts "enter a description"
|
23
27
|
body = gets
|
24
28
|
|
25
|
-
{:title =>
|
29
|
+
{:title => title, :body => body, :base => "master", :head => @branch }
|
30
|
+
end
|
31
|
+
|
32
|
+
def title
|
33
|
+
`git log #{@branch} -1 --pretty=format:'%s'`
|
26
34
|
end
|
27
35
|
|
28
36
|
def get_pull_request
|
@@ -3,8 +3,10 @@
|
|
3
3
|
module Status
|
4
4
|
module Github
|
5
5
|
class Statuses
|
6
|
-
def initialize(qa_status
|
6
|
+
def initialize(qa_status, branch)
|
7
7
|
@qa_status = qa_status
|
8
|
+
@branch = branch
|
9
|
+
@jenkins = Jenkins.new(branch)
|
8
10
|
end
|
9
11
|
|
10
12
|
def request
|
@@ -14,11 +16,11 @@ module Status
|
|
14
16
|
private
|
15
17
|
|
16
18
|
def status_api
|
17
|
-
"/repos/#{Status.owner}/#{Status.repo}/statuses/" +
|
19
|
+
"/repos/#{Status.owner}/#{Status.repo}/statuses/" + sha + "?access_token=" + Status.token
|
18
20
|
end
|
19
21
|
|
20
22
|
def description
|
21
|
-
"Build status: #{
|
23
|
+
"Build status: #{@jenkins.state}, QA #{@qa_status}"
|
22
24
|
end
|
23
25
|
|
24
26
|
def payload
|
@@ -26,19 +28,25 @@ module Status
|
|
26
28
|
end
|
27
29
|
|
28
30
|
def target_url
|
29
|
-
"#{Status.ci_url}/job/#{
|
31
|
+
"#{Status.ci_url}/job/#{@branch}"
|
30
32
|
end
|
31
33
|
|
32
34
|
def state
|
33
|
-
|
35
|
+
return "success" if @jenkins.pass? && @qa_status == "pass"
|
36
|
+
return "pending" if @jenkins.pass? && @qa_status != "pass"
|
37
|
+
git_state
|
34
38
|
end
|
35
39
|
|
36
40
|
def git_state
|
37
|
-
states.include?(
|
41
|
+
states.include?(@jenkins.state) ? states[states.index(@jenkins.state)] : "error"
|
38
42
|
end
|
39
43
|
|
40
44
|
def states
|
41
|
-
%w(error failure
|
45
|
+
%w(error failure)
|
46
|
+
end
|
47
|
+
|
48
|
+
def sha
|
49
|
+
`git log #{@branch} -1 --pretty=format:'%H'`
|
42
50
|
end
|
43
51
|
end
|
44
52
|
end
|
data/lib/status/jenkins.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
module Status
|
4
|
-
|
5
|
-
|
4
|
+
class Jenkins
|
5
|
+
def initialize(branch)
|
6
|
+
@branch = branch
|
7
|
+
end
|
6
8
|
|
7
9
|
def state
|
8
10
|
return "success" if pass?
|
@@ -24,7 +26,7 @@ module Status
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def path
|
27
|
-
"/job/#{
|
29
|
+
"/job/#{@branch}/lastBuild/api/json"
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
data/lib/status.rb
CHANGED
@@ -26,40 +26,28 @@ module Status
|
|
26
26
|
@config ||= Status::Config.new
|
27
27
|
end
|
28
28
|
|
29
|
-
def sha
|
30
|
-
`git log -1 --pretty=format:'%H'`
|
31
|
-
end
|
32
|
-
|
33
|
-
def title
|
34
|
-
`git log -1 --pretty=format:'%s'`
|
35
|
-
end
|
36
|
-
|
37
|
-
def branch
|
38
|
-
`git rev-parse --abbrev-ref HEAD`.chomp
|
39
|
-
end
|
40
|
-
|
41
29
|
def token
|
42
|
-
Status.config.
|
30
|
+
Status.config.parsed[:token]
|
43
31
|
end
|
44
32
|
|
45
33
|
def repo
|
46
|
-
Status.config.
|
34
|
+
Status.config.parsed[:repo]
|
47
35
|
end
|
48
36
|
|
49
37
|
def owner
|
50
|
-
Status.config.
|
38
|
+
Status.config.parsed[:owner]
|
51
39
|
end
|
52
40
|
|
53
41
|
def ci_url
|
54
|
-
Status.config.
|
42
|
+
Status.config.parsed[:ci_url]
|
55
43
|
end
|
56
44
|
|
57
45
|
def ci_user
|
58
|
-
Status.config.
|
46
|
+
Status.config.parsed[:username]
|
59
47
|
end
|
60
48
|
|
61
49
|
def ci_password
|
62
|
-
Status.config.
|
50
|
+
Status.config.parsed[:password]
|
63
51
|
end
|
64
52
|
|
65
53
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Status::Github::PullRequest do
|
4
|
-
subject { Status::Github::PullRequest.new }
|
4
|
+
subject { Status::Github::PullRequest.new("") }
|
5
5
|
|
6
6
|
before do
|
7
|
-
Status.stub(:config => stub(:
|
7
|
+
Status.stub(:config => stub(:parsed => {}))
|
8
8
|
end
|
9
9
|
|
10
10
|
context "#pull_request_found?" do
|
@@ -14,12 +14,12 @@ describe Status::Github::PullRequest do
|
|
14
14
|
|
15
15
|
it "is not found if a pull request does not exists" do
|
16
16
|
Status.stub(:branch => "new_branch")
|
17
|
-
|
17
|
+
Status::Github::PullRequest.new("new_branch").pull_request_found?.should be_false
|
18
18
|
end
|
19
19
|
|
20
20
|
it "is found if a pull request does exists" do
|
21
21
|
Status.stub(:branch => "branch_name")
|
22
|
-
|
22
|
+
Status::Github::PullRequest.new("branch_name").pull_request_found?.should be_true
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -2,37 +2,42 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Status::Github::Statuses do
|
4
4
|
before do
|
5
|
-
|
5
|
+
@jenkins = stub
|
6
|
+
stub_const("Status::Jenkins", @jenkins)
|
6
7
|
end
|
7
8
|
|
8
9
|
subject { Status::Github::Statuses }
|
9
10
|
it "has a payload target URL of the ci server URL and the branch name" do
|
11
|
+
@jenkins.stub(:new => stub(:state => "success", :pass? => true))
|
10
12
|
Status.stub(:ci_url => "http://jenkins-ci.org", :branch => "feature_branch")
|
11
|
-
subject.new.send(:target_url).should == "http://jenkins-ci.org/job/feature_branch"
|
13
|
+
subject.new("pending", "feature_branch").send(:target_url).should == "http://jenkins-ci.org/job/feature_branch"
|
12
14
|
end
|
13
15
|
|
14
16
|
it "has a payload description of the ci state and qa status" do
|
15
|
-
|
16
|
-
subject.new.send(:description).should == "Build status: success, QA pending"
|
17
|
+
@jenkins.stub(:new => stub(:state => "success"))
|
18
|
+
subject.new("pending", "feature_branch").send(:description).should == "Build status: success, QA pending"
|
17
19
|
end
|
18
20
|
|
19
21
|
it "has a payload pending state when ci is passing but qa hasn't passed" do
|
20
|
-
|
21
|
-
subject.new.send(:state).should == "pending"
|
22
|
+
@jenkins.stub(:new => stub(:state => "pending", :pass? => true))
|
23
|
+
subject.new("pending", "feature_branch").send(:state).should == "pending"
|
22
24
|
end
|
23
25
|
|
24
26
|
it "has a payload success state when ci is passing and qa has passed" do
|
25
|
-
|
26
|
-
subject.new("pass").send(:state).should == "success"
|
27
|
+
@jenkins.stub(:new => stub(:state => "success", :pass? => true))
|
28
|
+
subject.new("pass", "feature_branch").send(:state).should == "success"
|
27
29
|
end
|
28
30
|
|
29
31
|
it "has a payload error state when ci has an error" do
|
30
|
-
|
31
|
-
subject.new("pass").send(:state).should == "error"
|
32
|
+
@jenkins.stub(:new => stub(:state => "nothing", :pass? => false))
|
33
|
+
subject.new("pass", "feature_branch").send(:state).should == "error"
|
32
34
|
end
|
33
35
|
|
34
36
|
it "goes to the correct status api" do
|
35
|
-
|
36
|
-
|
37
|
+
@jenkins.stub(:new => stub)
|
38
|
+
Status.stub(:owner => "owner", :repo => "status", :token => "123", :ci_url => "")
|
39
|
+
status = subject.new("pending", "feature_branch")
|
40
|
+
status.stub(:sha => "99efgd")
|
41
|
+
status.send(:status_api).should == "/repos/owner/status/statuses/99efgd?access_token=123"
|
37
42
|
end
|
38
43
|
end
|
data/spec/status/jenkins_spec.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Status::Jenkins do
|
4
|
-
class Test
|
5
|
-
include Status::Jenkins
|
6
|
-
end
|
7
4
|
|
8
|
-
subject {
|
5
|
+
subject {Status::Jenkins.new("")}
|
9
6
|
|
10
7
|
before do
|
11
8
|
Status.stub(:config => stub(:attrs => {}))
|
12
|
-
Status.stub(:branch => "")
|
13
9
|
|
14
10
|
stub(Status::Request)
|
15
11
|
end
|
data/update_status.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "update_status"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Douglas Roper"]
|
12
|
-
s.date = "2012-12-
|
12
|
+
s.date = "2012-12-12"
|
13
13
|
s.description = "Updates pull requests on github, with latest build from Jenkins and QA status"
|
14
14
|
s.email = "douglasroper@notonthehighstreet.com"
|
15
15
|
s.executables = ["status"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: update_status
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
@@ -170,7 +170,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
170
|
version: '0'
|
171
171
|
segments:
|
172
172
|
- 0
|
173
|
-
hash:
|
173
|
+
hash: 3307849087401865744
|
174
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
175
|
none: false
|
176
176
|
requirements:
|