amara 0.2.0 → 0.3.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: 8510ef4c28f4fe621d93af3e766474f0cfae1059
4
- data.tar.gz: 5fb1800d65cbd59a5b1b51b34b6793cfb6ead749
3
+ metadata.gz: 144c53baf060dded67c646c85f51a52dac9582f4
4
+ data.tar.gz: 727735380c694fea5311ee26a584b0356d9bc1a7
5
5
  SHA512:
6
- metadata.gz: b1517cbc3df344f5ec6dd0f7a5485bd75f183d54b785f10fbcd576ad286daf6f4e562e5d6682fe5b3e3c1dda422464da133569b03b01eb160d0a404b61620604
7
- data.tar.gz: 7e0bd035c547bc960283bb145d02eadaa3aa5fccc8a56ff51b19402a9c2f1e53047c26fda13faaf745da1be0f597d964984327a47c12bf2b51357e24cd77b7e4
6
+ metadata.gz: 9b5f3a15c7489353a09d7d7858e4d420ef54ed24a7375b5b4267b8613772f03fee6bd8ca8c6747f5478b0911a2ff1b1173f4f81701bda9ab3171eb15dc83a2bc
7
+ data.tar.gz: 7e9432906468f09cd4d4a2e15699b8b0a716cc3f26621081b4b09c00f01866a78989645176c6bba04c4af28bd4c3f232e3543d5206f1b14508cdeedf7eb35b50
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ .DS_Store
2
+ .ruby-version
1
3
  *.gem
2
4
  *.rbc
3
5
  .bundle
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
3
+ - 2.3
4
+ - 2.2
5
5
  notifications:
6
6
  email:
7
7
  - andrew@prx.org
