nylas 0.15.5

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.
data/lib/parameters.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Inbox
2
+ module Parameters
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ def parameters
8
+ self.class.instance_variable_get("@parameters")
9
+ end
10
+
11
+ module ClassMethods
12
+ def parameter(*params)
13
+ @parameters ||= []
14
+ params.each do |param|
15
+ attr_accessor param
16
+ @parameters << param.to_s
17
+ end
18
+ end
19
+
20
+ def inherited(subclass)
21
+ parameters = instance_variable_get("@parameters") || []
22
+ subclass.instance_variable_set("@parameters", parameters.clone)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,80 @@
1
+ require 'time_attr_accessor'
2
+ require 'parameters'
3
+
4
+ module Inbox
5
+ class RestfulModel
6
+ extend Inbox::TimeAttrAccessor
7
+ include Inbox::Parameters
8
+
9
+ parameter :id
10
+ parameter :namespace_id
11
+ parameter :cursor # Only used by the delta sync API
12
+ time_attr_accessor :created_at
13
+
14
+ def self.collection_name
15
+ "#{self.to_s.downcase}s".split('::').last
16
+ end
17
+
18
+ def initialize(api, namespace_id = nil)
19
+ raise StandardError.new unless api.class <= Inbox::API
20
+ @namespace_id = namespace_id
21
+ @_api = api
22
+ end
23
+
24
+ def ==(comparison_object)
25
+ comparison_object.equal?(self) || (comparison_object.instance_of?(self.class) && comparison_object.id == id)
26
+ end
27
+
28
+ def inflate(json)
29
+ parameters.each do |property_name|
30
+ send("#{property_name}=", json[property_name]) if json.has_key?(property_name)
31
+ end
32
+ end
33
+
34
+ def save!
35
+ if id
36
+ update('PUT', '', as_json())
37
+ else
38
+ update('POST', '', as_json())
39
+ end
40
+ end
41
+
42
+ def url(action = "")
43
+ action = "/#{action}" unless action.empty?
44
+ @_api.url_for_path("/n/#{@namespace_id}/#{self.class.collection_name}/#{id}#{action}")
45
+ end
46
+
47
+ def as_json(options = {})
48
+ hash = {}
49
+ parameters.each do |getter|
50
+ unless options[:except] && options[:except].include?(getter)
51
+ value = send(getter)
52
+ unless value.is_a?(RestfulModelCollection)
53
+ value = value.as_json(options) if value.respond_to?(:as_json)
54
+ hash[getter] = value
55
+ end
56
+ end
57
+ end
58
+ hash
59
+ end
60
+
61
+ def update(http_method, action, data = {})
62
+ http_method = http_method.downcase
63
+
64
+ ::RestClient.send(http_method, self.url(action), data.to_json, :content_type => :json) do |response, request, result|
65
+ unless http_method == 'delete'
66
+ json = Inbox.interpret_response(result, response, :expected_class => Object)
67
+ inflate(json)
68
+ end
69
+ end
70
+ self
71
+ end
72
+
73
+ def destroy
74
+ ::RestClient.send('delete', self.url) do |response, request|
75
+ Inbox.interpret_http_status(response)
76
+ end
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,149 @@
1
+ require 'restful_model'
2
+
3
+ module Inbox
4
+ class RestfulModelCollection
5
+
6
+ attr_accessor :filters
7
+
8
+ def initialize(model_class, api, namespace_id, filters = {})
9
+ raise StandardError.new unless api.class <= Inbox::API
10
+ @model_class = model_class
11
+ @filters = filters
12
+ @namespace_id = namespace_id
13
+ @_api = api
14
+ end
15
+
16
+ def each
17
+ offset = 0
18
+ chunk_size = 100
19
+ finished = false
20
+ while (!finished) do
21
+ results = get_model_collection(offset, chunk_size)
22
+ results.each { |item|
23
+ yield item
24
+ }
25
+ offset += results.length
26
+ finished = results.length < chunk_size
27
+ end
28
+ end
29
+
30
+ def count
31
+ RestClient.get(url, params: @filters.merge(view: 'count')) { |response,request,result|
32
+ json = Inbox.interpret_response(result, response)
33
+ return json['count']
34
+ }
35
+ end
36
+
37
+ def first
38
+ get_model_collection.first
39
+ end
40
+
41
+ def all
42
+ range(0, Float::INFINITY)
43
+ end
44
+
45
+ def where(filters)
46
+ collection = self.clone
47
+ collection.filters ||= {}
48
+ collection.filters.merge!(filters)
49
+ collection
50
+ end
51
+
52
+ def range(offset = 0, limit = 100)
53
+ accumulated = []
54
+ finished = false
55
+ chunk_size = 100
56
+
57
+ while (!finished && accumulated.length < limit) do
58
+ results = get_model_collection(offset + accumulated.length, chunk_size)
59
+ accumulated = accumulated.concat(results)
60
+
61
+ # we're done if we have more than 'limit' items, or if we asked for 50 and got less than 50...
62
+ finished = accumulated.length >= limit || results.length == 0 || (results.length % chunk_size != 0)
63
+ end
64
+
65
+ accumulated = accumulated[0..limit] if limit < Float::INFINITY
66
+ accumulated
67
+ end
68
+
69
+ def delete(item_or_id)
70
+ item_or_id = item_or_id.id if item_or_id.is_a?(RestfulModel)
71
+ RestClient.delete("#{url}/#{id}")
72
+ end
73
+
74
+ def find(id)
75
+ return nil unless id
76
+ get_model(id)
77
+ end
78
+
79
+ def build(args)
80
+ for key in args.keys
81
+ args[key.to_s] = args[key]
82
+ end
83
+ model = @model_class.new(@_api, @namespace_id)
84
+ model.inflate(args)
85
+ model
86
+ end
87
+
88
+ def inflate_collection(items = [])
89
+ models = []
90
+
91
+ return unless items.is_a?(Array)
92
+ items.each do |json|
93
+ if @model_class < RestfulModel
94
+ model = @model_class.new(@_api)
95
+ model.inflate(json)
96
+ else
97
+ model = @model_class.new(json)
98
+ end
99
+ models.push(model)
100
+ end
101
+ models
102
+ end
103
+
104
+ def url
105
+ prefix = "/n/#{@namespace_id}" if @namespace_id
106
+ @_api.url_for_path("#{prefix}/#{@model_class.collection_name}")
107
+ end
108
+
109
+ private
110
+
111
+ def get_model(id)
112
+ model = nil
113
+
114
+ RestClient.get("#{url}/#{id}"){ |response,request,result|
115
+ json = Inbox.interpret_response(result, response, {:expected_class => Object})
116
+ if @model_class < RestfulModel
117
+ model = @model_class.new(@_api)
118
+ model.inflate(json)
119
+ else
120
+ model = @model_class.new(json)
121
+ end
122
+ }
123
+ model
124
+ end
125
+
126
+ def get_model_collection(offset = 0, limit = 100)
127
+ filters = @filters.clone
128
+ filters[:offset] = offset
129
+ filters[:limit] = limit
130
+ models = []
131
+
132
+ RestClient.get(url, :params => filters){ |response,request,result|
133
+ items = Inbox.interpret_response(result, response, {:expected_class => Array})
134
+ models = inflate_collection(items)
135
+ }
136
+ models
137
+ end
138
+
139
+ end
140
+
141
+ # a ManagementModelCollection is similar to a RestfulModelCollection except
142
+ # it's used by models under the /a/<app_id> namespace (mostly account status
143
+ # and billing methods).
144
+ class ManagementModelCollection < RestfulModelCollection
145
+ def url
146
+ @_api.url_for_management
147
+ end
148
+ end
149
+ end
data/lib/rfc2882.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'base64'
2
+ require 'restful_model'
3
+
4
+ module Inbox
5
+ class Rfc2822 < RestfulModel
6
+
7
+ parameter :rfc2822
8
+
9
+ def inflate(json)
10
+ super
11
+ # The 'rfc2822' attribute is a base64-encoded string. Decode it.
12
+ @rfc2822 = Base64.decode64(@rfc2822) if json.has_key?('rfc2822')
13
+ end
14
+ end
15
+ end
data/lib/tag.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'restful_model'
2
+
3
+ module Inbox
4
+ class Tag < RestfulModel
5
+
6
+ parameter :name
7
+
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Inbox
2
+ module TimeAttrAccessor
3
+ def time_attr_accessor(attr)
4
+ parameter attr
5
+ define_method "#{attr}=" do |value|
6
+ if value
7
+ instance_variable_set "@#{attr}", Time.at(value).utc
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Inbox
2
+ VERSION = "0.15.5"
3
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nylas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.15.5
5
+ platform: ruby
6
+ authors:
7
+ - Ben Gotow
8
+ - Karim Hamidou
9
+ - Jennie Lees
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-05-27 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.7'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: '1.7'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rspec
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :development
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: shoulda
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rdoc
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '3.12'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '3.12'
71
+ - !ruby/object:Gem::Dependency
72
+ name: bundler
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.5
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: 1.3.5
85
+ - !ruby/object:Gem::Dependency
86
+ name: jeweler
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: 1.8.4
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 1.8.4
99
+ - !ruby/object:Gem::Dependency
100
+ name: pry
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: pry-nav
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: pry-stack_explorer
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: webmock
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ description: Gem for interacting with the Inbox API.
156
+ email: ben@nylas.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files:
160
+ - LICENSE.txt
161
+ - README.md
162
+ files:
163
+ - lib/account.rb
164
+ - lib/api_thread.rb
165
+ - lib/calendar.rb
166
+ - lib/contact.rb
167
+ - lib/draft.rb
168
+ - lib/event.rb
169
+ - lib/file.rb
170
+ - lib/inbox.rb
171
+ - lib/message.rb
172
+ - lib/namespace.rb
173
+ - lib/parameters.rb
174
+ - lib/restful_model.rb
175
+ - lib/restful_model_collection.rb
176
+ - lib/rfc2882.rb
177
+ - lib/tag.rb
178
+ - lib/time_attr_accessor.rb
179
+ - lib/version.rb
180
+ - LICENSE.txt
181
+ - README.md
182
+ homepage: http://github.com/nylas/inbox-ruby
183
+ licenses:
184
+ - MIT
185
+ metadata: {}
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubyforge_project:
202
+ rubygems_version: 2.0.14
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: Gem for interacting with the Inbox API
206
+ test_files: []