late-sdk 0.0.712 → 0.0.714

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.
@@ -0,0 +1,216 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Zernio
17
+ class UpdateAdRequestTargetingKeywordsInnerOneOf < ApiModelBase
18
+ attr_accessor :text
19
+
20
+ attr_accessor :match_type
21
+
22
+ class EnumAttributeValidator
23
+ attr_reader :datatype
24
+ attr_reader :allowable_values
25
+
26
+ def initialize(datatype, allowable_values)
27
+ @allowable_values = allowable_values.map do |value|
28
+ case datatype.to_s
29
+ when /Integer/i
30
+ value.to_i
31
+ when /Float/i
32
+ value.to_f
33
+ else
34
+ value
35
+ end
36
+ end
37
+ end
38
+
39
+ def valid?(value)
40
+ !value || allowable_values.include?(value)
41
+ end
42
+ end
43
+
44
+ # Attribute mapping from ruby-style variable name to JSON key.
45
+ def self.attribute_map
46
+ {
47
+ :'text' => :'text',
48
+ :'match_type' => :'matchType'
49
+ }
50
+ end
51
+
52
+ # Returns attribute mapping this model knows about
53
+ def self.acceptable_attribute_map
54
+ attribute_map
55
+ end
56
+
57
+ # Returns all the JSON keys this model knows about
58
+ def self.acceptable_attributes
59
+ acceptable_attribute_map.values
60
+ end
61
+
62
+ # Attribute type mapping.
63
+ def self.openapi_types
64
+ {
65
+ :'text' => :'String',
66
+ :'match_type' => :'String'
67
+ }
68
+ end
69
+
70
+ # List of attributes with nullable: true
71
+ def self.openapi_nullable
72
+ Set.new([
73
+ ])
74
+ end
75
+
76
+ # Initializes the object
77
+ # @param [Hash] attributes Model attributes in the form of hash
78
+ def initialize(attributes = {})
79
+ if (!attributes.is_a?(Hash))
80
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf` initialize method"
81
+ end
82
+
83
+ # check to see if the attribute exists and convert string to symbol for hash key
84
+ acceptable_attribute_map = self.class.acceptable_attribute_map
85
+ attributes = attributes.each_with_object({}) { |(k, v), h|
86
+ if (!acceptable_attribute_map.key?(k.to_sym))
87
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
88
+ end
89
+ h[k.to_sym] = v
90
+ }
91
+
92
+ if attributes.key?(:'text')
93
+ self.text = attributes[:'text']
94
+ else
95
+ self.text = nil
96
+ end
97
+
98
+ if attributes.key?(:'match_type')
99
+ self.match_type = attributes[:'match_type']
100
+ end
101
+ end
102
+
103
+ # Show invalid properties with the reasons. Usually used together with valid?
104
+ # @return Array for valid properties with the reasons
105
+ def list_invalid_properties
106
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
107
+ invalid_properties = Array.new
108
+ if @text.nil?
109
+ invalid_properties.push('invalid value for "text", text cannot be nil.')
110
+ end
111
+
112
+ if @text.to_s.length > 80
113
+ invalid_properties.push('invalid value for "text", the character length must be smaller than or equal to 80.')
114
+ end
115
+
116
+ invalid_properties
117
+ end
118
+
119
+ # Check to see if the all the properties in the model are valid
120
+ # @return true if the model is valid
121
+ def valid?
122
+ warn '[DEPRECATED] the `valid?` method is obsolete'
123
+ return false if @text.nil?
124
+ return false if @text.to_s.length > 80
125
+ match_type_validator = EnumAttributeValidator.new('String', ["exact", "phrase", "broad"])
126
+ return false unless match_type_validator.valid?(@match_type)
127
+ true
128
+ end
129
+
130
+ # Custom attribute writer method with validation
131
+ # @param [Object] text Value to be assigned
132
+ def text=(text)
133
+ if text.nil?
134
+ fail ArgumentError, 'text cannot be nil'
135
+ end
136
+
137
+ if text.to_s.length > 80
138
+ fail ArgumentError, 'invalid value for "text", the character length must be smaller than or equal to 80.'
139
+ end
140
+
141
+ @text = text
142
+ end
143
+
144
+ # Custom attribute writer method checking allowed values (enum).
145
+ # @param [Object] match_type Object to be assigned
146
+ def match_type=(match_type)
147
+ validator = EnumAttributeValidator.new('String', ["exact", "phrase", "broad"])
148
+ unless validator.valid?(match_type)
149
+ fail ArgumentError, "invalid value for \"match_type\", must be one of #{validator.allowable_values}."
150
+ end
151
+ @match_type = match_type
152
+ end
153
+
154
+ # Checks equality by comparing each attribute.
155
+ # @param [Object] Object to be compared
156
+ def ==(o)
157
+ return true if self.equal?(o)
158
+ self.class == o.class &&
159
+ text == o.text &&
160
+ match_type == o.match_type
161
+ end
162
+
163
+ # @see the `==` method
164
+ # @param [Object] Object to be compared
165
+ def eql?(o)
166
+ self == o
167
+ end
168
+
169
+ # Calculates hash code according to all attributes.
170
+ # @return [Integer] Hash code
171
+ def hash
172
+ [text, match_type].hash
173
+ end
174
+
175
+ # Builds the object from hash
176
+ # @param [Hash] attributes Model attributes in the form of hash
177
+ # @return [Object] Returns the model itself
178
+ def self.build_from_hash(attributes)
179
+ return nil unless attributes.is_a?(Hash)
180
+ attributes = attributes.transform_keys(&:to_sym)
181
+ transformed_hash = {}
182
+ openapi_types.each_pair do |key, type|
183
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
184
+ transformed_hash["#{key}"] = nil
185
+ elsif type =~ /\AArray<(.*)>/i
186
+ # check to ensure the input is an array given that the attribute
187
+ # is documented as an array but the input is not
188
+ if attributes[attribute_map[key]].is_a?(Array)
189
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
190
+ end
191
+ elsif !attributes[attribute_map[key]].nil?
192
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
193
+ end
194
+ end
195
+ new(transformed_hash)
196
+ end
197
+
198
+ # Returns the object in the form of hash
199
+ # @return [Hash] Returns the object in the form of hash
200
+ def to_hash
201
+ hash = {}
202
+ self.class.attribute_map.each_pair do |attr, param|
203
+ value = self.send(attr)
204
+ if value.nil?
205
+ is_nullable = self.class.openapi_nullable.include?(attr)
206
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
207
+ end
208
+
209
+ hash[param] = _to_hash(value)
210
+ end
211
+ hash
212
+ end
213
+
214
+ end
215
+
216
+ end
@@ -17,7 +17,7 @@ module Zernio
17
17
  class WebhookPayloadMessageSentMessageSender < ApiModelBase
18
18
  attr_accessor :id
19
19
 
20
- # Zernio CRM Contact id for this sender, when one exists.
20
+ # Always omitted on this event: the sender is the business, not a contact. Use conversation.contactId to join back to the CRM Contact.
21
21
  attr_accessor :contact_id
22
22
 
23
23
  attr_accessor :name
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.712'
14
+ VERSION = '0.0.714'
15
15
  end
data/lib/zernio-sdk.rb CHANGED
@@ -1350,6 +1350,8 @@ require 'zernio-sdk/models/update_ad_request_budget'
1350
1350
  require 'zernio-sdk/models/update_ad_request_creative'
1351
1351
  require 'zernio-sdk/models/update_ad_request_targeting'
1352
1352
  require 'zernio-sdk/models/update_ad_request_targeting_interests_inner'
1353
+ require 'zernio-sdk/models/update_ad_request_targeting_keywords_inner'
1354
+ require 'zernio-sdk/models/update_ad_request_targeting_keywords_inner_one_of'
1353
1355
  require 'zernio-sdk/models/update_ad_set200_response'
1354
1356
  require 'zernio-sdk/models/update_ad_set_request'
1355
1357
  require 'zernio-sdk/models/update_ad_set_request_budget'
data/openapi.yaml CHANGED
@@ -3738,7 +3738,7 @@ components:
3738
3738
  type: string
3739
3739
  contactId:
3740
3740
  type: string
3741
- description: Zernio CRM Contact id for this sender, when one exists.
3741
+ description: 'Always omitted on this event: the sender is the business, not a contact. Use conversation.contactId to join back to the CRM Contact.'
3742
3742
  name:
3743
3743
  type: string
3744
3744
  username:
@@ -34620,12 +34620,12 @@ paths:
34620
34620
  x-resource-group: "contacts"
34621
34621
  operationId: listContacts
34622
34622
  summary: List contacts
34623
- description: List and search contacts for a profile. Supports filtering by tags, platform, subscription status, and full-text search.
34623
+ description: List and search contacts for a profile. Supports filtering by tags, platform, subscription status, and text search on name, email and company.
34624
34624
  tags: [Contacts]
34625
34625
  parameters:
34626
34626
  - { name: profileId, in: query, schema: { type: string }, description: 'Filter by profile. Omit to list across all profiles. Matches the profile recorded on the contact itself, which is set when the contact is created and is independent of the profile its account currently belongs to. Filter by accountId to list a contact through its channel instead.' }
34627
34627
  - { name: accountId, in: query, schema: { type: string }, description: 'Filter by the SocialAccount that owns the contact channel. Contacts are resolved through their channels, so the profileId contact filter is not applied while accountId is set. A profileId sent alongside is still access-checked and still scopes the returned filters.tags list.' }
34628
- - { name: search, in: query, schema: { type: string } }
34628
+ - { name: search, in: query, schema: { type: string }, description: 'Case-insensitive substring match on the contact name, email and company. Phone numbers and other platform identifiers are not matched: they live on the contact channel, not on the contact. To reach a contact from an inbox webhook, use the conversation.contactId it already carries.' }
34629
34629
  - { name: tag, in: query, schema: { type: string } }
34630
34630
  - { name: tags, in: query, schema: { type: string }, description: 'Comma-separated tags, matches contacts carrying any of them' }
34631
34631
  - { name: platform, in: query, schema: { type: string, enum: [instagram, facebook, telegram, twitter, bluesky, reddit, whatsapp] } }
@@ -38079,7 +38079,12 @@ paths:
38079
38079
  - **Meta** (Facebook + Instagram): all fields supported.
38080
38080
  - **TikTok**: status, budget, targeting (via `/v2/adgroup/update/`), and creative
38081
38081
  (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`).