data/README.md CHANGED
@@ -104,6 +104,14 @@ new_team = amara.teams.create(
104
104
 
105
105
  ```
106
106
 
107
+ In the event of an error from the Amara service, the error will be wrapped in one of the following exception clases.
108
+ ```ruby
109
+ raise Amara::NotFoundError # 404 error
110
+ raise Amara::ClientError # All other 400 errors
111
+ raise Amara::ServerError # 500 errors
112
+ raise Amara::UnknownError # All other errors
113
+ ```
114
+
107
115
  ## Contributing
108
116
 
109
117
  1. Fork it
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'active_support/all'
5
5
 
6
6
  require 'amara/version'
7
+ require 'amara/errors'
7
8
  require 'amara/configuration'
8
9
  require 'amara/connection'
9
10
  require 'amara/response'
@@ -18,6 +19,7 @@ require 'amara/videos/languages'
18
19
  require 'amara/videos/languages/subtitles'
19
20
  require 'amara/videos/urls'
20
21
  require 'amara/activity'
22
+ require 'amara/path'
21
23
  require 'amara/client'
22
24
 
23
25
  module Amara
@@ -42,5 +44,4 @@ module Amara
42
44
  :managers => 'Managers and admins',
43
45
  :admins => 'Admins only'
44
46
  }
45
-
46
47
  end
@@ -36,19 +36,42 @@ module Amara
36
36
  raise ArgumentError, "whoops, that isn't a valid http method: #{method}"
37
37
  end
38
38
 
39
- conn = connection((params[:options] || {}).merge(current_options))
40
- request_path = (conn.path_prefix + '/' + path + '/').gsub(/\/+/, '/')
39
+ options = current_options.merge(params[:options] || {})
40
+ request_params = params.except(:options)
41
+ conn = connection(options)
42
+ request_path = (conn.path_prefix + '/' + path + '/').gsub(/\/+/, '/')
41
43
 
42
44
  response = conn.send(method) do |request|
43
45
  case method.to_sym
44
46
  when :get, :delete
45
- request.url(request_path, params)
47
+ request.url(request_path, request_params)
46
48
  when :post, :put
47
49
  request.path = request_path
48
- request.body = params[:data] ? params[:data].to_json : nil
50
+ request.body = request_params[:data] ? request_params[:data].to_json : nil
49
51
  end
50
52
  end
51
- Amara::Response.new(response, {api: self, method: method, path: path, params: params})
53
+
54
+ amara_response = Amara::Response.new(response, { api: self, method: method, path: path, params: params } )
55
+ check_for_error(response) if options[:raise_errors]
56
+ amara_response
57
+ end
58
+
59
+ def check_for_error(response)
60
+ status_code_type = response.status.to_s[0]
61
+ case status_code_type
62
+ when "2"
63
+ # puts "all is well, status: #{response.status}"
64
+ when "4"
65
+ if response.status == 404
66
+ raise NotFoundError.new("Resource not found", response)
67
+ else
68
+ raise ClientError.new("Whoops, error back from Amara: #{response.status}", response)
69
+ end
70
+ when "5"
71
+ raise ServerError.new("Whoops, error back from Amara: #{response.status}", response)
72
+ else
73
+ raise UnknownError.new("Unrecongized status code: #{response.status}", response)
74
+ end
52
75
  end
53
76
 
54
77
  def base_path
@@ -64,7 +87,7 @@ module Amara
64
87
  end
65
88
 
66
89
  def paginate(params={})
67
- {limit: 20, offset: 0}.merge(params)
90
+ params.reverse_merge(limit: 20, offset: 0)
68
91
  end
69
92
 
70
93
  def list(params={})
@@ -72,26 +95,46 @@ module Amara
72
95
  request(:get, base_path, paginate(params))
73
96
  end
74
97
 
98
+ def list!(params={})
99
+ list(force_raise_errors(params))
100
+ end
101
+
75
102
  def get(params={})
76
103
  self.current_options = current_options.merge(args_to_options(params))
77
104
  request(:get, base_path)
78
105
  end
79
106
 
107
+ def get!(params={})
108
+ get(force_raise_errors(params))
109
+ end
110
+
80
111
  def create(params={})
81
112
  self.current_options = current_options.merge(args_to_options(params))
82
113
  request(:post, base_path, {data: params})
83
114
  end
84
115
 
116
+ def create!(params={})
117
+ create(force_raise_errors(params))
118
+ end
119
+
85
120
  def update(params={})
86
121
  self.current_options = current_options.merge(args_to_options(params))
87
122
  request(:put, base_path, {data: params})
88
123
  end
89
124
 
125
+ def update!(params={})
126
+ update(force_raise_errors(params))
127
+ end
128
+
90
129
  def delete(params={})
91
130
  self.current_options = current_options.merge(args_to_options(params))
92
131
  request(:delete, base_path)
93
132
  end
94
133
 
134
+ def delete!(params={})
135
+ delete(force_raise_errors(params))
136
+ end
137
+
95
138
  def args_to_options(args)
96
139
  params = if args.is_a?(String) || args.is_a?(Symbol)
97
140
  {"#{self.class.name.demodulize.downcase.singularize}_id" => args}
@@ -99,5 +142,12 @@ module Amara
99
142
  args
100
143
  end
101
144
  end
145
+
146
+ def force_raise_errors(params)
147
+ (params || {}).with_indifferent_access.tap do |p|
148
+ p[:options] = ActiveSupport::HashWithIndifferentAccess.new(p[:options])
149
+ p[:options][:raise_errors] = true
150
+ end
151
+ end
102
152
  end
103
153
  end
@@ -27,5 +27,10 @@ module Amara
27
27
  @users ||= ApiFactory.api('Amara::Users', self, params, &block)
28
28
  end
29
29
 
30
+ def path(path, params={}, &block)
31
+ @path ||= ApiFactory.api('Amara::Path', self, params, &block)
32
+ @path.current_options['path'] = path
33
+ @path
34
+ end
30
35
  end
31
36
  end
@@ -8,7 +8,8 @@ module Amara
8
8
  :api_key,
9
9
  :adapter,
10
10
  :endpoint,
11
- :user_agent
11
+ :user_agent,
12
+ :raise_errors
12
13
  ].freeze
13
14
 
14
15
  # this you need to get from amara - go register!
@@ -24,6 +25,9 @@ module Amara
24
25
  # The value sent in the http header for 'User-Agent' if none is set
25
26
  DEFAULT_USER_AGENT = "Amara Ruby Gem #{Amara::VERSION}".freeze
26
27
 
28
+ # by default, raise errors instead of returning them
29
+ DEFAULT_RAISE_ERRORS = true
30
+
27
31
  attr_accessor *VALID_OPTIONS_KEYS
28
32
 
29
33
  # Convenience method to allow for global setting of configuration options
@@ -54,8 +58,8 @@ module Amara
54
58
  self.adapter = DEFAULT_ADAPTER
55
59
  self.endpoint = DEFAULT_ENDPOINT
56
60
  self.user_agent = DEFAULT_USER_AGENT
61
+ self.raise_errors = DEFAULT_RAISE_ERRORS
57
62
  self
58
63
  end
59
-
60
64
  end
61
- end
65
+ end
@@ -0,0 +1,16 @@
1
+ module Amara
2
+
3
+ class Error < ::StandardError
4
+ attr_accessor :response
5
+
6
+ def initialize(message = nil, response = nil)
7
+ super(message || "Amara Error")
8
+ self.response = response
9
+ end
10
+ end
11
+
12
+ class ClientError < Error; end
13
+ class NotFoundError < Error; end
14
+ class ServerError < Error; end
15
+ class UnknownError < Error; end
16
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Amara
4
+ class Path < API
5
+ def base_path
6
+ path = self.current_options[:path]
7
+ if path.kind_of? Array
8
+ path.join('/')
9
+ else
10
+ path
11
+ end
12
+ end
13
+ end
14
+ end
@@ -17,26 +17,16 @@ module Amara
17
17
  def initialize(response, request={})
18
18
  @raw = response
19
19
  @request = request
20
-
21
- check_for_error(response)
22
- end
23
-
24
- def check_for_error(response)
25
- status_code_type = response.status.to_s[0]
26
- case status_code_type
27
- when "2"
28
- # puts "all is well, status: #{response.status}"
29
- when "4", "5"
30
- raise "Whoops, error back from Amara: #{response.status}"
31
- else
32
- raise "Unrecongized status code: #{response.status}"
33
- end
34
20
  end
35
21
 
36
22
  def body
37
23
  self.raw.body
38
24
  end
39
25
 
26
+ def status
27
+ self.raw.status
28
+ end
29
+
40
30
  def object
41
31
  body.objects.nil? ? body : body.objects
42
32
  end
@@ -109,6 +99,5 @@ module Amara
109
99
  self.raw = new_response.raw
110
100
  self
111
101
  end
112
-
113
102
  end
114
103
  end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module Amara
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -46,7 +46,7 @@ describe Amara::API do
46
46
  response.limit.must_equal 2
47
47
  response.size.must_equal 2
48
48
  response.first.id.must_equal 1
49
-
49
+
50
50
  second_response = '{"meta": {"limit": 2, "next": "/api2/partners/api/?limit=2&offset=4", "offset": 2, "previous":"/api2/partners/api/?limit=2&offset=0", "total_count": 5}, "objects": [{"id": 3}, {"id": 4}]}'
51
51
  stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=2').
52
52
  to_return(body: second_response)
@@ -70,4 +70,49 @@ describe Amara::API do
70
70
  response.wont_be :has_next_page?
71
71
  end
72
72
 
73
+ it "will raise errors" do
74
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
75
+ to_return(status: 500, body: '{}')
76
+
77
+ api = Amara::API.new(raise_errors: true)
78
+
79
+ error = proc {
80
+ response = api.list(limit: 2)
81
+ }.must_raise Amara::ServerError
82
+
83
+ error.response.wont_be_nil
84
+ error.response.status.must_equal 500
85
+ error.message.must_equal 'Whoops, error back from Amara: 500'
86
+ end
87
+
88
+ it "can return errors instead of raise them" do
89
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
90
+ to_return(status: 500, body: '{}')
91
+
92
+ api = Amara::API.new(raise_errors: false)
93
+ response = api.list(limit: 2)
94
+ response.status.must_equal 500
95
+
96
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
97
+ to_return(status: 500, body: '{}')
98
+
99
+ api = Amara::API.new(raise_errors: true)
100
+ response = api.list(limit: 2, options: { raise_errors: false } )
101
+ response.status.must_equal 500
102
+ end
103
+
104
+ it "can use bang methods to raise errors" do
105
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
106
+ to_return(status: 500, body: '{}')
107
+
108
+ api = Amara::API.new(raise_errors: false)
109
+
110
+ error = proc {
111
+ response = api.list!(limit: 2)
112
+ }.must_raise Amara::ServerError
113
+
114
+ error.response.wont_be_nil
115
+ error.response.status.must_equal 500
116
+ error.message.must_equal 'Whoops, error back from Amara: 500'
117
+ end
73
118
  end
@@ -19,4 +19,58 @@ describe Amara::Client do
19
19
  amara.languages.wont_be_nil
20
20
  end
21
21
 
22
+ it "returns a path api object" do
23
+ amara = Amara::Client.new
24
+ amara.path('some/path').wont_be_nil
25
+ end
26
+
27
+ it "throws no error on 200" do
28
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
29
+ to_return(body: nil, status: 200)
30
+ begin
31
+ Amara::API.new.list(limit: 2)
32
+ rescue
33
+ flunk "Client error should not be thrown!"
34
+ end
35
+ end
36
+
37
+ it "throws a client error on 400s (except 404)" do
38
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
39
+ to_return(body: nil, status: 400)
40
+ error = proc {
41
+ Amara::API.new.list(limit: 2)
42
+ }.must_raise Amara::ClientError
43
+
44
+ error.response.status.must_equal 400
45
+ end
46
+
47
+ it "throws a not found error on 404" do
48
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
49
+ to_return(body: nil, status: 404)
50
+ error = proc {
51
+ Amara::API.new.list(limit: 2)
52
+ }.must_raise Amara::NotFoundError
53
+
54
+ error.response.status.must_equal 404
55
+ end
56
+
57
+ it "throws a server error on 500s" do
58
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
59
+ to_return(body: nil, status: 500)
60
+ error = proc {
61
+ Amara::API.new.list(limit: 2)
62
+ }.must_raise Amara::ServerError
63
+
64
+ error.response.status.must_equal 500
65
+ end
66
+
67
+ it "throws an unknown error on all other errors" do
68
+ stub_request(:get, 'https://www.amara.org/api2/partners/api/?limit=2&offset=0').
69
+ to_return(body: nil, status: 601)
70
+ error = proc {
71
+ Amara::API.new.list(limit: 2)
72
+ }.must_raise Amara::UnknownError
73
+
74
+ error.response.status.must_equal 601
75
+ end
22
76
  end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
4
+
5
+ describe Amara::Path do
6
+
7
+ it "returns a path api object" do
8
+ amara = Amara::Client.new
9
+ assert_equal amara.path('some/path').class, Amara::Path
10
+ end
11
+
12
+ it "raises an exception if no path is passed" do
13
+ amara = Amara::Client.new
14
+ assert_raises ArgumentError do
15
+ amara.path.wont_be_nil
16
+ end
17
+ end
18
+
19
+ it "sets the custom path" do
20
+ amara = Amara::Client.new
21
+ path = amara.path('some/path')
22
+ assert_equal 'some/path', path.current_options['path']
23
+ end
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kuklewicz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-22 00:00:00.000000000 Z
11
+ date: 2016-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -172,8 +172,10 @@ files:
172
172
  - lib/amara/client.rb
173
173
  - lib/amara/configuration.rb
174
174
  - lib/amara/connection.rb
175
+ - lib/amara/errors.rb
175
176
  - lib/amara/languages.rb
176
177
  - lib/amara/message.rb
178
+ - lib/amara/path.rb
177
179
  - lib/amara/response.rb
178
180
  - lib/amara/teams.rb
179
181
  - lib/amara/teams/applications.rb
@@ -189,6 +191,7 @@ files:
189
191
  - lib/amara/videos/urls.rb
190
192
  - test/api_test.rb
191
193
  - test/client_test.rb
194
+ - test/path_test.rb
192
195
  - test/teams/projects_test.rb
193
196
  - test/teams_test.rb
194
197
  - test/test_helper.rb
@@ -219,6 +222,7 @@ summary: Works with API v1.2, http://amara.readthedocs.org/en/latest/api.html
219
222
  test_files:
220
223
  - test/api_test.rb
221
224
  - test/client_test.rb
225
+ - test/path_test.rb
222
226
  - test/teams/projects_test.rb
223
227
  - test/teams_test.rb
224
228
  - test/test_helper.rb