subordinate 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YmNjYmE1MjYzMTFhYWJmMmRiNGZlNTY3ZTA3YzNjNzJlYTlmZjBlMw==
5
- data.tar.gz: !binary |-
6
- Y2EwZGZiM2QwMTVlZmIxN2MwMGQ2ZmQxZTEyZDYzNmU5MDg1ZTEyMg==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MTExMzMxNjYwNzkxMzM1ZDQ0YzJhYmNjYWVmNTYzNzlhZDI0YjE4YTgwOWVh
10
- OGM5NWUxZTZhYzFkNjRmNDAwOGIyNzhhZjhhYWU5MWQxYjcxOTAxMzRlZTFl
11
- YmIyOTBhNjg1MmE3N2RjZDA1ZTk1M2U3MjRiY2Q2ODhjZjYwZWM=
12
- data.tar.gz: !binary |-
13
- ZTJiMzcwOWE2NDJhMjg4ZDRkNTU4ZGRmOGU4OGI1YzQ4NTE3N2NkODRhNDk4
14
- MjU2MTUwMjViOWYwY2E2MTlhYzk3MDBmYTlhMThhOGY3Y2MwYmNmMWYyZGE4
15
- M2Q3MGMzM2RkMTkwOWE1NzBmODljNTU4OGYyNzRlMjIxODljNmI=
2
+ SHA1:
3
+ metadata.gz: 2fcc3f8225a4165734cf15cd4991414242ed0780
4
+ data.tar.gz: 59259f7cc29b1938f48740b25097a6a0bc47ece3
5
+ SHA512:
6
+ metadata.gz: c2f5738a31937943c7852ff24a6ee68176ee91cc72c3d622e44f5dcf394aff5262cbdef5b5a6d09c2c7e262062a83f9df2f1eff63d137eae564babb4371b945a
7
+ data.tar.gz: f440f7ae37de8c3e93adb8024111cc45f3477fc4d284eaccde6079538ed2c2cd40689eb66003a6aa70e481df6893bb04fc40e1568a3df9a15441e61368b73973
@@ -1,22 +1,8 @@
1
1
  # Authentication Module
2
2
  module Subordinate
3
3
  module Authentication
4
- def authentication
5
- if username && api_token
6
- { :username => username, :api_token => api_token}
7
- else
8
- {}
9
- end
10
- end
11
-
12
4
  def authenticated?
13
- !authentication.empty?
14
- end
15
-
16
- def username_and_token(username = "", api_token = "")
17
- return if username.nil? || api_token.nil?
18
- self.username = username
19
- self.api_token = api_token
5
+ !!(username && api_token)
20
6
  end
21
7
  end
22
- end
8
+ end
@@ -2,15 +2,7 @@
2
2
  require "subordinate/authentication"
3
3
  require "subordinate/connection"
4
4
  require "subordinate/request"
5
-
6
- require "subordinate/client/job"
7
- require "subordinate/client/system"
8
- require "subordinate/client/build"
9
- require "subordinate/client/queue"
10
- require "subordinate/client/load"
11
- require "subordinate/client/people"
12
- require "subordinate/client/view"
13
- require "subordinate/client/executor"
5
+ Dir[File.expand_path("../client/*.rb", __FILE__)].each {|f| require f }
14
6
 
15
7
  module Subordinate
16
8
  class Client
@@ -22,23 +14,13 @@ module Subordinate
22
14
  Configuration::VALID_OPTIONS_KEYS.each do |key|
23
15
  send("#{key}=", options[key])
24
16
  end
25
-
26
- username_and_token(options[:username], options[:api_token])
27
- build_endpoint
28
17
  end
29
18
 
30
19
  # Builds the api endpoint to reach the Jenkins Server
31
20
  #
32
- # @return [String] Endpoint
33
- #
34
- # @author Jason Truluck
35
- def build_endpoint
36
- endpoint = ssl ? "https://" : "http://"
37
- endpoint << "#{self.username}:#{self.api_token}@" if self.authenticated?
38
- endpoint << "#{self.subdomain}." if self.subdomain
39
- endpoint << "#{self.domain}" if self.domain
40
- endpoint << ":#{self.port}" if self.port
41
- self.api_endpoint = endpoint
21
+ # @return [String] Endpoint - the api endpoint to the server
22
+ def api_endpoint
23
+ build_endpoint
42
24
  end
