nylas 0.16.1 → 0.17.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 +34 -1
- data/lib/inbox.rb +1 -1
- data/lib/namespace.rb +60 -11
- data/lib/nylas.rb +1 -1
- data/lib/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48ec6f70dc6e37ea3a4d59aa91259f7930e6d4a2
|
4
|
+
data.tar.gz: ffbf49839a6076ad36cc7723b8bcf3ba0b246596
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abf3f677bea9bf62f9e062348a26948e40abf8fb09c20eb44fa001907346bab3ecfc2a50da0be59201ccf11a10b8af30906ee508ea2e666cfa932831a872dd40
|
7
|
+
data.tar.gz: 20875e13b7c38eec6aac73cfd543a434f945bb1a8195849b2967beafc2b68dfb25454272705f17e8d3ba7f591af03b09b158623773cfa12641e9b6eda72b2dd8
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ You don't need to use this repo unless you're planning to modify the gem. If you
|
|
19
19
|
|
20
20
|
- Ruby 1.8.7 or above. (Ruby 1.8.6 may work if you load ActiveSupport.)
|
21
21
|
|
22
|
-
- rest-client, json
|
22
|
+
- rest-client, json, yajl-ruby, em-http-request
|
23
23
|
|
24
24
|
|
25
25
|
## Example Rails App
|
@@ -278,6 +278,39 @@ end
|
|
278
278
|
save_to_db(last_cursor)
|
279
279
|
```
|
280
280
|
|
281
|
+
### Using the Delta sync streaming API
|
282
|
+
|
283
|
+
The streaming API will receive deltas in real time, without needing to repeatedly poll. It uses EventMachine for async IO.
|
284
|
+
|
285
|
+
````ruby
|
286
|
+
# Get all the messages starting from timestamp
|
287
|
+
#
|
288
|
+
# we first need to get a cursor object a cursor is simply the id of
|
289
|
+
# an individual change.
|
290
|
+
cursor = inbox.namespaces.first.get_cursor(1407543195)
|
291
|
+
|
292
|
+
last_cursor = nil
|
293
|
+
inbox.namespaces.first.delta_stream(cursor) do |event, object|
|
294
|
+
if event == "create" or event == "modify"
|
295
|
+
if object.is_a?(Inbox::Contact)
|
296
|
+
puts "#{object.name} - #{object.email}"
|
297
|
+
elsif object.is_a?(Inbox::Event)
|
298
|
+
puts "Event!"
|
299
|
+
end
|
300
|
+
elsif event == "delete"
|
301
|
+
# In the case of a deletion, the API only returns the ID of the object.
|
302
|
+
# In this case, the Ruby SDK returns a dummy object with only the id field
|
303
|
+
# set.
|
304
|
+
puts "Deleting from collection #{object.class.name}, id: #{object}"
|
305
|
+
end
|
306
|
+
last_cursor = object.cursor
|
307
|
+
|
308
|
+
# This will loop indefintely
|
309
|
+
end
|
310
|
+
|
311
|
+
```
|
312
|
+
|
313
|
+
|
281
314
|
### Exclude changes from a specific type --- get only messages
|
282
315
|
````ruby
|
283
316
|
nylas.namespaces.first.deltas(cursor, exclude=[Nylas::Contact,
|
data/lib/inbox.rb
CHANGED
@@ -36,7 +36,7 @@ module Inbox
|
|
36
36
|
|
37
37
|
# Handle content expectation errors
|
38
38
|
raise UnexpectedResponse.new if options[:expected_class] && result_content.empty?
|
39
|
-
json = JSON.parse(result_content)
|
39
|
+
json = options[:result_parsed]? result_content : JSON.parse(result_content)
|
40
40
|
if json.is_a?(Hash) && (json['type'] == 'api_error' or json['type'] == 'invalid_request_error')
|
41
41
|
if result.code.to_i == 400
|
42
42
|
exc = InvalidRequest
|
data/lib/namespace.rb
CHANGED
@@ -7,6 +7,9 @@ require 'contact'
|
|
7
7
|
require 'file'
|
8
8
|
require 'calendar'
|
9
9
|
require 'event'
|
10
|
+
require 'yajl'
|
11
|
+
require 'em-http'
|
12
|
+
require 'ostruct'
|
10
13
|
|
11
14
|
# Rather than saying require 'thread', we need to explicitly force
|
12
15
|
# the thread model to load. Otherwise, we can't reference it below.
|
@@ -87,24 +90,28 @@ module Inbox
|
|
87
90
|
"tag" => Inbox::Tag,
|
88
91
|
}
|
89
92
|
|
93
|
+
def _build_exclude_types(exclude_types)
|
94
|
+
exclude_string = "&exclude_types="
|
95
|
+
|
96
|
+
exclude_types.each do |value|
|
97
|
+
count = 0
|
98
|
+
if OBJECTS_TABLE.has_value?(value)
|
99
|
+
param_name = OBJECTS_TABLE.key(value)
|
100
|
+
exclude_string += "#{param_name},"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
exclude_string = exclude_string[0..-2]
|
105
|
+
end
|
106
|
+
|
90
107
|
def deltas(cursor, exclude_types=[])
|
91
108
|
raise 'Please provide a block for receiving the delta objects' if !block_given?
|
92
109
|
exclude_string = ""
|
93
110
|
|
94
111
|
if exclude_types.any?
|
95
|
-
exclude_string =
|
96
|
-
|
97
|
-
exclude_types.each do |value|
|
98
|
-
count = 0
|
99
|
-
if OBJECTS_TABLE.has_value?(value)
|
100
|
-
param_name = OBJECTS_TABLE.key(value)
|
101
|
-
exclude_string += "#{param_name},"
|
102
|
-
end
|
103
|
-
end
|
112
|
+
exclude_string = _build_exclude_types(exclude_types)
|
104
113
|
end
|
105
114
|
|
106
|
-
exclude_string = exclude_string[0..-2]
|
107
|
-
|
108
115
|
# loop and yield deltas until we've come to the end.
|
109
116
|
loop do
|
110
117
|
path = @_api.url_for_path("/n/#{@namespace_id}/delta?cursor=#{cursor}#{exclude_string}")
|
@@ -143,5 +150,47 @@ module Inbox
|
|
143
150
|
end
|
144
151
|
end
|
145
152
|
|
153
|
+
def delta_stream(cursor, exclude_types=[], timeout=0)
|
154
|
+
raise 'Please provide a block for receiving the delta objects' if !block_given?
|
155
|
+
|
156
|
+
exclude_string = ""
|
157
|
+
|
158
|
+
if exclude_types.any?
|
159
|
+
exclude_string = _build_exclude_types(exclude_types)
|
160
|
+
end
|
161
|
+
|
162
|
+
# loop and yield deltas indefinitely.
|
163
|
+
path = @_api.url_for_path("/n/#{@namespace_id}/delta/streaming?cursor=#{cursor}#{exclude_string}")
|
164
|
+
|
165
|
+
parser = Yajl::Parser.new(:symbolize_keys => false)
|
166
|
+
parser.on_parse_complete = proc do |data|
|
167
|
+
delta = Inbox.interpret_response(OpenStruct.new(:code => '200'), data, {:expected_class => Object, :result_parsed => true})
|
168
|
+
|
169
|
+
cls = OBJECTS_TABLE[delta['object']]
|
170
|
+
obj = cls.new(@_api, @namespace_id)
|
171
|
+
|
172
|
+
case delta["event"]
|
173
|
+
when 'create', 'modify'
|
174
|
+
obj.inflate(delta['attributes'])
|
175
|
+
obj.cursor = delta["cursor"]
|
176
|
+
yield delta["event"], obj
|
177
|
+
when 'delete'
|
178
|
+
obj.id = delta["id"]
|
179
|
+
obj.cursor = delta["cursor"]
|
180
|
+
yield delta["event"], obj
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
EventMachine.run do
|
185
|
+
http = EventMachine::HttpRequest.new(path, :connect_timeout => 0, :inactivity_timeout => timeout).get(:keepalive => true)
|
186
|
+
http.stream do |chunk|
|
187
|
+
parser << chunk
|
188
|
+
end
|
189
|
+
http.errback do
|
190
|
+
raise UnexpectedResponse.new http.error
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
146
195
|
end
|
147
196
|
end
|
data/lib/nylas.rb
CHANGED
@@ -36,7 +36,7 @@ module Inbox
|
|
36
36
|
|
37
37
|
# Handle content expectation errors
|
38
38
|
raise UnexpectedResponse.new if options[:expected_class] && result_content.empty?
|
39
|
-
json = JSON.parse(result_content)
|
39
|
+
json = options[:result_parsed]? result_content : JSON.parse(result_content)
|
40
40
|
if json.is_a?(Hash) && (json['type'] == 'api_error' or json['type'] == 'invalid_request_error')
|
41
41
|
if result.code.to_i == 400
|
42
42
|
exc = InvalidRequest
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nylas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Gotow
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-06-
|
13
|
+
date: 2015-06-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
@@ -26,6 +26,34 @@ dependencies:
|
|
26
26
|
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '1.7'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: yajl-ruby
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: em-http-request
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
29
57
|
- !ruby/object:Gem::Dependency
|
30
58
|
name: rspec
|
31
59
|
requirement: !ruby/object:Gem::Requirement
|