38082
- - **Pinterest / X / LinkedIn / Google / OpenAI Ads**: status + budget only. Sending
38082
+ - **Google**: status, budget, and KEYWORD edits via `targeting.keywords` /
38083
+ `targeting.negativeKeywords` — each list you send becomes the FULL new set of its
38084
+ kind on the ad group (criteria not in the list are removed); a kind left out is
38085
+ untouched. Any other `targeting` field returns 400: Google cannot mutate broad
38086
+ targeting post-create without recreating the campaign. `creative` returns 501.
38087
+ - **Pinterest / X / LinkedIn / OpenAI Ads**: status + budget only. Sending
38083
38088
  `targeting` or `creative` returns 501 with code `unsupported_platform_operation`.
38084
38089
  OpenAI Ads budget is lifetime-only (see `budget.type` below).
38085
38090
  security:
@@ -38102,8 +38107,23 @@ paths:
38102
38107
  targeting:
38103
38108
  type: object
38104
38109
  description: |
38105
- Meta + TikTok only. Pinterest / X / LinkedIn / Google return 501.
38110
+ Meta + TikTok (demographics/interests) and Google (keyword edits only).
38111
+ Pinterest / X / LinkedIn return 501.
38106
38112
  properties:
38113
+ keywords:
38114
+ type: array
38115
+ description: "Google only. The FULL new set of positive keywords for the ad group; live keywords not listed are removed. Entries are strings (BROAD) or { text, matchType } with matchType exact | phrase | broad. Mirrored to GET /v1/ads/keywords immediately."
38116
+ items:
38117
+ oneOf:
38118
+ - { type: string }
38119
+ - { type: object, required: [text], properties: { text: { type: string, maxLength: 80 }, matchType: { type: string, enum: [exact, phrase, broad] } } }
38120
+ negativeKeywords:
38121
+ type: array
38122
+ description: "Google only. Same declarative contract as keywords, for the ad group's negative keywords."
38123
+ items:
38124
+ oneOf:
38125
+ - { type: string }
38126
+ - { type: object, required: [text], properties: { text: { type: string, maxLength: 80 }, matchType: { type: string, enum: [exact, phrase, broad] } } }
38107
38127
  ageMin: { type: integer, minimum: 13, maximum: 65 }