43
25
 
44
26
  include Subordinate::Authentication
@@ -53,5 +35,14 @@ module Subordinate
53
35
  include Subordinate::Client::People
54
36
  include Subordinate::Client::View
55
37
  include Subordinate::Client::Executor
38
+
39
+ private
40
+ def build_endpoint
41
+ endpoint = ssl ? "https://" : "http://"
42
+ endpoint << "#{self.subdomain}." if self.subdomain
43
+ endpoint << "#{self.domain}" if self.domain
44
+ endpoint << ":#{self.port}" if self.port
45
+ endpoint
46
+ end
56
47
  end
57
- end
48
+ end
@@ -34,7 +34,7 @@ module Subordinate
34
34
  #
35
35
  # @author Jason Truluck
36
36
  def build_job(job, options = {})
37
- post("job/#{job}/build", options).status
37
+ post("job/#{job}/build", options)
38
38
  end
39
39
 
40
40
  # Builds the job specified on the Jenkins server with specified parameters
@@ -51,7 +51,7 @@ module Subordinate
51
51
  #
52
52
  # @author Jason Truluck
53
53
  def build_job_with_params(job, options = {})
54
- post("job/#{job}/buildWithParameters", options).status
54
+ post("job/#{job}/buildWithParameters", options)
55
55
  end
56
56
 
57
57
  # Disables the specified job on the Jenkins Server
@@ -67,7 +67,7 @@ module Subordinate
67
67
  #
68
68
  # @author Jason Truluck
69
69
  def disable_job(job, options = {})
70
- post("job/#{job}/disable", options).status
70
+ post("job/#{job}/disable", options)
71
71
  end
72
72
 
73
73
  # Enables the specified job on the Jenkins Server
@@ -83,7 +83,7 @@ module Subordinate
83
83
  #
84
84
  # @author Jason Truluck
85
85
  def enable_job(job, options = {})
86
- post("job/#{job}/enable", options).status
86
+ post("job/#{job}/enable", options)
87
87
  end
88
88
 
89
89
  # Deletes the specified job on the Jenkins Server
@@ -99,7 +99,7 @@ module Subordinate
99
99
  #
100
100
  # @author Jason Truluck
101
101
  def delete_job(job, options = {})
102
- post("job/#{job}/delete", options).status
102
+ post("job/#{job}/delete", options)
103
103
  end
104
104
  end
105
105
  end
@@ -15,8 +15,6 @@ module Subordinate
15
15
  #
16
16
  # @example Get the root api response
17
17
  # Subordinate::Client.root
18
- #
19
- # @author Jason Truluck
20
18
  def root(options = {})
21
19
  get('/api/json', options)
22
20
  end
@@ -29,10 +27,8 @@ module Subordinate
29
27
  #
30
28
  # @example Send a quiet down request to the Jenkins server
31
29
  # Subordinate::Client.quiet_down
32
- #
33
- # @author Jason Truluck
34
30
  def quiet_down(options = {})
35
- post('/quietDown', options).status
31
+ post('/quietDown', options)
36
32
  end
37
33
 
38
34
  # Cancel a shut down request to the Jenkins Server
@@ -43,10 +39,8 @@ module Subordinate
43
39
  #
44
40
  # @example Send a quiet down request to the Jenkins server
45
41
  # Subordinate::Client.cancel_quiet_down
46
- #
47
- # @author Jason Truluck
48
42
  def cancel_quiet_down(options = {})
49
- post('/cancelQuietDown', options).status
43
+ post('/cancelQuietDown', options)
50
44
  end
51
45
 
52
46
  # Restarts the jenkins server, will not wait for jobs to finish
@@ -57,10 +51,8 @@ module Subordinate
57
51
  #
58
52
  # @example Sends a force restart request to the Jenkins server
59
53
  # Subordinate::Client.restart(true)
60
- #
61
- # @author Jason Truluck
62
54
  def restart(options = {})
63
- post("restart", options).status
55
+ post("restart", options)
64
56
  end
