teamsnap_rb 2.0.0.beta4 → 2.0.0.beta6

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: 3db56d6d4ca6e055cf80fe479fca02c9b4b8074f
4
- data.tar.gz: 5cdfb06bbf191203c5a223dac95e49a589e68c66
3
+ metadata.gz: f52464e6a2e0dcb607c8cb48f44da22fcb99088c
4
+ data.tar.gz: e7a00559a594e50b8e2681cae0ca9f17f37d68fe
5
5
  SHA512:
6
- metadata.gz: 54372ade0ae182ab80db00f56662d8997294ddb429ea01173cd1c9f53c1176220735af1c562011b2b0a4594b1aebbd6c30aab0ea68e5f9fc82619533b13b88cf
7
- data.tar.gz: b7bda322d789e638491fded6272a554eee314a235e31b28aef241b1b3e989932478d1b500bd9fda51a2b7558a503992fde21c593c148f8b5a1197318af1a3d99
6
+ metadata.gz: fdd9bd671fea6da070c628d12d2423b6a9bd88c2990e357755f2e23e87dd2a4a63bddd11c6b309739803505207396a5a2ae4a770dcc2d181a8b9800e1eed49cf
7
+ data.tar.gz: 7e1d60b58f8ea299f5a16284ad90f51095c333b3602d9a61ad9a974beeabde7bcb11ce12ed96c1408098c2ca42ebf5fc3f27039d81734ffba3a2900784978971
data/CHANGELOG.md CHANGED
@@ -20,3 +20,8 @@ v2.0.0.beta
20
20
 
21
21
  - Full CRUD actions available along with TeamSnap::Response option for better
22
22
  control-flow statements.
23
+
24
+ v2.0.0.beta6
25
+ ------
26
+
27
+ - Handle errors when response body is an empty string
data/lib/teamsnap.rb CHANGED
@@ -15,6 +15,7 @@ module TeamSnap
15
15
  DEFAULT_URL = "https://apiv3.teamsnap.com"
16
16
  Error = Class.new(StandardError)
17
17
  NotFound = Class.new(TeamSnap::Error)
18
+ InitializationError = Class.new(TeamSnap::Error)
18
19
 
19
20
  class << self
20
21
  attr_accessor :client_id, :client_secret, :root_client, :token, :url
@@ -34,7 +35,10 @@ module TeamSnap
34
35
  self.root_client = TeamSnap::Client.new(:token => token)
35
36
 
36
37
  ## Make the apiv3 root call. collection is parsed JSON
37
- collection = TeamSnap.run(root_client, :get, self.url, {})
38
+ collection = TeamSnap.run(root_client, :get, self.url, {}) do
39
+ self.root_client = nil
40
+ raise TeamSnap::InitializationError
41
+ end
38
42
 
39
43
  ## Setup Dynamic Classes from the collection
40
44
  TeamSnap::Structure.init(root_client, collection)
@@ -43,12 +47,19 @@ module TeamSnap
43
47
  TeamSnap::Collection.apply_endpoints(self, collection) && true
44
48
  end
45
49
 
46
- def run(client, via, href, args = {})
50
+ def run(client, via, href, args = {}, &block)
51
+ timeout_error = block || default_timeout_error
47
52
  resp = client_send(client, via, href, args)
48
53
  return TeamSnap::Response.load_collection(resp)
49
54
  rescue Faraday::TimeoutError
50
- warn("Connection to API failed with TimeoutError")
51
- {:links => []}
55
+ timeout_error.call
56
+ end
57
+
58
+ def default_timeout_error
59
+ -> {
60
+ warn("Connection to API failed with TimeoutError")
61
+ {:links => []}
62
+ }
52
63
  end
53
64
 
54
65
  def client_send(client, via, href, args)
data/lib/teamsnap/api.rb CHANGED
@@ -73,6 +73,8 @@ module TeamSnap
73
73
 
74
74
  def self.parse_error(resp)
75
75
  return "Object Not Found (404)" if resp.status == 404
76
+ return "Forbidden (403)" if resp.status == 403 && resp.body == ""
77
+
76
78
  begin
77
79
  Oj.load(resp.body)
78
80
  .fetch(:collection)
data/lib/teamsnap/item.rb CHANGED
@@ -6,7 +6,9 @@ module TeamSnap
6
6
  collection
7
7
  .fetch(:items) { [] }
8
8
  .map { |item|
9
- data = parse_data(item).merge(:href => item[:href])
9
+ data = parse_data(item)
10
+ .merge(:href => item[:href])
11
+ .merge(url_attributes(item))
10
12
  type = type_of(item)
11
13
  cls = load_class(type, data)
12
14
 
@@ -53,12 +55,18 @@ module TeamSnap
53
55
  }
54
56
  end
55
57
 
58
+ def url_attributes(item)
59
+ links = item
60
+ .fetch(:links) { [] }
61
+ .map { |link| ["#{link.fetch(:rel)}_url", link.fetch(:href)] }
62
+ hashify(links)
63
+ end
64
+
56
65
  def hashify(arr)
