nylas 4.2.4 → 4.3.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.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/lib/nylas.rb +2 -0
  3. data/lib/nylas/account.rb +9 -0
  4. data/lib/nylas/api.rb +15 -7
  5. data/lib/nylas/calendar.rb +2 -0
  6. data/lib/nylas/collection.rb +9 -0
  7. data/lib/nylas/constraints.rb +4 -3
  8. data/lib/nylas/contact.rb +3 -0
  9. data/lib/nylas/contact_group.rb +2 -0
  10. data/lib/nylas/current_account.rb +2 -0
  11. data/lib/nylas/delta.rb +3 -0
  12. data/lib/nylas/deltas.rb +2 -0
  13. data/lib/nylas/deltas_collection.rb +3 -0
  14. data/lib/nylas/draft.rb +3 -1
  15. data/lib/nylas/email_address.rb +2 -0
  16. data/lib/nylas/errors.rb +2 -0
  17. data/lib/nylas/event.rb +2 -0
  18. data/lib/nylas/event_collection.rb +2 -0
  19. data/lib/nylas/file.rb +8 -1
  20. data/lib/nylas/folder.rb +2 -0
  21. data/lib/nylas/http_client.rb +40 -15
  22. data/lib/nylas/im_address.rb +2 -0
  23. data/lib/nylas/label.rb +2 -0
  24. data/lib/nylas/logging.rb +3 -0
  25. data/lib/nylas/message.rb +10 -1
  26. data/lib/nylas/message_headers.rb +2 -0
  27. data/lib/nylas/message_tracking.rb +2 -0
  28. data/lib/nylas/model.rb +6 -2
  29. data/lib/nylas/model/attributable.rb +3 -1
  30. data/lib/nylas/model/attribute_definition.rb +5 -1
  31. data/lib/nylas/model/attributes.rb +11 -7
  32. data/lib/nylas/model/list_attribute_definition.rb +3 -0
  33. data/lib/nylas/native_authentication.rb +12 -5
  34. data/lib/nylas/new_message.rb +2 -0
  35. data/lib/nylas/nylas_date.rb +2 -0
  36. data/lib/nylas/participant.rb +2 -0
  37. data/lib/nylas/phone_number.rb +2 -0
  38. data/lib/nylas/physical_address.rb +2 -0
  39. data/lib/nylas/raw_message.rb +2 -0
  40. data/lib/nylas/recurrence.rb +2 -0
  41. data/lib/nylas/registry.rb +2 -0
  42. data/lib/nylas/rsvp.rb +2 -0
  43. data/lib/nylas/search_collection.rb +2 -0
  44. data/lib/nylas/thread.rb +2 -0
  45. data/lib/nylas/timespan.rb +2 -0
  46. data/lib/nylas/types.rb +9 -0
  47. data/lib/nylas/version.rb +3 -1
  48. data/lib/nylas/web_page.rb +2 -0
  49. data/lib/nylas/webhook.rb +2 -0
  50. metadata +23 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4a61da1587b7ea34f4bf8b6fe98ed453f3557860
4
- data.tar.gz: a9b33048fda409acecf5fa507aa3ee3fd15fb6f4
2
+ SHA256:
3
+ metadata.gz: 4701f3dfdc9be923e70af2eb5540f82b0ff68904427596be7fa5239ea4bad41a
4
+ data.tar.gz: 3db7ec170cca6ed5060a66b60cb8b18e77811b5ffe7b6fc79d5be5396978dc23
5
5
  SHA512:
