nylas 6.0.0.beta.1 → 6.0.0.beta.3

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.
@@ -1,20 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "resource"
4
- require_relative "../handler/admin_api_operations"
4
+ require_relative "../handler/api_operations"
5
5
 
6
6
  module Nylas
7
7
  # Grants
8
8
  class Grants < Resource
9
- include AdminApiOperations::Create
10
- include AdminApiOperations::Update
11
- include AdminApiOperations::List
12
- include AdminApiOperations::Destroy
13
- include AdminApiOperations::Find
9
+ include ApiOperations::Get
10
+ include ApiOperations::Put
11
+ include ApiOperations::Delete
14
12
 
15
- # Initializes Grants.
16
- def initialize(sdk_instance)
17
- super("grants", sdk_instance)
13
+ # Return all grants.
14
+ #
15
+ # @param query_params [Hash, nil] Query params to pass to the request.
16
+ # @return [Array(Array(Hash), String)] The list of grants and API Request ID.
17
+ def list(query_params: nil)
18
+ get(
19
+ path: "#{api_uri}/v3/grant",
20
+ query_params: query_params
21
+ )
22
+ end
23
+
24
+ # Return a grant.
25
+ #
26
+ # @param grant_id [String] The id of the grant to return.
27
+ # @return [Array(Hash, String)] The grant and API request ID.
28
+ def find(grant_id:)
29
+ get(
30
+ path: "#{api_uri}/v3/grant/#{grant_id}"
31
+ )
32
+ end
33
+
34
+ # Update a grant.
35
+ #
36
+ # @param grant_id [String] The id of the grant to update.
37
+ # @param request_body [Hash] The values to update the grant with
38
+ # @return [Array(Hash, String)] The updated grant and API Request ID.
39
+ def update(grant_id:, request_body:)
40
+ put(
41
+ path: "#{api_uri}/v3/grant/#{grant_id}",
42
+ request_body: request_body
43
+ )
44
+ end
45
+
46
+ # Delete a grant.
47
+ #
48
+ # @param grant_id [String] The id of the grant to delete.
49
+ # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
50
+ def destroy(grant_id:)
51
+ _, request_id = delete(
52
+ path: "#{api_uri}/v3/grant/#{grant_id}"
53
+ )
54
+
55
+ [true, request_id]
18
56
  end
19
57
  end
20
58
  end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "resource"
