Class: Pinnacle::Internal::Types::Model Abstract

Inherits:
Object
  • Object
show all
Includes:
Type
Defined in:
lib/pinnacle/internal/types/model.rb,
lib/pinnacle/internal/types/model/field.rb

Overview

This class is abstract.

An abstract model that all data objects will inherit from

Direct Known Subclasses

Audiences::Contacts::Types::AddContactsParams, Audiences::Contacts::Types::RemoveContactsParams, Audiences::Types::AudiencesDeleteRequest, Audiences::Types::AudiencesGetRequest, Audiences::Types::AudiencesGetResponse, Audiences::Types::CreateAudienceParams, Audiences::Types::UpdateAudienceParams, Brands::Types::AutofillBrandOptions, Brands::Types::AutofillBrandParams, Brands::Types::BrandsGetRequest, Brands::Types::UpsertBrandParams, Brands::Types::UpsertBrandSchemaContact, Brands::Types::VetBrandParams, Campaigns::Dlc::Types::DlcCampaignHelpKeywords, Campaigns::Dlc::Types::DlcCampaignKeywords, Campaigns::Dlc::Types::DlcCampaignLinks, Campaigns::Dlc::Types::DlcCampaignOptInKeywords, Campaigns::Dlc::Types::DlcCampaignOptOutKeywords, Campaigns::Dlc::Types::DlcCampaignOptions, Campaigns::Dlc::Types::DlcCampaignUseCase, Campaigns::Dlc::Types::UpsertDlcCampaignParams, Campaigns::Rcs::Types::RcsAgent, Campaigns::Rcs::Types::RcsAgentEmail, Campaigns::Rcs::Types::RcsAgentPhone, Campaigns::Rcs::Types::RcsAgentWebsite, Campaigns::Rcs::Types::RcsAutofillResponse, Campaigns::Rcs::Types::RcsCampaignHelpKeywords, Campaigns::Rcs::Types::RcsCampaignKeywords, Campaigns::Rcs::Types::RcsCampaignOptInKeywords, Campaigns::Rcs::Types::RcsCampaignOptOutKeywords, Campaigns::Rcs::Types::RcsCampaignTraffic, Campaigns::Rcs::Types::RcsLinks, Campaigns::Rcs::Types::RcsUseCase, Campaigns::Rcs::Types::UpsertRcsCampaignParams, Campaigns::TollFree::Types::TollFreeAutofillResponse, Campaigns::TollFree::Types::TollFreeCampaignHelpKeywords, Campaigns::TollFree::Types::TollFreeCampaignKeywords, Campaigns::TollFree::Types::TollFreeCampaignLinks, Campaigns::TollFree::Types::TollFreeCampaignOptIn, Campaigns::TollFree::Types::TollFreeCampaignOptInKeywords, Campaigns::TollFree::Types::TollFreeCampaignOptions, Campaigns::TollFree::Types::TollFreeCampaignUseCase, Campaigns::TollFree::Types::UpsertTollFreeCampaignParams, Contacts::Types::ContactsGetRequest, Contacts::Types::CreateContactParams, Contacts::Types::UpdateContactParams, Conversations::Types::ConversationsListMessagesRequest, Conversations::Types::ListConversationsParams, Conversations::Types::UpdateConversationParams, Messages::Blast::Types::BlastMms, Messages::Blast::Types::BlastMmsOptions, Messages::Blast::Types::BlastMmsResponse, Messages::Blast::Types::BlastRcs, Messages::Blast::Types::BlastRcsOptions, Messages::Blast::Types::BlastRcsRequestOptionsStandaloneCard, Messages::Blast::Types::BlastRcsResponse, Messages::Blast::Types::BlastSms, Messages::Blast::Types::BlastSmsOptions, Messages::Blast::Types::BlastSmsResponse, Messages::Mms::Types::Mms, Messages::Mms::Types::MmsSendResponse, Messages::Mms::Types::SendMmsOptions, Messages::Rcs::Types::SendRichMessageResponse, Messages::Rcs::Types::SendTypingIndicatorSchema, Messages::Rcs::Types::SendTypingIndicatorSchemaOptions, Messages::Sms::Types::SendSmsOptions, Messages::Sms::Types::Sms, Messages::Sms::Types::SmsSendResponse, Messages::Types::ReactMessageOptions, Messages::Types::ReactMessageParams, PhoneNumbers::Campaign::Types::AttachCampaignParams, PhoneNumbers::Campaign::Types::DetachCampaignParams, PhoneNumbers::Types::BuyPhoneNumberParams, PhoneNumbers::Types::EnhancedContactInfo, PhoneNumbers::Types::PhoneNumbersGetResponse, PhoneNumbers::Types::RetrievePhoneNumberDetailsOptions, PhoneNumbers::Types::RetrievePhoneNumberDetailsParams, PhoneNumbers::Types::SearchPhoneNumberByDigits, PhoneNumbers::Types::SearchPhoneNumberByLocation, PhoneNumbers::Types::SearchPhoneNumberOptions, PhoneNumbers::Types::SearchPhoneNumberParams, Rcs::Types::RcsCapabilitiesQuery, Rcs::Types::RcsLinkRequest, Rcs::Types::RcsWhitelistRequest, Tools::ContactCard::Types::GetVCardSchemaOptions, Tools::ContactCard::Types::GetVcardParams, Tools::ContactCard::Types::UpsertVcardParams, Tools::File::Types::DownloadOptions, Tools::File::Types::RefreshFileParams, Tools::File::Types::UploadFileOptions, Tools::File::Types::UploadFileParams, Tools::Url::Types::CreateUrlParams, Tools::Url::Types::UpdateUrlParams, Types::AdvancedPhoneInformation, Types::AdvancedPhoneInformationCarrier, Types::AdvancedPhoneInformationContact, Types::AdvancedPhoneInformationLocation, Types::AdvancedPhoneInformationLocationCoordinates, Types::AdvancedPhoneInformationLocationCountry, Types::AdvancedPhoneInformationType, Types::Agent, Types::AttachWebhookByIdParams, Types::AttachWebhookParams, Types::AttachWebhookResponseWebhook, Types::AttachedPhoneNumberResult, Types::AudienceCountOnly, Types::AudienceWithPagination, Types::AutofillCampaignParams, Types::AutofillDlcCampaignResponse, Types::AutofillDlcResponseKeywords, Types::AutofillDlcResponseKeywordsHelp, Types::AutofillDlcResponseKeywordsOptIn, Types::AutofillDlcResponseKeywordsOptOut, Types::AutofillDlcResponseLinks, Types::AutofillDlcResponseOptions, Types::AutofillDlcResponseUseCase, Types::BadRequestErrorBody, Types::BaseRichMessage, Types::BasicPhoneInformation, Types::BasicPhoneInformationContact, Types::BasicPhoneInformationLocation, Types::BasicPhoneInformationLocationCountry, Types::BlastDetails, Types::BrandStatus, Types::ButtonClicked, Types::ButtonClickedData, Types::ButtonClickedDataButton, Types::ButtonClickedDataButtonRaw, Types::BuyResponseCapabilities, Types::CampaignQuery, Types::CampaignSubmissionResult, Types::CampaignValidationResponseErrorsItem, Types::CampaignValidationResult, Types::ConfiguredWebhook, Types::Contact, Types::ContactId, Types::Conversation, Types::ConversationByIdParams, Types::ConversationByParticipantsParams, Types::ConversationContact, Types::ConversationList, Types::ConversationSender, Types::CreateAndAttachWebhookByUrlParams, Types::CreateUrlOptions, Types::DeleteAudienceResponse, Types::DetachedPhoneNumberResult, Types::DetachedWebhookInfo, Types::DlcCampaignStatus, Types::DlcCampaignWithExtendedBrandAndStatus, Types::DlcWithExtendedBrandAndStatusKeywords, Types::DlcWithExtendedBrandAndStatusKeywordsHelp, Types::DlcWithExtendedBrandAndStatusKeywordsOptIn, Types::DlcWithExtendedBrandAndStatusKeywordsOptOut, Types::DlcWithExtendedBrandAndStatusLinks, Types::DlcWithExtendedBrandAndStatusOptions, Types::DlcWithExtendedBrandAndStatusUseCase, Types::EnhancedContactItem, Types::Error, Types::ExtendedBrand, Types::ExtendedBrandWithVetting, Types::ExtendedRcsCampaign, Types::GetConversationParams, Types::GetDlcCampaignStatusResponseUpdates, Types::GetTollFreeCampaignStatusResponseUpdates, Types::LinkClickEvent, Types::LocationShareAction, Types::LocationShareActionData, Types::Message, Types::MessageContent, Types::MessageEvent, Types::MessageEventContent, Types::MessageEventConversation, Types::MessageEventMmsContent, Types::MessageEventRcsButtonData, Types::MessageEventRcsCardsContent, Types::MessageEventRcsCardsContentCardsItem, Types::MessageEventRcsLocationData, Types::MessageEventRcsMediaContent, Types::MessageEventRcsTextContent, Types::MessageEventSmsContent, Types::MessageList, Types::MessageSchedule, Types::MessageWithReaction, Types::MmsContent, Types::MmsValidationResponseSegments, Types::MmsValidationResponseSegmentsValueItem, Types::MmsValidationResult, Types::NotFoundErrorBody, Types::NumberFormat, Types::OptionalBrandInfo, Types::OptionalContact, Types::OptionalContacts, Types::Pagination, Types::Phone, Types::PhoneCapabilities, Types::PhoneNumberCampaignAttachFailedItem, Types::PhoneNumberCampaignAttachPhoneNumbersItem, Types::PhoneNumberCampaignAttachPhoneNumbersItemCampaign, Types::PhoneNumberCampaignDetachFailedItem, Types::PhoneNumberCampaignDetachPhoneNumbersItem, Types::PhoneNumberCampaignDetachPhoneNumbersItemCampaign, Types::PhoneNumberCost, Types::PhoneNumberDetails, Types::PhoneNumberRegion, Types::PhoneNumberStatus, Types::PinnacleFileUploadMetadata, Types::PinnacleUrlConfig, Types::PurchasedNumber, Types::RcsButtonCall, Types::RcsButtonOpenUrl, Types::RcsButtonRequestUserLocation, Types::RcsButtonScheduleEvent, Types::RcsButtonSendLocation, Types::RcsButtonSendLocationLatLong, Types::RcsButtonTrigger, Types::RcsCampaign, Types::RcsCampaignSchemaAgent, Types::RcsCampaignSchemaAgentEmailsItem, Types::RcsCampaignSchemaAgentPhonesItem, Types::RcsCampaignSchemaAgentWebsitesItem, Types::RcsCampaignSchemaExtraAgent, Types::RcsCampaignSchemaExtraAgentEmailsItem, Types::RcsCampaignSchemaExtraAgentPhonesItem, Types::RcsCampaignSchemaExtraAgentWebsitesItem, Types::RcsCampaignSchemaExtraKeywords, Types::RcsCampaignSchemaExtraKeywordsHelp, Types::RcsCampaignSchemaExtraKeywordsOptIn, Types::RcsCampaignSchemaExtraKeywordsOptOut, Types::RcsCampaignSchemaExtraLinks, Types::RcsCampaignSchemaExtraTraffic, Types::RcsCampaignSchemaExtraUseCase, Types::RcsCampaignSchemaKeywords, Types::RcsCampaignSchemaKeywordsHelp, Types::RcsCampaignSchemaKeywordsOptIn, Types::RcsCampaignSchemaKeywordsOptOut, Types::RcsCampaignSchemaLinks, Types::RcsCampaignSchemaTraffic, Types::RcsCampaignSchemaUseCase, Types::RcsCampaignStatus, Types::RcsCapability, Types::RcsCapabilityActions, Types::RcsCapabilityCards, Types::RcsCardsContent, Types::RcsCardsContentCardsItem, Types::RcsContent, Types::RcsLinkResult, Types::RcsMediaContent, Types::RcsMediaDetailsContent, Types::RcsValidateContent, Types::RcsValidateContentMedia, Types::RcsValidationResult, Types::RcsWhitelistResponse, Types::ReactionResult, Types::RefreshedFile, Types::RichButton, Types::RichCard, Types::RichCards, Types::RichCardsMessage, Types::RichMediaMessage, Types::RichMessage, Types::RichStandaloneCardOptions, Types::RichText, Types::RichTextMessage, Types::ScheduleCancelResult, Types::ScheduledBlastDetails, Types::ScheduledBlastResponseConfig, Types::ScheduledMessage, Types::ScheduledSendResponseConfig, Types::SendRichCardsOptions, Types::SendRichMessageOptions, Types::SendSmsResponseSegments, Types::SendTypingIndicatorResponse, Types::SentMmsDetails, Types::SentRichMessage, Types::SentSmsDetails, Types::ShortenedUrl, Types::ShortenedUrlWithClickData, Types::SmsContent, Types::SmsValidationResponseSegments, Types::SmsValidationResponseSegmentsGsm7, Types::SmsValidationResponseSegmentsUtf16, Types::SmsValidationResponseTotal, Types::SmsValidationResult, Types::SubmissionResults, Types::SuccessfulConversationUpdate, Types::TollFreeCampaign, Types::TollFreeCampaignSchemaKeywords, Types::TollFreeCampaignSchemaKeywordsHelp, Types::TollFreeCampaignSchemaKeywordsOptIn, Types::TollFreeCampaignSchemaLinks, Types::TollFreeCampaignSchemaOptIn, Types::TollFreeCampaignSchemaOptions, Types::TollFreeCampaignSchemaUseCase, Types::TollFreeCampaignStatus, Types::TollFreeCampaignWithExtendedBrandAndStatus, Types::TollFreeWithExtendedBrandAndStatusKeywords, Types::TollFreeWithExtendedBrandAndStatusKeywordsHelp, Types::TollFreeWithExtendedBrandAndStatusKeywordsOptIn, Types::TollFreeWithExtendedBrandAndStatusLinks, Types::TollFreeWithExtendedBrandAndStatusOptIn, Types::TollFreeWithExtendedBrandAndStatusOptions, Types::TollFreeWithExtendedBrandAndStatusUseCase, Types::UpdatedContactId, Types::UploadResults, Types::UserEvent, Types::UserEventConversation, Types::VCardData, Types::VCardDataFile, Types::VCardDataFileMetadata, Types::VCardGeo, Types::VCardName, Types::VCardOrganization, Types::ValidateCampaignParams, Types::ValidationErrorDetails, Types::ValidationResults, Types::Vcard, Types::VcardAddress, Types::VcardContent, Types::VcardEmail, Types::VcardPhone, Types::VcardResource, Types::VettingFeedback, Types::VettingHistory, Types::VettingResults, Types::WebhookResult, Types::Webhooks, Types::ZodError, Webhooks::Types::GetWebhookParams

