nylas-streaming 4.0.0.rc1 → 4.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nylas-streaming.rb +61 -62
  3. metadata +96 -110
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1784972f58c7cf9b17c7480d8ceef330e143294
4
- data.tar.gz: 00bab28f2e0bc3231a42c96f2c499b97587ed6b3
3
+ metadata.gz: fe263b385c3cc76e3f50cd3ba445a52f6134cd3a
4
+ data.tar.gz: c7a03fa56ce03bb183c2831f2bd0b59fcfeeef33
5
5
  SHA512:
6
- metadata.gz: '0509711c38178125c42b57fe69ccc6d5f75f9b2470804def7360079c03b81a5b3297e7d88cca6fc1b6ccf74f4b65f35ed9aad3724ddcc1a6501b1f0bc867b4f1'
7
- data.tar.gz: 4dd9c4c6e7cfbabbe1e93f30ae37c3fb9e46ab8a42f08cf84648a074637887a81b186f247c86363a07edf696aca8fc2515b47c7ee688cc3e9a7bf98c0c295b68
6
+ metadata.gz: 9a5b98b98f964a7e744fee8dc6bf8abe67ab6ee700bc5f4cc149bf88e44f5a33251ab0d76f70aeefad54a13bea2246cb36f5d49b6d6ee3abddd4b3eb1476bae4
7
+ data.tar.gz: a12b61694914c59c9a22df1e3d1b0e5fcd7038040cb0d7f2b84c27cea0a5528946af4e3d6b648013a57236984b7121a958c59f653f3bc0cef9c3084cc8137ff5
@@ -1,81 +1,80 @@
1
- require 'yajl'
2
- require 'em-http'
3
- require 'nylas'
1
+ require "yajl"
2
+ require "em-http"
3
+ require "nylas"
4
4
 
5
5
  module Nylas
6
- class API
7
- def delta_stream(cursor, exclude_types=[], timeout=0, expanded_view=false, include_types=[], &block)
8
- Streaming::Stream.new(api: self, cursor: cursor, timeout: timeout, expanded_view: expanded_view,
9
- exclude_types: exclude_types, include_types: include_types).listen(&block)
6
+ # Provides methods to work with the Nylas Streaming Deltas API
7
+ # @see https://docs.nylas.com/reference#streaming-delta-updates
8
+ module Streaming
9
+ # @see Nylas::Streaming::DeltaStream#initialize
10
+ def self.deltas(**kwargs, &callback)
11
+ DeltaStream.new(**kwargs).stream(&callback)
10
12
  end
11
- end
12
13
 
13
- module Streaming
14
- class Stream
15
- extend Forwardable
16
- def_delegators :api, :url_for_path
17
- attr_accessor :api, :timeout, :expanded_view, :include_types, :exclude_types, :cursor
14
+ # A live stream of deltas that stays open until explicitely closed
15
+ class DeltaStream
16
+ attr_accessor :cursor, :api, :exclude_types, :include_types, :expanded,
17
+ :connect_timeout, :inactivity_timeout
18
18
 
19
- def initialize(api: , cursor: , timeout: 0, expanded_view: false, include_types: [], exclude_types: [])
20
- self.api = api
19
+ # @param cursor [String] Cursor to start listening for changes on
20
+ # @param api [Nylas::API]
21
+ # @param expanded [Boolean] Expands threads and messages
22
+ # @param exclude_types [Array<String>] List of Object types *not* to include in the stream
23
+ # @param include_types [Array<String>] List of Object types to exclusively include in the stream
24
+ # @param connect_timeout [Integer] How long to wait before timing out on attempted connection
25
+ # @param inactivity_timeout [Integer] How long to wait before timing out on inactivity
26
+ # rubocop:disable Metrics/ParameterLists
27
+ def initialize(cursor:, api:, exclude_types: [], include_types: [], expanded: false, connect_timeout: 0,
28
+ inactivity_timeout: 0)
21
29
  self.cursor = cursor
