atlas 1.1.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2eebf961af024f87de6faedfb7f592f13b8ad5ea
4
- data.tar.gz: 755a43b75e08141b216475e5c53897680e796ab3
3
+ metadata.gz: bfcc9c5fb98681ad07faaaf69d275418c22b1ea4
4
+ data.tar.gz: 55823eb3defae3a970ceb99b298e636fb90cd2b0
5
5
  SHA512:
6
- metadata.gz: d353c63963a831696d233bc00072a9a9d9ae7a12d8822db21fccb757f99a3600c28c486d45bcd5e1aec9ba5bd61a8a8ff7315ae50a1639978bc4f843ca34701f
7
- data.tar.gz: 7de936672cd7500bf5f27935781a10f7a86ab906685171aa892d62d3074d1cbfce47b2c2e1d8b9bf4a069da53f17839a88d4c0a9253d1fd576da53abd6f05b5f
6
+ metadata.gz: b04a692cdba04c4b6f6bf5986acd7840eadd74493a696d777af8377ee57a3e3b20d2e558ce0e908653a6f74740ee60b11cb6ed9335210839e6dd183b3c898913
7
+ data.tar.gz: ae9887e9120916d97b94404523dbbb9c7db8340168a483afca4be1244f8a403c1253a78f8fa1659f323247f64039298f7a25fdee598d0c70951318d0dbf411ee
@@ -0,0 +1,13 @@
1
+ ---
2
+ languages:
3
+ Ruby: true
4
+ engines:
5
+ rubocop:
6
+ enabled: true
7
+ bundler-audit:
8
+ enabled: true
9
+ ratings:
10
+ paths:
11
+ - "**.rb"
12
+ exclude_paths:
13
+ - spec/**/*
@@ -1,12 +1,18 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 1.1.0
3
+ ## 1.2.0 (29/07/2015)
4
+
5
+ * Adds custom error classes and catching in the request.
6
+ * Moves the JSON response parsing into the request, removing from the
7
+ resources.
8
+
9
+ ## 1.1.0 (27/07/2015)
4
10
 
5
11
  * Adds support for uploading boxes to providers.
6
12
  * Adds shorter methods to create versions from boxes, and providers from
7
13
  versions.
8
14
 
9
- ## 1.0.0
15
+ ## 1.0.0 (24/07/2015)
10
16
 
11
17
  * Initial release; handles creating, updating, deleting boxes, versions and
12
18
  providers.
data/README.md CHANGED
@@ -35,13 +35,26 @@ end
35
35
  # then you can load in users (creating, updating, etc isn't supported by Atlas)
36
36
  user = Atlas::User.find('nickcharlton')
37
37
  #=> <Atlas::User username=nickcharlton...>
38
+ ```
39
+
40
+ More likely, you'll want to grab a box and work with it:
38
41
 
39
- # or access boxes, their versions and providers
42
+ ```ruby
40
43
  box = Atlas::Box.find('nickcharlton/example-box')
41
44
  #=> <Atlas::Box name=example-box'...>
42
45
 