6
- metadata.gz: 1fbb5dfbeda1db33d13ee472846fc084a2d13e990d42aa99079bd3f649703511ba19ac0a00df06bb5fe47c74cc3d93b26cb46d1e546245e95842bb585c63a03f
7
- data.tar.gz: ad9893411ecdeffa7e74cb6ca5fe99338000159503582ea05258d427236782c34694fe57d7aa8d205a641bdf83475d42c78ead049f4d6462ed984c0ef69d3aff
6
+ metadata.gz: 273fdaeb3e5389b57d5abb82d3a7c402dfb109973dc4e663fa5ab59d7c0412ea1ecf2b171a419cbe46ea0d9eac8a9ff4b0d31422d2ae119d44167333bf37992d
7
+ data.tar.gz: b89255b00a7fa491061c110e7687e275880456e4e65c131ace84b2f4ee8e040cf8e133dc50b48939de53f85a9898020b6a9bedd1e110e8767b87c0b1b5ce440e
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "json"
2
4
  require "rest-client"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Representation of the accounts for Account management purposes.
3
5
  # @see https://docs.nylas.com/reference#account-management
@@ -24,6 +26,13 @@ module Nylas
24
26
  response[:success]
25
27
  end
26
28
 
29
+ def revoke_all(keep_access_token: nil)
30
+ payload = JSON.dump(keep_access_token: keep_access_token) if keep_access_token
31
+
32
+ response = execute(method: :post, path: "#{resource_path}/revoke-all", payload: payload)
33
+ response[:success]
34
+ end
35
+
27
36
  def self.resources_path(api:)
28
37
  "/a/#{api.app_id}/accounts"
29
38
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Methods to retrieve data from the Nylas API as Ruby objects
3
5
  class API
@@ -15,20 +17,23 @@ module Nylas
15
17
  # you're using a self-hosted Nylas instance.
16
18
  # @param service_domain [String] (Optional) Host you are authenticating OAuth against.
17
19
  # @return [Nylas::API]
18
- # rubocop:disable Metrics/ParameterLists
19
20
  def initialize(client: nil, app_id: nil, app_secret: nil, access_token: nil,
20
21
  api_server: "https://api.nylas.com", service_domain: "api.nylas.com")
21
22
  self.client = client || HttpClient.new(app_id: app_id, app_secret: app_secret,
22
23
  access_token: access_token, api_server: api_server,
23
24
  service_domain: service_domain)
24
25
  end
25
- # rubocop:enable Metrics/ParameterLists
26
26
 
27
27
  # @return [String] A Nylas access token for that particular user.
28
- def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil)
29
- NativeAuthentication.new(api: self).authenticate(name: name, email_address: email_address,
30
- provider: provider, settings: settings,
31
- reauth_account_id: reauth_account_id)
28
+ def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil, scopes: nil)
29
+ NativeAuthentication.new(api: self).authenticate(
30
+ name: name,
31
+ email_address: email_address,
32
+ provider: provider,
33
+ settings: settings,
34
+ reauth_account_id: reauth_account_id,
35
+ scopes: scopes
36
+ )
32
37
  end
33
38
 
34
39
  # @return [Collection<Contact>] A queryable collection of Contacts
@@ -119,8 +124,11 @@ module Nylas
119
124
  @webhooks ||= Collection.new(model: Webhook, api: as(client.app_secret))
120
125
  end
121
126
 
122
- private def prevent_calling_if_missing_access_token(method_name)
127
+ private
128
+
129
+ def prevent_calling_if_missing_access_token(method_name)
123
130
  return if client.access_token && !client.access_token.empty?
131
+
124
132
  raise NoAuthToken, method_name
125
133
  end
126
134
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby bindings for the Nylas Calendar API
3
5
  # @see https://docs.nylas.com/reference#calendars
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # An enumerable for working with index and search endpoints
3
5
  class Collection
@@ -27,11 +29,13 @@ module Nylas
27
29
  # @return [Collection<Model>]
28
30
  def where(filters)
29
31
  raise ModelNotFilterableError, model unless model.filterable?
32
+
30
33
  self.class.new(model: model, api: api, constraints: constraints.merge(where: filters))
31
34
  end
32
35
 
33
36
  def search(query)
34
37
  raise ModelNotSearchableError, model unless model.searchable?
38
+
35
39
  SearchCollection.new(model: model, api: api, constraints: constraints.merge(where: { q: query }))
36
40
  end
