nylas 5.17.0 → 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/nylas/client.rb +121 -0
- data/lib/nylas/config.rb +19 -0
- data/lib/nylas/errors.rb +63 -89
- data/lib/nylas/handler/api_operations.rb +162 -0
- data/lib/nylas/handler/http_client.rb +252 -0
- data/lib/nylas/resources/applications.rb +27 -0
- data/lib/nylas/resources/attachments.rb +65 -0
- data/lib/nylas/resources/auth.rb +209 -0
- data/lib/nylas/resources/calendars.rb +101 -0
- data/lib/nylas/resources/connectors.rb +80 -0
- data/lib/nylas/resources/contacts.rb +89 -0
- data/lib/nylas/resources/credentials.rb +75 -0
- data/lib/nylas/resources/drafts.rb +121 -0
- data/lib/nylas/resources/events.rb +98 -0
- data/lib/nylas/resources/folders.rb +73 -0
- data/lib/nylas/resources/grants.rb +59 -0
- data/lib/nylas/resources/messages.rb +135 -0
- data/lib/nylas/resources/redirect_uris.rb +68 -0
- data/lib/nylas/resources/resource.rb +18 -0
- data/lib/nylas/resources/smart_compose.rb +36 -0
- data/lib/nylas/resources/threads.rb +62 -0
- data/lib/nylas/resources/webhooks.rb +121 -0
- data/lib/nylas/utils/file_utils.rb +61 -0
- data/lib/nylas/version.rb +1 -1
- data/lib/nylas.rb +31 -148
- metadata +88 -247
- data/lib/nylas/account.rb +0 -56
- data/lib/nylas/api.rb +0 -246
- data/lib/nylas/application_details.rb +0 -13
- data/lib/nylas/calendar.rb +0 -46
- data/lib/nylas/calendar_collection.rb +0 -144
- data/lib/nylas/categorize.rb +0 -14
- data/lib/nylas/collection.rb +0 -175
- data/lib/nylas/component.rb +0 -35
- data/lib/nylas/component_collection.rb +0 -10
- data/lib/nylas/constraints.rb +0 -56
- data/lib/nylas/contact.rb +0 -53
- data/lib/nylas/contact_group.rb +0 -23
- data/lib/nylas/current_account.rb +0 -23
- data/lib/nylas/delta.rb +0 -56
- data/lib/nylas/deltas.rb +0 -19
- data/lib/nylas/deltas_collection.rb +0 -40
- data/lib/nylas/draft.rb +0 -100
- data/lib/nylas/email_address.rb +0 -12
- data/lib/nylas/event.rb +0 -144
- data/lib/nylas/event_collection.rb +0 -15
- data/lib/nylas/event_conferencing.rb +0 -12
- data/lib/nylas/event_conferencing_autocreate.rb +0 -10
- data/lib/nylas/event_conferencing_details.rb +0 -14
- data/lib/nylas/event_notification.rb +0 -17
- data/lib/nylas/file.rb +0 -75
- data/lib/nylas/filter_attributes.rb +0 -25
- data/lib/nylas/folder.rb +0 -26
- data/lib/nylas/free_busy.rb +0 -13
- data/lib/nylas/free_busy_collection.rb +0 -48
- data/lib/nylas/http_client.rb +0 -279
- data/lib/nylas/im_address.rb +0 -11
- data/lib/nylas/job_status.rb +0 -27
- data/lib/nylas/job_status_collection.rb +0 -21
- data/lib/nylas/label.rb +0 -27
- data/lib/nylas/logging.rb +0 -41
- data/lib/nylas/message.rb +0 -98
- data/lib/nylas/message_headers.rb +0 -27
- data/lib/nylas/message_tracking.rb +0 -13
- data/lib/nylas/model/attributable.rb +0 -89
- data/lib/nylas/model/attribute_definition.rb +0 -24
- data/lib/nylas/model/attributes.rb +0 -97
- data/lib/nylas/model/list_attribute_definition.rb +0 -39
- data/lib/nylas/model/transferable.rb +0 -53
- data/lib/nylas/model.rb +0 -217
- data/lib/nylas/native_authentication.rb +0 -39
- data/lib/nylas/neural.rb +0 -87
- data/lib/nylas/neural_categorizer.rb +0 -29
- data/lib/nylas/neural_clean_conversation.rb +0 -33
- data/lib/nylas/neural_contact_link.rb +0 -11
- data/lib/nylas/neural_contact_name.rb +0 -11
- data/lib/nylas/neural_message_options.rb +0 -35
- data/lib/nylas/neural_ocr.rb +0 -16
- data/lib/nylas/neural_sentiment_analysis.rb +0 -17
- data/lib/nylas/neural_signature_contact.rb +0 -81
- data/lib/nylas/neural_signature_extraction.rb +0 -18
- data/lib/nylas/new_message.rb +0 -39
- data/lib/nylas/nylas_date.rb +0 -25
- data/lib/nylas/open_hours.rb +0 -15
- data/lib/nylas/outbox.rb +0 -116
- data/lib/nylas/outbox_job_status.rb +0 -19
- data/lib/nylas/outbox_message.rb +0 -17
- data/lib/nylas/participant.rb +0 -13
- data/lib/nylas/phone_number.rb +0 -11
- data/lib/nylas/physical_address.rb +0 -17
- data/lib/nylas/raw_message.rb +0 -25
- data/lib/nylas/recurrence.rb +0 -11
- data/lib/nylas/registry.rb +0 -42
- data/lib/nylas/room_resource.rb +0 -19
- data/lib/nylas/rsvp.rb +0 -24
- data/lib/nylas/scheduler.rb +0 -51
- data/lib/nylas/scheduler_booking_confirmation.rb +0 -24
- data/lib/nylas/scheduler_booking_request.rb +0 -17
- data/lib/nylas/scheduler_collection.rb +0 -104
- data/lib/nylas/scheduler_config.rb +0 -20
- data/lib/nylas/scheduler_time_slot.rb +0 -14
- data/lib/nylas/search_collection.rb +0 -10
- data/lib/nylas/send_grid_verified_status.rb +0 -12
- data/lib/nylas/services/tunnel.rb +0 -128
- data/lib/nylas/thread.rb +0 -66
- data/lib/nylas/time_slot.rb +0 -16
- data/lib/nylas/time_slot_capacity.rb +0 -13
- data/lib/nylas/timespan.rb +0 -20
- data/lib/nylas/token_info.rb +0 -20
- data/lib/nylas/types.rb +0 -168
- data/lib/nylas/web_page.rb +0 -11
- data/lib/nylas/webhook.rb +0 -111
- data/lib/nylas/when.rb +0 -75
data/lib/nylas/scheduler.rb
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Ruby representation of a the Nylas Scheduler API
|
|
5
|
-
# @see https://developer.nylas.com/docs/api/scheduler/#overview
|
|
6
|
-
class Scheduler
|
|
7
|
-
include Model
|
|
8
|
-
self.resources_path = "/manage/pages"
|
|
9
|
-
self.creatable = true
|
|
10
|
-
self.listable = true
|
|
11
|
-
self.showable = true
|
|
12
|
-
self.filterable = true
|
|
13
|
-
self.updatable = true
|
|
14
|
-
self.destroyable = true
|
|
15
|
-
|
|
16
|
-
attribute :id, :integer, read_only: true
|
|
17
|
-
attribute :app_client_id, :string
|
|
18
|
-
attribute :app_organization_id, :integer
|
|
19
|
-
attribute :config, :scheduler_config
|
|
20
|
-
attribute :edit_token, :string
|
|
21
|
-
attribute :name, :string
|
|
22
|
-
attribute :slug, :string
|
|
23
|
-
attribute :created_at, :date
|
|
24
|
-
attribute :modified_at, :date
|
|
25
|
-
|
|
26
|
-
has_n_of_attribute :access_tokens, :string
|
|
27
|
-
|
|
28
|
-
def get_available_calendars
|
|
29
|
-
raise ArgumentError, "Cannot get calendars for a page without an ID." if id.nil?
|
|
30
|
-
|
|
31
|
-
api.execute(
|
|
32
|
-
method: :get,
|
|
33
|
-
path: "/manage/pages/#{id}/calendars"
|
|
34
|
-
)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def upload_image(content_type:, object_name:)
|
|
38
|
-
raise ArgumentError, "Cannot upload an image to a page without an ID." if id.nil?
|
|
39
|
-
|
|
40
|
-
payload = {
|
|
41
|
-
contentType: content_type,
|
|
42
|
-
objectName: object_name
|
|
43
|
-
}
|
|
44
|
-
api.execute(
|
|
45
|
-
method: :put,
|
|
46
|
-
path: "/manage/pages/#{id}/upload-image",
|
|
47
|
-
payload: JSON.dump(payload)
|
|
48
|
-
)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Structure to represent the booking response returned from the Scheduler API
|
|
5
|
-
class SchedulerBookingConfirmation
|
|
6
|
-
include Model::Attributable
|
|
7
|
-
attribute :id, :integer
|
|
8
|
-
attribute :account_id, :string
|
|
9
|
-
attribute :calendar_event_id, :string
|
|
10
|
-
attribute :calendar_id, :string
|
|
11
|
-
attribute :edit_hash, :string
|
|
12
|
-
attribute :location, :string
|
|
13
|
-
attribute :title, :string
|
|
14
|
-
attribute :recipient_email, :string
|
|
15
|
-
attribute :recipient_locale, :string
|
|
16
|
-
attribute :recipient_name, :string
|
|
17
|
-
attribute :recipient_tz, :string
|
|
18
|
-
attribute :additional_field_values, :hash
|
|
19
|
-
attribute :is_confirmed, :boolean
|
|
20
|
-
attribute :start_time, :unix_timestamp
|
|
21
|
-
attribute :end_time, :unix_timestamp
|
|
22
|
-
has_n_of_attribute :additional_emails, :string
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Structure to represent the booking request used for the Scheduler API
|
|
5
|
-
class SchedulerBookingRequest
|
|
6
|
-
include Model::Attributable
|
|
7
|
-
attribute :additional_values, :hash
|
|
8
|
-
attribute :email, :string
|
|
9
|
-
attribute :locale, :string
|
|
10
|
-
attribute :name, :string
|
|
11
|
-
attribute :page_hostname, :string
|
|
12
|
-
attribute :replaces_booking_hash, :string
|
|
13
|
-
attribute :timezone, :string
|
|
14
|
-
attribute :slot, :scheduler_time_slot
|
|
15
|
-
has_n_of_attribute :additional_emails, :string
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Additional methods for some of Scheduler's other functionality
|
|
5
|
-
# @see https://developer.nylas.com/docs/api/scheduler#overview
|
|
6
|
-
class SchedulerCollection < Collection
|
|
7
|
-
# Retrieve Google availability
|
|
8
|
-
# @return [Hash] Returns the availability
|
|
9
|
-
def get_google_availability
|
|
10
|
-
execute_provider_availability("google")
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Retrieve Office 365 availability
|
|
14
|
-
# @return [Hash] Returns the availability
|
|
15
|
-
def get_office_365_availability
|
|
16
|
-
execute_provider_availability("o365")
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Retrieve public config for a scheduling page
|
|
20
|
-
# @param slug [String] The Scheduler page slug
|
|
21
|
-
# @return [Scheduler] Returns the Scheduler object representing the page configuration
|
|
22
|
-
def get_page_slug(slug)
|
|
23
|
-
page_response = api.execute(
|
|
24
|
-
method: :get,
|
|
25
|
-
path: "/schedule/#{slug}/info"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
Scheduler.new(**page_response.merge(api: api))
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Retrieve available time slots
|
|
32
|
-
# @param slug [String] The Scheduler page slug
|
|
33
|
-
# @return [Array<SchedulerTimeSlot>] Returns the list of available timeslots
|
|
34
|
-
def get_available_time_slots(slug)
|
|
35
|
-
response = api.execute(
|
|
36
|
-
method: :get,
|
|
37
|
-
path: "/schedule/#{slug}/timeslots"
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
timeslots = []
|
|
41
|
-
response.each do |available_slot|
|
|
42
|
-
timeslots.push(SchedulerTimeSlot.new(**available_slot.merge(api: api)))
|
|
43
|
-
end
|
|
44
|
-
timeslots
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Book a time slot
|
|
48
|
-
# @param slug [String] The Scheduler page slug
|
|
49
|
-
# @param timeslot [SchedulerBookingRequest] The time slot booking request
|
|
50
|
-
# @return [SchedulerBookingConfirmation] Returns the booking confirmation
|
|
51
|
-
def book_time_slot(slug, timeslot)
|
|
52
|
-
payload = timeslot.to_h
|
|
53
|
-
# The booking endpoint requires additional_values and additional_emails
|
|
54
|
-
# to exist regardless if they are empty or not
|
|
55
|
-
payload[:additional_values] = {} unless payload[:additional_values]
|
|
56
|
-
payload[:additional_emails] = [] unless payload[:additional_emails]
|
|
57
|
-
booking_response = api.execute(
|
|
58
|
-
method: :post,
|
|
59
|
-
path: "/schedule/#{slug}/timeslots",
|
|
60
|
-
payload: JSON.dump(payload)
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
SchedulerBookingConfirmation.new(**booking_response.merge(api: api))
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Cancel a booking
|
|
67
|
-
# @param slug [String] The Scheduler page slug
|
|
68
|
-
# @param edit_hash [String] The token used for editing the booked time slot
|
|
69
|
-
# @param reason [String] The reason for cancelling the booking
|
|
70
|
-
# @return [Hash] Returns a hash of a boolean representing success of cancellation
|
|
71
|
-
def cancel_booking(slug, edit_hash, reason)
|
|
72
|
-
api.execute(
|
|
73
|
-
method: :post,
|
|
74
|
-
path: "/schedule/#{slug}/#{edit_hash}/cancel",
|
|
75
|
-
payload: JSON.dump(reason: reason)
|
|
76
|
-
)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Confirm a booking
|
|
80
|
-
# @param slug [String] The Scheduler page slug
|
|
81
|
-
# @param edit_hash [String] The token used for editing the booked time slot
|
|
82
|
-
# @return [SchedulerBookingConfirmation] Returns the confirmed booking confirmation
|
|
83
|
-
def confirm_booking(slug, edit_hash)
|
|
84
|
-
booking_response = api.execute(
|
|
85
|
-
method: :post,
|
|
86
|
-
path: "/schedule/#{slug}/#{edit_hash}/confirm",
|
|
87
|
-
payload: {}
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
SchedulerBookingConfirmation.new(**booking_response.merge(api: api))
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
private
|
|
94
|
-
|
|
95
|
-
# Retrieve provider availability
|
|
96
|
-
# @return [Hash] Returns the availability
|
|
97
|
-
def execute_provider_availability(provider)
|
|
98
|
-
api.execute(
|
|
99
|
-
method: :get,
|
|
100
|
-
path: "/schedule/availability/#{provider}"
|
|
101
|
-
)
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Configuration settings for a Scheduler page
|
|
5
|
-
# @see https://developer.nylas.com/docs/api/scheduler
|
|
6
|
-
class SchedulerConfig
|
|
7
|
-
include Model::Attributable
|
|
8
|
-
|
|
9
|
-
attribute :appearance, :hash
|
|
10
|
-
attribute :booking, :hash
|
|
11
|
-
attribute :calendar_ids, :hash
|
|
12
|
-
attribute :event, :hash
|
|
13
|
-
attribute :expire_after, :hash
|
|
14
|
-
attribute :locale, :string
|
|
15
|
-
attribute :locale_for_guests, :string
|
|
16
|
-
attribute :timezone, :string
|
|
17
|
-
|
|
18
|
-
has_n_of_attribute :reminders, :hash
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Structure to represent the time slot object from the Scheduler API
|
|
5
|
-
class SchedulerTimeSlot
|
|
6
|
-
include Model::Attributable
|
|
7
|
-
attribute :account_id, :string
|
|
8
|
-
attribute :calendar_id, :string
|
|
9
|
-
attribute :host_name, :string
|
|
10
|
-
attribute :start, :unix_timestamp
|
|
11
|
-
attribute :end, :unix_timestamp
|
|
12
|
-
has_n_of_attribute :emails, :string
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Ruby representation of a Nylas Send Grid verified status object
|
|
5
|
-
# @see https://docs.nylas.com/reference#drafts
|
|
6
|
-
class SendGridVerifiedStatus
|
|
7
|
-
include Model::Attributable
|
|
8
|
-
|
|
9
|
-
attribute :domain_verified, :boolean
|
|
10
|
-
attribute :sender_verified, :boolean
|
|
11
|
-
end
|
|
12
|
-
end
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "securerandom"
|
|
4
|
-
require "faye/websocket"
|
|
5
|
-
require "eventmachine"
|
|
6
|
-
|
|
7
|
-
module Nylas
|
|
8
|
-
# Class containing methods to spin up a developmental websocket connection to test webhooks
|
|
9
|
-
class Tunnel
|
|
10
|
-
# Open a webhook tunnel and register it with the Nylas API
|
|
11
|
-
# 1. Creates a UUID
|
|
12
|
-
# 2. Opens a websocket connection to Nylas' webhook forwarding service, with the UUID as a header
|
|
13
|
-
# 3. Creates a new webhook pointed at the forwarding service with the UUID as the path
|
|
14
|
-
# When an event is received by the forwarding service, it will push directly to this websocket connection
|
|
15
|
-
#
|
|
16
|
-
# @param api [Nylas::API] The configured Nylas API client
|
|
17
|
-
# @param config [Hash] Configuration for the webhook tunnel, including callback functions, region, and
|
|
18
|
-
# events to subscribe to
|
|
19
|
-
def self.open_webhook_tunnel(api, config = {})
|
|
20
|
-
tunnel_id = SecureRandom.uuid
|
|
21
|
-
triggers = config[:triggers] || WebhookTrigger.constants(false).map { |c| WebhookTrigger.const_get c }
|
|
22
|
-
region = config[:region] || "us"
|
|
23
|
-
websocket_domain = "tunnel.nylas.com"
|
|
24
|
-
callback_domain = "cb.nylas.com"
|
|
25
|
-
|
|
26
|
-
EM.run do
|
|
27
|
-
setup_websocket_client(websocket_domain, api, tunnel_id, region, config)
|
|
28
|
-
register_webhook_callback(api, callback_domain, tunnel_id, triggers)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Register callback with the Nylas forwarding service which will pass messages to the websocket
|
|
33
|
-
# @param api [Nylas::API] The configured Nylas API client
|
|
34
|
-
# @param callback_domain [String] The domain name of the callback
|
|
35
|
-
# @param tunnel_path [String] The path to the tunnel
|
|
36
|
-
# @param triggers [Array<WebhookTrigger>] The list of triggers to subscribe to
|
|
37
|
-
# @return [Nylas::Webhook] The webhook details response from the API
|
|
38
|
-
def self.register_webhook_callback(api, callback_domain, tunnel_path, triggers)
|
|
39
|
-
callback_url = "https://#{callback_domain}/#{tunnel_path}"
|
|
40
|
-
|
|
41
|
-
api.webhooks.create(
|
|
42
|
-
callback_url: callback_url,
|
|
43
|
-
state: WebhookState::ACTIVE,
|
|
44
|
-
triggers: triggers
|
|
45
|
-
)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Setup the websocket client and register the callbacks
|
|
49
|
-
# @param websocket_domain [String] The domain of the websocket to connect to
|
|
50
|
-
# @param api [Nylas::API] The configured Nylas API client
|
|
51
|
-
# @param tunnel_id [String] The ID of the tunnel
|
|
52
|
-
# @param region [String] The Nylas region to configure for
|
|
53
|
-
# @param config [Hash] The object containing all the callback methods
|
|
54
|
-
# @return [WebSocket::Client] The configured websocket client
|
|
55
|
-
def self.setup_websocket_client(websocket_domain, api, tunnel_id, region, config)
|
|
56
|
-
ws = Faye::WebSocket::Client.new(
|
|
57
|
-
"wss://#{websocket_domain}",
|
|
58
|
-
[],
|
|
59
|
-
{
|
|
60
|
-
headers: {
|
|
61
|
-
"Client-Id" => api.client.app_id,
|
|
62
|
-
"Client-Secret" => api.client.app_secret,
|
|
63
|
-
"Tunnel-Id" => tunnel_id,
|
|
64
|
-
"Region" => region
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
ws.on :open do |event|
|
|
70
|
-
config[:on_open].call(event) if callable(config[:on_open])
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
ws.on :close do |close|
|
|
74
|
-
config[:on_close].call(close) if callable(config[:on_close])
|
|
75
|
-
EM.stop
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
ws.on :error do |error|
|
|
79
|
-
config[:on_error].call(error) if callable(config[:on_error])
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
ws.on :message do |message|
|
|
83
|
-
deltas = parse_deltas_from_message(message)
|
|
84
|
-
next if deltas.nil?
|
|
85
|
-
|
|
86
|
-
deltas.each do |delta|
|
|
87
|
-
delta = merge_and_create_delta(delta)
|
|
88
|
-
config[:on_message].call(delta) if callable(config[:on_message])
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
ws
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Check if the object is a method
|
|
96
|
-
# @param obj [Any] The object to check
|
|
97
|
-
# @return [Boolean] True if the object is a method
|
|
98
|
-
def self.callable(obj)
|
|
99
|
-
!obj.nil? && obj.respond_to?(:call)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Parse deltas from the message object
|
|
103
|
-
# @param message [Any] The message object containing the deltas
|
|
104
|
-
# @return [Hash] The parsed list of deltas
|
|
105
|
-
def self.parse_deltas_from_message(message)
|
|
106
|
-
return unless message.data
|
|
107
|
-
|
|
108
|
-
json = JSON.parse(message.data)
|
|
109
|
-
JSON.parse(json["body"])["deltas"]
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# Clean up and create the delta object
|
|
113
|
-
# @param delta [Hash] The hash containing the delta attributes from the API
|
|
114
|
-
# @return [Nylas::Delta] The delta object
|
|
115
|
-
def self.merge_and_create_delta(delta)
|
|
116
|
-
object_data = delta.delete("object_data")
|
|
117
|
-
attributes = object_data.delete("attributes")
|
|
118
|
-
object_data["object_attributes"] = attributes
|
|
119
|
-
delta = delta.merge(object_data).transform_keys(&:to_sym)
|
|
120
|
-
Delta.new(**delta)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
private_class_method :setup_websocket_client,
|
|
124
|
-
:callable,
|
|
125
|
-
:parse_deltas_from_message,
|
|
126
|
-
:merge_and_create_delta
|
|
127
|
-
end
|
|
128
|
-
end
|
data/lib/nylas/thread.rb
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Ruby representation of the Nylas /threads API
|
|
5
|
-
# @see https://docs.nylas.com/reference#threads
|
|
6
|
-
class Thread
|
|
7
|
-
include Model
|
|
8
|
-
self.searchable = true
|
|
9
|
-
self.listable = true
|
|
10
|
-
self.filterable = true
|
|
11
|
-
self.updatable = true
|
|
12
|
-
self.id_listable = true
|
|
13
|
-
self.countable = true
|
|
14
|
-
|
|
15
|
-
self.resources_path = "/threads"
|
|
16
|
-
|
|
17
|
-
attribute :id, :string
|
|
18
|
-
attribute :object, :string
|
|
19
|
-
attribute :account_id, :string
|
|
20
|
-
has_n_of_attribute :draft_ids, :string
|
|
21
|
-
attribute :first_message_timestamp, :unix_timestamp
|
|
22
|
-
attribute :has_attachments, :boolean
|
|
23
|
-
|
|
24
|
-
attribute :last_message_timestamp, :unix_timestamp
|
|
25
|
-
attribute :last_message_received_timestamp, :unix_timestamp
|
|
26
|
-
attribute :last_message_sent_timestamp, :unix_timestamp
|
|
27
|
-
|
|
28
|
-
has_n_of_attribute :labels, :label
|
|
29
|
-
has_n_of_attribute :folders, :folder
|
|
30
|
-
has_n_of_attribute :message_ids, :string
|
|
31
|
-
has_n_of_attribute :messages, :message
|
|
32
|
-
has_n_of_attribute :participants, :participant
|
|
33
|
-
attribute :snippet, :string
|
|
34
|
-
attribute :starred, :boolean
|
|
35
|
-
attribute :subject, :string
|
|
36
|
-
attribute :unread, :boolean
|
|
37
|
-
attribute :version, :integer
|
|
38
|
-
attribute :folder_id, :string
|
|
39
|
-
|
|
40
|
-
has_n_of_attribute :label_ids, :string
|
|
41
|
-
|
|
42
|
-
transfer :api, to: %i[labels folders]
|
|
43
|
-
|
|
44
|
-
UPDATABLE_ATTRIBUTES = %i[label_ids folder_id starred unread].freeze
|
|
45
|
-
def update(data)
|
|
46
|
-
unupdatable_attributes = data.keys.reject { |name| UPDATABLE_ATTRIBUTES.include?(name) }
|
|
47
|
-
unless unupdatable_attributes.empty?
|
|
48
|
-
raise ArgumentError, "Cannot update #{unupdatable_attributes} only " \
|
|
49
|
-
"#{UPDATABLE_ATTRIBUTES} are updatable"
|
|
50
|
-
end
|
|
51
|
-
super(**data)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def update_folder(folder_id)
|
|
55
|
-
update(folder_id: folder_id)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def starred?
|
|
59
|
-
starred
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def unread?
|
|
63
|
-
unread
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
data/lib/nylas/time_slot.rb
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Query free/busy information for a calendar during a certain time period
|
|
5
|
-
# @see https://docs.nylas.com/reference#calendars-free-busy
|
|
6
|
-
class TimeSlot
|
|
7
|
-
include Model::Attributable
|
|
8
|
-
|
|
9
|
-
attribute :object, :string
|
|
10
|
-
attribute :status, :string
|
|
11
|
-
attribute :start_time, :unix_timestamp
|
|
12
|
-
attribute :end_time, :unix_timestamp
|
|
13
|
-
attribute :capacity, :time_slot_capacity
|
|
14
|
-
has_n_of_attribute :emails, :string
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Capacity values for a timeslot
|
|
5
|
-
# @see https://docs.nylas.com/reference#calendars-free-busy
|
|
6
|
-
class TimeSlotCapacity
|
|
7
|
-
include Model::Attributable
|
|
8
|
-
|
|
9
|
-
attribute :event_id, :string
|
|
10
|
-
attribute :current_capacity, :integer
|
|
11
|
-
attribute :max_capacity, :integer
|
|
12
|
-
end
|
|
13
|
-
end
|
data/lib/nylas/timespan.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Structure to represent a Nylas Timespan.
|
|
5
|
-
# @see https://docs.nylas.com/reference#section-timespan
|
|
6
|
-
class Timespan
|
|
7
|
-
extend Forwardable
|
|
8
|
-
|
|
9
|
-
include Model::Attributable
|
|
10
|
-
attribute :object, :string
|
|
11
|
-
attribute :start_time, :unix_timestamp
|
|
12
|
-
attribute :end_time, :unix_timestamp
|
|
13
|
-
|
|
14
|
-
def_delegators :range, :cover?
|
|
15
|
-
|
|
16
|
-
def range
|
|
17
|
-
@range ||= Range.new(start_time, end_time)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
data/lib/nylas/token_info.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Structure to represent information about a Nylas access token.
|
|
5
|
-
# @see https://developer.nylas.com/docs/api/#post/a/client_id/accounts/id/token-info
|
|
6
|
-
class TokenInfo
|
|
7
|
-
include Model::Attributable
|
|
8
|
-
|
|
9
|
-
attribute :scopes, :string
|
|
10
|
-
attribute :state, :string
|
|
11
|
-
attribute :created_at, :unix_timestamp
|
|
12
|
-
attribute :updated_at, :unix_timestamp
|
|
13
|
-
|
|
14
|
-
# Returns the state of the token as a boolean
|
|
15
|
-
# @return [Boolean] If the token is active
|
|
16
|
-
def valid?
|
|
17
|
-
state == "valid"
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
data/lib/nylas/types.rb
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Nylas
|
|
4
|
-
# Collection of attribute types
|
|
5
|
-
module Types
|
|
6
|
-
def self.registry
|
|
7
|
-
@registry ||= Registry.new
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Base type for attributes
|
|
11
|
-
class ValueType
|
|
12
|
-
def cast(object)
|
|
13
|
-
object
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def serialize(object)
|
|
17
|
-
object
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def deseralize(object)
|
|
21
|
-
object
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def serialize_for_api(object)
|
|
25
|
-
serialize(object)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Casts/Serializes data that is persisted and used natively as a Hash
|
|
30
|
-
class HashType < ValueType
|
|
31
|
-
def serialize(object)
|
|
32
|
-
object.to_h
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def cast(value)
|
|
36
|
-
return JSON.parse(value, symbolize_names: true) if value.is_a?(String)
|
|
37
|
-
return value if value.respond_to?(:key)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
Types.registry[:hash] = HashType.new
|
|
41
|
-
|
|
42
|
-
# Type for attributes that are persisted in the API as a hash but exposed in ruby as a particular
|
|
43
|
-
# {Model} or Model-like thing.
|
|
44
|
-
class ModelType < ValueType
|
|
45
|
-
attr_accessor :model
|
|
46
|
-
|
|
47
|
-
def initialize(model:)
|
|
48
|
-
super()
|
|
49
|
-
self.model = model
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def serialize(object)
|
|
53
|
-
object.to_h
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def serialize_for_api(object)
|
|
57
|
-
object&.to_h(enforce_read_only: true)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def cast(value)
|
|
61
|
-
return model.new if value.nil?
|
|
62
|
-
return value if already_cast?(value)
|
|
63
|
-
return model.new(**actual_attributes(value)) if value.respond_to?(:key?)
|
|
64
|
-
|
|
65
|
-
raise TypeError, "Unable to cast #{value} to a #{model}"
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def already_cast?(value)
|
|
69
|
-
model.attribute_definitions.keys.all? { |attribute_name| value.respond_to?(attribute_name) }
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def actual_attributes(hash)
|
|
73
|
-
model.attribute_definitions.keys.each_with_object({}) do |attribute_name, attributes|
|
|
74
|
-
attributes[attribute_name] = hash[json_key_from_attribute_name(attribute_name)]
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def json_key_from_attribute_name(name)
|
|
79
|
-
name
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Type for attributes represented as a unix timestamp in the API and Time in Ruby
|
|
84
|
-
class UnixTimestampType < ValueType
|
|
85
|
-
def cast(object)
|
|
86
|
-
return object if object.is_a?(Time) || object.nil?
|
|
87
|
-
return Time.at(object.to_i) if object.is_a?(String)
|
|
88
|
-
return Time.at(object) if object.is_a?(Numeric)
|
|
89
|
-
return object.to_time if object.is_a?(Date)
|
|
90
|
-
|
|
91
|
-
raise TypeError, "Unable to cast #{object} to Time"
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def deserialize(object)
|
|
95
|
-
cast(object)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def serialize(object)
|
|
99
|
-
return nil if object.nil?
|
|
100
|
-
|
|
101
|
-
object.to_i
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
Types.registry[:unix_timestamp] = UnixTimestampType.new
|
|
105
|
-
|
|
106
|
-
# Type for attributes represented as an iso8601 dates in the API and Date in Ruby
|
|
107
|
-
class DateType < ValueType
|
|
108
|
-
def cast(value)
|
|
109
|
-
return nil if value.nil?
|
|
110
|
-
|
|
111
|
-
Date.parse(value)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def serialize(value)
|
|
115
|
-
return value.iso8601 if value.respond_to?(:iso8601)
|
|
116
|
-
|
|
117
|
-
value
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
Types.registry[:date] = DateType.new
|
|
121
|
-
|
|
122
|
-
# Type for attributes represented as pure strings both within the API and in Ruby
|
|
123
|
-
class StringType < ValueType
|
|
124
|
-
# @param value [Object] Casts the passed in object to a string using #to_s
|
|
125
|
-
def cast(value)
|
|
126
|
-
return value if value.nil?
|
|
127
|
-
|
|
128
|
-
value.to_s
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
Types.registry[:string] = StringType.new
|
|
132
|
-
|
|
133
|
-
# Type for attributes represented as pure integers both within the API and in Ruby
|
|
134
|
-
class IntegerType < ValueType
|
|
135
|
-
# @param value [Object] Casts the passed in object to an integer using to_i
|
|
136
|
-
def cast(value)
|
|
137
|
-
return nil if value.nil?
|
|
138
|
-
|
|
139
|
-
value.to_i
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
Types.registry[:integer] = IntegerType.new
|
|
143
|
-
|
|
144
|
-
# Type for attributes represented as booleans.
|
|
145
|
-
class BooleanType < ValueType
|
|
146
|
-
# @param value [Object] Strictly casts the passed in value to a boolean (must be true, not "" or 1)
|
|
147
|
-
def cast(value)
|
|
148
|
-
return nil if value.nil?
|
|
149
|
-
return true if value == true
|
|
150
|
-
return false if value == false
|
|
151
|
-
|
|
152
|
-
raise TypeError, "#{value} must be either true or false"
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
Types.registry[:boolean] = BooleanType.new
|
|
156
|
-
|
|
157
|
-
# Type for attributes represented as floats.
|
|
158
|
-
class FloatType < ValueType
|
|
159
|
-
# @param value [Object] Strictly casts the passed in value to a boolean (must be true, not "" or 1)
|
|
160
|
-
def cast(value)
|
|
161
|
-
return nil if value.nil?
|
|
162
|
-
|
|
163
|
-
value.to_f
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
Types.registry[:float] = FloatType.new
|
|
167
|
-
end
|
|
168
|
-
end
|