22
- self.timeout = timeout
23
- self.expanded_view = expanded_view
24
- self.include_types = TypesFilter.new(:include, types: include_types)
25
- self.exclude_types = TypesFilter.new(:exclude, types: exclude_types)
30
+ self.api = api
31
+ self.exclude_types = exclude_types
32
+ self.include_types = include_types
33
+ self.expanded = expanded
34
+ self.connect_timeout = connect_timeout
35
+ self.inactivity_timeout = inactivity_timeout
26
36
  end
37
+ # rubocop:enable Metrics/ParameterLists
27
38
 
28
- def listen
29
- raise 'Please provide a block for receiving the delta objects' if !block_given?
30
-
31
- exclude_string = exclude_types.to_query_string
32
- include_string = include_types.to_query_string
33
-
34
- # loop and yield deltas indefinitely.
35
- path = self.url_for_path("/delta/streaming?exclude_folders=false&cursor=#{cursor}#{exclude_string}#{include_string}")
36
- if expanded_view
37
- path += '&view=expanded'
38
- end
39
-
40
- parser = Yajl::Parser.new(:symbolize_keys => false)
41
- parser.on_parse_complete = proc do |data|
42
- delta = Nylas.interpret_response(OpenStruct.new(:code => '200'), data, {:expected_class => Object, :result_parsed => true})
43
-
44
- if not OBJECTS_TABLE.has_key?(delta['object'])
45
- next
39
+ def stream
40
+ parser.on_parse_complete = lambda do |data|
41
+ begin
42
+ yield(Types.registry[:delta].cast(data.merge(api: api)))
43
+ rescue Nylas::Error => e
44
+ Nylas::Logging.logger.error(e)
45
+ raise e
46
46
  end
47
+ end
47
48
 
48
- cls = OBJECTS_TABLE[delta['object']]
49
- if EXPANDED_OBJECTS_TABLE.has_key?(delta['object']) and expanded_view
50
- cls = EXPANDED_OBJECTS_TABLE[delta['object']]
51
- end
49
+ listener.stream { |chunk| parser << chunk }
50
+ end
52
51
 
53
- obj = cls.new(api)
52
+ def url
53
+ "#{api.client.url_for_path('/delta/streaming')}?#{query}"
54
+ end
54
55
 
55
- case delta["event"]
56
- when 'create', 'modify'
57
- obj.inflate(delta['attributes'])
58
- obj.cursor = delta["cursor"]
59
- yield delta["event"], obj
60
- when 'delete'
61
- obj.id = delta["id"]
62
- obj.cursor = delta["cursor"]
63
- yield delta["event"], obj
64
- end
65
- end
56
+ def query
57
+ query = ["cursor=#{cursor}"]
58
+ query << "view=expanded" if expanded
59
+ query << "include_types=#{include_types.join(',')}" unless include_types.empty?
60
+ query << "exclude_types=#{exclude_types.join(',')}" unless exclude_types.empty?
61
+ query.join("&")
62
+ end
66
63
 
67
- http = EventMachine::HttpRequest.new(path, :connect_timeout => 0, :inactivity_timeout => timeout).get(:keepalive => true)
64
+ def listener
65
+ @listener ||= EventMachine::HttpRequest.new(url, connect_timeout: connect_timeout,
66
+ inactivity_timeout: inactivity_timeout).get
67
+ end
68
68
 
69
- # set a callback on the HTTP stream that parses incoming chunks as they come in
70
- http.stream do |chunk|
71
- parser << chunk
72
- end
69
+ def http_error_handler(client)
70
+ raise Nylas::Error, client.error
71
+ end
73
72
 
74
- http.errback do
75
- raise UnexpectedResponse.new http.error
76
- end
73
+ def parser
74
+ return @parser if @parser
75
+ @parser = Yajl::Parser.new(symbolize_keys: true)
76
+ @parser
77
77
  end
78
78
  end
79
79
  end
80
80
  end