37
41
 
@@ -40,6 +44,7 @@ module Nylas
40
44
  # @return [Collection<String>]
41
45
  def raw
42
46
  raise ModelNotAvailableAsRawError, model unless model.exposable_as_raw?
47
+
43
48
  self.class.new(model: model, api: api, constraints: constraints.merge(accept: model.raw_mime_type))
44
49
  end
45
50
 
@@ -61,6 +66,7 @@ module Nylas
61
66
  # Iterates over a single page of results based upon current pagination settings
62
67
  def each
63
68
  return enum_for(:each) unless block_given?
69
+
64
70
  execute.each do |result|
65
71
  yield(model.new(result.merge(api: api)))
66
72
  end
@@ -77,6 +83,7 @@ module Nylas
77
83
  # Iterates over every result that meets the filters, retrieving a page at a time
78
84
  def find_each
79
85
  return enum_for(:find_each) unless block_given?
86
+
80
87
  query = self
81
88
  accumulated = 0
82
89
 
@@ -92,6 +99,7 @@ module Nylas
92
99
 
93
100
  def next_page(accumulated:, current_page:)
94
101
  return nil unless more_pages?(accumulated, current_page)
102
+
95
103
  self.class.new(model: model, api: api, constraints: constraints.next_page)
96
104
  end
97
105
 
@@ -99,6 +107,7 @@ module Nylas
99
107
  return false if current_page.empty?
100
108
  return false if constraints.limit && accumulated >= constraints.limit
101
109
  return false if constraints.per_page && current_page.length < constraints.per_page
110
+
102
111
  true
103
112
  end
104
113
 
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # The constraints a particular GET request will include in their query params
3
5
  class Constraints
4
6
  attr_accessor :where, :limit, :offset, :view, :per_page, :accept
5
- # rubocop:disable Metrics/ParameterLists
6
7
  def initialize(where: {}, limit: nil, offset: 0, view: nil, per_page: 100, accept: "application/json")
7
8
  self.where = where
8
9
  self.limit = limit
@@ -13,14 +14,13 @@ module Nylas
13
14
  end
14
15
 
15
16
  def merge(where: {}, limit: nil, offset: nil, view: nil, per_page: nil, accept: nil)
