nylas 4.0.0.rc2 → 4.0.0.rc3

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 (45) hide show
  1. checksums.yaml +5 -5
  2. data/lib/nylas.rb +48 -5
  3. data/lib/nylas/account.rb +31 -0
  4. data/lib/nylas/api.rb +86 -2
  5. data/lib/nylas/calendar.rb +27 -0
  6. data/lib/nylas/collection.rb +46 -19
  7. data/lib/nylas/constraints.rb +12 -4
  8. data/lib/nylas/contact.rb +10 -2
  9. data/lib/nylas/current_account.rb +1 -4
  10. data/lib/nylas/delta.rb +46 -0
  11. data/lib/nylas/deltas.rb +17 -0
  12. data/lib/nylas/deltas_collection.rb +36 -0
  13. data/lib/nylas/draft.rb +51 -0
  14. data/lib/nylas/email_address.rb +1 -5
  15. data/lib/nylas/errors.rb +13 -0
  16. data/lib/nylas/event.rb +42 -0
  17. data/lib/nylas/event_collection.rb +13 -0
  18. data/lib/nylas/file.rb +58 -0
  19. data/lib/nylas/folder.rb +22 -0
  20. data/lib/nylas/http_client.rb +38 -29
  21. data/lib/nylas/im_address.rb +0 -5
  22. data/lib/nylas/label.rb +22 -0
  23. data/lib/nylas/message.rb +45 -0
  24. data/lib/nylas/message_headers.rb +25 -0
  25. data/lib/nylas/message_tracking.rb +11 -0
  26. data/lib/nylas/model.rb +75 -24
  27. data/lib/nylas/model/attributable.rb +2 -2
  28. data/lib/nylas/model/attributes.rb +3 -1
  29. data/lib/nylas/native_authentication.rb +31 -0
  30. data/lib/nylas/new_message.rb +29 -0
  31. data/lib/nylas/nylas_date.rb +5 -2
  32. data/lib/nylas/participant.rb +10 -0
  33. data/lib/nylas/phone_number.rb +0 -5
  34. data/lib/nylas/physical_address.rb +0 -5
  35. data/lib/nylas/raw_message.rb +15 -0
  36. data/lib/nylas/recurrence.rb +9 -0
  37. data/lib/nylas/rsvp.rb +18 -0
  38. data/lib/nylas/search_collection.rb +8 -0
  39. data/lib/nylas/thread.rb +52 -0
  40. data/lib/nylas/timespan.rb +18 -0
  41. data/lib/nylas/types.rb +62 -9
  42. data/lib/nylas/version.rb +1 -1
  43. data/lib/nylas/web_page.rb +0 -5
  44. data/lib/nylas/webhook.rb +19 -0
  45. metadata +31 -7
@@ -6,9 +6,4 @@ module Nylas
6
6
  attribute :type, :string
7
7
  attribute :im_address, :string
8
8
  end
9
-
10
- # Serializes, Deserializes between {IMAddress} objects and their JSON representation
11
- class IMAddressType < Types::HashType
12
- casts_to IMAddress
13
- end
14
9
  end
