berkshelf-api-client 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/README.md +1 -0
- data/Rakefile +5 -0
- data/berkshelf-api-client.gemspec +1 -1
- data/lib/berkshelf/api_client/connection.rb +75 -0
- data/lib/berkshelf/api_client/errors.rb +1 -1
- data/lib/berkshelf/api_client/remote_cookbook.rb +48 -50
- data/lib/berkshelf/api_client/version.rb +2 -2
- data/lib/berkshelf/api_client.rb +6 -72
- data/spec/unit/berkshelf/api_client/connection_spec.rb +57 -0
- data/spec/unit/berkshelf/api_client_spec.rb +3 -51
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b24984684bc4e74fd8c9e4c74a96e7387075c235
|
4
|
+
data.tar.gz: 37fa9b61254d333c6b10abb5aff3638c807f09fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2687d666f257c2ec25c9786f1f25e12fc8c5cbcec50717b09c4b2570975013ca5a5d77502e6d6c1ee196d992d98669cb2334b03915f9397e6738b6933e203f1
|
7
|
+
data.tar.gz: 3c210c34674982c6ec7411d2cdfb6520eae51349e711e8a81205bf64990cdef7af55860f1a31a8a01e1d343277152cf5253611e03fbebc32e87f087ca66e8522
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p353
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Berkshelf::APIClient
|
2
|
+
[![Build Status](https://travis-ci.org/berkshelf/berkshelf-api-client.png?branch=master)](https://travis-ci.org/berkshelf/berkshelf-api-client)
|
2
3
|
|
3
4
|
A Ruby library for communicating with the [Berkshelf API server](https://github.com/berkshelf/berkshelf-api)
|
4
5
|
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'berkshelf/api_client'
|
4
|
+
require 'berkshelf/api_client/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "berkshelf-api-client"
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Berkshelf::APIClient
|
4
|
+
class Connection < Faraday::Connection
|
5
|
+
# @return [String]
|
6
|
+
attr_reader :url
|
7
|
+
|
8
|
+
# @return [Integer]
|
9
|
+
# how many retries to attempt on HTTP requests
|
10
|
+
attr_reader :retries
|
11
|
+
|
12
|
+
# @return [Float]
|
13
|
+
# time to wait between retries
|
14
|
+
attr_reader :retry_interval
|
15
|
+
|
16
|
+
# @param [String, Addressable::URI] url
|
17
|
+
#
|
18
|
+
# @option options [Integer] :open_timeout (3)
|
19
|
+
# how long to wait (in seconds) for connection open to the API server
|
20
|
+
# @option options [Integer] :timeout (30)
|
21
|
+
# how long to wait (in seconds) before getting a response from the API server
|
22
|
+
# @option options [Integer] :retries (3)
|
23
|
+
# how many retries to perform before giving up
|
24
|
+
# @option options [Float] :retry_interval (0.5)
|
25
|
+
# how long to wait (in seconds) between each retry
|
26
|
+
def initialize(url, options = {})
|
27
|
+
options = options.reverse_merge(retries: 3, retry_interval: 0.5,
|
28
|
+
open_timeout: 3, timeout: 30)
|
29
|
+
@url = url
|
30
|
+
@retries = options[:retries]
|
31
|
+
@retry_interval = options[:retry_interval]
|
32
|
+
|
33
|
+
options[:builder] ||= Faraday::Builder.new do |b|
|
34
|
+
b.response :parse_json
|
35
|
+
b.response :gzip
|
36
|
+
b.request :retry,
|
37
|
+
max: self.retries,
|
38
|
+
interval: self.retry_interval,
|
39
|
+
exceptions: [ Faraday::Error::TimeoutError, Errno::ETIMEDOUT ]
|
40
|
+
|
41
|
+
b.adapter :net_http
|
42
|
+
end
|
43
|
+
|
44
|
+
super(self.url, options)
|
45
|
+
@options[:open_timeout] = options[:open_timeout]
|
46
|
+
@options[:timeout] = options[:timeout]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Retrieves the entire universe of known cookbooks from the API source
|
50
|
+
#
|
51
|
+
# @raise [APIClient::TimeoutError]
|
52
|
+
#
|
53
|
+
# @return [Array<APIClient::RemoteCookbook>]
|
54
|
+
def universe
|
55
|
+
response = get("universe")
|
56
|
+
|
57
|
+
case response.status
|
58
|
+
when 200
|
59
|
+
[].tap do |cookbooks|
|
60
|
+
response.body.each do |name, versions|
|
61
|
+
versions.each { |version, attributes| cookbooks << RemoteCookbook.new(name, version, attributes) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
when 404
|
65
|
+
raise APIClient::ServiceNotFound, "service not found at: #{url}"
|
66
|
+
when 500..504
|
67
|
+
raise APIClient::ServiceUnavaiable, "service unavailable at: #{url}"
|
68
|
+
else
|
69
|
+
raise APIClient::BadResponse, "bad response #{response.inspect}"
|
70
|
+
end
|
71
|
+
rescue Faraday::Error::TimeoutError, Errno::ETIMEDOUT
|
72
|
+
raise APIClient::TimeoutError, "Unable to connect to: #{url}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -1,55 +1,53 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
|
-
module Berkshelf
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
::JSON.pretty_generate(to_hash, options)
|
52
|
-
end
|
3
|
+
module Berkshelf::APIClient
|
4
|
+
# A representation of cookbook metadata indexed by a Berkshelf API Server. Returned
|
5
|
+
# by sending messages to a {Berkshelf::APIClient} and used to download cookbooks
|
6
|
+
# indexed by the Berkshelf API Server.
|
7
|
+
class RemoteCookbook
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :name
|
10
|
+
# @return [String]
|
11
|
+
attr_reader :version
|
12
|
+
|
13
|
+
# @param [String] name
|
14
|
+
# @param [String] version
|
15
|
+
# @param [Hash] attributes
|
16
|
+
def initialize(name, version, attributes = {})
|
17
|
+
@name = name
|
18
|
+
@version = version
|
19
|
+
@attributes = attributes
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Hash]
|
23
|
+
def dependencies
|
24
|
+
@attributes[:dependencies]
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Hash]
|
28
|
+
def platforms
|
29
|
+
@attributes[:platforms]
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Symbol]
|
33
|
+
def location_type
|
34
|
+
@attributes[:location_type].to_sym
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String]
|
38
|
+
def location_path
|
39
|
+
@attributes[:location_path]
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_hash
|
43
|
+
{
|
44
|
+
name: name,
|
45
|
+
version: version
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_json(options = {})
|
50
|
+
::JSON.pretty_generate(to_hash, options)
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
data/lib/berkshelf/api_client.rb
CHANGED
@@ -1,85 +1,19 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
1
|
module Berkshelf
|
4
2
|
# Used to communicate with a remotely hosted [Berkshelf API Server](https://github.com/berkshelf/berkshelf-api).
|
5
3
|
#
|
6
4
|
# @example
|
7
5
|
# client = Berkshelf::APIClient.new("https://api.berkshelf.com")
|
8
6
|
# client.universe #=> [...]
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
module APIClient
|
8
|
+
require_relative 'api_client/version'
|
12
9
|
require_relative 'api_client/errors'
|
13
10
|
require_relative 'api_client/remote_cookbook'
|
11
|
+
require_relative 'api_client/connection'
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# @return [Integer]
|
19
|
-
# how many retries to attempt on HTTP requests
|
20
|
-
attr_reader :retries
|
21
|
-
|
22
|
-
# @return [Float]
|
23
|
-
# time to wait between retries
|
24
|
-
attr_reader :retry_interval
|
25
|
-
|
26
|
-
# @param [String, Addressable::URI] url
|
27
|
-
#
|
28
|
-
# @option options [Integer] :open_timeout (3)
|
29
|
-
# how long to wait (in seconds) for connection open to the API server
|
30
|
-
# @option options [Integer] :timeout (30)
|
31
|
-
# how long to wait (in seconds) before getting a response from the API server
|
32
|
-
# @option options [Integer] :retries (3)
|
33
|
-
# how many retries to perform before giving up
|
34
|
-
# @option options [Float] :retry_interval (0.5)
|
35
|
-
# how long to wait (in seconds) between each retry
|
36
|
-
def initialize(url, options = {})
|
37
|
-
options = options.reverse_merge(retries: 3, retry_interval: 0.5,
|
38
|
-
open_timeout: 3, timeout: 30)
|
39
|
-
@url = url
|
40
|
-
@retries = options[:retries]
|
41
|
-
@retry_interval = options[:retry_interval]
|
42
|
-
|
43
|
-
options[:builder] ||= Faraday::Builder.new do |b|
|
44
|
-
b.response :parse_json
|
45
|
-
b.response :gzip
|
46
|
-
b.request :retry,
|
47
|
-
max: self.retries,
|
48
|
-
interval: self.retry_interval,
|
49
|
-
exceptions: [ Faraday::Error::TimeoutError, Errno::ETIMEDOUT ]
|
50
|
-
|
51
|
-
b.adapter :net_http
|
52
|
-
end
|
53
|
-
|
54
|
-
super(self.url, options)
|
55
|
-
@options[:open_timeout] = options[:open_timeout]
|
56
|
-
@options[:timeout] = options[:timeout]
|
57
|
-
end
|
58
|
-
|
59
|
-
# Retrieves the entire universe of known cookbooks from the API source
|
60
|
-
#
|
61
|
-
# @raise [APIClient::TimeoutError]
|
62
|
-
#
|
63
|
-
# @return [Array<APIClient::RemoteCookbook>]
|
64
|
-
def universe
|
65
|
-
response = get("universe")
|
66
|
-
|
67
|
-
case response.status
|
68
|
-
when 200
|
69
|
-
[].tap do |cookbooks|
|
70
|
-
response.body.each do |name, versions|
|
71
|
-
versions.each { |version, attributes| cookbooks << RemoteCookbook.new(name, version, attributes) }
|
72
|
-
end
|
73
|
-
end
|
74
|
-
when 404
|
75
|
-
raise APIClient::ServiceNotFound, "service not found at: #{url}"
|
76
|
-
when 500..504
|
77
|
-
raise APIClient::ServiceUnavaiable, "service unavailable at: #{url}"
|
78
|
-
else
|
79
|
-
raise APIClient::BadResponse, "bad response #{response.inspect}"
|
13
|
+
class << self
|
14
|
+
def new(*args)
|
15
|
+
Connection.new(*args)
|
80
16
|
end
|
81
|
-
rescue Faraday::Error::TimeoutError, Errno::ETIMEDOUT
|
82
|
-
raise APIClient::TimeoutError, "Unable to connect to: #{url}"
|
83
17
|
end
|
84
18
|
end
|
85
19
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Berkshelf::APIClient::Connection do
|
4
|
+
let(:instance) { described_class.new("http://localhost:26210") }
|
5
|
+
|
6
|
+
describe "#universe" do
|
7
|
+
before do
|
8
|
+
berks_dependency("ruby", "1.2.3", dependencies: { "build-essential" => ">= 1.2.2" })
|
9
|
+
berks_dependency("ruby", "2.0.0", dependencies: { "build-essential" => ">= 1.2.2" })
|
10
|
+
berks_dependency("elixir", "1.0.0", platforms: { "CentOS" => "6.0" })
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { instance.universe }
|
14
|
+
|
15
|
+
it "returns an array of APIClient::RemoteCookbook" do
|
16
|
+
expect(subject).to be_a(Array)
|
17
|
+
|
18
|
+
subject.each do |remote|
|
19
|
+
expect(remote).to be_a(Berkshelf::APIClient::RemoteCookbook)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "contains a item for each dependency" do
|
24
|
+
expect(subject).to have(3).items
|
25
|
+
expect(subject[0].name).to eql("ruby")
|
26
|
+
expect(subject[0].version).to eql("1.2.3")
|
27
|
+
expect(subject[1].name).to eql("ruby")
|
28
|
+
expect(subject[1].version).to eql("2.0.0")
|
29
|
+
expect(subject[2].name).to eql("elixir")
|
30
|
+
expect(subject[2].version).to eql("1.0.0")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "has the dependencies for each" do
|
34
|
+
expect(subject[0].dependencies).to include("build-essential" => ">= 1.2.2")
|
35
|
+
expect(subject[1].dependencies).to include("build-essential" => ">= 1.2.2")
|
36
|
+
expect(subject[2].dependencies).to be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
it "has the platforms for each" do
|
40
|
+
expect(subject[0].platforms).to be_empty
|
41
|
+
expect(subject[1].platforms).to be_empty
|
42
|
+
expect(subject[2].platforms).to include("CentOS" => "= 6.0.0")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "has a location_path for each" do
|
46
|
+
subject.each do |remote|
|
47
|
+
expect(remote.location_path).to_not be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "has a location_type for each" do
|
52
|
+
subject.each do |remote|
|
53
|
+
expect(remote.location_type).to_not be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,57 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Berkshelf::APIClient do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
before do
|
8
|
-
berks_dependency("ruby", "1.2.3", dependencies: { "build-essential" => ">= 1.2.2" })
|
9
|
-
berks_dependency("ruby", "2.0.0", dependencies: { "build-essential" => ">= 1.2.2" })
|
10
|
-
berks_dependency("elixir", "1.0.0", platforms: { "CentOS" => "6.0" })
|
11
|
-
end
|
12
|
-
|
13
|
-
subject { instance.universe }
|
14
|
-
|
15
|
-
it "returns an array of APIClient::RemoteCookbook" do
|
16
|
-
expect(subject).to be_a(Array)
|
17
|
-
|
18
|
-
subject.each do |remote|
|
19
|
-
expect(remote).to be_a(Berkshelf::APIClient::RemoteCookbook)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
it "contains a item for each dependency" do
|
24
|
-
expect(subject).to have(3).items
|
25
|
-
expect(subject[0].name).to eql("ruby")
|
26
|
-
expect(subject[0].version).to eql("1.2.3")
|
27
|
-
expect(subject[1].name).to eql("ruby")
|
28
|
-
expect(subject[1].version).to eql("2.0.0")
|
29
|
-
expect(subject[2].name).to eql("elixir")
|
30
|
-
expect(subject[2].version).to eql("1.0.0")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "has the dependencies for each" do
|
34
|
-
expect(subject[0].dependencies).to include("build-essential" => ">= 1.2.2")
|
35
|
-
expect(subject[1].dependencies).to include("build-essential" => ">= 1.2.2")
|
36
|
-
expect(subject[2].dependencies).to be_empty
|
37
|
-
end
|
38
|
-
|
39
|
-
it "has the platforms for each" do
|
40
|
-
expect(subject[0].platforms).to be_empty
|
41
|
-
expect(subject[1].platforms).to be_empty
|
42
|
-
expect(subject[2].platforms).to include("CentOS" => "= 6.0.0")
|
43
|
-
end
|
44
|
-
|
45
|
-
it "has a location_path for each" do
|
46
|
-
subject.each do |remote|
|
47
|
-
expect(remote.location_path).to_not be_nil
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it "has a location_type for each" do
|
52
|
-
subject.each do |remote|
|
53
|
-
expect(remote.location_type).to_not be_nil
|
54
|
-
end
|
4
|
+
describe "::new" do
|
5
|
+
it "returns an instance of Berkshelf::APIClient::Connection" do
|
6
|
+
expect(described_class.new("http://localhost:26210")).to be_a(Berkshelf::APIClient::Connection)
|
55
7
|
end
|
56
8
|
end
|
57
9
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berkshelf-api-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-12-
|
13
|
+
date: 2013-12-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: faraday
|
@@ -120,6 +120,8 @@ extensions: []
|
|
120
120
|
extra_rdoc_files: []
|
121
121
|
files:
|
122
122
|
- .gitignore
|
123
|
+
- .ruby-version
|
124
|
+
- .travis.yml
|
123
125
|
- Gemfile
|
124
126
|
- Guardfile
|
125
127
|
- LICENSE
|
@@ -128,10 +130,12 @@ files:
|
|
128
130
|
- berkshelf-api-client.gemspec
|
129
131
|
- lib/berkshelf/api-client.rb
|
130
132
|
- lib/berkshelf/api_client.rb
|
133
|
+
- lib/berkshelf/api_client/connection.rb
|
131
134
|
- lib/berkshelf/api_client/errors.rb
|
132
135
|
- lib/berkshelf/api_client/remote_cookbook.rb
|
133
136
|
- lib/berkshelf/api_client/version.rb
|
134
137
|
- spec/spec_helper.rb
|
138
|
+
- spec/unit/berkshelf/api_client/connection_spec.rb
|
135
139
|
- spec/unit/berkshelf/api_client/remote_cookbook_spec.rb
|
136
140
|
- spec/unit/berkshelf/api_client_spec.rb
|
137
141
|
homepage: http://berkshelf.com
|
@@ -160,6 +164,7 @@ specification_version: 4
|
|
160
164
|
summary: API Client for communicating with a Berkshelf API server
|
161
165
|
test_files:
|
162
166
|
- spec/spec_helper.rb
|
167
|
+
- spec/unit/berkshelf/api_client/connection_spec.rb
|
163
168
|
- spec/unit/berkshelf/api_client/remote_cookbook_spec.rb
|
164
169
|
- spec/unit/berkshelf/api_client_spec.rb
|
165
170
|
has_rdoc:
|