16
- Constraints.new(where: where.merge(where),
17
+ Constraints.new(where: self.where.merge(where),
17
18
  limit: limit || self.limit,
18
19
  per_page: per_page || self.per_page,
19
20
  offset: offset || self.offset,
20
21
  view: view || self.view,
21
22
  accept: accept || self.accept)
22
23
  end
23
- # rubocop:enable Metrics/ParameterLists
24
24
 
25
25
  def next_page
26
26
  merge(offset: offset + per_page)
@@ -48,6 +48,7 @@ module Nylas
48
48
  return constraints if constraints.is_a?(Constraints)
49
49
  return new(**constraints) if constraints.respond_to?(:key?)
50
50
  return new if constraints.nil?
51
+
51
52
  raise TypeError, "passed in constraints #{constraints} cannot be cast to a set of constraints"
52
53
  end
53
54
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # ActiveModel compliant interface for interacting with the Contacts API
3
5
  # @see https://docs.nylas.com/reference#contacts
@@ -40,6 +42,7 @@ module Nylas
40
42
  # to retrieve it from nylas every time.
41
43
  def picture
42
44
  return @picture_tempfile if @picture_tempfile
45
+
43
46
  @picture_tempfile = Tempfile.new
44
47
  @picture_tempfile.write(api.get(path: "#{resource_path}/picture"))
45
48
  @picture_tempfile.close
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Contact Group schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby representation of the Nylas /account API
3
5
  # @see https://docs.nylas.com/reference#account
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby object to represent a single change. Used both when receiving a webhook, as well as the deltas API.
3
5
  # @see https://docs.nylas.com/reference#receiving-notifications
@@ -18,6 +20,7 @@ module Nylas
18
20
 
19
21
  def model
20
22
  return nil if object.nil?
23
+
21
24
  @model ||= Types.registry[object.to_sym].cast(object_attributes_with_ids)
22
25
  end
23
26
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby object to represent a collection of changes. Used both when receiving a webhook, as well as the
3
5
  # deltas API.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Special collection for delta objects
3
5
  class DeltasCollection < Collection
@@ -24,6 +26,7 @@ module Nylas
24
26
 
25
27
  def next_page(*)
26
28
  return nil if empty?
29
+
27
30
  where(cursor: cursor_end)
28
31
  end
29
32
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby representatin of a Nylas Draft object
3
5
  # @see https://docs.nylas.com/reference#drafts
@@ -28,7 +30,7 @@ module Nylas
28
30
 
29
31
  has_n_of_attribute :events, :event
30
32
  has_n_of_attribute :files, :file
31
- attribute :folder, :label
33
+ attribute :folder, :folder
32
34
  has_n_of_attribute :labels, :label
33
35
 
34
36
  def send!
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Email Address Schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  Error = Class.new(::StandardError)
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent a the Event Schema.
3
5
  # @see https://docs.nylas.com/reference#events
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Syntactical sugar methods for some of the Event's filters
3
5
  # @see https://docs.nylas.com/reference#get-events
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent a the File Schema.
3
5
  # @see https://docs.nylas.com/reference#events
@@ -22,12 +24,14 @@ module Nylas
22
24
  # @return [Tempfile] - Local copy of the file
23
25
  def download
24
26
  return file if file
27
+
25
28
  self.file = retrieve_file
26
29
  end
27
30
 
28
31
  # Redownloads a file even if it's been cached. Closes and unlinks the tempfile to help memory usage.
29
32
  def download!
30
33
  return download if file.nil?
34
+
31
35
  file.close
32
36
  file.unlink
33
37
  self.file = nil
@@ -40,13 +44,16 @@ module Nylas
40
44
 
41
45
  def save
42
46
  raise ModelNotUpdatableError if persisted?
47
+
43
48
  response = api.execute(path: "/files", method: :post, headers: { multipart: true },
44
49
  payload: { file: file })
45
50
  attributes.merge(response.first)
46
51
  true
47
52
  end
48
53
 
49
- private def retrieve_file
54
+ private
55
+
56
+ def retrieve_file
50
57
  response = api.get(path: "#{resource_path}/download")
51
58
  filename = response.headers.fetch(:content_disposition, "").gsub("attachment; filename=", "")
52
59
  temp_file = Tempfile.new(filename)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Folder Schema
3
5
  # @see https://docs.nylas.com/reference#folders
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Plain HTTP client that can be used to interact with the Nylas API sans any type casting.
3
- class HttpClient
5
+ class HttpClient # rubocop:disable Metrics/ClassLength
4
6
  HTTP_CODE_TO_EXCEPTIONS = {
5
7
  400 => InvalidRequest,
6
8
  402 => MessageRejected,
@@ -15,6 +17,15 @@ module Nylas
15
17
  503 => ServiceUnavailable
16
18
  }.freeze
17
19
 
20
+ ENDPOINT_TIMEOUTS = {
21
+ "/oauth/authorize" => 345,
22
+ "/messages/search" => 350,
23
+ "/threads/search" => 350,
24
+ "/delta" => 3650,
25
+ "/delta/longpoll" => 3650,
26
+ "/delta/streaming" => 3650
27
+ }.freeze
28
+
18
29
  include Logging
19
30
  attr_accessor :api_server, :service_domain
20
31
  attr_writer :default_headers
@@ -34,6 +45,7 @@ module Nylas
34
45
  unless api_server.include?("://")
35
46
  raise "When overriding the Nylas API server address, you must include https://"
36
47
  end
48
+
37
49
  @api_server = api_server
38
50
  @access_token = access_token
39
51
  @app_secret = app_secret
@@ -56,24 +68,33 @@ module Nylas
56
68
  # section of the URI fragment
57
69
  # @param payload [String,Hash] (Optional, defaults to nil) - Body to send with the request.
58
70
  # @return [Array Hash Stringn]
71
+ # rubocop:disable Metrics/MethodLength
59
72
  def execute(method:, path: nil, headers: {}, query: {}, payload: nil)
60
- request = build_request(method: method, path: path, headers: headers, query: query, payload: payload)
73
+ timeout = ENDPOINT_TIMEOUTS.fetch(path, 230)
74
+ request = build_request(
75
+ method: method,
76
+ path: path,
77
+ headers: headers,
78
+ query: query,
79
+ payload: payload,
80
+ timeout: timeout
81
+ )
61
82
  rest_client_execute(**request) do |response, _request, result|
62
83
  response = parse_response(response)
63
84
  handle_failed_response(result: result, response: response)
64
85
  response
65
86
  end
66
87
  end
88
+ # rubocop:enable Metrics/MethodLength
67
89
  inform_on :execute, level: :debug,
68
90
  also_log: { result: true, values: %i[method url path headers query payload] }
69
91
 
70
- def build_request(method:, path: nil, headers: {}, query: {}, payload: nil)
92
+ def build_request(method:, path: nil, headers: {}, query: {}, payload: nil, timeout: nil)
71
93
  headers[:params] = query
72
94
  url ||= url_for_path(path)
73
95
  resulting_headers = default_headers.merge(headers)
74
- { method: method, url: url, payload: payload, headers: resulting_headers }
96
+ { method: method, url: url, payload: payload, headers: resulting_headers, timeout: timeout }
75
97
  end
76
- # rubocop:enable Metrics/ParameterLists
77
98
 
78
99
  # Syntactical sugar for making GET requests via the API.
79
100
  # @see #execute
@@ -98,18 +119,11 @@ module Nylas
98
119
  def delete(path: nil, payload: nil, headers: {}, query: {})
99
120
  execute(method: :delete, path: path, headers: headers, query: query, payload: payload)
100
121
  end
101
- # rubocop:enable Metrics/ParameterList
102
-
103
- private def rest_client_execute(method:, url:, headers:, payload:, &block)
104
- ::RestClient::Request.execute(method: method, url: url, payload: payload,
105
- headers: headers, &block)
106
- end
107
- inform_on :rest_client_execute, level: :debug,
108
- also_log: { result: true, values: %i[method url headers payload] }
109
122
 
110
123
  def default_headers
111
124
  @default_headers ||= {
112
125
  "X-Nylas-API-Wrapper" => "ruby",
126
+ "X-Nylas-Client-Id" => @app_id,
113
127
  "User-Agent" => "Nylas Ruby SDK #{Nylas::VERSION} - #{RUBY_VERSION}",
114
128
  "Content-types" => "application/json"
115
129
  }
@@ -127,16 +141,27 @@ module Nylas
127
141
  "#{protocol}//#{access_token}:@#{domain}#{path}"
128
142
  end
129
143
 
130
- private def handle_failed_response(result:, response:)
144
+ private
145
+
146
+ def rest_client_execute(method:, url:, headers:, payload:, timeout:, &block)
147
+ ::RestClient::Request.execute(method: method, url: url, payload: payload,
148
+ headers: headers, timeout: timeout, &block)
149
+ end
150
+
151
+ inform_on :rest_client_execute, level: :debug,
152
+ also_log: { result: true, values: %i[method url headers payload] }
153
+
154
+ def handle_failed_response(result:, response:)
131
155
  http_code = result.code.to_i
132
156
 
133
157
  handle_anticipated_failure_mode(http_code: http_code, response: response)
134
158
  raise UnexpectedResponse, result.msg if result.is_a?(Net::HTTPClientError)
135
159
  end
136
160
 
137
- private def handle_anticipated_failure_mode(http_code:, response:)
161
+ def handle_anticipated_failure_mode(http_code:, response:)
138
162
  return if http_code == 200
139
163
  return unless response.is_a?(Hash)
164
+
140
165
  exception = HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
141
166
  raise exception.new(response[:type], response[:message], response.fetch(:server_error, nil))
142
167
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the IM Address Schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Label Schema
3
5
  # @see https://docs.nylas.com/reference#labels
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # We are explicitely choosing to allow clients to use or not use informed at their discretion
2
4
  # rubocop:disable Lint/HandleExceptions
3
5
  begin
@@ -20,6 +22,7 @@ module Nylas
20
22
 
21
23
  def self.logger
22
24
  return @logger if @logger
25
+
23
26
  @logger = Logger.new(STDOUT)
24
27
  @logger.level = level
25
28
  @logger
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby representatin of a Nylas Message object
3
5
  # @see https://docs.nylas.com/reference#messages
@@ -31,7 +33,7 @@ module Nylas
31
33
 
32
34
  has_n_of_attribute :events, :event
33
35
  has_n_of_attribute :files, :file
34
- attribute :folder, :label
36
+ attribute :folder, :folder
35
37
  has_n_of_attribute :labels, :label
36
38
 
37
39
  def starred?
@@ -41,5 +43,12 @@ module Nylas
41
43
  def unread?
42
44
  unread
43
45
  end
46
+
47
+ def expanded
48
+ return self unless headers.nil?
49
+
50
+ assign(api.execute(method: :get, path: resource_path, query: { view: "expanded" }))
51
+ self
52
+ end
44
53
  end
45
54
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Translates message headers into a Ruby object
3
5
  # @see https://docs.nylas.com/reference#section-message-views
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Message tracking features
3
5
  # @see https://docs.nylas.com/reference#message-tracking-overview
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "model/attribute_definition"
2
4
  require_relative "model/list_attribute_definition"
3
5
  require_relative "model/attributable"
@@ -23,6 +25,7 @@ module Nylas
23
25
  def save
24
26
  result = if persisted?
25
27
  raise ModelNotUpdatableError, self unless updatable?
28
+
26
29
  execute(method: :put, payload: attributes.serialize, path: resource_path)
27
30
  else
28
31
  create
@@ -40,11 +43,13 @@ module Nylas
40
43
 
41
44
  def create
42
45
  raise ModelNotCreatableError, self unless creatable?
46
+
43
47
  execute(method: :post, payload: attributes.serialize, path: resources_path)
44
48
  end
45
49
 
46
50
  def update(**data)
47
51
  raise ModelNotUpdatableError, model_class unless updatable?
52
+
48
53
  attributes.merge(**data)
49
54
  execute(method: :put, payload: attributes.serialize(keys: data.keys), path: resource_path)
50
55
  true
@@ -67,6 +72,7 @@ module Nylas
67
72
 
68
73
  def destroy
69
74
  raise ModelNotDestroyableError, self unless destroyable?
75
+
70
76
  execute(method: :delete, path: resource_path)
71
77
  end
72
78
 
@@ -81,7 +87,6 @@ module Nylas
81
87
  :destroyable
82
88
  attr_writer :resources_path
83
89
 
84
- # rubocop:disable Metrics/ParameterLists
85
90
  def allows_operations(creatable: false, showable: false, listable: false, filterable: false,
86
91
  searchable: false, updatable: false, destroyable: false)
87
92
 
@@ -94,7 +99,6 @@ module Nylas
94
99
  self.destroyable ||= destroyable
95
100
  end
96
101
 
97
- # rubocop:enable Metrics/ParameterLists
98
102
  def creatable?
99
103
  creatable
100
104
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  module Model
3
5
  # Allows defining of tyypecastable attributes on a model
@@ -10,7 +12,7 @@ module Nylas
10
12
  assign(**initial_data)
11
13
  end
12
14
 
13
- protected def assign(**data)
15
+ protected def assign(**data) # rubocop:disable Style/AccessModifierDeclarations
14
16
  data.each do |attribute_name, value|
15
17
  if respond_to?(:"#{attribute_name}=")
16
18
  send(:"#{attribute_name}=", value)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  module Model
3
5
  # Define a particular attribute for a given model
@@ -11,7 +13,9 @@ module Nylas
11
13
  self.default = default
12
14
  end
13
15
 
14
- private def type
16
+ private
17
+
18
+ def type
15
19
  Types.registry[type_name]
16
20
  end
17
21
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  module Model
3
5
  # Stores the actual model data to allow for type casting and clean/dirty checking
@@ -17,12 +19,6 @@ module Nylas
17
19
  data[key] = cast(key, value)
18
20
  end
19
21
 
20
- private def cast(key, value)
21
- attribute_definitions[key].cast(value)
22
- rescue TypeError => e
23
- raise TypeError, "#{key} #{e.message}"
24
- end
25
-
26
22
  # Merges data into the registry while casting input types correctly
27
23
  def merge(new_data)
28
24
  new_data.each do |attribute_name, value|
@@ -41,7 +37,15 @@ module Nylas
41
37
  JSON.dump(to_h(keys: keys))
42
38
  end
43
39
 
44
- private def default_attributes
40
+ private
41
+
42
+ def cast(key, value)
43
+ attribute_definitions[key].cast(value)
44
+ rescue TypeError => e
45
+ raise TypeError, "#{key} #{e.message}"
46
+ end
47
+
48
+ def default_attributes
45
49
  attribute_definitions.keys.zip([]).to_h
46
50
  end
47
51
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  module Model
3
5
  # Allows models to have an attribute which is a lists of another type of thing
@@ -12,6 +14,7 @@ module Nylas
12
14
 
13
15
  def cast(list)
14
16
  return default if list.nil? || list.empty?
17
+
15
18
  list.map { |item| type.cast(item) }
16
19
  end
17
20
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Authenticate your application using the native interface
3
5
  # @see https://docs.nylas.com/reference#native-authentication-1
@@ -7,22 +9,27 @@ module Nylas
7
9
  self.api = api
8
10
  end
9
11
 
10
- def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil)
12
+ def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil,
13
+ scopes: nil)
14
+ scopes ||= %w[email calendar contacts]
15
+ scopes = scopes.join(",") unless scopes.is_a?(String)
11
16
  code = retrieve_code(name: name, email_address: email_address, provider: provider,
12
- settings: settings, reauth_account_id: reauth_account_id)
17
+ settings: settings, reauth_account_id: reauth_account_id, scopes: scopes)
13
18
 