@@ -0,0 +1,22 @@
1
+ module Nylas
2
+ # Structure to represent the Label Schema
3
+ # @see https://docs.nylas.com/reference#labels
4
+ class Label
5
+ include Model
6
+ self.resources_path = "/labels"
7
+ self.creatable = true
8
+ self.listable = true
9
+ self.showable = true
10
+ self.filterable = false
11
+ self.updatable = true
12
+ self.destroyable = true
13
+
14
+ attribute :id, :string
15
+ attribute :account_id, :string
16
+
17
+ attribute :object, :string
18
+
19
+ attribute :name, :string
20
+ attribute :display_name, :string
21
+ end
22
+ end
@@ -0,0 +1,45 @@
1
+ module Nylas
2
+ # Ruby representatin of a Nylas Message object
3
+ # @see https://docs.nylas.com/reference#messages
4
+ class Message
5
+ include Model
6
+ self.raw_mime_type = "message/rfc822"
7
+ self.resources_path = "/messages"
8
+ allows_operations(showable: true, listable: true, filterable: true, searchable: true, updatable: true)
9
+
10
+ attribute :id, :string
11
+ attribute :object, :string
12
+ attribute :account_id, :string
13
+ attribute :thread_id, :string
14
+
15
+ attribute :headers, :message_headers
16
+
17
+ has_n_of_attribute :to, :email_address
18
+ has_n_of_attribute :from, :email_address
19
+ has_n_of_attribute :cc, :email_address
20
+ has_n_of_attribute :bcc, :email_address
21
+ has_n_of_attribute :reply_to, :email_address
22
+
23
+ attribute :date, :unix_timestamp
24
+ # This is only used when receiving a message received notification via a webhook
25
+ attribute :received_date, :unix_timestamp
26
+ attribute :subject, :string
27
+ attribute :snippet, :string
28
+ attribute :body, :string
29
+ attribute :starred, :boolean
30
+ attribute :unread, :boolean
31
+
32
+ has_n_of_attribute :events, :event
33
+ has_n_of_attribute :files, :file
34
+ attribute :folder, :label
35
+ has_n_of_attribute :labels, :label
36
+
37
+ def starred?
38
+ starred
39
+ end
40
+
41
+ def unread?
42
+ unread
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ module Nylas
2
+ # Translates message headers into a Ruby object
3
+ # @see https://docs.nylas.com/reference#section-message-views
4
+ class MessageHeaders
5
+ include Model::Attributable
6
+ attribute :in_reply_to, :string
7
+ attribute :message_id, :string
8
+ has_n_of_attribute :references, :string
9
+ end
10
+
11
+ # Serializes, Deserializes between {MessageHeaders} objects and a Hash
12
+ class MessageHeadersType < Types::ModelType
13
+ def initialize
14
+ super(model: MessageHeaders)
15
+ end
16
+ RUBY_KEY_TO_JSON_KEY_MAP = {
17
+ in_reply_to: :"In-Reply-To",
18
+ message_id: :"Message-Id",
19
+ references: :References
20
+ }.freeze
21
+ def json_key_from_attribute_name(attribute_name)
22
+ RUBY_KEY_TO_JSON_KEY_MAP.fetch(attribute_name)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module Nylas
2
+ # Message tracking features
3
+ # @see https://docs.nylas.com/reference#message-tracking-overview
4
+ class MessageTracking
5
+ include Model::Attributable
6
+ attribute :links, :boolean
7
+ attribute :opens, :boolean
8
+ attribute :thread_replies, :boolean
9
+ attribute :payload, :string
10
+ end
11
+ end
data/lib/nylas/model.rb CHANGED
@@ -7,33 +7,51 @@ module Nylas
7
7
  module Model
8
8
  attr_accessor :api
9
9
 
10
+ def model_class
11
+ self.class
12
+ end
13
+
10
14
  def self.included(model)
11
15
  model.include(Attributable)
12
16
  model.extend(ClassMethods)
13
- model.collectionable = true
14
- model.searchable = true
15
- model.read_only = false
17
+ model.extend(Forwardable)
18
+ model.def_delegators :model_class, :creatable?, :filterable?, :listable?, :searchable?, :showable?,
19
+ :updatable?, :destroyable?
20
+ model.allows_operations
16
21
  end
17
22
 
18
23
  def save
19
- raise_if_read_only
20
- result = if id
21
- api.execute(method: :put, payload: attributes.serialize, path: resource_path)
24
+ result = if persisted?
25
+ raise ModelNotUpdatableError, self unless updatable?
26
+ execute(method: :put, payload: attributes.serialize, path: resource_path)
22
27
  else
23
- api.execute(method: :post, payload: attributes.serialize, path: resources_path)
28
+ create
24
29
  end
25
30
  attributes.merge(result)
26
31
  end
27
32
 
33
+ def persisted?
34
+ !id.nil?
35
+ end
36
+
37
+ def execute(method:, payload: nil, path:)
38
+ api.execute(method: method, payload: payload, path: path)
39
+ end
40
+
41
+ def create
42
+ raise ModelNotCreatableError, self unless creatable?
43
+ execute(method: :post, payload: attributes.serialize, path: resources_path)
44
+ end
45
+
28
46
  def update(**data)
29
- raise_if_read_only
47
+ raise ModelNotUpdatableError, model_class unless updatable?
30
48
  attributes.merge(**data)
31
- api.execute(method: :put, payload: attributes.serialize(keys: data.keys), path: resource_path)
49
+ execute(method: :put, payload: attributes.serialize(keys: data.keys), path: resource_path)
32
50
  true
33
51
  end
34
52
 
35
53
  def reload
36
- attributes.merge(api.execute(method: :get, path: resource_path))
54
+ attributes.merge(execute(method: :get, path: resource_path))
37
55
  true
38
56
  end
39
57
 
@@ -42,11 +60,12 @@ module Nylas
42
60
  end
43
61
 
44
62
  def resources_path