4
+ require_relative "smart_compose"
5
+ require_relative "../handler/api_operations"
6
+ require_relative "../utils/file_utils"
7
+
8
+ module Nylas
9
+ # Nylas Messages API
10
+ class Messages < Resource
11
+ include ApiOperations::Get
12
+ include ApiOperations::Post
13
+ include ApiOperations::Put
14
+ include ApiOperations::Delete
15
+
16
+ attr_reader :smart_compose
17
+
18
+ # Initializes the messages resource.
19
+ # @param sdk_instance [Nylas::API] The API instance to which the resource is bound.
20
+ def initialize(sdk_instance)
21
+ super(sdk_instance)
22
+ @smart_compose = SmartCompose.new(sdk_instance)
23
+ end
24
+
25
+ # Return all messages.
26
+ #
27
+ # @param identifier [String] Grant ID or email account to query.
28
+ # @param query_params [Hash, nil] Query params to pass to the request.
29
+ # @return [Array(Array(Hash), String)] The list of messages and API Request ID.
30
+ def list(identifier:, query_params: nil)
31
+ get(
32
+ path: "#{api_uri}/v3/grants/#{identifier}/messages",
33
+ query_params: query_params
34
+ )
35
+ end
36
+
37
+ # Return a message.
38
+ #
39
+ # @param identifier [String] Grant ID or email account to query.
40
+ # @param message_id [String] The id of the message to return.
41
+ # @return [Array(Hash, String)] The message and API request ID.
42
+ def find(identifier:, message_id:)
43
+ get(
44
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/#{message_id}"
45
+ )
46
+ end
47
+
48
+ # Update a message.
49
+ #
50
+ # @param identifier [String] Grant ID or email account in which to update an object.
51
+ # @param message_id [String] The id of the message to update.
52
+ # @param request_body [Hash] The values to update the message with
53
+ # @return [Array(Hash, String)] The updated message and API Request ID.
54
+ def update(identifier:, message_id:, request_body:)
55
+ put(
56
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/#{message_id}",
57
+ request_body: request_body
58
+ )
59
+ end
60
+
61
+ # Delete a message.
62
+ #
63
+ # @param identifier [String] Grant ID or email account from which to delete an object.
64
+ # @param message_id [String] The id of the message to delete.
65
+ # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
66
+ def destroy(identifier:, message_id:)
67
+ _, request_id = delete(
68
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/#{message_id}"
69
+ )
70
+
71
+ [true, request_id]
72
+ end
73
+
74
+ # Send a message.
75
+ #
76
+ # @param identifier [String] Grant ID or email account from which to delete an object.
77
+ # @param request_body [Hash] The values to create the message with.
78
+ # If you're attaching files, you must pass an array of [File] objects, or
79
+ # you can use {FileUtils::attach_file_request_builder} to build each object attach.
80
+ # @return [Array(Hash, String)] The sent message and the API Request ID.
81
+ def send(identifier:, request_body:)
82
+ form_body, opened_files = FileUtils.build_form_request(request_body)
83
+
84
+ response = post(
85
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/send",
86
+ request_body: form_body
87
+ )
88
+
89
+ opened_files.each(&:close)
90
+
91
+ response
92
+ end
93
+
94
+ # Retrieve your scheduled messages.
95
+ #
96
+ # @param identifier [String] Grant ID or email account from which to find the scheduled message from.
97
+ # @param schedule_id [String] The id of the scheduled message to stop.
98
+ # @return [Array(Hash, String)] The list of scheduled messages and the API Request ID.
99
+ def list_scheduled_messages(identifier:, schedule_id:)
100
+ get(
101
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules/#{schedule_id}"
102
+ )
103
+ end
104
+
105
+ # Retrieve your scheduled messages.
106
+ #
107
+ # @param identifier [String] Grant ID or email account from which to list the scheduled messages from.
108
+ # @return [Array(Hash, String)] The scheduled message and the API Request ID.
109
+ def find_scheduled_messages(identifier:)
110
+ get(
111
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules"
112
+ )
113
+ end
114
+
115
+ # Stop a scheduled message.
116
+ #
117
+ # @param identifier [String] Grant ID or email account from which to list the scheduled messages from.
118
+ # @param schedule_id [String] The id of the scheduled message to stop..
119
+ # @return [Array(Hash, String)] The scheduled message and the API Request ID.
120
+ def stop_scheduled_messages(identifier:, schedule_id:)
121
+ delete(
122
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/schedules/#{schedule_id}"
123
+ )
124
+ end
125
+ end
126
+ end
@@ -1,20 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "resource"
4
- require_relative "../handler/admin_api_operations"
4
+ require_relative "../handler/api_operations"
5
5
 
6
6
  module Nylas
7
- # Redirect URIs
7
+ # A collection of redirect URI related API endpoints.
8
8
  class RedirectUris < Resource
9
- include AdminApiOperations::Create
10
- include AdminApiOperations::Update
11
- include AdminApiOperations::List
12
- include AdminApiOperations::Destroy
13
- include AdminApiOperations::Find
14
-
15
- # Initializes redirect URIs.
16
- def initialize(sdk_instance)
17
- super("applications/redirect-uris", sdk_instance)
9
+ include ApiOperations::Get
10
+ include ApiOperations::Post
11
+ include ApiOperations::Put
12
+ include ApiOperations::Delete
13
+
14
+ # Return all redirect uris.
15
+ #
16
+ # @return [Array(Array(Hash), String)] The list of redirect uris and API Request ID.
17
+ def list
18
+ get(
19
+ path: "#{api_uri}/v3/applications/redirect-uris"
20
+ )
21
+ end
22
+
23
+ # Return a redirect uri.
24
+ #
25
+ # @param redirect_uri_id [String] The id of the redirect uri to return.
26
+ # @return [Array(Hash, String)] The redirect uri and API request ID.
27
+ def find(redirect_uri_id:)
28
+ get(
29
+ path: "#{api_uri}/v3/applications/redirect-uris/#{redirect_uri_id}"
30
+ )
31
+ end
32
+
33
+ # Create a redirect uri.
34
+ #
35
+ # @param request_body [Hash] The values to create the redirect uri with.
36
+ # @return [Array(Hash, String)] The created redirect uri and API Request ID.
37
+ def create(request_body:)
38
+ post(
39
+ path: "#{api_uri}/v3/applications/redirect-uris",
40
+ request_body: request_body
41
+ )
42
+ end
43
+
44
+ # Update a redirect uri.
45
+ #
46
+ # @param redirect_uri_id [String] The id of the redirect uri to update.
47
+ # @param request_body [Hash] The values to update the redirect uri with
48
+ # @return [Array(Hash, String)] The updated redirect uri and API Request ID.
49
+ def update(redirect_uri_id:, request_body:)
50
+ put(
51
+ path: "#{api_uri}/v3/applications/redirect-uris/#{redirect_uri_id}",
52
+ request_body: request_body
53
+ )
54
+ end
55
+
56
+ # Delete a redirect uri.
57
+ #
58
+ # @param redirect_uri_id [String] The id of the redirect uri to delete.
59
+ # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
60
+ def destroy(redirect_uri_id:)
61
+ _, request_id = delete(
62
+ path: "#{api_uri}/v3/applications/redirect-uris/#{redirect_uri_id}"
63
+ )
64
+
65
+ [true, request_id]
18
66
  end
