teamsnap_rb 1.2.0 → 1.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 +4 -4
- data/README.md +1 -1
- data/lib/teamsnap/version.rb +1 -1
- data/lib/teamsnap.rb +64 -46
- data/spec/cassettes/apiv3-init.yml +1358 -1229
- data/spec/cassettes/teamsnap_rb/adds_find_if_search_is_available.yml +19 -21
- data/spec/cassettes/teamsnap_rb/adds_href_to_items.yml +8 -8
- data/spec/cassettes/teamsnap_rb/can_follow_plural_links.yml +44 -55
- data/spec/cassettes/teamsnap_rb/can_follow_singular_links.yml +37 -41
- data/spec/cassettes/teamsnap_rb/can_handle_an_empty_bulk_load.yml +14 -22
- data/spec/cassettes/teamsnap_rb/can_handle_an_error_with_bulk_load.yml +12 -14
- data/spec/cassettes/teamsnap_rb/can_handle_errors_generated_by_command.yml +14 -16
- data/spec/cassettes/teamsnap_rb/can_handle_links_with_no_data.yml +29 -45
- data/spec/cassettes/teamsnap_rb/can_use_bulk_load.yml +28 -31
- data/spec/cassettes/teamsnap_rb/handles_executing_an_action_via_commands.yml +18 -26
- data/spec/cassettes/teamsnap_rb/handles_executing_an_action_via_commands_with_multiple_params.yml +2918 -0
- data/spec/cassettes/teamsnap_rb/handles_fetching_data_via_queries.yml +18 -26
- data/spec/cassettes/teamsnap_rb/handles_queries_with_no_data.yml +15 -23
- data/spec/cassettes/teamsnap_rb/raises_an_exception_if_find_returns_nothing.yml +15 -23
- data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_array_of_objects_when_successful.yml +28 -40
- data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_plural_relation_is_called/responds_with_an_empty_array_when_no_objects_exist.yml +22 -34
- data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_nil_if_it_does_NOT_exist.yml +22 -34
- data/spec/cassettes/teamsnap_rb/supports_relations_with_expected_behaviors/when_a_singular_relation_is_called/responds_with_the_object_if_it_exists.yml +25 -37
- data/spec/spec_helper.rb +10 -0
- data/spec/teamsnap_spec.rb +72 -9
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5c247d6f1854cf336cecb619650aeee8874707f
|
4
|
+
data.tar.gz: 3a025c42980dad4d3da35f8795360042e157388a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4053c6f511dd48f576400bf8283cca14a01ff46b3677341392dc772724142e126b81bb1a5c0eb0dbbb255415aac1d47e8d2d5b28891474738598fa44b68e4ef5
|
7
|
+
data.tar.gz: 86e36409184178ef0c1397c4e5cc10bf34ac31232bfdaca7b362d19a538a283d8a491b704d77ed65be7f8c4be8e490c3f685b5ca8d4d86d9001593b3cff07cfc
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ _Note: You'll need an OAuth2 Token from TeamSnap. Checkout our API docs
|
|
15
15
|
```
|
16
16
|
λ gem install teamsnap_rb
|
17
17
|
λ irb
|
18
|
-
> TeamSnap.init(:token => "abc123..."
|
18
|
+
> TeamSnap.init(:token => "abc123...")
|
19
19
|
> t = TeamSnap::Team.find(1)
|
20
20
|
=> #<TeamSnap::Team::...>
|
21
21
|
> t.name
|
data/lib/teamsnap/version.rb
CHANGED
data/lib/teamsnap.rb
CHANGED
@@ -32,7 +32,7 @@ end
|
|
32
32
|
|
33
33
|
module TeamSnap
|
34
34
|
EXCLUDED_RELS = %w(me apiv2_root root self dude sweet random xyzzy)
|
35
|
-
DEFAULT_URL = "
|
35
|
+
DEFAULT_URL = "https://apiv3.teamsnap.com"
|
36
36
|
Error = Class.new(StandardError)
|
37
37
|
NotFound = Class.new(TeamSnap::Error)
|
38
38
|
|
@@ -43,10 +43,6 @@ module TeamSnap
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def call(env)
|
46
|
-
token = @options[:token]
|
47
|
-
client_id = @options[:client_id]
|
48
|
-
client_secret = @options[:client_secret]
|
49
|
-
|
50
46
|
if token
|
51
47
|
env[:request_headers].merge!({"Authorization" => "Bearer #{token}"})
|
52
48
|
elsif client_id && client_secret
|
@@ -58,22 +54,43 @@ module TeamSnap
|
|
58
54
|
})
|
59
55
|
env.url.query = URI.encode_www_form(query_params)
|
60
56
|
|
61
|
-
body = if env.body.is_a?(Hash)
|
62
|
-
Faraday::Utils::ParamsHash.new.merge(env.body).to_query
|
63
|
-
else
|
64
|
-
env.body
|
65
|
-
end
|
66
|
-
message = "/?" + env.url.query.to_s + (body || "")
|
67
|
-
digest = OpenSSL::Digest.new("sha256")
|
68
|
-
message_hash = digest.hexdigest(message)
|
69
|
-
|
70
57
|
env.request_headers["X-Teamsnap-Hmac"] = OpenSSL::HMAC.hexdigest(
|
71
|
-
digest, client_secret, message_hash
|
58
|
+
digest, client_secret, message_hash(env)
|
72
59
|
)
|
73
60
|
end
|
74
61
|
|
75
62
|
@app.call(env)
|
76
63
|
end
|
64
|
+
|
65
|
+
def token
|
66
|
+
@token ||= @options[:token]
|
67
|
+
end
|
68
|
+
|
69
|
+
def client_id
|
70
|
+
@client_id ||= @options[:client_id]
|
71
|
+
end
|
72
|
+
|
73
|
+
def client_secret
|
74
|
+
@client_secret ||= @options[:client_secret]
|
75
|
+
end
|
76
|
+
|
77
|
+
def digest
|
78
|
+
OpenSSL::Digest.new("sha256")
|
79
|
+
end
|
80
|
+
|
81
|
+
def message_hash(env)
|
82
|
+
digest.hexdigest(
|
83
|
+
query_string(env) + message(env)
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def query_string(env)
|
88
|
+
"/?" + env.url.query.to_s
|
89
|
+
end
|
90
|
+
|
91
|
+
def message(env)
|
92
|
+
env.body || ""
|
93
|
+
end
|
77
94
|
end
|
78
95
|
|
79
96
|
class << self
|
@@ -104,11 +121,6 @@ module TeamSnap
|
|
104
121
|
)
|
105
122
|
end
|
106
123
|
|
107
|
-
opts[:backup_cache] = opts.fetch(:backup_cache) { true }
|
108
|
-
if opts[:backup_cache]
|
109
|
-
opts[:backup_cache_file] = TeamSnap.backup_file_for(opts[:backup_cache])
|
110
|
-
end
|
111
|
-
|
112
124
|
self.client = Faraday.new(
|
113
125
|
:url => opts.fetch(:url),
|
114
126
|
:parallel_manager => Typhoeus::Hydra.new
|
@@ -121,7 +133,7 @@ module TeamSnap
|
|
121
133
|
c.adapter :typhoeus
|
122
134
|
end
|
123
135
|
|
124
|
-
collection = TeamSnap.
|
136
|
+
collection = TeamSnap.run_init(:get, "/", {})
|
125
137
|
|
126
138
|
classes = []
|
127
139
|
client.in_parallel do
|
@@ -136,17 +148,15 @@ module TeamSnap
|
|
136
148
|
apply_endpoints(self, collection) && true
|
137
149
|
end
|
138
150
|
|
139
|
-
def
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
collection
|
151
|
+
def run_init(via, href, args = {}, opts = {})
|
152
|
+
begin
|
153
|
+
resp = client_send(via, href, args)
|
154
|
+
rescue Faraday::TimeoutError
|
155
|
+
warn("Connection to API failed. Initializing with empty class structure")
|
156
|
+
{:links => []}
|
146
157
|
else
|
147
|
-
if
|
148
|
-
|
149
|
-
Oj.load(IO.read(opts[:backup_cache_file]))
|
158
|
+
if resp.success?
|
159
|
+
Oj.load(resp.body).fetch(:collection)
|
150
160
|
else
|
151
161
|
error_message = parse_error(resp)
|
152
162
|
raise TeamSnap::Error.new(error_message)
|
@@ -154,25 +164,33 @@ module TeamSnap
|
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
157
|
-
def
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
def write_backup_file(file_location, collection)
|
162
|
-
return unless file_location
|
163
|
-
dir_location = File.dirname(file_location)
|
164
|
-
if Dir.exist?(dir_location)
|
165
|
-
File.open(file_location, "w+") { |f| f.write Oj.dump(collection) }
|
167
|
+
def run(via, href, args = {})
|
168
|
+
resp = client_send(via, href, args)
|
169
|
+
if resp.success?
|
170
|
+
Oj.load(resp.body).fetch(:collection)
|
166
171
|
else
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
172
|
+
if resp.headers["content-type"].match("json")
|
173
|
+
error_message = parse_error(resp)
|
174
|
+
raise TeamSnap::Error.new(error_message)
|
175
|
+
else
|
176
|
+
raise TeamSnap::Error.new("`#{via}` call was unsuccessful. " +
|
177
|
+
"Unexpected response content-type. " +
|
178
|
+
"Check TeamSnap APIv3 connection")
|
179
|
+
end
|
171
180
|
end
|
172
181
|
end
|
173
182
|
|
174
|
-
def
|
175
|
-
|
183
|
+
def client_send(via, href, args)
|
184
|
+
case via
|
185
|
+
when :get
|
186
|
+
client.send(via, href, args)
|
187
|
+
when :post
|
188
|
+
client.send(via, href) do |req|
|
189
|
+
req.body = Oj.dump(args)
|
190
|
+
end
|
191
|
+
else
|
192
|
+
raise TeamSnap::Error.new("Don't know how to run `#{via}`")
|
193
|
+
end
|
176
194
|
end
|
177
195
|
|
178
196
|
def parse_error(resp)
|