Defined Under Namespace

Classes: Field

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Type

#coerce, #strict!, #strict?

Methods included from JSON::Serializable

#dump, #load

Constructor Details

#initialize(values = {}) ⇒ self

Creates a new instance of this model TODO: Should all this logic be in #coerce instead?

Parameters:

  • values (Hash) (defaults to: {})
  • strict (Hash)

    a customizable set of options



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/pinnacle/internal/types/model.rb', line 138

def initialize(values = {})
  @data = {}

  values = Utils.symbolize_keys(values.dup)

  self.class.fields.each do |field_name, field|
    value = values.delete(field.api_name.to_sym) || values.delete(field.api_name) || values.delete(field_name)

    field_value = value || (if field.literal?
                              field.value
                            elsif field.default
                              field.default
                            end)

    @data[field_name] = Utils.coerce(field.type, field_value)
  end

  # Any remaining values in the input become extra fields
  values.each do |name, value|
    self.class.add_extra_field_definition(name: name, type: value.class)

    @data[name.to_sym] = value
  end
end

Class Method Details

.===(instance) ⇒ Object



127
128
129
# File 'lib/pinnacle/internal/types/model.rb', line 127

def ===(instance)
  instance.class.ancestors.include?(self)
end

.add_extra_field_definition(name:, type:) ⇒ void

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Adds a new field definition into the class’s extra fields registry