19
67
  end
20
68
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Nylas
4
4
  # NOTE: BaseResource is the base class for all Nylas API resources.
5
+ # Used by all Nylas API resources
5
6
  class Resource
6
7
  # Initializes a resource.
7
- def initialize(resource_name, sdk_instance)
8
- @resource_name = resource_name
8
+ def initialize(sdk_instance)
9
9
  @api_key = sdk_instance.api_key
10
10
  @api_uri = sdk_instance.api_uri
11
11
  @timeout = sdk_instance.timeout
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "resource"
4
+ require_relative "../handler/api_operations"
5
+
6
+ module Nylas
7
+ # Nylas Smart Compose API
8
+ class SmartCompose < Resource
9
+ include ApiOperations::Post
10
+
11
+ # Compose a message.
12
+ #
13
+ # @param identifier [String] Grant ID or email account to generate a message suggestion for.
14
+ # @param request_body [Hash] The prompt that smart compose will use to generate a message suggestion.
15
+ # @return [Array(Hash, String)] The generated message and API Request ID.
16
+ def compose_message(identifier:, request_body:)
17
+ post(
18
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/smart-compose",
19
+ request_body: request_body
20
+ )
21
+ end
22
+
23
+ # Compose a message reply.
24
+ #
25
+ # @param identifier [String] Grant ID or email account to generate a message suggestion for.
26
+ # @param message_id [String] The id of the message to reply to.
27
+ # @param request_body [Hash] The prompt that smart compose will use to generate a message reply.
28
+ # @return [Array(Hash, String)] The generated message reply and API Request ID.
29
+ def compose_message_reply(identifier:, message_id:, request_body:)
30
+ post(
31
+ path: "#{api_uri}/v3/grants/#{identifier}/messages/#{message_id}/smart-compose",
32
+ request_body: request_body
33
+ )
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "resource"
4
+ require_relative "../handler/api_operations"
5
+
6
+ module Nylas
7
+ # Nylas Threads API
8
+ class Threads < Resource
9
+ include ApiOperations::Get
10
+ include ApiOperations::Put
11
+ include ApiOperations::Delete
12
+
13
+ # Return all threads.
14
+ #
15
+ # @param identifier [String] Grant ID or email account to query.
16
+ # @param query_params [Hash] Query params to pass to the request.
17
+ # @return [Array(Array(Hash), String)] The list of threads and API Request ID.
18
+ def list(identifier:, query_params: nil)
19
+ get(
20
+ path: "#{api_uri}/v3/grants/#{identifier}/threads",
21
+ query_params: query_params
22
+ )
23
+ end
24
+
25
+ # Return an thread.
26
+ #
27
+ # @param identifier [String] Grant ID or email account to query.
28
+ # @param thread_id [String] The id of the thread to return.
29
+ # @return [Array(Hash, String)] The thread and API request ID.
30
+ def find(identifier:, thread_id:)
31
+ get(
32
+ path: "#{api_uri}/v3/grants/#{identifier}/threads/#{thread_id}"
33
+ )
34
+ end
35
+
36
+ # Update an thread.
37
+ #
38
+ # @param identifier [String] Grant ID or email account in which to update the thread.
39
+ # @param thread_id [String] The id of the thread to update.
40
+ # @param request_body [Hash] The values to update the thread with
41
+ # @return [Array(Hash, String)] The updated thread and API Request ID.
42
+ def update(identifier:, thread_id:, request_body:)
43
+ put(
44
+ path: "#{api_uri}/v3/grants/#{identifier}/threads/#{thread_id}",
45
+ request_body: request_body
46
+ )
47
+ end
48
+
49
+ # Delete an thread.
50
+ #
51
+ # @param identifier [String] Grant ID or email account from which to delete the thread.
52
+ # @param thread_id [String] The id of the thread to delete.
53
+ # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
54
+ def destroy(identifier:, thread_id:)
55
+ _, request_id = delete(
56
+ path: "#{api_uri}/v3/grants/#{identifier}/threads/#{thread_id}"
57
+ )
58
+
59
+ [true, request_id]
60
+ end
61
+ end
62
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "resource"
4
- require_relative "../handler/grants_api_operations"
4
+ require_relative "../handler/api_operations"
5
5
 