65
57
 
66
58
  # Safely Restarts the jenkins server, will wait for jobs to finish
@@ -71,11 +63,9 @@ module Subordinate
71
63
  #
72
64
  # @example Sends a restart request to the Jenkins server (defaults to no force)
73
65
  # Subordinate::Client.restart
74
- #
75
- # @author Jason Truluck
76
66
  def safe_restart(options = {})
77
- post("safeRestart", options).status
67
+ post("safeRestart", options)
78
68
  end
79
69
  end
80
70
  end
81
- end
71
+ end
@@ -54,7 +54,6 @@ module Subordinate
54
54
  # @author Jason Truluck
55
55
  def add_job_to_view(view_name, job, options = {})
56
56
  options.merge!(
57
- :with_query_params => true,
58
57
  :name => job
59
58
  )
60
59
  post("view/#{view_name}/addJobToView", options)
@@ -75,11 +74,10 @@ module Subordinate
75
74
  # @author Jason Truluck
76
75
  def remove_job_from_view(view_name, job, options = {})
77
76
  options.merge!(
78
- :with_query_params => true,
79
- :name => job
77
+ :name => job
80
78
  )
81
79
  post("view/#{view_name}/removeJobFromView", options)
82
80
  end
83
81
  end
84
82
  end
85
- end
83
+ end
@@ -22,12 +22,9 @@ module Subordinate
22
22
  end
23
23
 
24
24
  def reset!
25
- self.username = nil
26
- self.api_token = nil
27
- self.domain = nil
28
- self.subdomain = nil
29
- self.port = nil
30
- self.ssl = true
25
+ VALID_OPTIONS_KEYS.each {|key| instance_variable_set("@#{key}".to_sym, nil) }
26
+ self.ssl = true
27
+ self
31
28
  end
32
29
  end
33
30
  end
@@ -1,5 +1,7 @@
1
1
  # Connection
2
+ require "json"
2
3
  require "faraday_middleware"
4
+ require "subordinate/error"
3
5
 
4
6
  module Subordinate
5
7
  module Connection
@@ -9,12 +11,31 @@ module Subordinate
9
11
  }.merge(options)
10
12
 
11
13
  connection = Faraday.new(options) do |build|
12
- build.use FaradayMiddleware::Mashify
13
- build.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
14
+ build.request :url_encoded
15
+ if authenticated?
16
+ build.request :basic_auth, self.username, self.api_token
17
+ end
18
+ build.response :mashify
19
+ build.response :json, :content_type => /\bjson$/
20
+ build.use ErrorMiddleware
14
21
  build.adapter Faraday.default_adapter
15
22
  end
16
23
 
17
24
  connection
18
25
  end
26
+ # Middleware for responding to Errors returned from the api
27
+ class ErrorMiddleware < Faraday::Middleware
28
+ def initialize(app)
29
+ @app = app
30
+ end
31
+
32
+ def call(env)
33
+ @app.call(env).on_complete do |env|
34
+ if error = Subordinate::Error.from(env[:response])
35
+ raise error
36
+ end
37
+ end
38
+ end
39
+ end
19
40
  end
20
- end
41
+ end
@@ -0,0 +1,45 @@
1
+ # lib/subordinate/error.rb
2
+ module Subordinate
3
+ class Error < StandardError
4
+ attr_accessor :response
5
+
6
+ def self.from(response)
7
+ status = response.status
8
+
9
+ if klass = case status
10
+ when 400 then Subordinate::BadRequest
11
+ when 401 then Subordinate::Unauthorized
12
+ when 404 then Subordinate::NotFound
13
+ when 422 then Subordinate::UnprocessableEntity
14
+ when 500 then Subordinate::InternalServerError
15
+ end
16
+
17
+ klass.new(response)
18
+ end
19
+ end
20
+
21
+ def initialize(response)
22
+ @response = response
23
+ super(error_message)
24
+ end
25
+
26
+ private
27
+ def error_message
28
+ message = "#{response.env[:method].upcase} "
29
+ message << "#{response.env[:url].to_s} | "
30
+ message << "#{response.status} "
31
+ message
32
+ end
33
+ end
34
+
35
+ # Raised when Jenkins REST Api returns a 400 HTTP status code
36
+ class BadRequest < Error; end
37
+ # Raised when Jenkins REST Api returns a 401 HTTP status code
38
+ class Unauthorized < Error; end
39
+ # Raised when Jenkins REST Api returns a 404 HTTP status code
40
+ class NotFound < Error; end
41
+ # Raised when Jenkins REST Api returns a 422 HTTP status code
42
+ class UnprocessableEntity < Error; end
43
+ # Raised when Jenkins REST Api returns a 500 HTTP status code
44
+ class InternalServerError < Error; end
45
+ end
@@ -1,40 +1,40 @@
1
- require 'multi_json'
2
-
1
+ # lib/subordinate/request.rb
3
2
  module Subordinate