43
- # or create a new version
44
- version = box.create(version: '1.0.0', description: 'A new box version.')
46
+ # creating a new version
47
+ version = box.create_version(version: '1.0.0')
48
+ #=> <Atlas::BoxVersion version: '1.0.0')
49
+
50
+ # add a provider to that version
51
+ provider = version.create_provider(name: 'virtualbox')
52
+
53
+ # upload a file for the version
54
+ provider.upload(File.open('box_name.box'))
55
+
56
+ # set the version to be released
57
+ version.release
45
58
  ```
46
59
 
47
60
  It aims to support most of the functionality listed in the [Atlas API
data/Rakefile CHANGED
@@ -16,6 +16,15 @@ require 'rspec/core/rake_task'
16
16
 
17
17
  RSpec::Core::RakeTask.new
18
18
 
19
+ ##
20
+ # RuboCop
21
+ ##
22
+ require 'rubocop/rake_task'
23
+
24
+ RuboCop::RakeTask.new do |task|
25
+ task.requires << 'rubocop-rspec'
26
+ end
27
+
19
28
  ##
20
29
  # By default, just run the tests.
21
30
  ##
@@ -26,5 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency 'rake', '~> 10.0'
27
27
  spec.add_development_dependency 'vcr', '~> 2.9'
28
28
  spec.add_development_dependency 'rspec', '~> 3.2'
29
+ spec.add_development_dependency 'rubocop', '~> 0.32'
30
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.3'
29
31
  spec.add_development_dependency 'pry'
30
32
  end
@@ -4,6 +4,7 @@ require 'json'
4
4
  require 'atlas/version'
5
5
  require 'atlas/configuration'
6
6
  require 'atlas/url_builder'
7
+ require 'atlas/errors'
7
8
  require 'atlas/client'
8
9
  require 'atlas/resource'
9
10
  require 'atlas/box_provider'
@@ -22,7 +22,7 @@ module Atlas
22
22
  url_builder = UrlBuilder.new tag
23
23
  response = Atlas.client.get(url_builder.box_url)
24
24
 
25
- new(tag, JSON.parse(response.body))
25
+ new(tag, response)
26
26
  end
27
27
 
28
28
  # Create a new Box.
@@ -113,23 +113,21 @@ module Atlas
113
113
  # update or create the box
114
114
  begin
115
115
  response = Atlas.client.put(url_builder.box_url, body: body)
116
- rescue Excon::Errors::NotFound
116
+ rescue Atlas::Errors::NotFoundError
117
117
  response = Atlas.client.post('/boxes', body: body)
118
118
  end
119
119
 
120
120
  # trigger the same on versions
121
121
  versions.each(&:save) if versions
122
122
 
123
- update_with_response(response.body, [:versions])
123
+ update_with_response(response, [:versions])
124
124
  end
125
125
 
126
126
  # Delete the box.
127
127
  #
128
128
  # @return [Hash] response body from Atlas.
129
129
  def delete
130
- response = Atlas.client.delete(url_builder.box_url)
131
-
132
- JSON.parse(response.body)
130
+ Atlas.client.delete(url_builder.box_url)
133
131
  end
134
132
  end
135
133
  end
@@ -15,7 +15,7 @@ module Atlas
15
15
  url_builder = UrlBuilder.new tag
16
16
  response = Atlas.client.get(url_builder.box_provider_url)
17
17
 
18
- new(tag, JSON.parse(response.body))
18
+ new(tag, response)
19
19
  end
20
20
 
21
21
  # Create a new Provider.
@@ -55,12 +55,12 @@ module Atlas
55
55
 
56
56
  begin
57
57
  response = Atlas.client.put(url_builder.box_provider_url, body: body)
58
- rescue Excon::Errors::NotFound
58
+ rescue Atlas::Errors::NotFoundError
59
59
  response = Atlas.client.post("#{url_builder.box_version_url}/providers",
60
60
  body: body)
61
61
  end
62
62
 
63
- update_with_response(response.body)
63
+ update_with_response(response)
64
64
  end
65
65
 
66
66
  # Upload a .box file for this provider.
@@ -71,7 +71,7 @@ module Atlas
71
71
  response = Atlas.client.get("#{url_builder.box_provider_url}/upload")
72
72
 
73
73
  # upload the file
74
- upload_url = JSON.parse(response.body)['upload_path']
74
+ upload_url = response['upload_path']
75
75
  Excon.put(upload_url, body: file)
76
76
  end
77
77
 
@@ -79,9 +79,7 @@ module Atlas
79
79
  #
80
80
  # @return [Hash] Atlas response object.
81
81
  def delete
82
- response = Atlas.client.delete(url_builder.box_provider_url)
83
-
84
- JSON.parse(response.body)
82
+ Atlas.client.delete(url_builder.box_provider_url)
85
83
  end
86
84
  end
87
85
  end
@@ -20,7 +20,7 @@ module Atlas
20
20
  url_builder = UrlBuilder.new tag
21
21
  response = Atlas.client.get(url_builder.box_version_url)
22
22
 
23
- new(tag, JSON.parse(response.body))
23
+ new(tag, response)
24
24
  end
25
25
 
26
26
  # Create a new version.
@@ -74,7 +74,7 @@ module Atlas
74
74
  # Save the version.
75
75
  #
76
76
  # @return [Hash] Atlas response object.
77
- def save # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
77
+ def save # rubocop:disable Metrics/AbcSize
78
78
  body = { version: to_hash }
79
79
 
80
80
  # providers are saved seperately
@@ -82,7 +82,7 @@ module Atlas
82
82
 
83
83
  begin
84
84
  response = Atlas.client.put(url_builder.box_version_url, body: body)
85
- rescue Excon::Errors::NotFound
85
+ rescue Atlas::Errors::NotFoundError
86
86
  response = Atlas.client.post("#{url_builder.box_url}/versions",
87
87
  body: body)
88
88
  end
@@ -90,7 +90,7 @@ module Atlas
90
90
  # trigger the same on the providers
91
91
  providers.each(&:save) if providers
92
92
 
93
- update_with_response(response.body, [:providers])
93
+ update_with_response(response, [:providers])
94
94
  end
95
95
 
96
96
  # Release the version.
@@ -99,7 +99,7 @@ module Atlas
99
99
  def release
100
100
  response = Atlas.client.put("#{url_builder.box_version_url}/release")
101
101
 
102
- update_with_response(response.body)
102
+ update_with_response(response)
103
103
  end
104
104
 
105
105
  # Revoke the version.
@@ -108,16 +108,14 @@ module Atlas
108
108
  def revoke
109
109
  response = Atlas.client.put("#{url_builder.box_version_url}/revoke")
110
110
 
111
- update_with_response(response.body)
111
+ update_with_response(response)
112
112
  end
113
113
 
114
114
  # Delete the version.
115
115
  #
116
116
  # @return [Hash] Atlas response object.
117
117
  def delete
118
- response = Atlas.client.delete(url_builder.box_version_url)
119
-
120
- JSON.parse(response.body)
118
+ Atlas.client.delete(url_builder.box_version_url)
121
119
  end
122
120
  end
123
121
  end
@@ -1,6 +1,8 @@
1
1
  module Atlas
2
2
  # Client for interacting with the Atlas API.
3
3
  class Client
4
+ include Atlas::Errors
5
+
4
6
  DEFAULT_HEADERS = { 'User-Agent' => "Atlas-Ruby/#{Atlas::VERSION}",
5
7
  'Content-Type' => 'application/json' }
6
8
 
@@ -19,7 +21,7 @@ module Atlas
19
21
 
20
22
  private
21
23
 
22
- def request(method, path, opts = {})
24
+ def request(method, path, opts = {}) # rubocop:disable AbcSize, MethodLength
23
25
  body, query, headers = parse_opts(opts)
24
26
 
25
27
  # set the default headers
@@ -29,9 +31,21 @@ module Atlas
29
31
  query.merge!(access_token: @access_token)
30
32
 
31
33
  connection = Excon.new(@url)
32
- connection.request(expects: [200, 201], method: method,
33
- path: "/api/v1#{path}", body: body, query: query,
34
- headers: headers)
34
+ response = connection.request(expects: [200, 201], method: method,
35
+ path: "/api/v1#{path}", body: body,
36
+ query: query, headers: headers)
37
+
38
+ JSON.parse(response.body)
39
+ rescue Excon::Errors::BadRequest => e
40
+ raise ClientError, e.response.body
41
+ rescue Excon::Errors::Unauthorized => e
42
+ raise UnauthorizedError, e.response.body
43
+ rescue Excon::Errors::NotFound => e
44
+ raise NotFoundError, e.response.body
45
+ rescue Excon::Errors::InternalServerError => e
46
+ raise ServerError, e.response.body
47
+ rescue Excon::Errors::Timeout => e
48
+ raise TimeoutError, e.message
35
49
  end
36
50
 
37
51
  def parse_opts(opts)
@@ -0,0 +1,25 @@
1
+ module Atlas
2
+ # A collection of errors which can be raised by this gem.
3
+ module Errors
4
+ # Base error for all other gem errors.
5
+ class AtlasError < StandardError; end
6
+
7
+ # Raised when incorrect arguments are provided to a method.
8
+ class ArgumentError < AtlasError; end
9
+
10
+ # Raised when a request returns a 400 Bad Request.
11
+ class ClientError < AtlasError; end
12
+
13
+ # Raised when a request returns a 401 Unauthorized.
14
+ class UnauthorizedError < AtlasError; end
15
+
16
+ # Raised when a request returns a 404 Not Found.
17
+ class NotFoundError < AtlasError; end
18
+
19
+ # Raised when a request returns a 500 Server Error.
20
+ class ServerError < AtlasError; end
21
+
22
+ # Raised when a request times out.
23
+ class TimeoutError < AtlasError; end
24
+ end
25
+ end
@@ -10,13 +10,11 @@ module Atlas
10
10
  hash.each { |k, v| send("#{k}=", v) if respond_to?("#{k}=") }
11
11
  end
12
12
 
13
- def update_with_response(o, except_keys = [])
14
- hash = JSON.parse(o)
15
-
13
+ def update_with_response(response, except_keys = [])
16
14
  # remove keys that shouldn't be included
17
- except_keys.each { |k| hash.delete(k) }
15
+ except_keys.each { |k| response.delete(k) }
18
16
 
19
- hash.each { |k, v| send("#{k}=", v) if respond_to?("#{k}=") }
17
+ response.each { |k, v| send("#{k}=", v) if respond_to?("#{k}=") }
20
18
  end
21
19
 
22
20
  def to_hash
@@ -7,7 +7,7 @@ module Atlas
7
7
  url_builder = UrlBuilder.new(tag)
8
8
  response = Atlas.client.get(url_builder.user_url)
9
9
 
10
- new(tag, JSON.parse(response.body))
10
+ new(tag, response)
11
11
  end
12
12
 
13
13
  def initialize(tag, hash = {})
@@ -1,4 +1,4 @@
1
1
  # Version information.
2
2
  module Atlas
3
- VERSION = '1.1.0'
3
+ VERSION = '1.2.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atlas
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Charlton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-27 00:00:00.000000000 Z
11
+ date: 2015-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.32'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.32'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: pry
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +143,7 @@ executables: []
115
143
  extensions: []
116
144
  extra_rdoc_files: []
117
145
  files:
146
+ - ".codeclimate.yml"
118
147
  - ".gitignore"
119
148
  - ".travis.yml"
120
149
  - CHANGELOG.md
@@ -132,6 +161,7 @@ files:
132
161
  - lib/atlas/box_version.rb
133
162
  - lib/atlas/client.rb
134
163
  - lib/atlas/configuration.rb
164
+ - lib/atlas/errors.rb
135
165
  - lib/atlas/resource.rb
136
166
  - lib/atlas/url_builder.rb
137
167
  - lib/atlas/user.rb