nylas 4.2.4 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
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