38108
38128
  ageMax: { type: integer, minimum: 13, maximum: 65 }
38109
38129
  countries: { type: array, items: { type: string } }
@@ -41000,7 +41020,8 @@ paths:
41000
41020
  items: { type: string, enum: [mobile, desktop] }
41001
41021
  audienceId: { type: string, description: Custom audience ID for targeting }
41002
41022
  campaignType: { type: string, enum: [display, search], default: display, description: Google only }
41003
- keywords: { type: array, items: { type: string }, description: Google Search only }
41023
+ keywords: { type: array, items: { type: string }, description: "Google Search only. BROAD-match keywords on the new ad group (first 20)." }
41024
+ negativeKeywords: { type: array, items: { type: string, maxLength: 80 }, description: "Google Search only; other platforms return 400. BROAD-match negative keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.negativeKeywords." }
41004
41025
  additionalHeadlines: { type: array, items: { type: string }, description: "Google Search RSA only. Extra headlines." }
41005
41026
  additionalDescriptions: { type: array, items: { type: string }, description: "Google Search RSA only. Extra descriptions." }
41006
41027
  advantageAudience: { type: integer, enum: [0, 1], description: "Meta only. Controls the Advantage audience feature (targeting_automation). 0 = disabled (default), 1 = enabled. Meta Marketing API requires this field on all ad set creation requests." }