Parameters:

  • name (Symbol)
  • type (Class)
  • required (Hash)

    a customizable set of options

  • optional (Hash)

    a customizable set of options



88
89
90
91
92
93
94
95
# File 'lib/pinnacle/internal/types/model.rb', line 88

def add_extra_field_definition(name:, type:)
  return if extra_fields.key?(name.to_sym)

  extra_fields[name.to_sym] = Field.new(name: name, type: type, optional: true, nullable: false)

  define_accessor(name)
  define_setter(name)
end

.coerce(value, strict: (respond_to?(:strict?) ? strict? : false)) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument



115
116
117
118
119
120
121
# File 'lib/pinnacle/internal/types/model.rb', line 115

def coerce(value, strict: (respond_to?(:strict?) ? strict? : false)) # rubocop:disable Lint/UnusedMethodArgument
  return value if value.is_a?(self)

  return value unless value.is_a?(::Hash)

  new(value)
end

.extra_fieldsHash<Symbol, Field>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Any extra fields that have been created from instantiation

Returns:



31
32
33
# File 'lib/pinnacle/internal/types/model.rb', line 31

def extra_fields
  @extra_fields ||= {}
end

.field(name, type, optional: false, nullable: false, api_name: nil, default: nil) ⇒ void

This method returns an undefined value.

