nylas 4.6.6 → 5.2.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/lib/nylas.rb +6 -0
- data/lib/nylas/api.rb +30 -5
- data/lib/nylas/collection.rb +21 -7
- data/lib/nylas/contact.rb +2 -2
- data/lib/nylas/delta.rb +6 -1
- data/lib/nylas/deltas.rb +1 -1
- data/lib/nylas/deltas_collection.rb +1 -1
- data/lib/nylas/draft.rb +31 -2
- data/lib/nylas/event.rb +4 -3
- data/lib/nylas/free_busy.rb +13 -0
- data/lib/nylas/free_busy_collection.rb +48 -0
- data/lib/nylas/http_client.rb +40 -10
- data/lib/nylas/message.rb +6 -4
- data/lib/nylas/model.rb +44 -15
- data/lib/nylas/model/attributable.rb +12 -7
- data/lib/nylas/model/attribute_definition.rb +3 -3
- data/lib/nylas/model/attributes.rb +16 -0
- data/lib/nylas/model/list_attribute_definition.rb +3 -3
- data/lib/nylas/raw_message.rb +9 -2
- data/lib/nylas/room_resource.rb +19 -0
- data/lib/nylas/rsvp.rb +6 -2
- data/lib/nylas/thread.rb +1 -1
- data/lib/nylas/time_slot.rb +14 -0
- data/lib/nylas/version.rb +1 -1
- data/lib/nylas/when.rb +1 -1
- metadata +7 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6b0265bb93198dcc5494a819c68a5261703a143a4fe320a4662cc6c65aa2e94
|
4
|
+
data.tar.gz: ee107c7cacfb2b7e2b099fd675c20c02700def063e1ccdd6b46923448da9e25b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e7aca3de25b0e2847011c4b190960405a214e8905429ba2743f9d3bd068d41e60cb36ad7365d298f685eb47979c30df0397996212d784c26e20e54f32b874aa
|
7
|
+
data.tar.gz: 8fc30003aa6609694e5f2a7aedf2c949e2f191c45a0edea6045669d918c3ff88cdfc837046ec409815f67c255b7a1184586532878988166cd39865c8517f00fe
|
data/lib/nylas.rb
CHANGED
@@ -51,10 +51,13 @@ require_relative "nylas/timespan"
|
|
51
51
|
require_relative "nylas/web_page"
|
52
52
|
require_relative "nylas/nylas_date"
|
53
53
|
require_relative "nylas/when"
|
54
|
+
require_relative "nylas/free_busy"
|
55
|
+
require_relative "nylas/time_slot"
|
54
56
|
|
55
57
|
# Custom collection types
|
56
58
|
require_relative "nylas/search_collection"
|
57
59
|
require_relative "nylas/deltas_collection"
|
60
|
+
require_relative "nylas/free_busy_collection"
|
58
61
|
|
59
62
|
# Models supported by the API
|
60
63
|
require_relative "nylas/account"
|
@@ -66,6 +69,7 @@ require_relative "nylas/deltas"
|
|
66
69
|
require_relative "nylas/delta"
|
67
70
|
require_relative "nylas/draft"
|
68
71
|
require_relative "nylas/message"
|
72
|
+
require_relative "nylas/room_resource"
|
69
73
|
require_relative "nylas/new_message"
|
70
74
|
require_relative "nylas/raw_message"
|
71
75
|
require_relative "nylas/thread"
|
@@ -91,6 +95,7 @@ module Nylas
|
|
91
95
|
Types.registry[:folder] = Types::ModelType.new(model: Folder)
|
92
96
|
Types.registry[:im_address] = Types::ModelType.new(model: IMAddress)
|
93
97
|
Types.registry[:label] = Types::ModelType.new(model: Label)
|
98
|
+
Types.registry[:room_resource] = Types::ModelType.new(model: RoomResource)
|
94
99
|
Types.registry[:message] = Types::ModelType.new(model: Message)
|
95
100
|
Types.registry[:message_headers] = MessageHeadersType.new
|
96
101
|
Types.registry[:message_tracking] = Types::ModelType.new(model: MessageTracking)
|
@@ -104,4 +109,5 @@ module Nylas
|
|
104
109
|
Types.registry[:nylas_date] = NylasDateType.new
|
105
110
|
Types.registry[:contact_group] = Types::ModelType.new(model: ContactGroup)
|
106
111
|
Types.registry[:when] = Types::ModelType.new(model: When)
|
112
|
+
Types.registry[:time_slot] = Types::ModelType.new(model: TimeSlot)
|
107
113
|
end
|
data/lib/nylas/api.rb
CHANGED
@@ -6,7 +6,7 @@ module Nylas
|
|
6
6
|
attr_accessor :client
|
7
7
|
|
8
8
|
extend Forwardable
|
9
|
-
def_delegators :client, :execute, :get, :post, :put, :delete, :app_id
|
9
|
+
def_delegators :client, :execute, :get, :post, :put, :delete, :app_id, :api_server
|
10
10
|
|
11
11
|
include Logging
|
12
12
|
|
@@ -16,13 +16,11 @@ module Nylas
|
|
16
16
|
# @param access_token [String] (Optional) Your users access token.
|
17
17
|
# @param api_server [String] (Optional) Which Nylas API Server to connect to. Only change this if
|
18
18
|
# you're using a self-hosted Nylas instance.
|
19
|
-
# @param service_domain [String] (Optional) Host you are authenticating OAuth against.
|
20
19
|
# @return [Nylas::API]
|
21
20
|
def initialize(client: nil, app_id: nil, app_secret: nil, access_token: nil,
|
22
|
-
api_server: "https://api.nylas.com"
|
21
|
+
api_server: "https://api.nylas.com")
|
23
22
|
self.client = client || HttpClient.new(app_id: app_id, app_secret: app_secret,
|
24
|
-
access_token: access_token, api_server: api_server
|
25
|
-
service_domain: service_domain)
|
23
|
+
access_token: access_token, api_server: api_server)
|
26
24
|
end
|
27
25
|
|
28
26
|
# @return [String] A Nylas access token for that particular user.
|
@@ -37,6 +35,19 @@ module Nylas
|
|
37
35
|
)
|
38
36
|
end
|
39
37
|
|
38
|
+
def authentication_url(redirect_uri:, scopes:, response_type: "code", login_hint: nil, state: nil)
|
39
|
+
params = {
|
40
|
+
client_id: app_id,
|
41
|
+
redirect_uri: redirect_uri,
|
42
|
+
response_type: response_type,
|
43
|
+
login_hint: login_hint
|
44
|
+
}
|
45
|
+
params[:state] = state if state
|
46
|
+
params[:scopes] = scopes.join(",") if scopes
|
47
|
+
|
48
|
+
"#{api_server}/oauth/authorize?#{URI.encode_www_form(params)}"
|
49
|
+
end
|
50
|
+
|
40
51
|
def exchange_code_for_token(code)
|
41
52
|
data = {
|
42
53
|
"client_id" => app_id,
|
@@ -110,6 +121,11 @@ module Nylas
|
|
110
121
|
@messages ||= Collection.new(model: Message, api: self)
|
111
122
|
end
|
112
123
|
|
124
|
+
# @return[Collection<RoomResource>] A queryable collection of {RoomResource} objects
|
125
|
+
def room_resources
|
126
|
+
@room_resources ||= Collection.new(model: RoomResource, api: self)
|
127
|
+
end
|
128
|
+
|
113
129
|
# Revokes access to the Nylas API for the given access token
|
114
130
|
# @return [Boolean]
|
115
131
|
def revoke(access_token)
|
@@ -150,6 +166,15 @@ module Nylas
|
|
150
166
|
@webhooks ||= Collection.new(model: Webhook, api: as(client.app_secret))
|
151
167
|
end
|
152
168
|
|
169
|
+
def free_busy(emails:, start_time:, end_time:)
|
170
|
+
FreeBusyCollection.new(
|
171
|
+
api: self,
|
172
|
+
emails: emails,
|
173
|
+
start_time: start_time.to_i,
|
174
|
+
end_time: end_time.to_i
|
175
|
+
)
|
176
|
+
end
|
177
|
+
|
153
178
|
private
|
154
179
|
|
155
180
|
def prevent_calling_if_missing_access_token(method_name)
|
data/lib/nylas/collection.rb
CHANGED
@@ -21,7 +21,7 @@ module Nylas
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def create(**attributes)
|
24
|
-
instance = model.new(attributes.merge(api: api))
|
24
|
+
instance = model.new(**attributes.merge(api: api))
|
25
25
|
instance.save
|
26
26
|
instance
|
27
27
|
end
|
@@ -69,7 +69,7 @@ module Nylas
|
|
69
69
|
return enum_for(:each) unless block_given?
|
70
70
|
|
71
71
|
execute.each do |result|
|
72
|
-
yield(model.new(result.merge(api: api)))
|
72
|
+
yield(model.new(**result.merge(api: api)))
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -119,7 +119,7 @@ module Nylas
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def find_raw(id)
|
122
|
-
api.execute(to_be_executed.merge(path: "#{resources_path}/#{id}")).to_s
|
122
|
+
api.execute(**to_be_executed.merge(path: "#{resources_path}/#{id}")).to_s
|
123
123
|
end
|
124
124
|
|
125
125
|
def resources_path
|
@@ -127,9 +127,13 @@ module Nylas
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def find_model(id)
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
response = api.execute(
|
131
|
+
**to_be_executed.merge(
|
132
|
+
path: "#{resources_path}/#{id}",
|
133
|
+
query: view_query
|
134
|
+
)
|
135
|
+
)
|
136
|
+
model.from_hash(response, api: api)
|
133
137
|
end
|
134
138
|
|
135
139
|
# @return [Hash] Specification for request to be passed to {API#execute}
|
@@ -141,7 +145,17 @@ module Nylas
|
|
141
145
|
# Retrieves the data from the API for the particular constraints
|
142
146
|
# @return [Hash,Array]
|
143
147
|
def execute
|
144
|
-
api.execute(to_be_executed)
|
148
|
+
api.execute(**to_be_executed)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def view_query
|
154
|
+
if constraints.view
|
155
|
+
{ view: constraints.view }
|
156
|
+
else
|
157
|
+
{}
|
158
|
+
end
|
145
159
|
end
|
146
160
|
end
|
147
161
|
end
|
data/lib/nylas/contact.rb
CHANGED
@@ -13,9 +13,9 @@ module Nylas
|
|
13
13
|
self.updatable = true
|
14
14
|
self.destroyable = true
|
15
15
|
|
16
|
-
attribute :id, :string,
|
16
|
+
attribute :id, :string, read_only: true
|
17
17
|
attribute :object, :string, default: "contact"
|
18
|
-
attribute :account_id, :string,
|
18
|
+
attribute :account_id, :string, read_only: true
|
19
19
|
|
20
20
|
attribute :given_name, :string
|
21
21
|
attribute :middle_name, :string
|
data/lib/nylas/delta.rb
CHANGED
@@ -6,6 +6,7 @@ module Nylas
|
|
6
6
|
# @see https://docs.nylas.com/reference#deltas
|
7
7
|
class Delta
|
8
8
|
include Model::Attributable
|
9
|
+
|
9
10
|
attribute :id, :string
|
10
11
|
attribute :type, :string
|
11
12
|
attribute :object, :string
|
@@ -24,6 +25,8 @@ module Nylas
|
|
24
25
|
@model ||= Types.registry[object.to_sym].cast(object_attributes_with_ids)
|
25
26
|
end
|
26
27
|
|
28
|
+
private
|
29
|
+
|
27
30
|
def object_attributes_with_ids
|
28
31
|
(object_attributes || {}).merge(id: id, account_id: account_id)
|
29
32
|
end
|
@@ -42,8 +45,10 @@ module Nylas
|
|
42
45
|
else
|
43
46
|
data
|
44
47
|
end
|
48
|
+
|
49
|
+
data = data.merge(data[:attributes]) if data[:attributes]
|
45
50
|
data[:object_attributes] = data.delete(:attributes)
|
46
|
-
super(data)
|
51
|
+
super(**data)
|
47
52
|
end
|
48
53
|
end
|
49
54
|
end
|
data/lib/nylas/deltas.rb
CHANGED
@@ -34,7 +34,7 @@ module Nylas
|
|
34
34
|
# Retrieves the data from the API for the particular constraints
|
35
35
|
# @return [Detlas]
|
36
36
|
def execute
|
37
|
-
self.deltas ||= Deltas.new(api.execute(to_be_executed))
|
37
|
+
self.deltas ||= Deltas.new(**api.execute(**to_be_executed))
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
data/lib/nylas/draft.rb
CHANGED
@@ -29,7 +29,8 @@ module Nylas
|
|
29
29
|
attribute :unread, :boolean
|
30
30
|
|
31
31
|
has_n_of_attribute :events, :event
|
32
|
-
has_n_of_attribute :files, :file
|
32
|
+
has_n_of_attribute :files, :file, read_only: true
|
33
|
+
has_n_of_attribute :file_ids, :string
|
33
34
|
attribute :folder, :folder
|
34
35
|
has_n_of_attribute :labels, :label
|
35
36
|
|
@@ -37,6 +38,20 @@ module Nylas
|
|
37
38
|
|
38
39
|
transfer :api, to: %i[events files folder labels]
|
39
40
|
|
41
|
+
def update(**data)
|
42
|
+
self.files = data[:files] if data[:files]
|
43
|
+
extract_file_ids!
|
44
|
+
data[:file_ids] = file_ids
|
45
|
+
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def create
|
50
|
+
extract_file_ids!
|
51
|
+
|
52
|
+
super
|
53
|
+
end
|
54
|
+
|
40
55
|
def send!
|
41
56
|
return execute(method: :post, path: "/send", payload: to_json) if tracking
|
42
57
|
|
@@ -53,7 +68,21 @@ module Nylas
|
|
53
68
|
end
|
54
69
|
|
55
70
|
def destroy
|
56
|
-
execute(method: :delete, path: resource_path, payload: attributes.
|
71
|
+
execute(method: :delete, path: resource_path, payload: attributes.serialize_for_api(keys: [:version]))
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def save_call
|
77
|
+
extract_file_ids!
|
78
|
+
|
79
|
+
super
|
80
|
+
end
|
81
|
+
|
82
|
+
def extract_file_ids!
|
83
|
+
files = self.files || []
|
84
|
+
|
85
|
+
self.file_ids = files.map(&:id)
|
57
86
|
end
|
58
87
|
end
|
59
88
|
end
|
data/lib/nylas/event.rb
CHANGED
@@ -9,9 +9,9 @@ module Nylas
|
|
9
9
|
allows_operations(creatable: true, listable: true, filterable: true, showable: true, updatable: true,
|
10
10
|
destroyable: true)
|
11
11
|
|
12
|
-
attribute :id, :string
|
13
|
-
attribute :object, :string
|
14
|
-
attribute :account_id, :string
|
12
|
+
attribute :id, :string, read_only: true
|
13
|
+
attribute :object, :string, read_only: true
|
14
|
+
attribute :account_id, :string, read_only: true
|
15
15
|
attribute :calendar_id, :string
|
16
16
|
attribute :master_event_id, :string
|
17
17
|
attribute :message_id, :string
|
@@ -27,6 +27,7 @@ module Nylas
|
|
27
27
|
attribute :status, :string
|
28
28
|
attribute :title, :string
|
29
29
|
attribute :when, :when
|
30
|
+
attribute :metadata, :hash
|
30
31
|
attribute :original_start_time, :unix_timestamp
|
31
32
|
|
32
33
|
attr_accessor :notify_participants
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nylas
|
4
|
+
# Query free/busy information for a calendar during a certain time period
|
5
|
+
# @see https://docs.nylas.com/reference#calendars-free-busy
|
6
|
+
class FreeBusy
|
7
|
+
include Model::Attributable
|
8
|
+
|
9
|
+
attribute :email, :string
|
10
|
+
attribute :object, :string
|
11
|
+
has_n_of_attribute :time_slots, :time_slot
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nylas
|
4
|
+
# Helper to get and build `FreeBusy` objects
|
5
|
+
class FreeBusyCollection
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :each, :map, :select, :reject, :to_a, :take
|
8
|
+
def_delegators :to_a, :first, :last, :[]
|
9
|
+
|
10
|
+
def initialize(emails:, start_time:, end_time:, api:)
|
11
|
+
@api = api
|
12
|
+
@emails = emails
|
13
|
+
@start_time = start_time
|
14
|
+
@end_time = end_time
|
15
|
+
end
|
16
|
+
|
17
|
+
def each
|
18
|
+
return enum_for(:each) unless block_given?
|
19
|
+
|
20
|
+
execute.each do |result|
|
21
|
+
yield(FreeBusy.new(**result))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :api, :emails, :start_time, :end_time
|
28
|
+
|
29
|
+
PATH = "/calendars/free-busy"
|
30
|
+
private_constant :PATH
|
31
|
+
|
32
|
+
def execute
|
33
|
+
api.execute(
|
34
|
+
method: :post,
|
35
|
+
path: PATH,
|
36
|
+
payload: payload
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def payload
|
41
|
+
JSON.dump(
|
42
|
+
emails: emails,
|
43
|
+
start_time: start_time,
|
44
|
+
end_time: end_time
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/nylas/http_client.rb
CHANGED
@@ -5,6 +5,8 @@ module Nylas
|
|
5
5
|
|
6
6
|
# Plain HTTP client that can be used to interact with the Nylas API sans any type casting.
|
7
7
|
class HttpClient # rubocop:disable Metrics/ClassLength
|
8
|
+
HTTP_SUCCESS_CODES = [200, 302].freeze
|
9
|
+
|
8
10
|
HTTP_CODE_TO_EXCEPTIONS = {
|
9
11
|
400 => InvalidRequest,
|
10
12
|
401 => UnauthorizedRequest,
|
@@ -31,9 +33,10 @@ module Nylas
|
|
31
33
|
"/delta/longpoll" => 3650,
|
32
34
|
"/delta/streaming" => 3650
|
33
35
|
}.freeze
|
36
|
+
SUPPORTED_API_VERSION = "2.2"
|
34
37
|
|
35
38
|
include Logging
|
36
|
-
attr_accessor :api_server
|
39
|
+
attr_accessor :api_server
|
37
40
|
attr_writer :default_headers
|
38
41
|
attr_reader :access_token
|
39
42
|
attr_reader :app_id
|
@@ -44,10 +47,8 @@ module Nylas
|
|
44
47
|
# @param access_token [String] (Optional) Your users access token.
|
45
48
|
# @param api_server [String] (Optional) Which Nylas API Server to connect to. Only change this if
|
46
49
|
# you're using a self-hosted Nylas instance.
|
47
|
-
# @param service_domain [String] (Optional) Host you are authenticating OAuth against.
|
48
50
|
# @return [Nylas::HttpClient]
|
49
|
-
def initialize(app_id:, app_secret:, access_token: nil, api_server: "https://api.nylas.com"
|
50
|
-
service_domain: "api.nylas.com")
|
51
|
+
def initialize(app_id:, app_secret:, access_token: nil, api_server: "https://api.nylas.com")
|
51
52
|
unless api_server.include?("://")
|
52
53
|
raise "When overriding the Nylas API server address, you must include https://"
|
53
54
|
end
|
@@ -56,13 +57,12 @@ module Nylas
|
|
56
57
|
@access_token = access_token
|
57
58
|
@app_secret = app_secret
|
58
59
|
@app_id = app_id
|
59
|
-
@service_domain = service_domain
|
60
60
|
end
|
61
61
|
|
62
62
|
# @return [Nylas::HttpClient[]
|
63
63
|
def as(access_token)
|
64
64
|
HttpClient.new(app_id: app_id, access_token: access_token,
|
65
|
-
app_secret: app_secret, api_server: api_server
|
65
|
+
app_secret: app_secret, api_server: api_server)
|
66
66
|
end
|
67
67
|
|
68
68
|
# Sends a request to the Nylas API and rai
|
@@ -103,8 +103,8 @@ module Nylas
|
|
103
103
|
also_log: { result: true, values: %i[method url path headers query payload] }
|
104
104
|
|
105
105
|
def build_request(method:, path: nil, headers: {}, query: {}, payload: nil, timeout: nil)
|
106
|
-
headers[:params] = query
|
107
106
|
url ||= url_for_path(path)
|
107
|
+
url = add_query_params_to_url(url, query)
|
108
108
|
resulting_headers = default_headers.merge(headers)
|
109
109
|
{ method: method, url: url, payload: payload, headers: resulting_headers, timeout: timeout }
|
110
110
|
end
|
@@ -137,6 +137,7 @@ module Nylas
|
|
137
137
|
@default_headers ||= {
|
138
138
|
"X-Nylas-API-Wrapper" => "ruby",
|
139
139
|
"X-Nylas-Client-Id" => @app_id,
|
140
|
+
"Nylas-API-Version" => SUPPORTED_API_VERSION,
|
140
141
|
"User-Agent" => "Nylas Ruby SDK #{Nylas::VERSION} - #{RUBY_VERSION}",
|
141
142
|
"Content-types" => "application/json"
|
142
143
|
}
|
@@ -175,11 +176,40 @@ module Nylas
|
|
175
176
|
end
|
176
177
|
|
177
178
|
def handle_anticipated_failure_mode(http_code:, response:)
|
178
|
-
return if http_code
|
179
|
-
return unless response.is_a?(Hash)
|
179
|
+
return if HTTP_SUCCESS_CODES.include?(http_code)
|
180
180
|
|
181
181
|
exception = HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
|
182
|
-
|
182
|
+
parsed_response = parse_response(response)
|
183
|
+
|
184
|
+
raise exception.new(
|
185
|
+
parsed_response[:type],
|
186
|
+
parsed_response[:message],
|
187
|
+
parsed_response.fetch(:server_error, nil)
|
188
|
+
)
|
189
|
+
end
|
190
|
+
|
191
|
+
def add_query_params_to_url(url, query)
|
192
|
+
unless query.empty?
|
193
|
+
uri = URI.parse(url)
|
194
|
+
query = custom_params(query)
|
195
|
+
params = URI.decode_www_form(uri.query || "") + query.to_a
|
196
|
+
uri.query = URI.encode_www_form(params)
|
197
|
+
url = uri.to_s
|
198
|
+
end
|
199
|
+
|
200
|
+
url
|
201
|
+
end
|
202
|
+
|
203
|
+
def custom_params(query)
|
204
|
+
# Convert hash to "<key>:<value>" form for metadata_pair query
|
205
|
+
if query.key?(:metadata_pair)
|
206
|
+
pairs = query[:metadata_pair].map do |key, value|
|
207
|
+
"#{key}:#{value}"
|
208
|
+
end
|
209
|
+
query[:metadata_pair] = pairs
|
210
|
+
end
|
211
|
+
|
212
|
+
query
|
183
213
|
end
|
184
214
|
end
|
185
215
|
end
|
data/lib/nylas/message.rb
CHANGED
@@ -37,7 +37,7 @@ module Nylas
|
|
37
37
|
attribute :folder, :folder
|
38
38
|
attribute :folder_id, :string
|
39
39
|
|
40
|
-
has_n_of_attribute :labels, :label,
|
40
|
+
has_n_of_attribute :labels, :label, read_only: true
|
41
41
|
has_n_of_attribute :label_ids, :string
|
42
42
|
|
43
43
|
transfer :api, to: %i[events files folder labels]
|
@@ -56,7 +56,7 @@ module Nylas
|
|
56
56
|
allowed_attributes: UPDATABLE_ATTRIBUTES
|
57
57
|
).check
|
58
58
|
|
59
|
-
super(payload)
|
59
|
+
super(**payload)
|
60
60
|
end
|
61
61
|
|
62
62
|
def update_folder(folder_id)
|
@@ -66,7 +66,9 @@ module Nylas
|
|
66
66
|
def expanded
|
67
67
|
return self unless headers.nil?
|
68
68
|
|
69
|
-
assign(api.execute(method: :get, path: resource_path, query: { view: "expanded" }))
|
69
|
+
assign(**api.execute(method: :get, path: resource_path, query: { view: "expanded" }))
|
70
|
+
# Transfer reference to the API to attributes that need it
|
71
|
+
transfer_attributes
|
70
72
|
self
|
71
73
|
end
|
72
74
|
|
@@ -75,7 +77,7 @@ module Nylas
|
|
75
77
|
|
76
78
|
execute(
|
77
79
|
method: :put,
|
78
|
-
payload: attributes.
|
80
|
+
payload: attributes.serialize_for_api,
|
79
81
|
path: resource_path
|
80
82
|
)
|
81
83
|
end
|
data/lib/nylas/model.rb
CHANGED
@@ -48,7 +48,7 @@ module Nylas
|
|
48
48
|
|
49
49
|
execute(
|
50
50
|
method: :post,
|
51
|
-
payload: attributes.
|
51
|
+
payload: attributes.serialize_for_api,
|
52
52
|
path: resources_path,
|
53
53
|
query: query_params
|
54
54
|
)
|
@@ -58,19 +58,44 @@ module Nylas
|
|
58
58
|
raise ModelNotUpdatableError, model_class unless updatable?
|
59
59
|
|
60
60
|
attributes.merge(**data)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
)
|
61
|
+
payload = attributes.serialize_for_api(keys: data.keys)
|
62
|
+
update_call(payload)
|
63
|
+
|
64
|
+
true
|
65
|
+
rescue Registry::MissingKeyError => e
|
66
|
+
raise ModelMissingFieldError.new(e.key, self)
|
67
|
+
end
|
68
|
+
|
69
|
+
def save_all_attributes
|
70
|
+
result = if persisted?
|
71
|
+
raise ModelNotUpdatableError, self unless updatable?
|
72
|
+
|
73
|
+
execute(
|
74
|
+
method: :put,
|
75
|
+
payload: attributes.serialize_all_for_api,
|
76
|
+
path: resource_path
|
77
|
+
)
|
78
|
+
else
|
79
|
+
create
|
80
|
+
end
|
81
|
+
|
82
|
+
attributes.merge(result)
|
83
|
+
end
|
84
|
+
|
85
|
+
def update_all_attributes(**data)
|
86
|
+
raise ModelNotUpdatableError, model_class unless updatable?
|
87
|
+
|
88
|
+
attributes.merge(**data)
|
89
|
+
payload = attributes.serialize_all_for_api(keys: data.keys)
|
90
|
+
update_call(payload)
|
91
|
+
|
67
92
|
true
|
68
93
|
rescue Registry::MissingKeyError => e
|
69
94
|
raise ModelMissingFieldError.new(e.key, self)
|
70
95
|
end
|
71
96
|
|
72
97
|
def reload
|
73
|
-
assign(execute(method: :get, path: resource_path))
|
98
|
+
assign(**execute(method: :get, path: resource_path))
|
74
99
|
true
|
75
100
|
end
|
76
101
|
|
@@ -95,20 +120,24 @@ module Nylas
|
|
95
120
|
|
96
121
|
private
|
97
122
|
|
98
|
-
def allowed_keys_for_save
|
99
|
-
attributes.attribute_definitions.to_h.reject do |_k, v|
|
100
|
-
v.exclude_when.include?(:saving)
|
101
|
-
end.keys
|
102
|
-
end
|
103
|
-
|
104
123
|
def save_call
|
105
124
|
execute(
|
106
125
|
method: :put,
|
107
|
-
payload: attributes.
|
126
|
+
payload: attributes.serialize_for_api,
|
108
127
|
path: resource_path
|
109
128
|
)
|
110
129
|
end
|
111
130
|
|
131
|
+
def update_call(payload)
|
132
|
+
result = execute(
|
133
|
+
method: :put,
|
134
|
+
payload: payload,
|
135
|
+
path: resource_path,
|
136
|
+
query: query_params
|
137
|
+
)
|
138
|
+
attributes.merge(result) if result
|
139
|
+
end
|
140
|
+
|
112
141
|
def query_params
|
113
142
|
{}
|
114
143
|
end
|
@@ -34,17 +34,22 @@ module Nylas
|
|
34
34
|
# Methods to call when tweaking Attributable classes
|
35
35
|
module ClassMethods
|
36
36
|
# rubocop:disable Naming/PredicateName
|
37
|
-
def has_n_of_attribute(name, type_name,
|
38
|
-
attribute_definitions[name] = ListAttributeDefinition.new(
|
39
|
-
|
40
|
-
|
37
|
+
def has_n_of_attribute(name, type_name, read_only: false, default: [])
|
38
|
+
attribute_definitions[name] = ListAttributeDefinition.new(
|
39
|
+
type_name: type_name,
|
40
|
+
read_only: read_only,
|
41
|
+
default: default
|
42
|
+
)
|
41
43
|
define_accessors(name)
|
42
44
|
end
|
43
45
|
# rubocop:enable Naming/PredicateName
|
44
46
|
|
45
|
-
def attribute(name, type_name,
|
46
|
-
attribute_definitions[name] = AttributeDefinition.new(
|
47
|
-
|
47
|
+
def attribute(name, type_name, read_only: false, default: nil)
|
48
|
+
attribute_definitions[name] = AttributeDefinition.new(
|
49
|
+
type_name: type_name,
|
50
|
+
read_only: read_only,
|
51
|
+
default: default
|
52
|
+
)
|
48
53
|
define_accessors(name)
|
49
54
|
end
|
50
55
|
|
@@ -6,11 +6,11 @@ module Nylas
|
|
6
6
|
class AttributeDefinition
|
7
7
|
extend Forwardable
|
8
8
|
def_delegators :type, :cast, :serialize
|
9
|
-
attr_accessor :type_name, :
|
9
|
+
attr_accessor :type_name, :read_only, :default
|
10
10
|
|
11
|
-
def initialize(type_name:,
|
11
|
+
def initialize(type_name:, read_only:, default:)
|
12
12
|
self.type_name = type_name
|
13
|
-
self.
|
13
|
+
self.read_only = read_only
|
14
14
|
self.default = default
|
15
15
|
end
|
16
16
|
|
@@ -39,6 +39,22 @@ module Nylas
|
|
39
39
|
JSON.dump(to_h(keys: keys))
|
40
40
|
end
|
41
41
|
|
42
|
+
def serialize_for_api(keys: attribute_definitions.keys)
|
43
|
+
api_keys = keys.delete_if { |key| attribute_definitions[key].read_only == true }
|
44
|
+
|
45
|
+
serialize(keys: api_keys)
|
46
|
+
end
|
47
|
+
|
48
|
+
def serialize_all_for_api(keys: attribute_definitions.keys)
|
49
|
+
api_keys = keys.delete_if { |key| attribute_definitions[key].read_only == true }
|
50
|
+
|
51
|
+
JSON.dump(
|
52
|
+
api_keys.each_with_object({}) do |key, casted_data|
|
53
|
+
casted_data[key] = attribute_definitions[key].serialize(self[key])
|
54
|
+
end
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
42
58
|
private
|
43
59
|
|
44
60
|
def cast(key, value)
|
@@ -4,11 +4,11 @@ module Nylas
|
|
4
4
|
module Model
|
5
5
|
# Allows models to have an attribute which is a lists of another type of thing
|
6
6
|
class ListAttributeDefinition
|
7
|
-
attr_accessor :type_name, :
|
7
|
+
attr_accessor :type_name, :read_only, :default
|
8
8
|
|
9
|
-
def initialize(type_name:,
|
9
|
+
def initialize(type_name:, read_only:, default:)
|
10
10
|
self.type_name = type_name
|
11
|
-
self.
|
11
|
+
self.read_only = read_only
|
12
12
|
self.default = default
|
13
13
|
end
|
14
14
|
|
data/lib/nylas/raw_message.rb
CHANGED
@@ -11,8 +11,15 @@ module Nylas
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def send!
|
14
|
-
Message.new(api.execute(
|
15
|
-
|
14
|
+
Message.new(**api.execute(
|
15
|
+
method: :post,
|
16
|
+
path: "/send",
|
17
|
+
payload: mime_compatible_string,
|
18
|
+
headers: HEADERS
|
19
|
+
).merge(api: api))
|
16
20
|
end
|
21
|
+
|
22
|
+
HEADERS = { "Content-type" => "message/rfc822" }.freeze
|
23
|
+
private_constant :HEADERS
|
17
24
|
end
|
18
25
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nylas
|
4
|
+
# Ruby representation of a Nylas Room Resource object
|
5
|
+
# @see https://developer.nylas.com/docs/api/#tag--Room-Resources
|
6
|
+
class RoomResource
|
7
|
+
include Model
|
8
|
+
self.resources_path = "/resources"
|
9
|
+
allows_operations(listable: true)
|
10
|
+
|
11
|
+
attribute :object, :string, read_only: true
|
12
|
+
attribute :email, :string, read_only: true
|
13
|
+
attribute :name, :string, read_only: true
|
14
|
+
attribute :capacity, :string, read_only: true
|
15
|
+
attribute :building, :string, read_only: true
|
16
|
+
attribute :floor_name, :string, read_only: true
|
17
|
+
attribute :floor_number, :string, read_only: true
|
18
|
+
end
|
19
|
+
end
|
data/lib/nylas/rsvp.rb
CHANGED
@@ -13,8 +13,12 @@ module Nylas
|
|
13
13
|
attr_accessor :notify_participants
|
14
14
|
|
15
15
|
def save
|
16
|
-
api.execute(
|
17
|
-
|
16
|
+
api.execute(
|
17
|
+
method: :post,
|
18
|
+
path: "/send-rsvp",
|
19
|
+
payload: attributes.serialize_for_api,
|
20
|
+
query: { notify_participants: notify_participants }
|
21
|
+
)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
end
|
data/lib/nylas/thread.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nylas
|
4
|
+
# Query free/busy information for a calendar during a certain time period
|
5
|
+
# @see https://docs.nylas.com/reference#calendars-free-busy
|
6
|
+
class TimeSlot
|
7
|
+
include Model::Attributable
|
8
|
+
|
9
|
+
attribute :object, :string
|
10
|
+
attribute :status, :string
|
11
|
+
attribute :start_time, :unix_timestamp
|
12
|
+
attribute :end_time, :unix_timestamp
|
13
|
+
end
|
14
|
+
end
|
data/lib/nylas/version.rb
CHANGED
data/lib/nylas/when.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nylas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nylas, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.3.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: jeweler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.1'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.1'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: yard
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -300,6 +286,8 @@ files:
|
|
300
286
|
- lib/nylas/file.rb
|
301
287
|
- lib/nylas/filter_attributes.rb
|
302
288
|
- lib/nylas/folder.rb
|
289
|
+
- lib/nylas/free_busy.rb
|
290
|
+
- lib/nylas/free_busy_collection.rb
|
303
291
|
- lib/nylas/http_client.rb
|
304
292
|
- lib/nylas/im_address.rb
|
305
293
|
- lib/nylas/label.rb
|
@@ -322,9 +310,11 @@ files:
|
|
322
310
|
- lib/nylas/raw_message.rb
|
323
311
|
- lib/nylas/recurrence.rb
|
324
312
|
- lib/nylas/registry.rb
|
313
|
+
- lib/nylas/room_resource.rb
|
325
314
|
- lib/nylas/rsvp.rb
|
326
315
|
- lib/nylas/search_collection.rb
|
327
316
|
- lib/nylas/thread.rb
|
317
|
+
- lib/nylas/time_slot.rb
|
328
318
|
- lib/nylas/timespan.rb
|
329
319
|
- lib/nylas/types.rb
|
330
320
|
- lib/nylas/version.rb
|
@@ -356,7 +346,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
356
346
|
- !ruby/object:Gem::Version
|
357
347
|
version: '0'
|
358
348
|
requirements: []
|
359
|
-
rubygems_version: 3.
|
349
|
+
rubygems_version: 3.2.17
|
360
350
|
signing_key:
|
361
351
|
specification_version: 4
|
362
352
|
summary: Gem for interacting with the Nylas API
|