@@ -290,7 +290,7 @@ describe 'AdCampaignsApi' do
290
290
 
291
291
  # unit tests for update_ad
292
292
  # Update ad
293
- # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style — &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Pinterest / X / LinkedIn / Google / OpenAI Ads**: status + budget only. Sending &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below).
293
+ # Patch one or more fields on an ad. Status, budget, targeting, and creative changes are propagated to the platform. Per-platform support: - **Meta** (Facebook + Instagram): all fields supported. - **TikTok**: status, budget, targeting (via &#x60;/v2/adgroup/update/&#x60;), and creative (via &#x60;/v2/ad/update/&#x60; patch-style — &#x60;headline&#x60; is ignored, &#x60;body&#x60; becomes &#x60;ad_text&#x60;). - **Google**: status, budget, and KEYWORD edits via &#x60;targeting.keywords&#x60; / &#x60;targeting.negativeKeywords&#x60; — each list you send becomes the FULL new set of its kind on the ad group (criteria not in the list are removed); a kind left out is untouched. Any other &#x60;targeting&#x60; field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. &#x60;creative&#x60; returns 501. - **Pinterest / X / LinkedIn / OpenAI Ads**: status + budget only. Sending &#x60;targeting&#x60; or &#x60;creative&#x60; returns 501 with code &#x60;unsupported_platform_operation&#x60;. OpenAI Ads budget is lifetime-only (see &#x60;budget.type&#x60; below).
294
294
  # @param ad_id