Define a new field on this model

Parameters:

  • name (Symbol)

    The name of the field

  • type (Class)

    Type of the field

  • optional (Hash) (defaults to: false)

    a customizable set of options

  • nullable (Hash) (defaults to: false)

    a customizable set of options

  • api_name (Hash) (defaults to: nil)

    a customizable set of options

Options Hash (optional:):

  • If (Boolean)

    it is an optional field

Options Hash (nullable:):

  • If (Boolean)

    it is a nullable field

Options Hash (api_name:):

  • Name (Symbol, String)

    in the API of this field. When serializing/deserializing, will use this field name



44
45
46
47
48
49
50
# File 'lib/pinnacle/internal/types/model.rb', line 44

def field(name, type, optional: false, nullable: false, api_name: nil, default: nil)
  add_field_definition(name: name, type: type, optional: optional, nullable: nullable, api_name: api_name,
                       default: default)

  define_accessor(name)
  define_setter(name)
end

.fieldsHash<Symbol, Field>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The defined fields for this model

Returns:



18
19
20
21
22
23
24
# File 'lib/pinnacle/internal/types/model.rb', line 18

def fields
  @fields ||= if self < Pinnacle::Internal::Types::Model
                superclass.fields.dup
              else
                {}
              end
end

.literal(name, value, api_name: nil) ⇒ void