45
- self.class.resources_path
63
+ self.class.resources_path(api: api)
46
64
  end
47
65
 
48
66
  def destroy
49
- api.execute(method: :delete, path: resource_path)
67
+ raise ModelNotDestroyableError, self unless destroyable?
68
+ execute(method: :delete, path: resource_path)
50
69
  end
51
70
 
52
71
  # @return [String] JSON String of the model.
@@ -54,28 +73,60 @@ module Nylas
54
73
  JSON.dump(to_h)
55
74
  end
56
75
 
57
- def raise_if_read_only
58
- self.class.raise_if_read_only
59
- end
60
-
61
76
  # Allows you to narrow in exactly what kind of model you're working with
62
77
  module ClassMethods
63
- attr_accessor :resources_path, :searchable, :read_only, :collectionable
78
+ attr_accessor :raw_mime_type, :creatable, :showable, :filterable, :searchable, :listable, :updatable,
79
+ :destroyable
80
+ attr_writer :resources_path
81
+
82
+ # rubocop:disable Metrics/ParameterLists
83
+ def allows_operations(creatable: false, showable: false, listable: false, filterable: false,
84
+ searchable: false, updatable: false, destroyable: false)
85
+
86
+ self.creatable ||= creatable
87
+ self.showable ||= showable
88
+ self.listable ||= listable
89
+ self.filterable ||= filterable
90
+ self.searchable ||= searchable
91
+ self.updatable ||= updatable
92
+ self.destroyable ||= destroyable
93
+ end
64
94
 
65
- def read_only?
66
- read_only == true
95
+ # rubocop:enable Metrics/ParameterLists
96
+ def creatable?
97
+ creatable
67
98
  end
68
99
 
69
- def raise_if_read_only
70
- raise NotImplementedError, "#{self} is read only" if read_only?
100
+ def showable?
101
+ showable
102
+ end
103
+
104
+ def listable?
105
+ listable
106
+ end
107
+
108
+ def filterable?
109
+ filterable
71
110
  end
72
111
 
73
112
  def searchable?
74
- searchable == true
113
+ searchable
114
+ end
115
+
116
+ def updatable?
117
+ updatable
118
+ end
119
+
120
+ def destroyable?
121
+ destroyable
122
+ end
123
+
124
+ def resources_path(*)
125
+ @resources_path
75
126
  end
76
127
 
77
- def collectionable?
78
- collectionable == true
128
+ def exposable_as_raw?
129
+ !raw_mime_type.nil?
79
130
  end
80
131
 
81
132
  def from_json(json, api:)
@@ -23,14 +23,14 @@ module Nylas
23
23
 
24
24
  # Methods to call when tweaking Attributable classes
25
25
  module ClassMethods
26
- # rubocop:disable Style/PredicateName
26
+ # rubocop:disable Naming/PredicateName
27
27
  def has_n_of_attribute(name, type_name, exclude_when: [], default: [])
28
28
  attribute_definitions[name] = ListAttributeDefinition.new(type_name: type_name,
29
29
  exclude_when: exclude_when,
30
30
  default: default)
31
31
  define_accessors(name)
32
32
  end
33
- # rubocop:enable Style/PredicateName
33
+ # rubocop:enable Naming/PredicateName
34
34
 
35
35
  def attribute(name, type_name, exclude_when: [], default: nil)
