nylas 5.0.0 → 5.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82a2a7e6af812dd58557c604deb553e18d586c373ee8c308b1eddc8492a44c28
4
- data.tar.gz: 43b9a7943a854c10f2257d49220fc420ff4e3b022b76a527ba772041600d24dd
3
+ metadata.gz: d2f677958900566f6aeb941f450e9bbe3b4dfd54f57c4cf4b87bb403f968f731
4
+ data.tar.gz: 5f4eb58cf5835a43a4034229d506d7662923fa110c4fe5e352f9d867ac69b295
5
5
  SHA512:
6
- metadata.gz: 6c005ca3d6e0f61bc25ebdab118cc0dda5dd366c24b8ad1519b78a5bb32bd0de976b1070fb6dc35dfbd81ffd4540c636956c38f1248e412e80441cf12fb788d0
7
- data.tar.gz: 05e47ffa2fb00e66adf7483b7eb7a0bd870c85dbff006dee3cfa7b968589173634d77d74519bc04e657d214efdfd17b1bc8ef492da0880edef5552fb012ac466
6
+ metadata.gz: c727f58c5ecaeaca411d346b23d2176f8114f1cc441347326c8c26239f3ef78626007a443f89932fc955c68c295229d238a647cb7f42234f11d31fc0d02ec7e9
7
+ data.tar.gz: e1ce86d59fcdc7c7193688faf95833978e106fb5e0ea5166f009f9f06234e9a724e363b21133b6636c14398e4dcc177853347b13a5c821af765deaf5900a0cc4
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, exclude_when: %i[creating updating]
16
+ attribute :id, :string, read_only: true
17
17
  attribute :object, :string, default: "contact"
18
- attribute :account_id, :string, exclude_when: %i[creating updating]
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
@@ -14,6 +14,6 @@ module Nylas
14
14
  attribute :cursor_end, :string
15
15
 
16
16
  extend Forwardable
17
- def_delegators :deltas, :count, :length, :each, :map, :first, :to_a, :empty?
17
+ def_delegators :deltas, :count, :length, :each, :map, :first, :last, :to_a, :empty?
18
18
  end
19
19
  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.serialize(keys: [:version]))
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, exclude_when: %i[saving]
13
- attribute :object, :string, exclude_when: %i[saving]
14
- attribute :account_id, :string, exclude_when: %i[saving]
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
@@ -104,8 +104,8 @@ module Nylas
104
104
  also_log: { result: true, values: %i[method url path headers query payload] }
105
105
 
106
106
  def build_request(method:, path: nil, headers: {}, query: {}, payload: nil, timeout: nil)
107
- headers[:params] = query
108
107
  url ||= url_for_path(path)
108
+ url = add_query_params_to_url(url, query)
109
109
  resulting_headers = default_headers.merge(headers)
110
110
  { method: method, url: url, payload: payload, headers: resulting_headers, timeout: timeout }
111
111
  end
@@ -178,10 +178,39 @@ module Nylas
178
178
 
179
179
  def handle_anticipated_failure_mode(http_code:, response:)
180
180
  return if http_code == 200
181
- return unless response.is_a?(Hash)
182
181
 
183
182
  exception = HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
184
- raise exception.new(response[:type], response[:message], response.fetch(:server_error, nil))
183
+ parsed_response = parse_response(response)
184
+
185
+ raise exception.new(
186
+ parsed_response[:type],
187
+ parsed_response[:message],
188
+ parsed_response.fetch(:server_error, nil)
189
+ )
190
+ end
191
+
192
+ def add_query_params_to_url(url, query)
193
+ unless query.empty?
194
+ uri = URI.parse(url)
195
+ query = custom_params(query)
196
+ params = URI.decode_www_form(uri.query || "") + query.to_a
197
+ uri.query = URI.encode_www_form(params)
198
+ url = uri.to_s
199
+ end
200
+
201
+ url
202
+ end
203
+
204
+ def custom_params(query)
205
+ # Convert hash to "<key>:<value>" form for metadata_pair query
206
+ if query.key?(:metadata_pair)
207
+ pairs = query[:metadata_pair].map do |key, value|
208
+ "#{key}:#{value}"
209
+ end
210
+ query[:metadata_pair] = pairs
211
+ end
212
+
213
+ query
185
214
  end
186
215
  end
187
216
  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, exclude_when: [:saving]
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]
@@ -75,7 +75,7 @@ module Nylas
75
75
 
76
76
  execute(
77
77
  method: :put,
78
- payload: attributes.serialize(keys: allowed_keys_for_save),
78
+ payload: attributes.serialize_for_api,
79
79
  path: resource_path
80
80
  )
81
81
  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.serialize,
51
+ payload: attributes.serialize_for_api,
52
52
  path: resources_path,
53
53
  query: query_params
54
54
  )
@@ -58,12 +58,37 @@ module Nylas
58
58
  raise ModelNotUpdatableError, model_class unless updatable?
59
59
 
60
60
  attributes.merge(**data)
61
- execute(
62
- method: :put,
63
- payload: attributes.serialize(keys: data.keys),
64
- path: resource_path,
65
- query: query_params
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)
@@ -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.serialize(keys: allowed_keys_for_save),
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, exclude_when: [], default: [])
38
- attribute_definitions[name] = ListAttributeDefinition.new(type_name: type_name,
39
- exclude_when: exclude_when,
40
- default: default)
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, exclude_when: [], default: nil)
46
- attribute_definitions[name] = AttributeDefinition.new(type_name: type_name,
47
- exclude_when: exclude_when, default: default)
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, :exclude_when, :default
9
+ attr_accessor :type_name, :read_only, :default
10
10
 
11
- def initialize(type_name:, exclude_when:, default:)
11
+ def initialize(type_name:, read_only:, default:)
12
12
  self.type_name = type_name
13
- self.exclude_when = exclude_when
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, :exclude_when, :default
7
+ attr_accessor :type_name, :read_only, :default
8
8
 
9
- def initialize(type_name:, exclude_when:, default:)
9
+ def initialize(type_name:, read_only:, default:)
10
10
  self.type_name = type_name
11
- self.exclude_when = exclude_when
11
+ self.read_only = read_only
12
12
  self.default = default
13
13
  end
14
14
 
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(method: :post, path: "/send-rsvp", payload: attributes.serialize,
17
- query: { notify_participants: notify_participants })
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/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nylas
4
- VERSION = "5.0.0"
4
+ VERSION = "5.1.0"
5
5
  end
data/lib/nylas/when.rb CHANGED
@@ -8,7 +8,7 @@ module Nylas
8
8
 
9
9
  include Model::Attributable
10
10
 
11
- attribute :object, :string
11
+ attribute :object, :string, read_only: true
12
12
 
13
13
  # when object == 'date'
14
14
  attribute :date, :date
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: 5.0.0
4
+ version: 5.1.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-05-07 00:00:00.000000000 Z
11
+ date: 2021-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -345,7 +345,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
345
345
  - !ruby/object:Gem::Version
346
346
  version: '0'
347
347
  requirements: []
348
- rubygems_version: 3.1.2
348
+ rubygems_version: 3.2.17
349
349
  signing_key:
350
350
  specification_version: 4
351
351
  summary: Gem for interacting with the Nylas API