295
295
  # @param update_ad_request
296
296
  # @param [Hash] opts the optional parameters
@@ -94,11 +94,11 @@ describe 'ContactsApi' do
94
94
 
95
95
  # unit tests for list_contacts
96
96
  # List contacts
97
- # List and search contacts for a profile. Supports filtering by tags, platform, subscription status, and full-text search.
97
+ # List and search contacts for a profile. Supports filtering by tags, platform, subscription status, and text search on name, email and company.
98
98
  # @param [Hash] opts the optional parameters
99
99
  # @option opts [String] :profile_id Filter by profile. Omit to list across all profiles. Matches the profile recorded on the contact itself, which is set when the contact is created and is independent of the profile its account currently belongs to. Filter by accountId to list a contact through its channel instead.
100
100
  # @option opts [String] :account_id Filter by the SocialAccount that owns the contact channel. Contacts are resolved through their channels, so the profileId contact filter is not applied while accountId is set. A profileId sent alongside is still access-checked and still scopes the returned filters.tags list.
101
- # @option opts [String] :search
101
+ # @option opts [String] :search Case-insensitive substring match on the contact name, email and company. Phone numbers and other platform identifiers are not matched: they live on the contact channel, not on the contact. To reach a contact from an inbox webhook, use the conversation.contactId it already carries.
102
102
  # @option opts [String] :tag
103
103
  # @option opts [String] :tags Comma-separated tags, matches contacts carrying any of them
104
104
  # @option opts [String] :platform
@@ -467,6 +467,12 @@ describe Zernio::CreateStandaloneAdRequest do
467
467
  end
468
468
  end
469
469
 
470
+ describe 'test attribute "negative_keywords"' do
471
+ it 'should work' do
472
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
473
+ end
474
+ end
475
+
470
476
  describe 'test attribute "additional_headlines"' do
471
477
  it 'should work' do
472
478
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
@@ -0,0 +1,46 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf do
21
+ #let(:instance) { Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf.new }
22
+
23
+ describe 'test an instance of UpdateAdRequestTargetingKeywordsInnerOneOf' do
24
+ it 'should create an instance of UpdateAdRequestTargetingKeywordsInnerOneOf' do
25
+ # uncomment below to test the instance creation
26
+ #expect(instance).to be_instance_of(Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf)
27
+ end
28
+ end
29
+
30
+ describe 'test attribute "text"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "match_type"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["exact", "phrase", "broad"])
40
+ # validator.allowable_values.each do |value|
41
+ # expect { instance.match_type = value }.not_to raise_error
42
+ # end
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,32 @@
1
+ =begin
2
+ #Zernio API
3
+
4
+ #API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
5
+
6
+ The version of the OpenAPI document: 1.0.4
7
+ Contact: support@zernio.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.19.0
10
+
11
+ =end
12
+
13
+ require 'spec_helper'
14
+ require 'json'
15
+ require 'date'
16
+
17
+ # Unit tests for Zernio::UpdateAdRequestTargetingKeywordsInner
18
+ # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
+ # Please update as you see appropriate
20
+ describe Zernio::UpdateAdRequestTargetingKeywordsInner do
21
+ describe '.openapi_one_of' do
22
+ it 'lists the items referenced in the oneOf array' do
23
+ expect(described_class.openapi_one_of).to_not be_empty
24
+ end
25
+ end
26
+
27
+ describe '.build' do
28
+ it 'returns the correct model' do
29
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
30
+ end
31
+ end
32
+ end
@@ -27,6 +27,18 @@ describe Zernio::UpdateAdRequestTargeting do
27
27
  end
28
28
  end
29
29
 
30
+ describe 'test attribute "keywords"' do
31
+ it 'should work' do
32
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
+ end
34
+ end
35
+
36
+ describe 'test attribute "negative_keywords"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
30
42
  describe 'test attribute "age_min"' do
31
43
  it 'should work' do
32
44
  # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
Binary file