abiquo-api 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/abiquo-api.gemspec +4 -0
- data/lib/abiquo-api.rb +22 -4
- data/lib/abiquo-api/collection.rb +17 -11
- data/lib/abiquo-api/httpclient.rb +70 -68
- data/lib/abiquo-api/version.rb +1 -1
- metadata +82 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3c3049291ec1569f72209a814aff513b14b3133
|
4
|
+
data.tar.gz: b0c28497ca9fb3fa847e3bec9b0a41d1cb6bf949
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca26573a649b5e145a6ab34a8ac187b15e4d60b286cdbfe4260c0f765d4f83ae9dfb6f9ecf3057ad2ce74bb77cc9bc0def42efb2e6c5c21a2dbda36c61df7fb7
|
7
|
+
data.tar.gz: e9ea6c2637cf89698d9fd38ab51977b781e4529de0f9131f1a1d1bb02fb3c080b2c3ec134c8c66526e35f3694e338c31ab4b7a040ee011cd39d7962a77d3ef83
|
data/abiquo-api.gemspec
CHANGED
@@ -17,6 +17,10 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
19
|
gem.add_runtime_dependency "excon", '~> 0.43', '>= 0.43.0'
|
20
|
+
gem.add_runtime_dependency "faraday", '~> 0.9.2', '>= 0.9.2'
|
21
|
+
gem.add_runtime_dependency "faraday_middleware", '~> 0.10.0', '>= 0.10.0'
|
22
|
+
gem.add_runtime_dependency "simple_oauth", '~> 0.3.1', '>= 0.3.1'
|
23
|
+
gem.add_runtime_dependency "addressable", '~> 2.4.0', '>= 2.4.0'
|
20
24
|
gem.add_runtime_dependency "formatador", '~> 0.2', '>= 0.2.5'
|
21
25
|
gem.add_runtime_dependency "json", '~> 1.8', '>= 1.8.0'
|
22
26
|
end
|
data/lib/abiquo-api.rb
CHANGED
@@ -54,13 +54,32 @@ class AbiquoAPI
|
|
54
54
|
api_url = options[:abiquo_api_url]
|
55
55
|
api_username = options[:abiquo_username]
|
56
56
|
api_password = options[:abiquo_password]
|
57
|
+
api_key = options[:abiquo_api_key]
|
58
|
+
api_secret = options[:abiquo_api_secret]
|
59
|
+
token_key = options[:abiquo_token_key]
|
60
|
+
token_secret = options[:abiquo_token_secret]
|
57
61
|
connection_options = options[:connection_options] || {}
|
58
62
|
|
59
|
-
raise "You need to set :abiquo_api_url
|
63
|
+
raise "You need to set :abiquo_api_url" if api_url.nil?
|
64
|
+
raise "You need to provide either basic auth or oauth credentials!!" if (api_username.nil? or api_password.nil?) and
|
65
|
+
(api_key.nil? or api_secret.nil? or token_key.nil? or token_secret.nil?)
|
66
|
+
|
67
|
+
unless api_key.nil?
|
68
|
+
credentials = {
|
69
|
+
:consumer_key => api_key,
|
70
|
+
:consumer_secret => api_secret,
|
71
|
+
:token => token_key,
|
72
|
+
:token_secret => token_secret
|
73
|
+
}
|
74
|
+
else
|
75
|
+
credentials = {
|
76
|
+
:api_username => api_username,
|
77
|
+
:api_password => api_password
|
78
|
+
}
|
79
|
+
end
|
60
80
|
|
61
81
|
@http_client = AbiquoAPIClient::HTTPClient.new(api_url,
|
62
|
-
|
63
|
-
api_password,
|
82
|
+
credentials,
|
64
83
|
connection_options)
|
65
84
|
|
66
85
|
api_path = URI.parse(api_url).path
|
@@ -150,7 +169,6 @@ class AbiquoAPI
|
|
150
169
|
}
|
151
170
|
|
152
171
|
req_hash[:accept] = "#{accept}; version=#{@version};" unless accept.eql? ""
|
153
|
-
|
154
172
|
resp = @http_client.request(req_hash)
|
155
173
|
|
156
174
|
if resp['collection'].nil?
|
@@ -12,7 +12,7 @@ module AbiquoAPIClient
|
|
12
12
|
else
|
13
13
|
@type = type
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
unless parsed_response['links'].empty?
|
17
17
|
coluri = URI.parse(parsed_response['links'].first['href'])
|
18
18
|
@path = coluri.path
|
@@ -23,14 +23,17 @@ module AbiquoAPIClient
|
|
23
23
|
@page_size = opt_hash[:limit].to_i
|
24
24
|
|
25
25
|
st = opt_hash[:startwith].nil? ? 0 : opt_hash[:startwith].to_i
|
26
|
-
@current_page =
|
26
|
+
@current_page = case
|
27
|
+
when @page_size == 0 then st
|
28
|
+
when @page_size > 0 then (st / @page_size) + 1
|
29
|
+
end
|
27
30
|
end
|
28
|
-
|
31
|
+
|
29
32
|
@links = parsed_response['links']
|
30
33
|
end
|
31
34
|
|
32
35
|
@collection = parsed_response['collection'].map {|r| client.new_object(r)}
|
33
|
-
|
36
|
+
|
34
37
|
@client = client
|
35
38
|
end
|
36
39
|
|
@@ -64,7 +67,7 @@ module AbiquoAPIClient
|
|
64
67
|
out = nil
|
65
68
|
|
66
69
|
each {|i| out = i }
|
67
|
-
|
70
|
+
|
68
71
|
out
|
69
72
|
end
|
70
73
|
|
@@ -114,13 +117,13 @@ module AbiquoAPIClient
|
|
114
117
|
@collection = next_page.nil? ? [] : next_page
|
115
118
|
end
|
116
119
|
|
117
|
-
loop do
|
120
|
+
loop do
|
118
121
|
@collection.each do |item|
|
119
122
|
yield item
|
120
123
|
end
|
121
|
-
|
124
|
+
|
122
125
|
break if @links.nil? or @links.select {|l| l['rel'].eql? "next" }.first.nil?
|
123
|
-
|
126
|
+
|
124
127
|
next_page = retrieve('next')
|
125
128
|
@collection = next_page.nil? ? [] : next_page
|
126
129
|
end
|
@@ -160,10 +163,13 @@ module AbiquoAPIClient
|
|
160
163
|
|
161
164
|
l = AbiquoAPIClient::Link.new(:href => f['href'],
|
162
165
|
:type => @type)
|
163
|
-
resp = @client.get(l, opts)
|
164
|
-
|
166
|
+
resp = @client.get(l, opts)
|
167
|
+
|
165
168
|
st = opts[:startwith].nil? ? 0 : opts[:startwith].to_i
|
166
|
-
@current_page =
|
169
|
+
@current_page = case
|
170
|
+
when @page_size == 0 then st
|
171
|
+
when @page_size > 0 then (st / @page_size) + 1
|
172
|
+
end
|
167
173
|
|
168
174
|
@links = resp['links']
|
169
175
|
|
@@ -1,5 +1,7 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
1
3
|
require 'excon'
|
2
|
-
require 'uri'
|
4
|
+
require 'addressable/uri'
|
3
5
|
require 'json'
|
4
6
|
|
5
7
|
module AbiquoAPIClient
|
@@ -10,7 +12,7 @@ module AbiquoAPIClient
|
|
10
12
|
#
|
11
13
|
class HTTPClient
|
12
14
|
##
|
13
|
-
#
|
15
|
+
# Faraday connection object.
|
14
16
|
#
|
15
17
|
attr_reader :connection
|
16
18
|
|
@@ -26,25 +28,22 @@ module AbiquoAPIClient
|
|
26
28
|
#
|
27
29
|
# Parameters:
|
28
30
|
# :abiquo_api_url:: The URL of the Abiquo API. ie. https://yourserver/api
|
29
|
-
# :
|
30
|
-
# :abiquo_password:: The password for your user.
|
31
|
+
# :creds:: The credentials used to connect to the Abiquo API (basic auth or oauth).
|
31
32
|
# :connection_options:: { :connect_timeout => <time_in_secs>, :read_timeout => <time_in_secs>, :write_timeout => <time_in_secs>,
|
32
33
|
# :ssl_verify_peer => <true_or_false>, :ssl_ca_path => <path_to_ca_file> }
|
33
34
|
#
|
34
|
-
def initialize(api_url,
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
:read_timeout => read_timeout,
|
47
|
-
:write_timeout => write_timeout)
|
35
|
+
def initialize(api_url, creds, connection_options)
|
36
|
+
if creds.has_key? :consumer_key
|
37
|
+
@connection = Faraday.new(api_url, connection_options) do |c|
|
38
|
+
c.request :oauth, creds
|
39
|
+
c.adapter :excon
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@connection = Faraday.new(api_url, connection_options ) do |c|
|
43
|
+
c.basic_auth(creds[:api_username], creds[:api_password])
|
44
|
+
c.adapter :excon
|
45
|
+
end
|
46
|
+
end
|
48
47
|
|
49
48
|
self
|
50
49
|
end
|
@@ -54,7 +53,7 @@ module AbiquoAPIClient
|
|
54
53
|
#
|
55
54
|
# Parameters:
|
56
55
|
# [params] A hash of options to be passed to the
|
57
|
-
#
|
56
|
+
# Faraday connection.
|
58
57
|
#
|
59
58
|
# Returns a hash resulting of parsing the response
|
60
59
|
# body as JSON, or nil if the response is "No
|
@@ -71,17 +70,16 @@ module AbiquoAPIClient
|
|
71
70
|
|
72
71
|
# Set Auth cookie and delete user and password if present
|
73
72
|
unless @cookies.nil?
|
74
|
-
@connection.data.delete(:user) unless @connection.data[:user].nil?
|
75
|
-
@connection.data.delete(:password) unless @connection.data[:password].nil?
|
73
|
+
# @connection.data.delete(:user) unless @connection.data[:user].nil?
|
74
|
+
# @connection.data.delete(:password) unless @connection.data[:password].nil?
|
76
75
|
headers.merge!(@cookies)
|
77
76
|
end
|
77
|
+
if params.has_key? :headers
|
78
|
+
params[:headers].merge!(headers)
|
79
|
+
else
|
80
|
+
params[:headers] = headers
|
81
|
+
end
|
78
82
|
|
79
|
-
params[:headers] = headers
|
80
|
-
|
81
|
-
# Correct API path
|
82
|
-
path = URI.parse(params[:path]).path
|
83
|
-
params[:path] = path
|
84
|
-
|
85
83
|
response = issue_request(params)
|
86
84
|
return nil if response.nil?
|
87
85
|
|
@@ -95,59 +93,63 @@ module AbiquoAPIClient
|
|
95
93
|
private
|
96
94
|
|
97
95
|
##
|
98
|
-
# Issues the HTTP request using the
|
96
|
+
# Issues the HTTP request using the Faraday connection
|
99
97
|
# object.
|
100
98
|
#
|
101
99
|
# Handles API error codes.
|
102
100
|
#
|
103
|
-
def issue_request(
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
101
|
+
def issue_request(params)
|
102
|
+
full_path = Addressable::URI.parse(params[:path])
|
103
|
+
if full_path.host.nil?
|
104
|
+
# only path
|
105
|
+
full_url = Addressable::URI.parse(@connection.url_prefix.to_s + '/' + params[:path].gsub(@connection.url_prefix.path, ""))
|
106
|
+
else
|
107
|
+
full_url = Addressable::URI.parse(params[:path])
|
108
|
+
end
|
109
|
+
full_url.query_values = params[:query]
|
110
|
+
|
111
|
+
resp = @connection.run_request(params[:method].downcase.to_sym,
|
112
|
+
full_url.to_s,
|
113
|
+
params[:body],
|
114
|
+
params[:headers])
|
115
|
+
# Save cookies
|
116
|
+
# Get all "Set-Cookie" headers and replace them with "Cookie" header.
|
117
|
+
@cookies = Hash[resp.headers.select{|k| k.eql? "Set-Cookie" }.map {|k,v| ["Cookie", v] }]
|
118
|
+
|
119
|
+
if resp.status == 204
|
120
|
+
nil
|
121
|
+
elsif resp.status >= 400 and resp.status <= 600
|
122
|
+
unless resp.body.nil?
|
123
|
+
begin
|
124
|
+
error_response = JSON.parse(resp.body)
|
125
|
+
error_code = error_response['collection'][0]['code']
|
126
|
+
error_text = error_response['collection'][0]['message']
|
127
|
+
rescue JSON::ParserError
|
128
|
+
error_code = ''
|
129
|
+
error_text = ''
|
130
|
+
end
|
116
131
|
end
|
117
|
-
|
118
|
-
case error.response.status
|
132
|
+
case resp.status
|
119
133
|
when 401
|
120
|
-
raise AbiquoAPIClient::InvalidCredentials, "Wrong username or password"
|
134
|
+
raise AbiquoAPIClient::InvalidCredentials, "Wrong username or password - #{error_code} - #{error_text}"
|
121
135
|
when 403
|
122
|
-
raise AbiquoAPIClient::Forbidden, "Not Authorized"
|
136
|
+
raise AbiquoAPIClient::Forbidden, "Not Authorized - #{error_code} - #{error_text}"
|
123
137
|
when 406, 400
|
124
|
-
raise AbiquoAPIClient::BadRequest, "Bad request"
|
138
|
+
raise AbiquoAPIClient::BadRequest, "Bad request - #{error_code} - #{error_text}"
|
125
139
|
when 415
|
126
|
-
raise AbiquoAPIClient::UnsupportedMediaType, "Unsupported mediatype"
|
140
|
+
raise AbiquoAPIClient::UnsupportedMediaType, "Unsupported mediatype - #{error_code} - #{error_text}"
|
127
141
|
when 404
|
128
|
-
|
129
|
-
error_response = JSON.parse(error.response.body)
|
130
|
-
|
131
|
-
error_code = error_response['collection'][0]['code']
|
132
|
-
error_text = error_response['collection'][0]['message']
|
133
|
-
|
134
|
-
rescue
|
135
|
-
raise AbiquoAPIClient::NotFound, "Not Found; #{error_code} - #{error_text}"
|
136
|
-
end
|
137
|
-
raise AbiquoAPIClient::NotFound, "Not Found"
|
142
|
+
raise AbiquoAPIClient::NotFound, "Not Found - #{error_code} - #{error_text}"
|
138
143
|
else
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
error_code
|
143
|
-
error_text = error_response['collection'][0]['message']
|
144
|
-
|
145
|
-
rescue
|
146
|
-
raise AbiquoAPIClient::Error, error.response.body
|
144
|
+
if error_code == '' and error_text == '' # Error and no json response
|
145
|
+
raise AbiquoAPIClient::Error, "#{resp.body}"
|
146
|
+
else # error with json response
|
147
|
+
raise AbiquoAPIClient::Error, "#{error_code} - #{error_text}"
|
147
148
|
end
|
148
|
-
|
149
|
-
|
149
|
+
end
|
150
|
+
else
|
151
|
+
resp
|
150
152
|
end
|
151
153
|
end
|
152
154
|
end
|
153
|
-
end
|
155
|
+
end
|
data/lib/abiquo-api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abiquo-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Cirauqui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -30,6 +30,86 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.43.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: faraday
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.9.2
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.9.2
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.9.2
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.9.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: faraday_middleware
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.10.0
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.10.0
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.10.0
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 0.10.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: simple_oauth
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.3.1
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.3.1
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.1
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.3.1
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: addressable
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 2.4.0
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.4.0
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 2.4.0
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 2.4.0
|
33
113
|
- !ruby/object:Gem::Dependency
|
34
114
|
name: formatador
|
35
115
|
requirement: !ruby/object:Gem::Requirement
|