81
-
metadata CHANGED
@@ -1,209 +1,197 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nylas-streaming
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.rc1
4
+ version: 4.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nylas, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-09 00:00:00.000000000 Z
11
+ date: 2018-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: nylas
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
20
- type: :runtime
19
+ version: '1.3'
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: yajl-ruby
28
+ name: jeweler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.2'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 1.2.1
37
- type: :runtime
33
+ version: '2.1'
34
+ type: :development
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: '1.2'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 1.2.1
40
+ version: '2.1'
47
41
  - !ruby/object:Gem::Dependency
48
- name: em-http-request
42
+ name: yard
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '1.1'
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 1.1.3
57
- type: :runtime
47
+ version: 0.9.0
48
+ type: :development
58
49
  prerelease: false
59
50
  version_requirements: !ruby/object:Gem::Requirement
60
51
  requirements:
61
52
  - - "~>"
62
53
  - !ruby/object:Gem::Version
63
- version: '1.1'
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 1.1.3
54
+ version: 0.9.0
67
55
  - !ruby/object:Gem::Dependency
68
- name: yard
56
+ name: awesome_print
69
57
  requirement: !ruby/object:Gem::Requirement
70
58
  requirements:
71
- - - ">="
59
+ - - "~>"
72
60
  - !ruby/object:Gem::Version
73
- version: 0.9.12
61
+ version: '1.0'
74
62
  type: :development
75
63
  prerelease: false
76
64
  version_requirements: !ruby/object:Gem::Requirement
77
65
  requirements:
78
- - - ">="
66
+ - - "~>"
79
67
  - !ruby/object:Gem::Version
80
- version: 0.9.12
68
+ version: '1.0'
81
69
  - !ruby/object:Gem::Dependency
82
- name: bundler
70
+ name: rubocop
83
71
  requirement: !ruby/object:Gem::Requirement
84
72
  requirements:
85
- - - ">="
73
+ - - "~>"
86
74
  - !ruby/object:Gem::Version
87
- version: 1.3.5
75
+ version: 0.52.0
88
76
  type: :development
89
77
  prerelease: false
90
78
  version_requirements: !ruby/object:Gem::Requirement
91
79
  requirements:
92
- - - ">="
80
+ - - "~>"
93
81
  - !ruby/object:Gem::Version
94
- version: 1.3.5
82
+ version: 0.52.0
95
83
  - !ruby/object:Gem::Dependency
96
- name: jeweler
84
+ name: rubocop-rspec
97
85
  requirement: !ruby/object:Gem::Requirement
98
86
  requirements:
99
- - - ">="
87
+ - - "~>"
100
88
  - !ruby/object:Gem::Version
101
- version: 2.1.2
89
+ version: 1.20.1
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
93
  requirements:
106
- - - ">="
94
+ - - "~>"
107
95
  - !ruby/object:Gem::Version
108
- version: 2.1.2
96
+ version: 1.20.1
109
97
  - !ruby/object:Gem::Dependency
110
- name: pry
98
+ name: overcommit
111
99
  requirement: !ruby/object:Gem::Requirement
112
100
  requirements:
113
- - - ">="
101
+ - - "~>"
114
102
  - !ruby/object:Gem::Version
115
- version: 0.10.4
103
+ version: '0.41'
116
104
  type: :development
117
105
  prerelease: false
118
106
  version_requirements: !ruby/object:Gem::Requirement
119
107
  requirements:
120
- - - ">="
108
+ - - "~>"
121
109
  - !ruby/object:Gem::Version
122
- version: 0.10.4
110
+ version: '0.41'
123
111
  - !ruby/object:Gem::Dependency
124
- name: pry-nav
112
+ name: pry
125
113
  requirement: !ruby/object:Gem::Requirement
126
114
  requirements:
127
- - - ">="
115
+ - - "~>"
128
116
  - !ruby/object:Gem::Version
129
- version: 0.2.4
117
+ version: 0.10.4
130
118
  type: :development
131
119
  prerelease: false
132
120
  version_requirements: !ruby/object:Gem::Requirement
133
121
  requirements:
134
- - - ">="
122
+ - - "~>"
135
123
  - !ruby/object:Gem::Version
136
- version: 0.2.4
124
+ version: 0.10.4
137
125
  - !ruby/object:Gem::Dependency