6
6
  module Nylas
7
7
  # Module representing the possible 'trigger' values in a Webhook.
@@ -19,19 +19,70 @@ module Nylas
19
19
  GRANT_EXPIRED = "grant.expired"
20
20
  MESSAGE_SEND_SUCCESS = "message.send_success"
21
21
  MESSAGE_SEND_FAILED = "message.send_failed"
22
+ MESSAGE_OPENED = "message.opened"
23
+ MESSAGE_LINK_CLICKED = "message.link_clicked"
24
+ THREAD_REPLIED = "thread.replied"
22
25
  end
23
26
 
24
- # Webhooks
27
+ # Nylas Webhooks API
25
28
  class Webhooks < Resource
26
- include GrantsApiOperations::Create
27
- include GrantsApiOperations::Update
28
- include GrantsApiOperations::List
29
- include GrantsApiOperations::Destroy
30
- include GrantsApiOperations::Find
31
-
32
- # Initializes webhooks.
33
- def initialize(parent)
34
- super("webhooks", parent)
29
+ include ApiOperations::Get
30
+ include ApiOperations::Post
31
+ include ApiOperations::Put
32
+ include ApiOperations::Delete
33
+
34
+ # Return all webhooks.
35
+ #
36
+ # @return [Array(Array(Hash), String)] The list of webhooks and API Request ID.
37
+ def list
38
+ get(
39
+ path: "#{api_uri}/v3/webhooks"
40
+ )
41
+ end
42
+
43
+ # Return a webhook.
44
+ #
45
+ # @param webhook_id [String] The id of the webhook to return.
46
+ # @return [Array(Hash, String)] The webhook and API request ID.
47
+ def find(webhook_id:)
48
+ get(
49
+ path: "#{api_uri}/v3/webhooks/#{webhook_id}"
50
+ )
51
+ end
52
+
53
+ # Create a webhook.
54
+ #
55
+ # @param request_body [Hash] The values to create the webhook with.
56
+ # @return [Array(Hash, String)] The created webhook and API Request ID.
57
+ def create(request_body:)
58
+ post(
59
+ path: "#{api_uri}/v3/webhooks",
60
+ request_body: request_body
61
+ )
62
+ end
63
+
64
+ # Update a webhook.
65
+ #
66
+ # @param webhook_id [String] The id of the webhook to update.
67
+ # @param request_body [Hash] The values to update the webhook with
68
+ # @return [Array(Hash, String)] The updated webhook and API Request ID.
69
+ def update(webhook_id:, request_body:)
70
+ put(
71
+ path: "#{api_uri}/v3/webhooks/#{webhook_id}",
72
+ request_body: request_body
73
+ )
74
+ end
75
+
76
+ # Delete a webhook.
77
+ #
78
+ # @param webhook_id [String] The id of the webhook to delete.
79
+ # @return [Array(TrueClass, String)] True and the API Request ID for the delete operation.
80
+ def destroy(webhook_id:)
81
+ _, request_id = delete(
82
+ path: "#{api_uri}/v3/webhooks/#{webhook_id}"
83
+ )
84
+
85
+ [true, request_id]
35
86
  end
36
87
  end