14
19
  exchange_code_for_access_token(code)
15
20
  end
16
21
 
17
- private def retrieve_code(name:, email_address:, provider:, settings:, reauth_account_id:)
22
+ private
23
+
24
+ def retrieve_code(name:, email_address:, provider:, settings:, reauth_account_id:, scopes:)
18
25
  payload = { client_id: api.client.app_id, name: name, email_address: email_address,
19
- provider: provider, settings: settings }
26
+ provider: provider, settings: settings, scopes: scopes }
20
27
  payload[:reauth_account_id] = reauth_account_id
21
28
  response = api.execute(method: :post, path: "/connect/authorize", payload: JSON.dump(payload))
22
29
  response[:code]
23
30
  end
24
31
 
25
- private def exchange_code_for_access_token(code)
32
+ def exchange_code_for_access_token(code)
26
33
  payload = { client_id: api.client.app_id, client_secret: api.client.app_secret, code: code }
27
34
  response = api.execute(method: :post, path: "/connect/token", payload: JSON.dump(payload))
28
35
  response[:access_token]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Data structure for seending a message via the Nylas API
3
5
  class NewMessage
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent Nylas's more complex Date Schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Participant
3
5
  class Participant
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Phone Number Schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Physical Address schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Allows sending of email with nylas from an rfc822 compatible string
3
5
  class RawMessage
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Representation of a Recurrence object
3
5
  # @see https://docs.nylas.com/reference#section-recurrence
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Used to create a hash-like structure which defaults to raising an exception in the event the key to
3
5
  # retrieve does not exist.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Allows RSVPing to a particular event