This method returns an undefined value.

Define a new literal for this model

Parameters:

  • name (Symbol)
  • value (Object)
  • api_name (Hash) (defaults to: nil)

    a customizable set of options

Options Hash (api_name:):

  • (Symbol, String)


58
59
60
61
62
63
# File 'lib/pinnacle/internal/types/model.rb', line 58

def literal(name, value, api_name: nil)
  add_field_definition(name: name, type: value.class, optional: false, nullable: false, api_name: api_name,
                       value: value)

  define_accessor(name)
end

.load(str) ⇒ Object



123
124
125
# File 'lib/pinnacle/internal/types/model.rb', line 123

def load(str)
  coerce(::JSON.parse(str, symbolize_names: true))
end

Instance Method Details

#==(other) ⇒ Object



191
192
193
# File 'lib/pinnacle/internal/types/model.rb', line 191

def ==(other)
  self.class == other.class && to_h == other.to_h
end

#inspectString

Returns:

  • (String)


196
197
198
199
200
201
202
203
204
# File 'lib/pinnacle/internal/types/model.rb', line 196

def inspect
  attrs = @data.map do |name, value|
    field = self.class.fields[name] || self.class.extra_fields[name]
    display_value = field&.sensitive? ? "[REDACTED]" : value.inspect
    "#{name}=#{display_value}"
  end

  "#<#{self.class.name}:0x#{object_id&.to_s(16)} #{attrs.join(" ")}>"
end

#to_hObject



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/pinnacle/internal/types/model.rb', line 163

def to_h
  result = self.class.fields.merge(self.class.extra_fields).each_with_object({}) do |(name, field), acc|
    # If there is a value present in the data, use that value
    # If there is a `nil` value present in the data, and it is optional but NOT nullable, exclude key altogether
    # If there is a `nil` value present in the data, and it is optional and nullable, use the nil value

    value = @data[name]

    next if value.nil? && field.optional && !field.nullable

    if value.is_a?(::Array)
      value = value.map { |item| item.respond_to?(:to_h) ? item.to_h : item }
    elsif value.respond_to?(:to_h)
      value = value.to_h
    end

    acc[field.api_name] = value
  end

  # Inject union discriminant if this instance was coerced from a discriminated union
  # and the discriminant key is not already present in the result
  discriminant_key = instance_variable_get(:@_fern_union_discriminant_key)
  discriminant_value = instance_variable_get(:@_fern_union_discriminant_value)
  result[discriminant_key] = discriminant_value if discriminant_key && discriminant_value && !result.key?(discriminant_key)

  result
end