4
3
  module Request
5
4
  def get(path, options = {})
6
- response = request(:get, path, options)
7
- response.body
5
+ request(:get, path, options)
8
6
  end
9
7
 
10
8
  def post(path, options = {})
11
- response = request(:post, path, options)
12
- response
9
+ request(:post, path, options)
10
+ end
11
+
12
+ def put(path, options = {})
13
+ request(:put, path, options)
14
+ end
15
+
16
+ def delete(path, options = {})
17
+ request(:delete, path, options)
18
+ end
19
+
20
+ def last_response
21
+ @last_response
13
22
  end
14
23
 
15
24
  private
16
25
  def request(method, path, options = {})
17
- url = options.delete(:endpoint) || api_endpoint
26
+ url = options.delete(:api_endpoint) || api_endpoint
18
27
 
19
28
  connection_options = {
20
29
  :url => url
21
30
  }
22
31
 
23
32
  response = connection(connection_options).send(method) do |request|
24
- case method
25
- when :get
26
- request.url(path, options)
27
- when :post
28
- with_query_params = options.delete(:with_query_params) || false
29
- if with_query_params
30
- request.url(path, options)
31
- else
32
- request.path = path
33
- request.body = MultiJson.dump(options) unless options.empty?
34
- end
35
- end
33
+ request.url(path, options)
36
34
  end
37
- response
35
+
36
+ @last_response = response
37
+ response.body
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Subordinate
2
- VERSION = "0.6.2"
2
+ VERSION = "0.7.0"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,22 +1,20 @@
1
1
  require 'rubygems'
2
2
  require 'coveralls'
3
+ require "pry"
3
4
  Coveralls.wear!
4
5
 
5
6
  ENV["RAILS_ENV"] ||= 'test'
6
-
7
- if ENV['RAILS_ENV'] == 'test'
8
- require 'simplecov'
9
- SimpleCov.start 'rails'
10
- class SimpleCov::Formatter::QualityFormatter
11
- def format(result)
12
- SimpleCov::Formatter::HTMLFormatter.new.format(result)
13
- File.open("coverage/covered_percent", "w") do |f|
14
- f.puts result.source_files.covered_percent.to_f
15
- end
7
+ require 'simplecov'
8
+ SimpleCov.start 'rails'
9
+ class SimpleCov::Formatter::QualityFormatter
10
+ def format(result)
11
+ SimpleCov::Formatter::HTMLFormatter.new.format(result)
12
+ File.open("coverage/covered_percent", "w") do |f|
13
+ f.puts result.source_files.covered_percent.to_f
16
14
  end
17
15
  end
18
- SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
19
16
  end
17
+ SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
20
18
 
21
19
  require 'subordinate'
22
20
  require "webmock/rspec"
@@ -25,12 +23,15 @@ Dir[File.expand_path("spec/support/**/*.rb", __FILE__)].each {|f| require f}
25
23
 
26
24
  RSpec.configure do |config|
27
25
  config.treat_symbols_as_metadata_keys_with_true_values = true
26
+ config.color_enabled = true
28
27
  config.order = "random"
29
28
  end
30
29
 
31
30
  def stub_jenkins(http_method = :any, endpoint = "/", status = 200, content_type = "application/json", response)
32
31
  stub_request(http_method, "http://someusername:sometoken@jenkins.example.com:8080#{endpoint}").
