teamsnap_rb 0.0.8 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +13 -0
- data/Gemfile +2 -1
- data/LICENSE +1 -1
- data/README.md +31 -79
- data/Rakefile +19 -1
- data/lib/teamsnap/version.rb +3 -0
- data/lib/teamsnap.rb +270 -0
- data/spec/cassettes/apiv3-init.yml +1963 -0
- data/spec/cassettes/teamsnap_rb/adds_find_if_search_is_available.yml +56 -0
- data/spec/cassettes/teamsnap_rb/can_follow_plural_links.yml +111 -0
- data/spec/cassettes/teamsnap_rb/can_follow_singular_links.yml +105 -0
- data/spec/cassettes/teamsnap_rb/can_handle_an_empty_bulk_load.yml +52 -0
- data/spec/cassettes/teamsnap_rb/can_handle_an_error_with_bulk_load.yml +50 -0
- data/spec/cassettes/teamsnap_rb/can_handle_errors_generated_by_command.yml +50 -0
- data/spec/cassettes/teamsnap_rb/can_handle_links_with_no_data.yml +101 -0
- data/spec/cassettes/teamsnap_rb/can_use_bulk_load.yml +61 -0
- data/spec/cassettes/teamsnap_rb/handles_executing_an_action_via_commands.yml +54 -0
- data/spec/cassettes/teamsnap_rb/handles_fetching_data_via_queries.yml +56 -0
- data/spec/cassettes/teamsnap_rb/handles_queries_with_no_data.yml +53 -0
- data/spec/cassettes/teamsnap_rb/raises_an_exception_if_find_returns_nothing.yml +53 -0
- data/spec/spec_helper.rb +18 -13
- data/spec/teamsnap_spec.rb +125 -0
- data/teamsnap_rb.gemspec +17 -15
- metadata +100 -84
- data/lib/teamsnap_rb/client.rb +0 -8
- data/lib/teamsnap_rb/collection.rb +0 -179
- data/lib/teamsnap_rb/command.rb +0 -39
- data/lib/teamsnap_rb/commands.rb +0 -40
- data/lib/teamsnap_rb/config.rb +0 -14
- data/lib/teamsnap_rb/exceptions.rb +0 -3
- data/lib/teamsnap_rb/item.rb +0 -136
- data/lib/teamsnap_rb/link.rb +0 -24
- data/lib/teamsnap_rb/links_proxy.rb +0 -40
- data/lib/teamsnap_rb/models/event.rb +0 -4
- data/lib/teamsnap_rb/models/user.rb +0 -4
- data/lib/teamsnap_rb/queries_proxy.rb +0 -68
- data/lib/teamsnap_rb/request_builder.rb +0 -67
- data/lib/teamsnap_rb/template.rb +0 -37
- data/lib/teamsnap_rb/version.rb +0 -3
- data/lib/teamsnap_rb.rb +0 -22
- data/spec/client_spec.rb +0 -39
- data/spec/collection_spec.rb +0 -175
- data/spec/command_spec.rb +0 -60
- data/spec/commands_spec.rb +0 -35
- data/spec/config_spec.rb +0 -16
- data/spec/fixtures/cassettes/production_root.yml +0 -59
- data/spec/fixtures/cassettes/root.yml +0 -573
- data/spec/fixtures/cassettes/team.yml +0 -4858
- data/spec/fixtures/cassettes/teams.yml +0 -160
- data/spec/item_spec.rb +0 -133
- data/spec/link_spec.rb +0 -43
- data/spec/links_proxy_spec.rb +0 -32
- data/spec/queries_proxy_spec.rb +0 -31
- data/spec/template_spec.rb +0 -57
@@ -1,179 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Collection
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
attr_reader :errors
|
6
|
-
|
7
|
-
TYPE_TO_CLASS = {
|
8
|
-
"Event" => Event
|
9
|
-
}
|
10
|
-
|
11
|
-
def initialize(url, query_parameters, config, options = {})
|
12
|
-
request = options.fetch(:request, nil)
|
13
|
-
|
14
|
-
self.config = config
|
15
|
-
data = request || get(url, query_parameters)
|
16
|
-
self.errors = []
|
17
|
-
self.url = data.env["url"]
|
18
|
-
body = data.body
|
19
|
-
|
20
|
-
if data.success?
|
21
|
-
deserializer = Conglomerate::TreeDeserializer.new(JSON.parse(body))
|
22
|
-
self.collection_json = deserializer.deserialize
|
23
|
-
self.items = collection_json.items.map do |item|
|
24
|
-
type_name = item.data.find do |datum|
|
25
|
-
datum.name == "type"
|
26
|
-
end.value
|
27
|
-
|
28
|
-
klass = TYPE_TO_CLASS[type_name] || Item
|
29
|
-
klass.new(item, config)
|
30
|
-
end
|
31
|
-
|
32
|
-
if collection_json.error
|
33
|
-
errors << collection_json.error.message
|
34
|
-
end
|
35
|
-
else
|
36
|
-
errors << data.status.to_s
|
37
|
-
end
|
38
|
-
|
39
|
-
handle_error(errors)
|
40
|
-
end
|
41
|
-
|
42
|
-
def [](index)
|
43
|
-
items[index]
|
44
|
-
end
|
45
|
-
|
46
|
-
def each
|
47
|
-
items.each do |item|
|
48
|
-
yield item
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def where(attribute_hash)
|
53
|
-
CollectionWhereProxy.new(items).where(attribute_hash)
|
54
|
-
end
|
55
|
-
|
56
|
-
def href
|
57
|
-
collection_json.href
|
58
|
-
end
|
59
|
-
|
60
|
-
def method_missing(method, *args)
|
61
|
-
if links.respond_to?(method)
|
62
|
-
links.send(method)
|
63
|
-
elsif queries.respond_to?(method)
|
64
|
-
queries.send(method, *args)
|
65
|
-
else
|
66
|
-
super
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def respond_to?(method)
|
71
|
-
links.respond_to?(method) || queries.respond_to?(method)
|
72
|
-
end
|
73
|
-
|
74
|
-
def links
|
75
|
-
@links ||= LinksProxy.new(collection_json.links, config)
|
76
|
-
end
|
77
|
-
|
78
|
-
def queries
|
79
|
-
@queries ||= QueriesProxy.new(collection_json.queries, config)
|
80
|
-
end
|
81
|
-
|
82
|
-
def template
|
83
|
-
@template ||= Template.new(collection_json.template, config, href)
|
84
|
-
end
|
85
|
-
|
86
|
-
def commands
|
87
|
-
@commands ||= CommandsProxy.new(collection_json.commands, config)
|
88
|
-
end
|
89
|
-
|
90
|
-
def error
|
91
|
-
errors
|
92
|
-
end
|
93
|
-
|
94
|
-
def error?
|
95
|
-
errors.count > 0
|
96
|
-
end
|
97
|
-
|
98
|
-
def size
|
99
|
-
items.size
|
100
|
-
end
|
101
|
-
|
102
|
-
def present?
|
103
|
-
items.size > 0
|
104
|
-
end
|
105
|
-
|
106
|
-
def blank?
|
107
|
-
items.size == 0
|
108
|
-
end
|
109
|
-
|
110
|
-
private
|
111
|
-
|
112
|
-
attr_accessor :collection_json, :config, :items, :url
|
113
|
-
attr_writer :errors
|
114
|
-
|
115
|
-
def get(url, query_parameters = {})
|
116
|
-
RequestBuilder.new(config, url).connection.get do |conn|
|
117
|
-
query_parameters.each do |key, value|
|
118
|
-
conn.params[key] = value
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def this_href
|
124
|
-
collection_json.links.find { |l| l.rel == "self" }.href
|
125
|
-
end
|
126
|
-
|
127
|
-
def handle_error(errors)
|
128
|
-
if errors.include?("401")
|
129
|
-
raise HttpError, "401 Unauthorized for #{url}"
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
class CollectionWhereProxy
|
134
|
-
include Enumerable
|
135
|
-
|
136
|
-
def initialize(items)
|
137
|
-
self.items = items
|
138
|
-
end
|
139
|
-
|
140
|
-
def [](index)
|
141
|
-
items[index]
|
142
|
-
end
|
143
|
-
|
144
|
-
def each
|
145
|
-
items.each do |item|
|
146
|
-
yield item
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def size
|
151
|
-
items.size
|
152
|
-
end
|
153
|
-
|
154
|
-
def present?
|
155
|
-
items.size > 0
|
156
|
-
end
|
157
|
-
|
158
|
-
def blank?
|
159
|
-
items.size == 0
|
160
|
-
end
|
161
|
-
|
162
|
-
def where(attribute_hash)
|
163
|
-
CollectionWhereProxy.new(find_all do |item|
|
164
|
-
attribute_hash.keys.all? do |key|
|
165
|
-
if item.respond_to?(key)
|
166
|
-
attribute_hash[key] == item.send(key)
|
167
|
-
else
|
168
|
-
false
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end)
|
172
|
-
end
|
173
|
-
|
174
|
-
private
|
175
|
-
|
176
|
-
attr_accessor :items
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
data/lib/teamsnap_rb/command.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Command
|
3
|
-
def initialize(command, config)
|
4
|
-
self.command = command
|
5
|
-
self.config = config
|
6
|
-
end
|
7
|
-
|
8
|
-
def execute(attrs = {})
|
9
|
-
post(attrs.flatten.first)
|
10
|
-
end
|
11
|
-
|
12
|
-
def rel
|
13
|
-
command.rel
|
14
|
-
end
|
15
|
-
|
16
|
-
def href
|
17
|
-
command.href
|
18
|
-
end
|
19
|
-
|
20
|
-
def prompt
|
21
|
-
command.prompt
|
22
|
-
end
|
23
|
-
|
24
|
-
def data
|
25
|
-
command.data.map(&:name)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def post(attrs = {})
|
31
|
-
RequestBuilder.new(config, href).connection.post do |conn|
|
32
|
-
conn.body = attrs.to_json
|
33
|
-
conn.headers['Content-Type'] = 'application/json'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
attr_accessor :command, :config
|
38
|
-
end
|
39
|
-
end
|
data/lib/teamsnap_rb/commands.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class CommandsProxy
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
def initialize(commands, config)
|
6
|
-
self.config = config
|
7
|
-
self.commands = commands.inject({}) do |h, command|
|
8
|
-
h.tap do |hash|
|
9
|
-
hash[command.rel.to_sym] = Command.new(command, config)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method, *args)
|
15
|
-
if command = commands[method.to_sym]
|
16
|
-
command.execute(args)
|
17
|
-
else
|
18
|
-
super
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def respond_to?(method)
|
23
|
-
commands.include?(method.to_sym) || super
|
24
|
-
end
|
25
|
-
|
26
|
-
def each
|
27
|
-
commands.values.each do |command|
|
28
|
-
yield command
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def rels
|
33
|
-
commands.keys
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
attr_accessor :commands, :config
|
39
|
-
end
|
40
|
-
end
|
data/lib/teamsnap_rb/config.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Config
|
3
|
-
attr_accessor :access_token, :client_id, :client_secret, :request_middleware, :response_middleware, :authorization
|
4
|
-
|
5
|
-
def initialize(options = {})
|
6
|
-
self.authorization = options.fetch(:authorization, nil)
|
7
|
-
self.access_token = options.fetch(:access_token, nil)
|
8
|
-
self.client_secret = options.fetch(:client_secret, nil)
|
9
|
-
self.client_id = options.fetch(:client_id, nil)
|
10
|
-
self.response_middleware = []
|
11
|
-
self.request_middleware = []
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/teamsnap_rb/item.rb
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Item
|
3
|
-
class << self
|
4
|
-
attr_accessor :templates
|
5
|
-
end
|
6
|
-
@templates = {}
|
7
|
-
|
8
|
-
def initialize(item, config)
|
9
|
-
self.config = config
|
10
|
-
self.item = item
|
11
|
-
end
|
12
|
-
|
13
|
-
def href
|
14
|
-
item.href
|
15
|
-
end
|
16
|
-
|
17
|
-
def data
|
18
|
-
item.data
|
19
|
-
end
|
20
|
-
|
21
|
-
def template
|
22
|
-
self.class.templates[type] ||= fetch_template
|
23
|
-
end
|
24
|
-
|
25
|
-
def this
|
26
|
-
@this ||= Collection.new(href, {}, config)
|
27
|
-
end
|
28
|
-
|
29
|
-
def links
|
30
|
-
@links ||= LinksProxy.new(item.links, config)
|
31
|
-
end
|
32
|
-
|
33
|
-
def commands
|
34
|
-
@commands ||= CommandsProxy.new(this.commands, config)
|
35
|
-
end
|
36
|
-
|
37
|
-
def delete
|
38
|
-
response = delete_href(href)
|
39
|
-
if response.status == 204
|
40
|
-
true
|
41
|
-
else
|
42
|
-
raise FailedToDelete
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def with(attrs)
|
47
|
-
attrs = Hash[attrs.map{ |k, v| [k.to_s, v] }]
|
48
|
-
dirtied_attrs = attrs.keys
|
49
|
-
attrs = attributes.merge(attrs)
|
50
|
-
|
51
|
-
new_data = attrs.inject([]) do |arr, (key, value)|
|
52
|
-
arr << Conglomerate::Datum.new(:name => key, :value => value)
|
53
|
-
end
|
54
|
-
|
55
|
-
item = Conglomerate::Item.new(
|
56
|
-
:href => href,
|
57
|
-
:data => new_data
|
58
|
-
)
|
59
|
-
|
60
|
-
Item.new(item, config).tap do |it|
|
61
|
-
it.send(:dirty, dirtied_attrs)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def save
|
66
|
-
attrs_to_update = dirty_attributes.inject({}) do |h, attr|
|
67
|
-
h.tap do |hash|
|
68
|
-
hash[attr] = attributes[attr]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
request = RequestBuilder.new(config, href).connection.patch do |conn|
|
73
|
-
conn.body = template.build(attrs_to_update).to_json
|
74
|
-
conn.headers["Content-Type"] = "application/json"
|
75
|
-
end
|
76
|
-
|
77
|
-
Collection.new(nil, nil, config, :request => request)
|
78
|
-
end
|
79
|
-
|
80
|
-
def method_missing(method, *args)
|
81
|
-
if datum = data.find { |d| d.name == method.to_s }
|
82
|
-
unless instance_variable_get("@#{method}_datum")
|
83
|
-
instance_variable_set("@#{method}_datum", datum.value)
|
84
|
-
end
|
85
|
-
|
86
|
-
instance_variable_get("@#{method}_datum")
|
87
|
-
elsif links.respond_to?(method)
|
88
|
-
links.send(method)
|
89
|
-
elsif commands.respond_to?(method)
|
90
|
-
commands.send(method, args)
|
91
|
-
else
|
92
|
-
super
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def respond_to?(method)
|
97
|
-
if data.find { |d| d.name == method.to_s }
|
98
|
-
true
|
99
|
-
elsif
|
100
|
-
links.respond_to?(method)
|
101
|
-
elsif
|
102
|
-
commands.respond_to?(method)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def attributes
|
109
|
-
@attributes ||= data.inject({}) do |h, datum|
|
110
|
-
h.tap do |hash|
|
111
|
-
hash[datum.name] = datum.value
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def delete_href(href)
|
117
|
-
RequestBuilder.new(config, href).connection.delete
|
118
|
-
end
|
119
|
-
|
120
|
-
def dirty(attrs)
|
121
|
-
self.dirty_attributes = attrs
|
122
|
-
end
|
123
|
-
|
124
|
-
def fetch_template
|
125
|
-
this.template
|
126
|
-
end
|
127
|
-
|
128
|
-
def fetch_commands
|
129
|
-
this.commands
|
130
|
-
end
|
131
|
-
|
132
|
-
attr_accessor :item, :config, :dirty_attributes
|
133
|
-
end
|
134
|
-
|
135
|
-
class FailedToDelete < StandardError;end;
|
136
|
-
end
|
data/lib/teamsnap_rb/link.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Link
|
3
|
-
def initialize(link, config)
|
4
|
-
self.config = config
|
5
|
-
self.link = link
|
6
|
-
end
|
7
|
-
|
8
|
-
def follow
|
9
|
-
@collection ||= Collection.new(href, {}, config)
|
10
|
-
end
|
11
|
-
|
12
|
-
def rel
|
13
|
-
link.rel
|
14
|
-
end
|
15
|
-
|
16
|
-
def href
|
17
|
-
link.href
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_accessor :config, :link
|
23
|
-
end
|
24
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class LinksProxy
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
def initialize(links, config)
|
6
|
-
self.config = config
|
7
|
-
self.links = links.inject({}) do |h, link|
|
8
|
-
h.tap do |hash|
|
9
|
-
hash[link.rel.to_sym] = Link.new(link, config)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method, *args)
|
15
|
-
if link = links[method.to_sym]
|
16
|
-
link.follow
|
17
|
-
else
|
18
|
-
super
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def respond_to?(method)
|
23
|
-
links.include?(method.to_sym) || super
|
24
|
-
end
|
25
|
-
|
26
|
-
def each
|
27
|
-
links.values.each do |link|
|
28
|
-
yield link
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def rels
|
33
|
-
links.keys
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
attr_accessor :links, :config
|
39
|
-
end
|
40
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class QueriesProxy
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
def initialize(queries, config)
|
6
|
-
self.config = config
|
7
|
-
self.queries = queries.inject({}) do |h, query|
|
8
|
-
h.tap do |hash|
|
9
|
-
hash[query.rel.to_sym] = Query.new(query.href, query.data, config)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method, *args)
|
15
|
-
if query = queries[method.to_sym]
|
16
|
-
query.get(*args)
|
17
|
-
else
|
18
|
-
super
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def respond_to?(method)
|
23
|
-
queries.include?(method.to_sym) || super
|
24
|
-
end
|
25
|
-
|
26
|
-
def each
|
27
|
-
queries.values.each do |query|
|
28
|
-
yield query
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def rels
|
33
|
-
queries.keys
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
attr_accessor :queries, :config
|
39
|
-
end
|
40
|
-
|
41
|
-
class Query
|
42
|
-
MissingQueryParameter = Class.new(StandardError)
|
43
|
-
|
44
|
-
def initialize(url, data, config)
|
45
|
-
self.url = url
|
46
|
-
self.data = data
|
47
|
-
self.config = config
|
48
|
-
end
|
49
|
-
|
50
|
-
def get(query_parameters={})
|
51
|
-
possible_params = data.map(&:name).map(&:to_sym)
|
52
|
-
query_parameters.reject! { |key, value| !possible_params.include?(key) }
|
53
|
-
|
54
|
-
if query_parameters.empty?
|
55
|
-
raise(
|
56
|
-
MissingQueryParameter,
|
57
|
-
"You must provide at least one of the following parameters: #{possible_params}"
|
58
|
-
)
|
59
|
-
end
|
60
|
-
|
61
|
-
Collection.new(url, query_parameters, config)
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
attr_accessor :url, :data, :config
|
67
|
-
end
|
68
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require "openssl"
|
2
|
-
|
3
|
-
module TeamsnapRb
|
4
|
-
class RequestBuilder
|
5
|
-
attr_reader :connection
|
6
|
-
|
7
|
-
def initialize(config, url)
|
8
|
-
self.config = config
|
9
|
-
self.connection = Faraday::Connection.new(:url => url) do |faraday|
|
10
|
-
config.request_middleware.each do |m|
|
11
|
-
faraday.request(m)
|
12
|
-
end
|
13
|
-
|
14
|
-
config.response_middleware.each do |m|
|
15
|
-
faraday.response(m)
|
16
|
-
end
|
17
|
-
|
18
|
-
faraday.request :teamsnap_config_middleware, config
|
19
|
-
faraday.adapter Faraday.default_adapter
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
attr_accessor :config
|
26
|
-
attr_writer :connection
|
27
|
-
end
|
28
|
-
|
29
|
-
class TeamsnapAuthMiddleware < Faraday::Middleware
|
30
|
-
def initialize(app, *args, &block)
|
31
|
-
self.config = args[0]
|
32
|
-
super(app)
|
33
|
-
end
|
34
|
-
|
35
|
-
def call(env)
|
36
|
-
if config.access_token
|
37
|
-
env.request_headers["X-Teamsnap-Access-Token"] = config.access_token
|
38
|
-
elsif config.authorization
|
39
|
-
env.request_headers["Authorization"] = "Bearer #{config.authorization}"
|
40
|
-
elsif config.client_id && config.client_secret
|
41
|
-
query_params = Hash[URI.decode_www_form(env.url.query || "")]
|
42
|
-
query_params.merge!({
|
43
|
-
hmac_client_id: config.client_id,
|
44
|
-
hmac_nonce: SecureRandom.uuid,
|
45
|
-
hmac_timestamp: Time.now.to_i
|
46
|
-
})
|
47
|
-
env.url.query = URI.encode_www_form(query_params)
|
48
|
-
|
49
|
-
message = "/?" + env.url.query.to_s + (env.body || "")
|
50
|
-
digest = OpenSSL::Digest.new('sha256')
|
51
|
-
message_hash = digest.hexdigest(message)
|
52
|
-
|
53
|
-
env.request_headers["X-Teamsnap-Hmac"] = OpenSSL::HMAC.hexdigest(digest, config.client_secret, message_hash)
|
54
|
-
end
|
55
|
-
|
56
|
-
@app.call(env)
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
attr_accessor :config
|
62
|
-
end
|
63
|
-
|
64
|
-
Faraday::Request.register_middleware(
|
65
|
-
:teamsnap_config_middleware => lambda { TeamsnapAuthMiddleware }
|
66
|
-
)
|
67
|
-
end
|
data/lib/teamsnap_rb/template.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module TeamsnapRb
|
2
|
-
class Template
|
3
|
-
def initialize(template, config, url)
|
4
|
-
self.config = config
|
5
|
-
self.template = template
|
6
|
-
self.url = url
|
7
|
-
end
|
8
|
-
|
9
|
-
def build(attrs={})
|
10
|
-
@data = template.build(attrs)
|
11
|
-
end
|
12
|
-
|
13
|
-
def push(attrs={})
|
14
|
-
build(attrs)
|
15
|
-
publish
|
16
|
-
end
|
17
|
-
|
18
|
-
def data
|
19
|
-
template.data
|
20
|
-
end
|
21
|
-
|
22
|
-
def publish
|
23
|
-
post(url, @data) if @data
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
attr_accessor :template, :config, :url
|
29
|
-
|
30
|
-
def post(url, query_parameters = {})
|
31
|
-
RequestBuilder.new(config, url).connection.post do |conn|
|
32
|
-
conn.body = @data.to_json
|
33
|
-
conn.headers['Content-Type'] = 'application/json'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/teamsnap_rb/version.rb
DELETED
data/lib/teamsnap_rb.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require "conglomerate"
|
2
|
-
require "json"
|
3
|
-
require "faraday"
|
4
|
-
require "securerandom"
|
5
|
-
|
6
|
-
require_relative "teamsnap_rb/version"
|
7
|
-
require_relative "teamsnap_rb/exceptions"
|
8
|
-
require_relative "teamsnap_rb/config"
|
9
|
-
require_relative "teamsnap_rb/request_builder"
|
10
|
-
require_relative "teamsnap_rb/link"
|
11
|
-
require_relative "teamsnap_rb/links_proxy"
|
12
|
-
require_relative "teamsnap_rb/queries_proxy"
|
13
|
-
require_relative "teamsnap_rb/item"
|
14
|
-
require_relative "teamsnap_rb/template"
|
15
|
-
require_relative "teamsnap_rb/command"
|
16
|
-
require_relative "teamsnap_rb/commands"
|
17
|
-
require_relative "teamsnap_rb/models/event"
|
18
|
-
require_relative "teamsnap_rb/collection"
|
19
|
-
require_relative "teamsnap_rb/client"
|
20
|
-
|
21
|
-
module TeamsnapRb
|
22
|
-
end
|