138
- name: pry-stack_explorer
126
+ name: pry-nav
139
127
  requirement: !ruby/object:Gem::Requirement
140
128
  requirements:
141
- - - ">="
129
+ - - "~>"
142
130
  - !ruby/object:Gem::Version
143
- version: 0.4.9.2
131
+ version: 0.2.4
144
132
  type: :development
145
133
  prerelease: false
146
134
  version_requirements: !ruby/object:Gem::Requirement
147
135
  requirements:
148
- - - ">="
136
+ - - "~>"
149
137
  - !ruby/object:Gem::Version
150
- version: 0.4.9.2
138
+ version: 0.2.4
151
139
  - !ruby/object:Gem::Dependency
152
- name: rspec
140
+ name: pry-stack_explorer
153
141
  requirement: !ruby/object:Gem::Requirement
154
142
  requirements:
155
- - - ">="
143
+ - - "~>"
156
144
  - !ruby/object:Gem::Version
157
- version: 3.5.0
145
+ version: 0.4.9
158
146
  type: :development
159
147
  prerelease: false
160
148
  version_requirements: !ruby/object:Gem::Requirement
161
149
  requirements:
162
- - - ">="
150
+ - - "~>"
163
151
  - !ruby/object:Gem::Version
164
- version: 3.5.0
152
+ version: 0.4.9
165
153
  - !ruby/object:Gem::Dependency
166
- name: shoulda
154
+ name: rspec
167
155
  requirement: !ruby/object:Gem::Requirement
168
156
  requirements:
169
- - - ">="
157
+ - - "~>"
170
158
  - !ruby/object:Gem::Version
171
- version: 3.4.0
159
+ version: '3.7'
172
160
  type: :development
173
161
  prerelease: false
174
162
  version_requirements: !ruby/object:Gem::Requirement
175
163
  requirements:
176
- - - ">="
164
+ - - "~>"
177
165
  - !ruby/object:Gem::Version
178
- version: 3.4.0
166
+ version: '3.7'
179
167
  - !ruby/object:Gem::Dependency
180
168
  name: webmock
181
169
  requirement: !ruby/object:Gem::Requirement
182
170
  requirements:
183
- - - ">="
171
+ - - "~>"
184
172
  - !ruby/object:Gem::Version
185
- version: 2.1.0
173
+ version: '3.0'
186
174
  type: :development
187
175
  prerelease: false
188
176
  version_requirements: !ruby/object:Gem::Requirement
189
177
  requirements:
190
- - - ">="
178
+ - - "~>"
191
179
  - !ruby/object:Gem::Version
192
- version: 2.1.0
180
+ version: '3.0'
193
181
  - !ruby/object:Gem::Dependency
194
- name: sinatra
182
+ name: faker
195
183
  requirement: !ruby/object:Gem::Requirement
196
184
  requirements:
197
- - - ">="
185
+ - - "~>"
198
186
  - !ruby/object:Gem::Version
199
- version: 1.4.7
187
+ version: '1.8'
200
188
  type: :development
201
189
  prerelease: false
202
190
  version_requirements: !ruby/object:Gem::Requirement
203
191
  requirements:
204
- - - ">="
192
+ - - "~>"
205
193
  - !ruby/object:Gem::Version
206
- version: 1.4.7
194
+ version: '1.8'
207
195
  - !ruby/object:Gem::Dependency
208
196
  name: informed
209
197
  requirement: !ruby/object:Gem::Requirement
@@ -219,83 +207,81 @@ dependencies:
219
207
  - !ruby/object:Gem::Version
220
208
  version: '1.0'
221
209
  - !ruby/object:Gem::Dependency
222
- name: faker
210
+ name: simplecov
223
211
  requirement: !ruby/object:Gem::Requirement
224
212
  requirements:
225
213
  - - "~>"
226
214
  - !ruby/object:Gem::Version
227
- version: '1.8'
215
+ version: '0.15'
228
216
  type: :development
229
217
  prerelease: false
230
218
  version_requirements: !ruby/object:Gem::Requirement
231
219
  requirements:
232
220
  - - "~>"
233
221
  - !ruby/object:Gem::Version
234
- version: '1.8'
222
+ version: '0.15'
235
223
  - !ruby/object:Gem::Dependency
236
- name: awesome_print
224
+ name: em-http-request
237
225
  requirement: !ruby/object:Gem::Requirement
238
226
  requirements:
239
227
  - - "~>"
240
228
  - !ruby/object:Gem::Version
241
- version: '1.0'
242
- type: :development
243
- prerelease: false
244
- version_requirements: !ruby/object:Gem::Requirement
245
- requirements:
246
- - - "~>"
247
- - !ruby/object:Gem::Version
248
- version: '1.0'
249
- - !ruby/object:Gem::Dependency
250
- name: simplecov
251
- requirement: !ruby/object:Gem::Requirement
252
- requirements:
253
- - - "~>"
229
+ version: '1.1'
230
+ - - ">="
254
231
  - !ruby/object:Gem::Version
255
- version: '0.15'
256
- type: :development
232
+ version: 1.1.3
233
+ type: :runtime
257
234
  prerelease: false
258
235
  version_requirements: !ruby/object:Gem::Requirement
259
236
  requirements:
260
237
  - - "~>"
261
238
  - !ruby/object:Gem::Version
262
- version: '0.15'
239
+ version: '1.1'
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: 1.1.3
263
243
  - !ruby/object:Gem::Dependency
264
- name: rubocop
244
+ name: nylas
265
245
  requirement: !ruby/object:Gem::Requirement
266
246
  requirements:
267
247
  - - "~>"
268
248
  - !ruby/object:Gem::Version
269
- version: '0.51'
270
- type: :development
249
+ version: '4.0'
250
+ type: :runtime
271
251
  prerelease: false
272
252
  version_requirements: !ruby/object:Gem::Requirement
273
253
  requirements:
274
254
  - - "~>"
275
255
  - !ruby/object:Gem::Version
276
- version: '0.51'
256
+ version: '4.0'
277
257
  - !ruby/object:Gem::Dependency
278
- name: rubocop-rspec
258
+ name: yajl-ruby
279
259
  requirement: !ruby/object:Gem::Requirement
280
260
  requirements:
281
261
  - - "~>"
282
262
  - !ruby/object:Gem::Version
283
- version: '1.20'
284
- type: :development
263
+ version: '1.2'
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ version: 1.2.1
267
+ type: :runtime
285
268
  prerelease: false
286
269
  version_requirements: !ruby/object:Gem::Requirement
287
270
  requirements:
288
271
  - - "~>"
289
272
  - !ruby/object:Gem::Version
290
- version: '1.20'
291
- description: Gem for interacting with the Nylas API.
273
+ version: '1.2'
274
+ - - ">="
275
+ - !ruby/object:Gem::Version
276
+ version: 1.2.1
277
+ description: Gem for interacting with the Nylas Deltas Streaming API.
292
278
  email: support@nylas.com
293
279
  executables: []
294
280
  extensions: []
295
281
  extra_rdoc_files: []
296
282
  files:
297
283
  - lib/nylas-streaming.rb
298
- homepage: http://github.com/nylas/nylas-ruby
284
+ homepage:
299
285
  licenses:
300
286
  - MIT
301
287
  metadata:
@@ -311,9 +297,9 @@ require_paths:
311
297
  - lib
312
298
  required_ruby_version: !ruby/object:Gem::Requirement
313
299
  requirements:
314
- - - ">="
300
+ - - "~>"
315
301
  - !ruby/object:Gem::Version
316
- version: '0'
302
+ version: '2.2'
317
303
  required_rubygems_version: !ruby/object:Gem::Requirement
318
304
  requirements:
319
305
  - - ">"
@@ -324,5 +310,5 @@ rubyforge_project:
324
310
  rubygems_version: 2.6.13
325
311
  signing_key:
326
312
  specification_version: 4
327
- summary: Gem for interacting with the Nylas API
313
+ summary: Gem for interacting with the Nylas Deltas Streaming API
328
314
  test_files: []