33
- to_return(:status => status,
32
+ to_return(
33
+ :status => status,
34
34
  :body => File.read(File.expand_path("../support/mocks/#{response}", __FILE__)),
35
- :headers =>{'Accept' => content_type, 'Content-type' => content_type})
35
+ :headers =>{'Accept' => content_type, 'Content-type' => content_type}
36
+ )
36
37
  end
@@ -138,7 +138,8 @@ describe Subordinate::Client do
138
138
  it "builds the job specified" do
139
139
  stub_jenkins(:post, "/job/Some-Job/build", 302, "empty.json")
140
140
 
141
- subordinate.build_job("Some-Job").should == 302
141
+ subordinate.build_job("Some-Job")
142
+ expect(subordinate.last_response.status).to eq(302)
142
143
  end
143
144
  end
144
145
 
@@ -146,7 +147,8 @@ describe Subordinate::Client do
146
147
  it "builds the job specified with the parameters specified" do
147
148
  stub_jenkins(:post, "/job/Some-Job/buildWithParameters", 302, "empty.json")
148
149
 
149
- subordinate.build_job_with_params("Some-Job").should == 302
150
+ subordinate.build_job_with_params("Some-Job")
151
+ expect(subordinate.last_response.status).to eq(302)
150
152
  end
151
153
  end
152
154
 
@@ -154,7 +156,8 @@ describe Subordinate::Client do
154
156
  it "disables the specified job" do
155
157
  stub_jenkins(:post, "/job/Some-Job/disable", 302, "empty.json")
156
158
 
157
- subordinate.disable_job("Some-Job").should == 302
159
+ subordinate.disable_job("Some-Job")
160
+ expect(subordinate.last_response.status).to eq(302)
158
161
  end
159
162
  end
160
163
 
@@ -162,7 +165,8 @@ describe Subordinate::Client do
162
165
  it "enables the specified job" do
163
166
  stub_jenkins(:post, "/job/Some-Job/enable", 302, "empty.json")
164
167
 
165
- subordinate.enable_job("Some-Job").should == 302
168
+ subordinate.enable_job("Some-Job")
169
+ expect(subordinate.last_response.status).to eq(302)
166
170
  end
167
171
  end
168
172
 
@@ -170,7 +174,8 @@ describe Subordinate::Client do
170
174
  it "deletes the specified job" do
171
175
  stub_jenkins(:post, "/job/Some-Job/delete", 302, "empty.json")
172
176
 
173
- subordinate.delete_job("Some-Job").should == 302
177
+ subordinate.delete_job("Some-Job")
178
+ expect(subordinate.last_response.status).to eq(302)
174
179
  end
175
180
  end
176
181
  end
@@ -88,19 +88,19 @@ describe Subordinate::Client do
88
88
 
89
89
  describe "#quiet_down" do
90
90
  it "will shut down the server" do
91
- stub_request(:post, "#{subordinate.api_endpoint}/quietDown").
92
- to_return(:status => 302, :body => "", :headers => {})
91
+ stub_jenkins(:post, "/quietDown", 302, "empty.json")
93
92
 
94
- subordinate.quiet_down.should == 302
93
+ subordinate.quiet_down
94
+ expect(subordinate.last_response.status).to eq(302)
95
95
  end
96
96
  end
97
97
 
98
98
  describe "#cancel_quiet_down" do
99
99
  it "will cancel a shut down request to the server" do
100
- stub_request(:post, "#{subordinate.api_endpoint}/cancelQuietDown").
101
- to_return(:status => 302, :body => "", :headers => {})
100
+ stub_jenkins(:post, "/cancelQuietDown", 302, "empty.json")
102
101
 
103
- subordinate.cancel_quiet_down.should == 302
102
+ subordinate.cancel_quiet_down
103
+ expect(subordinate.last_response.status).to eq(302)
104
104
  end
105
105
  end
106
106
 
@@ -108,19 +108,19 @@ describe Subordinate::Client do
108
108
  # commented out since random order is used.
109
109
  describe "#restart" do
110
110
  it "will force restart the jenkins server" do
