cisco_spark 0.2.1 → 0.2.2
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 +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
|
[](https://travis-ci.org/NGMarmaduke/cisco_spark-ruby)
|
3
3
|
[](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
|