37
88
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mime/types"
4
+
5
+ module Nylas
6
+ # A collection of file-related utilities.
7
+ module FileUtils
8
+ # Build a form request for the API.
9
+ # @param request_body The values to create the message with.
10
+ # @return The form data to send to the API and the opened files.
11
+ # @!visibility private
12
+ def self.build_form_request(request_body)
13
+ attachments = request_body.delete(:attachments) || request_body.delete("attachments") || []
14
+
15
+ # RestClient will not send a multipart request if there are no attachments
16
+ # so we need to return the message payload to be used as a json payload
17
+ return [request_body, []] if attachments.empty?
18
+
19
+ # Prepare the data to return
20
+ message_payload = request_body.to_json
21
+
22
+ form_data = {}
23
+ opened_files = []
24
+
25
+ attachments.each_with_index do |attachment, index|
26
+ file = attachment[:content] || attachment["content"]
27
+ form_data.merge!({ "file#{index}" => file })
28
+ opened_files << file
29
+ end
30
+
31
+ form_data.merge!({ "multipart" => true, "message" => message_payload })
32
+
33
+ [form_data, opened_files]
34
+ end
35
+
36
+ # Build the request to attach a file to a message/draft object.
37
+ # @param file_path [String] The path to the file to attach.
38
+ # @return [Hash] The request that will attach the file to the message/draft
39
+ def self.attach_file_request_builder(file_path)
40
+ filename = File.basename(file_path)
41
+ content_type = MIME::Types.type_for(file_path).first.to_s
42
+ content_type = "application/octet-stream" if content_type.empty?
43
+ size = File.size(file_path)
44
+ content = File.new(file_path, "rb")
45
+
46
+ {
47
+ filename: filename,
48
+ content_type: content_type,
49
+ size: size,
50
+ content: content
51
+ }
52
+ end
53
+ end
54
+ end
data/lib/nylas/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nylas
4
- VERSION = "6.0.0.beta.1"
4
+ VERSION = "6.0.0.beta.3"
5
5
  end
data/lib/nylas.rb CHANGED
@@ -7,7 +7,7 @@ require "rest-client"
7
7
  # See https://github.com/sparklemotion/http-cookie/issues/27
8
8
  # and https://github.com/sparklemotion/http-cookie/issues/6
9
9
  #
10
- # CookieJar uses unsafe class caching for dynamically loading cookie jars.
10
+ # CookieJar uses unsafe class caching for dynamically loading cookie jars.
11
11
  # If two rest-client instances are instantiated at the same time (in threads), non-deterministic
12
12
  # behaviour can occur whereby the Hash cookie jar isn't properly loaded and cached.
13
13
  # Forcing an instantiation of the jar onload will force the CookieJar to load before the system has
@@ -28,9 +28,20 @@ require_relative "nylas/config"
28
28
  require_relative "nylas/handler/http_client"
29
29
 
30
30
  require_relative "nylas/resources/applications"
31
+ require_relative "nylas/resources/attachments"
31
32
  require_relative "nylas/resources/auth"
32
33
  require_relative "nylas/resources/calendars"
34
+ require_relative "nylas/resources/connectors"
35
+ require_relative "nylas/resources/contacts"
36
+ require_relative "nylas/resources/credentials"
37
+ require_relative "nylas/resources/drafts"
33
38
  require_relative "nylas/resources/events"
39
+ require_relative "nylas/resources/folders"
34
40
  require_relative "nylas/resources/grants"
41
+ require_relative "nylas/resources/messages"
42
+ require_relative "nylas/resources/smart_compose"
43
+ require_relative "nylas/resources/threads"
35
44
  require_relative "nylas/resources/redirect_uris"
36
45
  require_relative "nylas/resources/webhooks"
46
+
47
+ require_relative "nylas/utils/file_utils"
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nylas
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.beta.1
4
+ version: 6.0.0.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nylas, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-16 00:00:00.000000000 Z
11
+ date: 2024-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mime-types
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.5.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.5'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.5.1
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: rest-client
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -212,18 +232,26 @@ files:
212
232
  - lib/nylas/client.rb
213
233
  - lib/nylas/config.rb
214
234
  - lib/nylas/errors.rb
215
- - lib/nylas/handler/admin_api_operations.rb
216
235
  - lib/nylas/handler/api_operations.rb
217
- - lib/nylas/handler/grants_api_operations.rb
218
236
  - lib/nylas/handler/http_client.rb
219
237
  - lib/nylas/resources/applications.rb
238
+ - lib/nylas/resources/attachments.rb
220
239
  - lib/nylas/resources/auth.rb
221
240
  - lib/nylas/resources/calendars.rb
241
+ - lib/nylas/resources/connectors.rb
242
+ - lib/nylas/resources/contacts.rb
243
+ - lib/nylas/resources/credentials.rb
244
+ - lib/nylas/resources/drafts.rb
222
245
  - lib/nylas/resources/events.rb
246
+ - lib/nylas/resources/folders.rb
223
247
  - lib/nylas/resources/grants.rb
248
+ - lib/nylas/resources/messages.rb
224
249
  - lib/nylas/resources/redirect_uris.rb
225
250
  - lib/nylas/resources/resource.rb
251
+ - lib/nylas/resources/smart_compose.rb
252
+ - lib/nylas/resources/threads.rb
226
253
  - lib/nylas/resources/webhooks.rb
254
+ - lib/nylas/utils/file_utils.rb
227
255
  - lib/nylas/version.rb
228
256
  homepage:
229
257
  licenses: