cisco_spark 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +247 -5
- data/lib/cisco_spark/api.rb +3 -12
- data/lib/cisco_spark/collection.rb +48 -0
- data/lib/cisco_spark/model.rb +19 -7
- data/lib/cisco_spark/models/room.rb +17 -1
- data/lib/cisco_spark/models/webhook.rb +20 -0
- data/lib/cisco_spark/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e7bab6e1d7eb7f898297f5f1c350a800e9bfcb7
|
4
|
+
data.tar.gz: 2fba2068d4a125b24ddca0808a7e49981281083b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 153091bc0d40028cdddcb87c33cc987d28d630bf05ce34ab7e75ab370992cbe448f547650388116fa351ad9d769ba98987b9513ae6d040af61297bd5aa31efa7
|
7
|
+
data.tar.gz: be05e4a6bc6e80d85322993b3c2b9974b3671f7e05a2ca25d4d00af7f9e3486c457e4b74e185c37174e702b07f52763c2012371709dd0f1dea5a2446020c20c5
|
data/README.md
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
[![Build Status](https://travis-ci.org/NGMarmaduke/cisco_spark-ruby.svg?branch=master)](https://travis-ci.org/NGMarmaduke/cisco_spark-ruby)
|
3
3
|
[![Coverage Status](https://coveralls.io/repos/github/NGMarmaduke/cisco_spark-ruby/badge.svg?branch=master)](https://coveralls.io/github/NGMarmaduke/cisco_spark-ruby?branch=master)
|
4
4
|
|
5
|
-
Ruby
|
6
|
-
|
7
|
-
Work in progress currently
|
5
|
+
Ruby client for [Cisco Spark](https://developer.ciscospark.com).
|
8
6
|
|
9
7
|
## Installation
|
10
8
|
|
@@ -24,13 +22,257 @@ Or install it yourself as:
|
|
24
22
|
|
25
23
|
## Usage
|
26
24
|
|
27
|
-
|
25
|
+
### Configuration
|
26
|
+
Configuration can be done in an initializer on app boot.
|
27
|
+
An API key or users OAuth token is required to make any API requests.
|
28
|
+
|
29
|
+
API key example:
|
30
|
+
```ruby
|
31
|
+
CiscoSpark.configure do |config|
|
32
|
+
config.api_key = 'YOUR KEY'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
If you are using OAuth token you can wrap API operaions in a block, all API calls within the block will then use that token.
|
37
|
+
|
38
|
+
OAuth token example:
|
39
|
+
```ruby
|
40
|
+
CiscoSpark.with_token('OAuth token') do
|
41
|
+
users_rooms = CiscoSpark::Room.fetch_all
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
### Models
|
46
|
+
All models have methods to interact with the API and parse response data
|
47
|
+
|
48
|
+
###### `klass.fetch_all`
|
49
|
+
Fetches all records for a given model, returns a `CiscoSpark::Collection`
|
50
|
+
Accepts any parameters that the API allows.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
rooms = CiscoSpark::Room.fetch_all(max: 5)
|
54
|
+
=> #<CiscoSpark::Collection>
|
55
|
+
```
|
56
|
+
|
57
|
+
###### `klass.fetch`
|
58
|
+
Fetches a single record for the given resource ID, returns an instance
|
59
|
+
Accepts any parameters that the API allows.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
room = CiscoSpark::Room.fetch('Y2lzY...', show_sip_address: true)
|
63
|
+
=> #<CiscoSpark::Room>
|
64
|
+
```
|
65
|
+
|
66
|
+
###### `klass.create`
|
67
|
+
Creates a resource with given attribues, returns an instance
|
68
|
+
Accepts any parameters that the API allows.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
room = CiscoSpark::Room.create(title: 'Ruby Room')
|
72
|
+
=> #<CiscoSpark::Room>
|
73
|
+
```
|
74
|
+
|
75
|
+
###### `klass.update`
|
76
|
+
Updates a resource with given attribues, returns an instance
|
77
|
+
Accepts any parameters that the API allows.
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
room = CiscoSpark::Room.update('Y2lzY...', title: 'Groovey Ruby Room')
|
81
|
+
=> #<CiscoSpark::Room>
|
82
|
+
```
|
83
|
+
|
84
|
+
###### `klass.detroy`
|
85
|
+
Destroys a resource with the given ID, returns an boolean to indicate success
|
86
|
+
Accepts any parameters that the API allows.
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
room = CiscoSpark::Room.destroy('Y2lzY...')
|
90
|
+
=> true
|
91
|
+
```
|
92
|
+
|
93
|
+
###### `klass.parse_collection`
|
94
|
+
Parses a valid JSON string or a ruby hash/array into a collection of models.
|
95
|
+
This is useful for processing data recieved from a webhook etc.
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
json_string = '{"items": [{ "id": "Y2lzY...", "key": "value" }]}'
|
99
|
+
rooms = CiscoSpark::Room.parse_collection(json_string)
|
100
|
+
=> #<CiscoSpark::Collection>
|
101
|
+
```
|
102
|
+
|
103
|
+
###### `klass.parse`
|
104
|
+
Parses a valid JSON string or a ruby hash/array into a model.
|
105
|
+
This is useful for processing data recieved from a webhook etc.
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
json_string = '{ "id": "Y2lzY...", "key": "value" }'
|
109
|
+
room = CiscoSpark::Room.parse(json_string)
|
110
|
+
=> #<CiscoSpark::Room>
|
111
|
+
```
|
112
|
+
|
113
|
+
###### `klass.new`
|
114
|
+
Creates a new instance of the model with given attributes
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
room = CiscoSpark::Room.new(title: 'New room')
|
118
|
+
=> #<CiscoSpark::Room>
|
119
|
+
```
|
120
|
+
|
121
|
+
###### `instance.persist`
|
122
|
+
You can call persist on an instance to create or update it through the API.
|
123
|
+
If the instance already has an ID a `PUT` will be made to update the mutable attributes
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
room = CiscoSpark::Room.new(title: 'New room')
|
127
|
+
room.persist
|
128
|
+
=> #<CiscoSpark::Room>
|
129
|
+
```
|
130
|
+
|
131
|
+
###### `instance.fetch`
|
132
|
+
You can call fetch on an instance fetch or refresh an instance
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
room = CiscoSpark::Room.new(id: 'Y2lzY...')
|
136
|
+
room.fetch
|
137
|
+
=> #<CiscoSpark::Room>
|
138
|
+
```
|
139
|
+
|
140
|
+
###### `instance.destroy`
|
141
|
+
You can call destroy on an instance to destroy it through the API
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
room = CiscoSpark::Room.new(id: 'Y2lzY...')
|
145
|
+
room.destroy
|
146
|
+
=> true
|
147
|
+
```
|
148
|
+
|
149
|
+
###### `instance.to_h`
|
150
|
+
Convert a model instance into a hash
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
room = CiscoSpark::Room.fetch('Y2lzY...')
|
154
|
+
room.to_h
|
155
|
+
=> Hash
|
156
|
+
```
|
157
|
+
|
158
|
+
##### `CiscoSpark::Person`
|
159
|
+
[API reference](https://developer.ciscospark.com/resource-people.html)
|
160
|
+
|
161
|
+
###### `CiscoSpark::Person.all_by_email`
|
162
|
+
Search all people by email,
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
people = CiscoSpark::Person.all_by_email('nickpmaher@gmail.com', max: 5)
|
166
|
+
=> #<CiscoSpark::Collection>
|
167
|
+
```
|
168
|
+
|
169
|
+
###### `CiscoSpark::Person.all_by_name`
|
170
|
+
Search all people by display name
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
people = CiscoSpark::Person.all_by_name('Nick', max: 5)
|
174
|
+
=> #<CiscoSpark::Collection>
|
175
|
+
```
|
176
|
+
|
177
|
+
###### `#memberships`
|
178
|
+
Get all memberships for person
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
person = CiscoSpark::Person.new(id: 'Y2lz...')
|
182
|
+
person.memberships(max: 5)
|
183
|
+
=> #<CiscoSpark::Collection>
|
184
|
+
```
|
185
|
+
|
186
|
+
##### `CiscoSpark::Room`
|
187
|
+
[API reference](https://developer.ciscospark.com/resource-rooms.html)
|
188
|
+
|
189
|
+
###### `#memberships`
|
190
|
+
Get all memberships for room
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
room = CiscoSpark::Room.new(id: 'Y3de...')
|
194
|
+
room.memberships(max: 5)
|
195
|
+
=> #<CiscoSpark::Collection>
|
196
|
+
```
|
197
|
+
|
198
|
+
###### `#messages`
|
199
|
+
Get all messages for room
|
200
|
+
|
201
|
+
```ruby
|
202
|
+
room = CiscoSpark::Room.new(id: 'Y3de...')
|
203
|
+
room.messages(max: 5)
|
204
|
+
=> #<CiscoSpark::Collection>
|
205
|
+
```
|
206
|
+
|
207
|
+
###### `#messages_before_message`
|
208
|
+
Get all message before a given message, accepts a `CiscoSpark::Message` or a message ID
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
room.all_before_message('Y3de...', max: 5)
|
212
|
+
=> #<CiscoSpark::Collection>
|
213
|
+
```
|
214
|
+
|
215
|
+
###### `#messages_before`
|
216
|
+
Get all message before a given time, accepts a `DateTime` or a string
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
room.messages_before(DateTime.now, max: 5)
|
220
|
+
=> #<CiscoSpark::Collection>
|
221
|
+
```
|
222
|
+
|
223
|
+
###### `#send_message`
|
224
|
+
Send a message to the room
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
message = CiscoSpark::Message.new(text: 'Hello Spark')
|
228
|
+
|
229
|
+
room = CiscoSpark::Room.new(id: 'Y3de...')
|
230
|
+
room.send_message(message)
|
231
|
+
=> #<CiscoSpark::Message>
|
232
|
+
```
|
233
|
+
|
234
|
+
###### `#add_person`
|
235
|
+
Creates a new membership to the room for a given person
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
person = CiscoSpark::Person.fetch('Y2lz')
|
239
|
+
|
240
|
+
room = CiscoSpark::Room.new(id: 'Y3de...')
|
241
|
+
room.add_person(person)
|
242
|
+
=> #<CiscoSpark::Membership>
|
243
|
+
```
|
244
|
+
|
245
|
+
##### `CiscoSpark::Membership`
|
246
|
+
[API reference](https://developer.ciscospark.com/resource-memberships.html)
|
247
|
+
|
248
|
+
###### `#person`
|
249
|
+
Returns the person for this membership
|
250
|
+
|
251
|
+
###### `#room`
|
252
|
+
Returns the room this membership belongs to
|
253
|
+
|
254
|
+
##### `CiscoSpark::Message`
|
255
|
+
[API reference](https://developer.ciscospark.com/resource-messages.html)
|
256
|
+
|
257
|
+
###### `#person`
|
258
|
+
Returns the person that sent this message
|
259
|
+
|
260
|
+
###### `#person_to`
|
261
|
+
Returns the person that the message was sent to
|
262
|
+
|
263
|
+
##### `CiscoSpark::Webhook`
|
264
|
+
[API reference](https://developer.ciscospark.com/resource-webhooks.html)
|
265
|
+
|
266
|
+
### `CiscoSpark::Collection`
|
267
|
+
Wraps a collection of models. Responds to all enumerable methods e.g. `first`, `map`, `each` etc...
|
268
|
+
|
269
|
+
Call `next` on a collection to load the next page of data
|
28
270
|
|
29
271
|
## Development
|
30
272
|
|
31
273
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
32
274
|
|
33
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
275
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
34
276
|
|
35
277
|
## Contributing
|
36
278
|
|
data/lib/cisco_spark/api.rb
CHANGED
@@ -23,8 +23,6 @@ module CiscoSpark
|
|
23
23
|
@resource = resource
|
24
24
|
@request_body = request_body
|
25
25
|
|
26
|
-
puts "request_body: #{request_body}"
|
27
|
-
|
28
26
|
do_put
|
29
27
|
end
|
30
28
|
|
@@ -49,9 +47,7 @@ module CiscoSpark
|
|
49
47
|
response = http_client.request(get_request)
|
50
48
|
debug(response) if CiscoSpark.debug
|
51
49
|
|
52
|
-
|
53
|
-
JSON.parse(response.body)
|
54
|
-
end
|
50
|
+
response
|
55
51
|
end
|
56
52
|
|
57
53
|
def do_post
|
@@ -62,9 +58,7 @@ module CiscoSpark
|
|
62
58
|
response = http_client.request(post_request)
|
63
59
|
debug(response) if CiscoSpark.debug
|
64
60
|
|
65
|
-
|
66
|
-
JSON.parse(response.body)
|
67
|
-
end
|
61
|
+
response
|
68
62
|
end
|
69
63
|
|
70
64
|
def do_put
|
@@ -75,10 +69,7 @@ module CiscoSpark
|
|
75
69
|
response = http_client.request(post_request)
|
76
70
|
debug(response) if CiscoSpark.debug
|
77
71
|
|
78
|
-
|
79
|
-
if response.is_a?(Net::HTTPSuccess)
|
80
|
-
JSON.parse(response.body)
|
81
|
-
end
|
72
|
+
response
|
82
73
|
end
|
83
74
|
|
84
75
|
def http_client
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module CiscoSpark
|
2
|
+
class Collection
|
3
|
+
attr_accessor :collection, :model_klass
|
4
|
+
|
5
|
+
def initialize(model_klass, collection=[], response=nil)
|
6
|
+
@model_klass = model_klass
|
7
|
+
@collection = collection
|
8
|
+
|
9
|
+
parse_pagination(response)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
def method_missing(name, *args, &block)
|
15
|
+
if collection.respond_to?(name)
|
16
|
+
collection.send(name, *args, &block)
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def next
|
23
|
+
return false unless next_params
|
24
|
+
response = model_klass.fetch_all_raw(next_params)
|
25
|
+
@collection = model_klass.parse_collection(response.body)
|
26
|
+
parse_pagination(response)
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_accessor :next_params
|
33
|
+
|
34
|
+
def parse_pagination(response)
|
35
|
+
@next_params = nil
|
36
|
+
return unless response && response['Link']
|
37
|
+
|
38
|
+
matches = /<(?<next>.*)>; rel="next"/.match(response['Link'])
|
39
|
+
next_url = matches[:next]
|
40
|
+
|
41
|
+
if next_url
|
42
|
+
next_uri = URI.parse(next_url)
|
43
|
+
@next_params = Hash[URI::decode_www_form(next_uri.query)]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
data/lib/cisco_spark/model.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "cisco_spark/api"
|
2
|
+
require "cisco_spark/collection"
|
2
3
|
require "cisco_spark/data_caster"
|
3
4
|
|
4
5
|
module CiscoSpark
|
@@ -25,36 +26,44 @@ module CiscoSpark
|
|
25
26
|
@mutable_attributes = attributes
|
26
27
|
end
|
27
28
|
|
29
|
+
def fetch_all_raw(options={})
|
30
|
+
Api.new.get(@resource, options)
|
31
|
+
end
|
32
|
+
|
28
33
|
def fetch_all(options={})
|
29
|
-
response =
|
30
|
-
parse_collection(response
|
34
|
+
response = fetch_all_raw(options)
|
35
|
+
collection = parse_collection(response.body)
|
36
|
+
CiscoSpark::Collection.new(self, collection, response)
|
31
37
|
end
|
32
38
|
|
33
39
|
def fetch(id, options={})
|
34
40
|
response = Api.new.get("#{@resource}/#{id}", options)
|
35
|
-
parse(response)
|
41
|
+
parse(response.body)
|
36
42
|
end
|
37
43
|
|
38
44
|
def create(attributes)
|
39
45
|
response = Api.new.post(@resource, attributes)
|
40
|
-
parse(response)
|
46
|
+
parse(response.body)
|
41
47
|
end
|
42
48
|
|
43
49
|
def update(id, attributes)
|
44
50
|
attributes = attributes.select{ |name, _v| @mutable_attributes.include?(name) }
|
45
51
|
response = Api.new.put("#{@resource}/#{id}", attributes)
|
46
|
-
parse(response)
|
52
|
+
parse(response.body)
|
47
53
|
end
|
48
54
|
|
49
55
|
def destroy(id)
|
50
56
|
Api.new.delete("#{@resource}/#{id}")
|
51
57
|
end
|
52
58
|
|
53
|
-
def parse_collection(
|
54
|
-
|
59
|
+
def parse_collection(object)
|
60
|
+
object = JSON.parse(object) if object.is_a?(String)
|
61
|
+
object = object.fetch('items', []) if object.is_a?(Hash)
|
62
|
+
object.map{ |hash| parse(hash) }
|
55
63
|
end
|
56
64
|
|
57
65
|
def parse(hash)
|
66
|
+
hash = JSON.parse(hash) if hash.is_a?(String)
|
58
67
|
params = attributes.each_with_object({}) do |(attribute, caster), params|
|
59
68
|
params[attribute] = caster.call(hash[Utils.camelize(attribute)])
|
60
69
|
end
|
@@ -68,6 +77,7 @@ module CiscoSpark
|
|
68
77
|
|
69
78
|
def fetch
|
70
79
|
merge_attributes(self.class.fetch(id))
|
80
|
+
self
|
71
81
|
end
|
72
82
|
|
73
83
|
def persist
|
@@ -88,12 +98,14 @@ module CiscoSpark
|
|
88
98
|
|
89
99
|
def create
|
90
100
|
merge_attributes(self.class.create(to_h))
|
101
|
+
self
|
91
102
|
end
|
92
103
|
|
93
104
|
def update
|
94
105
|
attrs = to_h
|
95
106
|
id = attrs.delete(:id)
|
96
107
|
merge_attributes(self.class.update(id, attrs))
|
108
|
+
self
|
97
109
|
end
|
98
110
|
|
99
111
|
def merge_attributes(object)
|
@@ -20,6 +20,22 @@ module CiscoSpark
|
|
20
20
|
CiscoSpark::Message.fetch_all(options)
|
21
21
|
end
|
22
22
|
|
23
|
+
def messages_before_message(message, options={})
|
24
|
+
message_id = message.is_a?(CiscoSpark::Message) ? message.id : message
|
25
|
+
options[:before_message] = message_id
|
26
|
+
options[:room_id] = id
|
27
|
+
CiscoSpark::Message.fetch_all(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
def messages_before(date, options={})
|
31
|
+
if date.is_a?(DateTime)
|
32
|
+
date = date.to_time.iso8601
|
33
|
+
end
|
34
|
+
options[:room_id] = id
|
35
|
+
options[:before] = date
|
36
|
+
CiscoSpark::Message.fetch_all(options)
|
37
|
+
end
|
38
|
+
|
23
39
|
def memberships(options={})
|
24
40
|
options[:room_id] = id
|
25
41
|
CiscoSpark::Membership.fetch_all(options)
|
@@ -27,7 +43,7 @@ module CiscoSpark
|
|
27
43
|
|
28
44
|
def send_message(message)
|
29
45
|
message.room_id = id
|
30
|
-
message.
|
46
|
+
message.persist
|
31
47
|
end
|
32
48
|
|
33
49
|
def add_person(person, options={})
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "cisco_spark/model"
|
2
|
+
|
3
|
+
module CiscoSpark
|
4
|
+
class Webhook
|
5
|
+
include Model
|
6
|
+
resource 'webhooks'
|
7
|
+
|
8
|
+
attributes(
|
9
|
+
id: DataCaster::String,
|
10
|
+
name: DataCaster::String,
|
11
|
+
target_url: DataCaster::String,
|
12
|
+
resource: DataCaster::String,
|
13
|
+
event: DataCaster::String,
|
14
|
+
filter: DataCaster::String,
|
15
|
+
created: DataCaster::DateTime,
|
16
|
+
)
|
17
|
+
mutable_attributes :name, :target_url
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/cisco_spark/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cisco_spark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Maher
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- cisco_spark.gemspec
|
102
102
|
- lib/cisco_spark.rb
|
103
103
|
- lib/cisco_spark/api.rb
|
104
|
+
- lib/cisco_spark/collection.rb
|
104
105
|
- lib/cisco_spark/configuration.rb
|
105
106
|
- lib/cisco_spark/data_caster.rb
|
106
107
|
- lib/cisco_spark/errors.rb
|
@@ -109,6 +110,7 @@ files:
|
|
109
110
|
- lib/cisco_spark/models/message.rb
|
110
111
|
- lib/cisco_spark/models/person.rb
|
111
112
|
- lib/cisco_spark/models/room.rb
|
113
|
+
- lib/cisco_spark/models/webhook.rb
|
112
114
|
- lib/cisco_spark/utils.rb
|
113
115
|
- lib/cisco_spark/version.rb
|
114
116
|
homepage: https://github.com/NGMarmaduke/cisco_spark-ruby
|