111
- stub_request(:post, "#{subordinate.api_endpoint}/restart").
112
- to_return(:status => 302, :body => "", :headers => {})
111
+ stub_jenkins(:post, "/restart", 302, "empty.json")
113
112
 
114
- subordinate.restart.should == 302
113
+ subordinate.restart
114
+ expect(subordinate.last_response.status).to eq(302)
115
115
  end
116
116
  end
117
117
 
118
118
  describe "#safe_restart" do
119
119
  it "will restart the jenkins server" do
120
- stub_request(:post, "#{subordinate.api_endpoint}/safeRestart").
121
- to_return(:status => 302, :body => "", :headers => {})
120
+ stub_jenkins(:post, "/safeRestart", 302, "empty.json")
122
121
 
123
- subordinate.safe_restart.should == 302
122
+ subordinate.safe_restart
123
+ expect(subordinate.last_response.status).to eq(302)
124
124
  end
125
125
  end
126
126
  end
@@ -16,7 +16,7 @@ describe Subordinate::Client do
16
16
 
17
17
  describe "#view" do
18
18
  before(:each) { stub_jenkins(:get, "/view/someview/api/json", "view.json") }
19
-
19
+
20
20
  let(:current_response) { subordinate.view("someview") }
21
21
 
22
22
  it "returns the view response" do
@@ -80,21 +80,8 @@ describe Subordinate::Client do
80
80
  it "responds with a success" do
81
81
  stub_jenkins(:post, "/view/someview/addJobToView?name=somejob", 200, "empty.json")
82
82
 
83
- subordinate.add_job_to_view("someview", "somejob").status.should == 200
84
- end
85
-
86
- context "error" do
87
- it "returns 404 when not found" do
88
- stub_jenkins(:post, "/view/someview/addJobToView?name=somejob", 404, "empty.json")
89
-
90
- subordinate.add_job_to_view("someview", "somejob").status.should == 404
91
- end
92
-
93
- it "returns 500 when server error" do
94
- stub_jenkins(:post, "/view/someview/addJobToView?name=somejob", 500, "empty.json")
95
-
96
- subordinate.add_job_to_view("someview", "somejob").status.should == 500
97
- end
83
+ subordinate.add_job_to_view("someview", "somejob")
84
+ expect(subordinate.last_response.status).to eq(200)
98
85
  end
99
86
  end
100
87
 
@@ -102,21 +89,8 @@ describe Subordinate::Client do
102
89
  it "responds with a success" do
103
90
  stub_jenkins(:post, "/view/someview/removeJobFromView?name=somejob", 200, "empty.json")
104
91
 
105
- subordinate.remove_job_from_view("someview", "somejob").status.should == 200
106
- end
107
-
108
- context "error" do
109
- it "returns 404 when not found" do
110
- stub_jenkins(:post, "/view/someview/removeJobFromView?name=somejob", 404, "empty.json")
111
-
112
- subordinate.remove_job_from_view("someview", "somejob").status.should == 404
113
- end
114
-
115
- it "returns 500 when server error" do
116
- stub_jenkins(:post, "/view/someview/removeJobFromView?name=somejob", 500, "empty.json")
117
-
118
- subordinate.remove_job_from_view("someview", "somejob").status.should == 500
119
- end
92
+ subordinate.remove_job_from_view("someview", "somejob")
93
+ expect(subordinate.last_response.status).to eq(200)
120
94
  end
121
95
  end
122
96
  end
@@ -2,118 +2,50 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe Subordinate::Client do
5
- before do
6
- Subordinate.reset!
7
-
8
- Subordinate.configure do |c|
9
- c.subdomain = "jenkins"
10
- c.domain = "example.com"
11
- c.port = 8080
12
- c.ssl = false
13
- end
14
- end
15
-
16
5
  describe "configuration" do
17
6
  let(:domain) { "woofound.com" }
18
7
  let(:subdomain) { "awesome" }
19
8
  let(:port) { 2000 }
20
9
  let(:ssl) { false }
21
10
 
22
- describe "with a domain" do
23
- before do
24
- Subordinate.reset!
25
- Subordinate.configure do |c|
26
- c.domain = domain
27
- end
28
- end
29
-
30
- let(:client) { Subordinate.new }
31
-
32
- it "sets the domain for the client" do
33
- client.domain.should == domain
34
- end
11
+ before(:each){
12
+ Subordinate.reset!
13
+ }
35
14
 