3
5
  # @see https://docs.nylas.com/reference#rsvping-to-invitations
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ensures our search requests hit the right path
3
5
  class SearchCollection < Collection
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Ruby representation of the Nylas /threads API
3
5
  # @see https://docs.nylas.com/reference#threads
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent a Nylas Timespan.
3
5
  # @see https://docs.nylas.com/reference#section-timespan
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Collection of attribute types
3
5
  module Types
@@ -34,6 +36,7 @@ module Nylas
34
36
  return model.new if value.nil?
35
37
  return value if already_cast?(value)
36
38
  return model.new(**actual_attributes(value)) if value.respond_to?(:key?)
39
+
37
40
  raise TypeError, "Unable to cast #{value} to a #{model}"
38
41
  end
39
42
 
@@ -74,6 +77,7 @@ module Nylas
74
77
  return Time.at(object.to_i) if object.is_a?(String)
75
78
  return Time.at(object) if object.is_a?(Numeric)
76
79
  return object.to_time if object.is_a?(Date)
80
+
77
81
  raise TypeError, "Unable to cast #{object} to Time"
78
82
  end
79
83
 
@@ -91,11 +95,13 @@ module Nylas
91
95
  class DateType < ValueType
92
96
  def cast(value)
93
97
  return nil if value.nil?