57
66
  Hash[*arr.flatten]
58
67
  rescue NoMethodError
59
68
  arr.inject({}) { |hash, (key, value)| hash[key] = value; hash }
60
69
  end
61
-
62
70
  end
63
71
 
64
72
  private
@@ -71,7 +79,6 @@ module TeamSnap
71
79
  href = link.fetch(:href)
72
80
  is_singular = rel == Inflecto.singularize(rel)
73
81
 
74
- define_singleton_method("#{rel}_url") { href }
75
82
  define_singleton_method(rel) {
76
83
  instance_variable_get("@#{rel}") || instance_variable_set(
77
84
  "@#{rel}", -> {
@@ -84,7 +84,7 @@ module TeamSnap
84
84
 
85
85
  def process_error
86
86
  if @resp.headers["content-type"].match("json")
87
- body = Oj.load(@resp.body)
87
+ body = Oj.load(@resp.body) || {}
88
88
  @collection = body.fetch(:collection) { {} }
89
89
  @message = TeamSnap::Api.parse_error(@resp)
90
90
  @objects = TeamSnap::Item.load_items(@client, @collection)
@@ -1,3 +1,3 @@
1
1
  module TeamSnap
2
- VERSION = "2.0.0.beta4"
2
+ VERSION = "2.0.0.beta6"
3
3
  end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+ require "teamsnap"
3
+
4
+ RSpec.describe "teamsnap__api", :vcr => true do
5
+ context ".parse_error" do
6
+ it "returns error message on a 403 and an empty body" do
7
+ response = Faraday::Response.new(
8
+ :status => 403,
9
+ :body => ""
10
+ )
11
+ expect(TeamSnap::Api.parse_error(response)).to eq("Forbidden (403)")
12
+ end
13
+
14
+ it "returns error message on a 404" do
15
+ response = Faraday::Response.new(
16
+ :status => 404,
17
+ :body => ""
18
+ )
19
+ expect(TeamSnap::Api.parse_error(response)).to eq("Object Not Found (404)")
20
+ end
21
+
22
+ it "returns a proper error message" do
23
+ response = Faraday::Response.new(
24
+ :status => 403,
25
+ :body => Oj.dump("collection" => { :error => { :message => "Error Message"}})
26
+ )
27
+ expect(TeamSnap::Api.parse_error(response)).to eq("Error Message")
28
+ end
29
+ end
30
+ end
@@ -142,14 +142,22 @@ RSpec.describe "teamsnap__item", :vcr => true do
142
142
  :name => "humanized_media_storage_used",
143
143
  :value => "0 B"
144
144
  }
145
+ ],
146
+ :links => [
147
+ {
148
+ :rel => "logo",
149
+ :href => "http://example.com/logo.png"
150
+ }
145
151
  ]
146
152
  }
147
153
  ]
148
154
  }
149
155
 
150
- expect(
151
- TeamSnap::Item.load_items(TeamSnap.root_client, collection)[0].class
152
- ).to eq(TeamSnap::Team)
156
+ item = TeamSnap::Item.load_items(TeamSnap.root_client, collection)[0]
157
+
158
+ expect(item.class).to eq(TeamSnap::Team)
159
+ expect(item.logo_url).to eq("http://example.com/logo.png")
160
+ expect(item.attributes[:logo_url]).to eq("http://example.com/logo.png")
153
161
  end
154
162
  end
155
163
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teamsnap_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta4
4
+ version: 2.0.0.beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Emmons
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-06 00:00:00.000000000 Z
12
+ date: 2016-05-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -193,6 +193,7 @@ files:
193
193
  - spec/cassettes/teamsnap_rb/_run/processes_the_response.yml
194
194
  - spec/cassettes/teamsnap_rb/_server_error/Specifies_call_and_endpoint_that_was_unsuccessful.yml
195
195
  - spec/spec_helper.rb
196
+ - spec/teamsnap/apiv_spec.rb
196
197
  - spec/teamsnap/client_spec.rb
197
198
  - spec/teamsnap/collection_spec.rb
198
199
  - spec/teamsnap/item_spec.rb
@@ -220,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
221
  version: 1.3.1
221
222
  requirements: []
222
223
  rubyforge_project:
223
- rubygems_version: 2.2.2
224
+ rubygems_version: 2.6.3
224
225
  signing_key:
225
226
  specification_version: 4
226
227
  summary: A gem to interact with TeamSnap's API
@@ -256,6 +257,7 @@ test_files:
256
257
  - spec/cassettes/teamsnap_rb/_run/processes_the_response.yml
257
258
  - spec/cassettes/teamsnap_rb/_server_error/Specifies_call_and_endpoint_that_was_unsuccessful.yml
258
259
  - spec/spec_helper.rb
260
+ - spec/teamsnap/apiv_spec.rb
259
261
  - spec/teamsnap/client_spec.rb
260
262
  - spec/teamsnap/collection_spec.rb
261
263
  - spec/teamsnap/item_spec.rb