15
+ describe "with a domain" do
36
16
  it "builds an endpoint with the domain" do
37
- client.api_endpoint.should include(domain)
17
+ Subordinate.reset!
18
+ client = Subordinate.new(domain: domain)
19
+ client.api_endpoint.should eq("https://#{domain}")
38
20
  end
39
21
  end
40
22
 
41
23
  # SUBDOMAIN
42
24
  describe "with a subdomain" do
43
- before do
44
- Subordinate.reset!
45
- Subordinate.configure do |c|
46
- c.subdomain = subdomain
47
- end
48
- end
49
-
50
- let(:client) { Subordinate.new }
51
-
52
- it "sets the subdomain for the client" do
53
- client.subdomain.should == subdomain
54
- end
55
-
56
25
  it "builds an endpoint with the subdomain" do
57
- client.api_endpoint.should include(subdomain)
58
- end
59
- end
60
-
61
- describe "without a subdomain" do
62
- it "builds an endpoint without a subdomain" do
63
- client = Subordinate.new(:subdomain => nil)
64
- client.api_endpoint.should == "http://example.com:8080"
26
+ client = Subordinate.new(domain: domain, subdomain: subdomain)
27
+ client.api_endpoint.should eq("https://#{subdomain}.#{domain}")
65
28
  end
66
29
  end
67
30
 
68
31
  # PORT
69
32
  describe "with a port" do
70
- before do
71
- Subordinate.reset!
72
- Subordinate.configure do |c|
73
- c.port = port
74
- end
75
- end
76
-
77
- let(:client) { Subordinate.new }
78
-
79
- it "sets the port for the client" do
80
- client.port.should == port
81
- end
82
-
83
33
  it "builds an endpoint with the port" do
84
- client.api_endpoint.should include("#{port}")
85
- end
86
- end
87
-
88
- describe "without a port" do
89
- it "builds an endpoint without a port" do
90
- client = Subordinate.new(:port => nil)
91
- client.api_endpoint.should == "http://jenkins.example.com"
34
+ client = Subordinate.new(domain: domain, port: port)
35
+ client.api_endpoint.should eq("https://#{domain}:#{port}")
92
36
  end
93
37
  end
94
38
 
95
39
  # SSL
96
40
  describe "with a ssl" do
97
- before do
98
- Subordinate.reset!
99
- Subordinate.configure do |c|
100
- c.ssl = ssl
101
- end
102
- end
103
-
104
- let(:client) { Subordinate.new }
105
-
106
- it "sets the ssl for the client" do
107
- client.ssl.should == ssl
108
- end
109
-
110
41
  it "builds an endpoint with the ssl set to false" do
111
- client.api_endpoint.should include("http://")
42
+ client = Subordinate.new(domain: domain, ssl: false)
43
+ client.api_endpoint.should eq("http://#{domain}")
112
44
  end
113
45
 
114
46
  it "builds an endpoint with the ssl set to true" do
115
- client = Subordinate.new(:ssl => true)
116
- client.api_endpoint.should include("https://")
47
+ client = Subordinate.new(domain: domain, ssl: true)
48
+ client.api_endpoint.should eq("https://#{domain}")
117
49
  end
118
50
  end
119
51
  end