98
+
94
99
  Date.parse(value)
95
100
  end
96
101
 
97
102
  def serialize(value)
98
103
  return value.iso8601 if value.respond_to?(:iso8601)
104
+
99
105
  value
100
106
  end
101
107
  end
@@ -106,6 +112,7 @@ module Nylas
106
112
  # @param value [Object] Casts the passed in object to a string using #to_s
107
113
  def cast(value)
108
114
  return value if value.nil?
115
+
109
116
  value.to_s
110
117
  end
111
118
  end
@@ -116,6 +123,7 @@ module Nylas
116
123
  # @param value [Object] Casts the passed in object to an integer using to_i
117
124
  def cast(value)
118
125
  return nil if value.nil?
126
+
119
127
  value.to_i
120
128
  end
121
129
  end
@@ -128,6 +136,7 @@ module Nylas
128
136
  return nil if value.nil?
129
137
  return true if value == true
130
138
  return false if value == false
139
+
131
140
  raise TypeError, "#{value} must be either true or false"
132
141
  end
133
142
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
- VERSION = "4.2.4".freeze
4
+ VERSION = "4.3.0"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Structure to represent the Web Page Schema
3
5
  # @see https://docs.nylas.com/reference#contactsid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nylas
2
4
  # Represents a webhook attached to your application.
3
5
  # @see https://docs.nylas.com/reference#webhooks
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nylas
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.4
4
+ version: 4.3.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: 2018-08-07 00:00:00.000000000 Z
11
+ date: 2019-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: 1.3.0
20
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: '1.3'
26
+ version: 1.3.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: jeweler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '3.7'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rspec-json_matcher
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.1'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.1'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: webmock
169
183
  requirement: !ruby/object:Gem::Requirement
@@ -310,17 +324,16 @@ require_paths:
310
324
  - lib
311
325
  required_ruby_version: !ruby/object:Gem::Requirement
312
326
  requirements:
313
- - - "~>"
327
+ - - ">="
314
328
  - !ruby/object:Gem::Version
315
- version: '2.2'
329
+ version: '2.4'
316
330
  required_rubygems_version: !ruby/object:Gem::Requirement
317
331
  requirements:
318
332
  - - ">="
319
333
  - !ruby/object:Gem::Version
320
334
  version: '0'
321
335
  requirements: []
322
- rubyforge_project:
323
- rubygems_version: 2.5.2.3
336
+ rubygems_version: 3.0.1
324
337
  signing_key:
325
338
  specification_version: 4
326
339
  summary: Gem for interacting with the Nylas API