36
36
  attribute_definitions[name] = AttributeDefinition.new(type_name: type_name,
@@ -19,6 +19,8 @@ module Nylas
19
19
 
20
20
  private def cast(key, value)
21
21
  attribute_definitions[key].cast(value)
22
+ rescue TypeError => e
23
+ raise TypeError, "#{key} #{e.message}"
22
24
  end
23
25
 
24
26
  # Merges data into the registry while casting input types correctly
@@ -31,7 +33,7 @@ module Nylas
31
33
  def to_h(keys: attribute_definitions.keys)
32
34
  keys.each_with_object({}) do |key, casted_data|
33
35
  value = attribute_definitions[key].serialize(self[key])
34
- casted_data[key] = value unless value.nil? || value.empty?
36
+ casted_data[key] = value unless value.nil? || (value.respond_to?(:empty?) && value.empty?)
35
37
  end
36
38
  end
37
39
 
@@ -0,0 +1,31 @@
1
+ module Nylas
2
+ # Authenticate your application using the native interface
3
+ # @see https://docs.nylas.com/reference#native-authentication-1
4
+ class NativeAuthentication
5
+ attr_accessor :api
6
+ def initialize(api:)
7
+ self.api = api
8
+ end
9
+
10
+ def authenticate(name:, email_address:, provider:, settings:, reauth_account_id: nil)
11
+ code = retrieve_code(name: name, email_address: email_address, provider: provider,
12
+ settings: settings, reauth_account_id: reauth_account_id)
13
+
14
+ exchange_code_for_access_token(code)
15
+ end
16
+
17
+ private def retrieve_code(name:, email_address:, provider:, settings:, reauth_account_id:)
18
+ payload = { client_id: api.client.app_id, name: name, email_address: email_address,
19
+ provider: provider, settings: settings }
20
+ payload[:reauth_account_id] = reauth_account_id
21
+ response = api.execute(method: :post, path: "/connect/authorize", payload: JSON.dump(payload))
22
+ response[:code]
23
+ end
24
+
25
+ private def exchange_code_for_access_token(code)
26
+ payload = { client_id: api.client.app_id, client_secret: api.client.app_secret, code: code }
27
+ response = api.execute(method: :post, path: "/connect/token", payload: JSON.dump(payload))
28
+ response[:access_token]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ module Nylas
2
+ # Data structure for seending a message via the Nylas API
3
+ class NewMessage
4
+ include Model
5
+ self.creatable = false
6
+ self.showable = false
7
+ self.listable = false
8
+ self.filterable = false
9
+ self.updatable = false
10
+ self.destroyable = false
11
+
12
+ has_n_of_attribute :to, :email_address
13
+ has_n_of_attribute :from, :email_address
14
+ has_n_of_attribute :cc, :email_address
15
+ has_n_of_attribute :bcc, :email_address
16
+
17
+ attribute :subject, :string
18
+ attribute :body, :string
19
+ attribute :reply_to_message_id, :string
20
+
21
+ has_n_of_attribute :file_ids, :string
22
+
23
+ attribute :tracking, :message_tracking
24
+
25
+ def send!
26
+ Message.new(api.execute(method: :post, path: "/send", payload: to_json).merge(api: api))
27
+ end
28
+ end
29
+ end
@@ -11,8 +11,11 @@ module Nylas
11
11
  end
12
12
 
13
13
  # Serializes, Deserializes between {NylasDate} objects and a {Hash}
14
- class NylasDateType < Types::HashType
15
- casts_to NylasDate
14
+ class NylasDateType < Types::ModelType
15
+ def initialize
16
+ super(model: NylasDate)
17
+ end
18
+
16
19
  def cast(value)
17
20
  value.is_a?(String) ? super({ object: "date", date: value }) : super
18
21
  end
@@ -0,0 +1,10 @@
1
+ module Nylas
2
+ # Structure to represent the Participant
3
+ class Participant
4
+ include Model::Attributable
5
+ attribute :name, :string
6
+ attribute :email, :string
7
+ attribute :comment, :string
8
+ attribute :status, :string
9
+ end
10
+ end
@@ -6,9 +6,4 @@ module Nylas
6
6
  attribute :type, :string
7
7
  attribute :number, :string
8
8
  end
9
-
10
- # Serializes, Deserializes between {PhoneNumber} objects and a {Hash}
11
- class PhoneNumberType < Types::HashType
12
- casts_to PhoneNumber
13
- end
14
9
  end
@@ -11,9 +11,4 @@ module Nylas
11
11
  attribute :city, :string
12
12
  attribute :country, :string
13
13
  end
14
-
15
- # Serializes, Deserializes between {PhysicalAddress} objects and a {Hash}
16
- class PhysicalAddressType < Types::HashType
17
- casts_to PhysicalAddress
18
- end
19
14
  end
@@ -0,0 +1,15 @@
1
+ module Nylas
2
+ # Allows sending of email with nylas from an rfc822 compatible string
3
+ class RawMessage
4
+ attr_accessor :api, :mime_compatible_string
5
+ def initialize(mime_compatible_string, api:)
6
+ self.api = api
7
+ self.mime_compatible_string = mime_compatible_string
8
+ end
9
+
10
+ def send!
11
+ Message.new(api.execute(method: :post, path: "/send", payload: mime_compatible_string,
12
+ headers: { "Content-type" => "message/rfc822" }).merge(api: api))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Nylas
2
+ # Representation of a Recurrence object
3
+ # @see https://docs.nylas.com/reference#section-recurrence
4
+ class Recurrence
5
+ include Model::Attributable
6
+ has_n_of_attribute :rrule, :string
7
+ attribute :timezone, :string
8
+ end
9
+ end