@@ -0,0 +1,58 @@
1
+ # spec/subordinate/error.rb
2
+ require "spec_helper"
3
+
4
+ describe Subordinate::Error do
5
+ before do
6
+ Subordinate.reset!
7
+ Subordinate.configure do |c|
8
+ c.subdomain = "jenkins"
9
+ c.domain = "example.com"
10
+ c.port = 8080
11
+ c.ssl = false
12
+ end
13
+ end
14
+
15
+ let(:client) { Subordinate::Client.new(:username => "someusername", :api_token => "sometoken") }
16
+
17
+ describe "#from" do
18
+ describe "400 Error" do
19
+ it "raises a Subordinate::BadRequest error" do
20
+ stub_jenkins(:get, "/api/json", 400, "application/json", "base.json")
21
+
22
+ expect{ client.root }.to raise_error(Subordinate::BadRequest)
23
+ end
24
+ end
25
+
26
+ describe "401 Error" do
27
+ it "raises a Subordinate::Unauthorized error" do
28
+ stub_jenkins(:get, "/api/json", 401, "base.json")
29
+
30
+ expect{ client.root }.to raise_error(Subordinate::Unauthorized)
31
+ end
32
+ end
33
+
34
+ describe "404 Error" do
35
+ it "raises a Subordinate::NotFound error" do
36
+ stub_jenkins(:get, "/api/json", 404, "base.json")
37
+
38
+ expect{ client.root }.to raise_error(Subordinate::NotFound)
39
+ end
40
+ end
41
+
42
+ describe "422 Error" do
43
+ it "raises a Subordinate::UnprocessableEntity error" do
44
+ stub_jenkins(:get, "/api/json", 422, "base.json")
45
+
46
+ expect{ client.root }.to raise_error(Subordinate::UnprocessableEntity)
47
+ end
48
+ end
49
+
50
+ describe "500 Error" do
51
+ it "raises a Subordinate::InternalServerError error" do
52
+ stub_jenkins(:get, "/api/json", 500, "base.json")
53
+
54
+ expect{ client.root }.to raise_error(Subordinate::InternalServerError)
55
+ end
56
+ end
57
+ end
58
+ end
data/subordinate.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency "rspec", "~> 2.14.0"
22
22
  gem.add_development_dependency "rake", "~> 10.1.0"
23
23
  gem.add_development_dependency "webmock", "~> 1.13.0"
24
+ gem.add_development_dependency "pry"
24
25
  gem.add_development_dependency "simplecov", "~> 0.7.0"
25
26
  gem.add_development_dependency "coveralls", "~> 0.7.0"
26
27
  gem.add_development_dependency "yard", "~> 0.8.0.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subordinate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Truluck
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-23 00:00:00.000000000 Z
11
+ date: 2013-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ~>
109
109
  - !ruby/object:Gem::Version
110
110
  version: 1.13.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: simplecov
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +204,7 @@ files:
190
204
  - lib/subordinate/client/view.rb
191
205
  - lib/subordinate/configuration.rb
192
206
  - lib/subordinate/connection.rb
207
+ - lib/subordinate/error.rb
193
208
  - lib/subordinate/request.rb
194
209
  - lib/subordinate/version.rb
195
210
  - spec/spec_helper.rb
@@ -203,6 +218,7 @@ files:
203
218
  - spec/subordinate/client/view_spec.rb
204
219
  - spec/subordinate/client_spec.rb
205
220
  - spec/subordinate/configuration_spec.rb
221
+ - spec/subordinate/error_spec.rb
206
222
  - spec/support/mocks/base.json
207
223
  - spec/support/mocks/build.json
208
224
  - spec/support/mocks/build_timestamp.txt
@@ -229,17 +245,17 @@ require_paths:
229
245
  - lib
230
246
  required_ruby_version: !ruby/object:Gem::Requirement
231
247
  requirements:
232
- - - ! '>='
248
+ - - '>='
233
249
  - !ruby/object:Gem::Version
234
250
  version: '0'
235
251
  required_rubygems_version: !ruby/object:Gem::Requirement
236
252
  requirements:
237
- - - ! '>='
253
+ - - '>='
238
254
  - !ruby/object:Gem::Version
239
255
  version: '0'
240
256
  requirements: []
241
257
  rubyforge_project:
242
- rubygems_version: 2.0.3
258
+ rubygems_version: 2.1.10
243
259
  signing_key:
244
260
  specification_version: 4
245
261
  summary: Jenkins API wrapper
@@ -255,6 +271,7 @@ test_files:
255
271
  - spec/subordinate/client/view_spec.rb
256
272
  - spec/subordinate/client_spec.rb
257
273
  - spec/subordinate/configuration_spec.rb
274
+ - spec/subordinate/error_spec.rb
258
275
  - spec/support/mocks/base.json
259
276
  - spec/support/mocks/build.json
260
277
  - spec/support/mocks/build_timestamp.txt