calendly 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,23 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/loggable'
4
+
3
5
  module Calendly
4
6
  # calendly module's base error object
5
7
  class Error < StandardError
8
+ include Loggable
9
+
6
10
  def initialize(message = nil)
7
11
  @logger = Calendly.configuration.logger
8
12
  msg = "#{self.class} occured."
9
13
  msg += " status:#{status}" if respond_to?(:status)
10
14
  msg += " message:#{message}"
11
- log msg
15
+ warn_log msg
12
16
  super message
13
17
  end
14
-
15
- private
16
-
17
- def log(msg, level = :warn)
18
- return if @logger.nil?
19
-
20
- @logger.send level, msg
21
- end
22
18
  end
23
19
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Calendly
4
+ # Calendly logger utility module.
5
+ module Loggable
6
+ def error_log(msg)
7
+ log msg, :error
8
+ end
9
+
10
+ def warn_log(msg)
11
+ log msg, :warn
12
+ end
13
+
14
+ def info_log(msg)
15
+ log msg, :info
16
+ end
17
+
18
+ def debug_log(msg)
19
+ log msg, :debug
20
+ end
21
+
22
+ private
23
+
24
+ def log(msg, level = :info)
25
+ logger = Calendly.configuration.logger
26
+ return unless logger
27
+ return unless logger.respond_to? level
28
+
29
+ logger.send level, msg
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+ require 'calendly/models/event_type'
6
+
3
7
  module Calendly
4
8
  # Calendly's event model.
5
9
  # A meeting that has been scheduled
@@ -7,7 +11,7 @@ module Calendly
7
11
  include ModelUtils
8
12
  UUID_RE = %r{\A#{Client::API_HOST}/scheduled_events/(\w+)\z}.freeze
9
13
  TIME_FIELDS = %i[start_time end_time created_at updated_at].freeze
10
- ASSOCIATION = { event_type: EventType }.freeze
14
+ ASSOCIATION = {event_type: EventType}.freeze
11
15
 
12
16
  # @return [String]
13
17
  # unique id of the Event object.
@@ -69,19 +73,29 @@ module Calendly
69
73
  # @param [Hash] opts the optional request parameters.
70
74
  # @option opts [Integer] :count Number of rows to return.
71
75
  # @option opts [String] :email Filter by email.
72
- # @option opts [String] :page_token Pass this to get the next portion of collection.
73
- # @option opts [String] :sort Order results by the specified field and directin. Accepts comma-separated list of {field}:{direction} values.
76
+ # @option opts [String] :page_token
77
+ # Pass this to get the next portion of collection.
78
+ # @option opts [String] :sort Order results by the specified field and directin.
79
+ # Accepts comma-separated list of {field}:{direction} values.
74
80
  # @option opts [String] :status Whether the scheduled event is active or canceled.
75
81
  # @return [Array<Calendly::Invitee>]
76
82
  # @raise [Calendly::Error] if the uuid is empty.
77
83
  # @raise [Calendly::ApiError] if the api returns error code.
78
84
  # @since 0.1.0
79
85
  def invitees(opts = {})
86
+ return @cached_invitees if @cached_invitees
87
+
80
88
  request_proc = proc { |options| client.event_invitees uuid, options }
81
- auto_pagination request_proc, opts
89
+ @cached_invitees = auto_pagination request_proc, opts
82
90
  end
83
91
 
84
- private
92
+ # @since 0.2.0
93
+ def invitees!(opts = {})
94
+ @cached_invitees = nil
95
+ invitees opts
96
+ end
97
+
98
+ private
85
99
 
86
100
  def after_set_attributes(attrs)
87
101
  super attrs
@@ -89,11 +103,12 @@ module Calendly
89
103
  @location = Location.new loc_params if loc_params&.is_a? Hash
90
104
 
91
105
  inv_cnt_attrs = attrs[:invitees_counter]
92
- if inv_cnt_attrs&.is_a? Hash
93
- @invitees_counter_total = inv_cnt_attrs[:total]
94
- @invitees_counter_active = inv_cnt_attrs[:active]
95
- @invitees_counter_limit = inv_cnt_attrs[:limit]
96
- end
106
+ return unless inv_cnt_attrs
107
+ return unless inv_cnt_attrs.is_a? Hash
108
+
109
+ @invitees_counter_total = inv_cnt_attrs[:total]
110
+ @invitees_counter_active = inv_cnt_attrs[:active]
111
+ @invitees_counter_limit = inv_cnt_attrs[:limit]
97
112
  end
98
113
  end
99
114
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+
3
6
  module Calendly
4
7
  # Calendly's event type model.
5
8
  # A configuration for a schedulable event
@@ -72,17 +75,16 @@ module Calendly
72
75
  # Whether the profile belongs to a “User” or a “Team”.
73
76
  attr_accessor :owner_type
74
77
 
75
- private
78
+ private
76
79
 
77
80
  def after_set_attributes(attrs)
78
81
  super attrs
79
- if attrs[:profile]
82
+ return unless attrs[:profile]
80
83
 
81
- @owner_uri = attrs[:profile][:owner]
82
- @owner_uuid = User.extract_uuid owner_uri
83
- @owner_name = attrs[:profile][:name]
84
- @owner_type = attrs[:profile][:type]
85
- end
84
+ @owner_uri = attrs[:profile][:owner]
85
+ @owner_uuid = User.extract_uuid owner_uri
86
+ @owner_name = attrs[:profile][:name]
87
+ @owner_type = attrs[:profile][:type]
86
88
  end
87
89
  end
88
90
  end
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+ require 'calendly/models/event'
6
+
3
7
  module Calendly
4
8
  # Calendly's Invitee model.
5
9
  # An individual who has been invited to meet with a Calendly member.
@@ -7,7 +11,7 @@ module Calendly
7
11
  include ModelUtils
8
12
  UUID_RE = %r{\A#{Client::API_HOST}/scheduled_events/\w+/invitees/(\w+)\z}.freeze
9
13
  TIME_FIELDS = %i[created_at updated_at].freeze
10
- ASSOCIATION = { event: Event }.freeze
14
+ ASSOCIATION = {event: Event}.freeze
11
15
 
12
16
  # @return [String]
13
17
  # unique id of the Invitee object.
@@ -61,14 +65,12 @@ module Calendly
61
65
  client.event_invitee ev_uuid, uuid
62
66
  end
63
67
 
64
- private
68
+ private
65
69
 
66
70
  def after_set_attributes(attrs)
67
71
  super attrs
68
72
  answers = attrs[:questions_and_answers]
69
- if answers&.is_a? Array
70
- @questions_and_answers = answers.map { |ans| InviteeQuestionAndAnswer.new ans }
71
- end
73
+ @questions_and_answers = answers.map { |ans| InviteeQuestionAndAnswer.new ans } if answers&.is_a? Array
72
74
 
73
75
  trac_attrs = attrs[:tracking]
74
76
  @tracking = InviteeTracking.new trac_attrs if trac_attrs&.is_a? Hash
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/models/model_utils'
4
+
3
5
  module Calendly
4
6
  # Calendly's InviteeQuestionAndAnswer model.
5
7
  # An individual form question and response.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/models/model_utils'
4
+
3
5
  module Calendly
4
6
  # Calendly's InviteeTracking model.
5
7
  # Object that represents UTM and Salesforce tracking parameters associated with the invitee.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/models/model_utils'
4
+
3
5
  module Calendly
4
6
  # Calendly's location model.
5
7
  # Polymorphic base type for the various supported meeting locations.
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'time'
4
+ require 'calendly/error'
4
5
 
5
6
  module Calendly
6
7
  # Calendly model utility.
@@ -19,7 +20,7 @@ module Calendly
19
20
  # @raise [Calendly::Error] if the client is nil.
20
21
  # @since 0.1.0
21
22
  def client
22
- raise Error, '@client is not ready.' if !@client || !@client.is_a?(Client)
23
+ raise Error.new('@client is not ready.') if !@client || !@client.is_a?(Client)
23
24
 
24
25
  @client
25
26
  end
@@ -31,7 +32,7 @@ module Calendly
31
32
  # @raise [Calendly::Error] if uuid is not defined.
32
33
  # @since 0.1.0
33
34
  def id
34
- raise Error, 'uuid is not defined.' unless defined? uuid
35
+ raise Error.new('uuid is not defined.') unless defined? uuid
35
36
 
36
37
  uuid
37
38
  end
@@ -58,9 +59,9 @@ module Calendly
58
59
  base.extend ClassMethods
59
60
  end
60
61
 
61
- private
62
+ private
62
63
 
63
- def set_attributes(attrs)
64
+ def set_attributes(attrs) # rubocop:disable all
64
65
  return if attrs.nil?
65
66
  return unless attrs.is_a? Hash
66
67
  return if attrs.empty?
@@ -68,10 +69,10 @@ module Calendly
68
69
  attrs.each do |key, value|
69
70
  next unless respond_to? "#{key}=".to_sym
70
71
 
71
- if defined?(self.class::ASSOCIATION) && self.class::ASSOCIATION.key?(key)
72
- associated_attrs = value.is_a?(Hash) ? value : { uri: value }
72
+ if value && defined?(self.class::ASSOCIATION) && self.class::ASSOCIATION.key?(key)
73
+ associated_attrs = value.is_a?(Hash) ? value : {uri: value}
73
74
  value = self.class::ASSOCIATION[key].new associated_attrs, @client
74
- elsif defined?(self.class::TIME_FIELDS) && self.class::TIME_FIELDS.include?(key)
75
+ elsif value && defined?(self.class::TIME_FIELDS) && self.class::TIME_FIELDS.include?(key)
75
76
  value = Time.parse value
76
77
  end
77
78
  instance_variable_set "@#{key}", value
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+
3
6
  module Calendly
4
7
  # Calendly's organization model.
5
8
  class Organization
@@ -25,8 +28,16 @@ module Calendly
25
28
  # @raise [Calendly::ApiError] if the api returns error code.
26
29
  # @since 0.1.0
27
30
  def memberships(opts = {})
31
+ return @cached_memberships if @cached_memberships
32
+
28
33
  request_proc = proc { |options| client.memberships uri, options }
29
- auto_pagination request_proc, opts
34
+ @cached_memberships = auto_pagination request_proc, opts
35
+ end
36
+
37
+ # @since 0.2.0
38
+ def memberships!(opts = {})
39
+ @cached_memberships = nil
40
+ memberships opts
30
41
  end
31
42
 
32
43
  #
@@ -36,15 +47,24 @@ module Calendly
36
47
  # @option opts [Integer] :count Number of rows to return.
37
48
  # @option opts [String] :email Filter by email.
38
49
  # @option opts [String] :page_token Pass this to get the next portion of collection.
39
- # @option opts [String] :sort Order results by the specified field and directin. Accepts comma-separated list of {field}:{direction} values.
50
+ # @option opts [String] :sort Order results by the specified field and directin.
51
+ # Accepts comma-separated list of {field}:{direction} values.
40
52
  # @option opts [String] :status Filter by status.
41
53
  # @return [Array<Calendly::OrganizationInvitation>]
42
54
  # @raise [Calendly::Error] if the uuid is empty.
43
55
  # @raise [Calendly::ApiError] if the api returns error code.
44
56
  # @since 0.1.0
45
57
  def invitations(opts = {})
58
+ return @cached_invitations if @cached_invitations
59
+
46
60
  request_proc = proc { |options| client.invitations uuid, options }
47
- auto_pagination request_proc, opts
61
+ @cached_invitations = auto_pagination request_proc, opts
62
+ end
63
+
64
+ # @since 0.2.0
65
+ def invitations!(opts = {})
66
+ @cached_invitations = nil
67
+ invitations opts
48
68
  end
49
69
 
50
70
  #
@@ -59,5 +79,45 @@ module Calendly
59
79
  def create_invitation(email)
60
80
  client.create_invitation uuid, email
61
81
  end
82
+
83
+ #
84
+ # Get List of organization scope Webhooks associated with self.
85
+ #
86
+ # @param [Hash] opts the optional request parameters.
87
+ # @option opts [Integer] :count Number of rows to return.
88
+ # @option opts [String] :page_token Pass this to get the next portion of collection.
89
+ # @option opts [String] :sort Order results by the specified field and directin. Accepts comma-separated list of {field}:{direction} values.
90
+ # Accepts comma-separated list of {field}:{direction} values.
91
+ # @return [Array<Calendly::WebhookSubscription>]
92
+ # @raise [Calendly::Error] if the uri is empty.
93
+ # @raise [Calendly::ApiError] if the api returns error code.
94
+ # @since 0.1.3
95
+ def webhooks(opts = {})
96
+ return @cached_webhooks if @cached_webhooks
97
+
98
+ request_proc = proc { |options| client.webhooks uri, options }
99
+ @cached_webhooks = auto_pagination request_proc, opts
100
+ end
101
+
102
+ # @since 0.2.0
103
+ def webhooks!(opts = {})
104
+ @cached_webhooks = nil
105
+ webhooks opts
106
+ end
107
+
108
+ #
109
+ # Create a user scope webhook associated with self.
110
+ #
111
+ # @param [String] url Canonical reference (unique identifier) for the resource.
112
+ # @param [Array<String>] events List of user events to subscribe to. options: invitee.created or invitee.canceled
113
+ # @return [Calendly::WebhookSubscription]
114
+ # @raise [Calendly::Error] if the url arg is empty.
115
+ # @raise [Calendly::Error] if the events arg is empty.
116
+ # @raise [Calendly::Error] if the uri is empty.
117
+ # @raise [Calendly::ApiError] if the api returns error code.
118
+ # @since 0.1.3
119
+ def create_webhook(url, events)
120
+ client.create_webhook url, events, uri
121
+ end
62
122
  end
63
123
  end
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+ require 'calendly/models/organization'
6
+ require 'calendly/models/user'
7
+
3
8
  module Calendly
4
9
  # Calendly's organization invitation model.
5
10
  class OrganizationInvitation
6
11
  include ModelUtils
7
12
  UUID_RE = %r{\A#{Client::API_HOST}/organizations/\w+/invitations/(\w+)\z}.freeze
8
13
  TIME_FIELDS = %i[created_at updated_at last_sent_at].freeze
9
- ASSOCIATION = { user: User, organization: Organization }.freeze
14
+ ASSOCIATION = {user: User, organization: Organization}.freeze
10
15
 
11
16
  # @return [String]
12
17
  # unique id of the OrganizationInvitation object.
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'calendly/client'
4
+ require 'calendly/models/model_utils'
5
+ require 'calendly/models/organization'
6
+ require 'calendly/models/user'
7
+
3
8
  module Calendly
4
9
  # Calendly's organization membership model.
5
10
  class OrganizationMembership
6
11
  include ModelUtils
7
12
  UUID_RE = %r{\A#{Client::API_HOST}/organization_memberships/(\w+)\z}.freeze
8
13
  TIME_FIELDS = %i[created_at updated_at].freeze
9
- ASSOCIATION = { user: User, organization: Organization }.freeze
14
+ ASSOCIATION = {user: User, organization: Organization}.freeze
10
15
 
11
16
  # @return [String]
12
17
  # unique id of the OrganizationMembership object.
@@ -52,5 +57,50 @@ module Calendly
52
57
  def delete
53
58
  client.delete_membership uuid
54
59
  end
60
+
61
+ #
62
+ # Get List of user scope Webhooks associated with self.
63
+ #
64
+ # @param [Hash] opts the optional request parameters.
65
+ # @option opts [Integer] :count Number of rows to return.
66
+ # @option opts [String] :page_token Pass this to get the next portion of collection.
67
+ # @option opts [String] :sort Order results by the specified field and directin. Accepts comma-separated list of {field}:{direction} values.
68
+ # Accepts comma-separated list of {field}:{direction} values.
69
+ # @return [Array<Calendly::WebhookSubscription>]
70
+ # @raise [Calendly::Error] if the organization.uri is empty.
71
+ # @raise [Calendly::Error] if the user.uri is empty.
72
+ # @raise [Calendly::ApiError] if the api returns error code.
73
+ # @since 0.1.3
74
+ def user_scope_webhooks(opts = {})
75
+ return @cached_user_scope_webhooks if @cached_user_scope_webhooks
76
+
77
+ org_uri = organization.uri if organization
78
+ user_uri = user.uri if user
79
+ request_proc = proc { |options| client.user_scope_webhooks org_uri, user_uri, options }
80
+ @cached_user_scope_webhooks = auto_pagination request_proc, opts
81
+ end
82
+
83
+ # @since 0.2.0
84
+ def user_scope_webhooks!(opts = {})
85
+ @cached_user_scope_webhooks = nil
86
+ user_scope_webhooks opts
87
+ end
88
+
89
+ #
90
+ # Create a user scope webhook associated with self.
91
+ #
92
+ # @param [String] url Canonical reference (unique identifier) for the resource.
93
+ # @param [Array<String>] events List of user events to subscribe to. options: invitee.created or invitee.canceled
94
+ # @return [Calendly::WebhookSubscription]
95
+ # @raise [Calendly::Error] if the url arg is empty.
96
+ # @raise [Calendly::Error] if the events arg is empty.
97
+ # @raise [Calendly::Error] if the organization.uri is empty.
98
+ # @raise [Calendly::ApiError] if the api returns error code.
99
+ # @since 0.1.3
100
+ def create_user_scope_webhook(url, events)
101
+ org_uri = organization.uri if organization
102
+ user_uri = user.uri if user
103
+ client.create_webhook url, events, org_uri, user_uri
104
+ end
55
105
  end
56
106
  end