late-sdk 0.0.712 → 0.0.713

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e2dede122bdc22380ddb34f95c88d683fb5293de67a7b1f103d172227d3d0a8
4
- data.tar.gz: 5d62e5125f5b1e31caee6e2ba5d25eea8102e738ffa2e6a3acbd05f831435ac6
3
+ metadata.gz: 703c1ee72b50525532fe3bb4cf4fd913c54fe744716dee6049caf65df8399197
4
+ data.tar.gz: '0974a8f4104db93718fb7cc07d22e0f5c1f597a92fae31afad7d2aad686eb94b'
5
5
  SHA512:
6
- metadata.gz: 27298a74f36d392ccd5ea40600ab1ddff6d7e61f9fd1c033ae7486b4f0b0e015854fe5bff5972c66b7dbcba5a57f4a532b7068f260d3204dc4e8318c5d4e8388
7
- data.tar.gz: 35950d25ac955a78cb99a5c4d9c8e6e84ac353043cc01b76740f74b2d73cd1ce86b3982bcc28ca0c4e92c745a4aaf1855a590d1dd880ae995821265321c5a089
6
+ metadata.gz: 1b7916c0259740e78ab6b594b6b9aa60934fdc8ff0c569581b66609c22461324b414edee01340893fd35486998fb6487725f0909ac7faf346149e1d8e56a5d26
7
+ data.tar.gz: 4a98a2cf187b820711d948905e30bd799eddbffc2d60af331bb17c142a50e4612beefccd7160b3ec8daf45cbe1002526bc035da1658295589640adf8e9abfaf8
data/README.md CHANGED
@@ -1956,6 +1956,8 @@ Class | Method | HTTP request | Description
1956
1956
  - [Zernio::UpdateAdRequestCreative](docs/UpdateAdRequestCreative.md)
1957
1957
  - [Zernio::UpdateAdRequestTargeting](docs/UpdateAdRequestTargeting.md)
1958
1958
  - [Zernio::UpdateAdRequestTargetingInterestsInner](docs/UpdateAdRequestTargetingInterestsInner.md)
1959
+ - [Zernio::UpdateAdRequestTargetingKeywordsInner](docs/UpdateAdRequestTargetingKeywordsInner.md)
1960
+ - [Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf](docs/UpdateAdRequestTargetingKeywordsInnerOneOf.md)
1959
1961
  - [Zernio::UpdateAdSet200Response](docs/UpdateAdSet200Response.md)
1960
1962
  - [Zernio::UpdateAdSetRequest](docs/UpdateAdSetRequest.md)
1961
1963
  - [Zernio::UpdateAdSetRequestBudget](docs/UpdateAdSetRequestBudget.md)
@@ -1288,7 +1288,7 @@ end
1288
1288
 
1289
1289
  Update ad
1290
1290
 
1291
- 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 `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`). - **Pinterest / X / LinkedIn / Google / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below).
1291
+ 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 `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, and KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords` — 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 `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **Pinterest / X / LinkedIn / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below).
1292
1292
 
1293
1293
  ### Examples
1294
1294
 
@@ -69,7 +69,8 @@
69
69
  | **placement_assets** | [**CreateStandaloneAdRequestPlacementAssets**](CreateStandaloneAdRequestPlacementAssets.md) | | [optional] |
70
70
  | **audience_id** | **String** | Custom audience ID for targeting | [optional] |
71
71
  | **campaign_type** | **String** | Google only | [optional][default to 'display'] |
72
- | **keywords** | **Array<String>** | Google Search only | [optional] |
72
+ | **keywords** | **Array<String>** | Google Search only. BROAD-match keywords on the new ad group (first 20). | [optional] |
73
+ | **negative_keywords** | **Array<String>** | 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. | [optional] |
73
74
  | **additional_headlines** | **Array<String>** | Google Search RSA only. Extra headlines. | [optional] |
74
75
  | **additional_descriptions** | **Array<String>** | Google Search RSA only. Extra descriptions. | [optional] |
75
76
  | **advantage_audience** | **Integer** | 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. | [optional] |
@@ -159,6 +160,7 @@ instance = Zernio::CreateStandaloneAdRequest.new(
159
160
  audience_id: null,
160
161
  campaign_type: null,
161
162
  keywords: null,
163
+ negative_keywords: null,
162
164
  additional_headlines: null,
163
165
  additional_descriptions: null,
164
166
  advantage_audience: null,
@@ -4,6 +4,8 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
+ | **keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | 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. | [optional] |
8
+ | **negative_keywords** | [**Array<UpdateAdRequestTargetingKeywordsInner>**](UpdateAdRequestTargetingKeywordsInner.md) | Google only. Same declarative contract as keywords, for the ad group's negative keywords. | [optional] |
7
9
  | **age_min** | **Integer** | | [optional] |
8
10
  | **age_max** | **Integer** | | [optional] |
9
11
  | **countries** | **Array<String>** | | [optional] |
@@ -16,6 +18,8 @@
16
18
  require 'zernio-sdk'
17
19
 
18
20
  instance = Zernio::UpdateAdRequestTargeting.new(
21
+ keywords: null,
22
+ negative_keywords: null,
19
23
  age_min: null,
20
24
  age_max: null,
21
25
  countries: null,
@@ -0,0 +1,49 @@
1
+ # Zernio::UpdateAdRequestTargetingKeywordsInner
2
+
3
+ ## Class instance methods
4
+
5
+ ### `openapi_one_of`
6
+
7
+ Returns the list of classes defined in oneOf.
8
+
9
+ #### Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ Zernio::UpdateAdRequestTargetingKeywordsInner.openapi_one_of
15
+ # =>
16
+ # [
17
+ # :'String',
18
+ # :'UpdateAdRequestTargetingKeywordsInnerOneOf'
19
+ # ]
20
+ ```
21
+
22
+ ### build
23
+
24
+ Find the appropriate object from the `openapi_one_of` list and casts the data into it.
25
+
26
+ #### Example
27
+
28
+ ```ruby
29
+ require 'zernio-sdk'
30
+
31
+ Zernio::UpdateAdRequestTargetingKeywordsInner.build(data)
32
+ # => #<String:0x00007fdd4aab02a0>
33
+
34
+ Zernio::UpdateAdRequestTargetingKeywordsInner.build(data_that_doesnt_match)
35
+ # => nil
36
+ ```
37
+
38
+ #### Parameters
39
+
40
+ | Name | Type | Description |
41
+ | ---- | ---- | ----------- |
42
+ | **data** | **Mixed** | data to be matched against the list of oneOf items |
43
+
44
+ #### Return type
45
+
46
+ - `String`
47
+ - `UpdateAdRequestTargetingKeywordsInnerOneOf`
48
+ - `nil` (if no type matches)
49
+
@@ -0,0 +1,20 @@
1
+ # Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **text** | **String** | | |
8
+ | **match_type** | **String** | | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::UpdateAdRequestTargetingKeywordsInnerOneOf.new(
16
+ text: null,
17
+ match_type: null
18
+ )
19
+ ```
20
+
@@ -1381,7 +1381,7 @@ module Zernio
1381
1381
  end
1382
1382
 
1383
1383
  # Update ad
1384
- # 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 `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`). - **Pinterest / X / LinkedIn / Google / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below).
1384
+ # 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 `/v2/adgroup/update/`), and creative (via `/v2/ad/update/` patch-style — `headline` is ignored, `body` becomes `ad_text`). - **Google**: status, budget, and KEYWORD edits via `targeting.keywords` / `targeting.negativeKeywords` — 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 `targeting` field returns 400: Google cannot mutate broad targeting post-create without recreating the campaign. `creative` returns 501. - **Pinterest / X / LinkedIn / OpenAI Ads**: status + budget only. Sending `targeting` or `creative` returns 501 with code `unsupported_platform_operation`. OpenAI Ads budget is lifetime-only (see `budget.type` below).
1385
1385
  # @param ad_id [String]
1386
1386
  # @param update_ad_request [UpdateAdRequest]
1387
1387
  # @param [Hash] opts the optional parameters
@@ -1392,7 +1392,7 @@ module Zernio
1392
1392
  end
1393
1393
 
1394
1394
  # Update ad
1395
- # 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).
1395
+ # 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).
1396
1396
  # @param ad_id [String]
1397
1397
  # @param update_ad_request [UpdateAdRequest]
1398
1398
  # @param [Hash] opts the optional parameters
@@ -198,9 +198,12 @@ module Zernio
198
198
  # Google only
199
199
  attr_accessor :campaign_type
200
200
 
201
- # Google Search only
201
+ # Google Search only. BROAD-match keywords on the new ad group (first 20).
202
202
  attr_accessor :keywords
203
203
 
204
+ # 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.
205
+ attr_accessor :negative_keywords
206
+
204
207
  # Google Search RSA only. Extra headlines.
205
208
  attr_accessor :additional_headlines
206
209
 
@@ -337,6 +340,7 @@ module Zernio
337
340
  :'audience_id' => :'audienceId',
338
341
  :'campaign_type' => :'campaignType',
339
342
  :'keywords' => :'keywords',
343
+ :'negative_keywords' => :'negativeKeywords',
340
344
  :'additional_headlines' => :'additionalHeadlines',
341
345
  :'additional_descriptions' => :'additionalDescriptions',
342
346
  :'advantage_audience' => :'advantageAudience',
@@ -435,6 +439,7 @@ module Zernio
435
439
  :'audience_id' => :'String',
436
440
  :'campaign_type' => :'String',
437
441
  :'keywords' => :'Array<String>',
442
+ :'negative_keywords' => :'Array<String>',
438
443
  :'additional_headlines' => :'Array<String>',
439
444
  :'additional_descriptions' => :'Array<String>',
440
445
  :'advantage_audience' => :'Integer',
@@ -784,6 +789,12 @@ module Zernio
784
789
  end
785
790
  end
786
791
 
792
+ if attributes.key?(:'negative_keywords')
793
+ if (value = attributes[:'negative_keywords']).is_a?(Array)
794
+ self.negative_keywords = value
795
+ end
796
+ end
797
+
787
798
  if attributes.key?(:'additional_headlines')
788
799
  if (value = attributes[:'additional_headlines']).is_a?(Array)
789
800
  self.additional_headlines = value
@@ -1473,6 +1484,7 @@ module Zernio
1473
1484
  audience_id == o.audience_id &&
1474
1485
  campaign_type == o.campaign_type &&
1475
1486
  keywords == o.keywords &&
1487
+ negative_keywords == o.negative_keywords &&
1476
1488
  additional_headlines == o.additional_headlines &&
1477
1489
  additional_descriptions == o.additional_descriptions &&
1478
1490
  advantage_audience == o.advantage_audience &&
@@ -1500,7 +1512,7 @@ module Zernio
1500
1512
  # Calculates hash code according to all attributes.
1501
1513
  # @return [Integer] Hash code
1502
1514
  def hash
1503
- [account_id, ad_account_id, name, campaign_name, ad_set_name, ad_name, tracking, goal, optimization_goal, billing_event, buying_type, rf_prediction_id, creative_features, multi_advertiser, validate_only, budget_amount, budget_type, status, budget_level, currency, headline, long_headline, body, description, call_to_action, link_url, lead_gen_form_id, image_url, images, video, creatives, ad_set_id, existing_campaign_id, existing_creative_id, business_name, board_id, organization_id, targeting, countries, cities, regions, age_min, age_max, interests, zips, metros, custom_locations, behaviors, income_tier, languages, placements, saved_targeting_id, raw_targeting, special_ad_categories, special_ad_category_country, end_date, start_date, instagram_account_id, dynamic_creative, carousel_cards, default_locale, translations, placement_assets, audience_id, campaign_type, keywords, additional_headlines, additional_descriptions, advantage_audience, attribution_spec, gender, bid_strategy, bid_amount, roas_average_floor, value_rule_set_id, value_rules_applied, platform_specific_data, dsa_beneficiary, dsa_payor, brand_identity, identity_type, promoted_object].hash
1515
+ [account_id, ad_account_id, name, campaign_name, ad_set_name, ad_name, tracking, goal, optimization_goal, billing_event, buying_type, rf_prediction_id, creative_features, multi_advertiser, validate_only, budget_amount, budget_type, status, budget_level, currency, headline, long_headline, body, description, call_to_action, link_url, lead_gen_form_id, image_url, images, video, creatives, ad_set_id, existing_campaign_id, existing_creative_id, business_name, board_id, organization_id, targeting, countries, cities, regions, age_min, age_max, interests, zips, metros, custom_locations, behaviors, income_tier, languages, placements, saved_targeting_id, raw_targeting, special_ad_categories, special_ad_category_country, end_date, start_date, instagram_account_id, dynamic_creative, carousel_cards, default_locale, translations, placement_assets, audience_id, campaign_type, keywords, negative_keywords, additional_headlines, additional_descriptions, advantage_audience, attribution_spec, gender, bid_strategy, bid_amount, roas_average_floor, value_rule_set_id, value_rules_applied, platform_specific_data, dsa_beneficiary, dsa_payor, brand_identity, identity_type, promoted_object].hash
1504
1516
  end
1505
1517
 
1506
1518
  # Builds the object from hash
@@ -14,8 +14,14 @@ require 'date'
14
14
  require 'time'
15
15
 
16
16
  module Zernio
17
- # Meta + TikTok only. Pinterest / X / LinkedIn / Google return 501.
17
+ # Meta + TikTok (demographics/interests) and Google (keyword edits only). Pinterest / X / LinkedIn return 501.
18
18
  class UpdateAdRequestTargeting < ApiModelBase
19
+ # 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.
20
+ attr_accessor :keywords
21
+
22
+ # Google only. Same declarative contract as keywords, for the ad group's negative keywords.
23
+ attr_accessor :negative_keywords
24
+
19
25
  attr_accessor :age_min
20
26
 
21
27
  attr_accessor :age_max
@@ -53,6 +59,8 @@ module Zernio
53
59
  # Attribute mapping from ruby-style variable name to JSON key.
54
60
  def self.attribute_map
55
61
  {
62
+ :'keywords' => :'keywords',
63
+ :'negative_keywords' => :'negativeKeywords',
56
64
  :'age_min' => :'ageMin',
57
65
  :'age_max' => :'ageMax',
58
66
  :'countries' => :'countries',
@@ -74,6 +82,8 @@ module Zernio
74
82
  # Attribute type mapping.
75
83
  def self.openapi_types
76
84
  {
85
+ :'keywords' => :'Array<UpdateAdRequestTargetingKeywordsInner>',
86
+ :'negative_keywords' => :'Array<UpdateAdRequestTargetingKeywordsInner>',
77
87
  :'age_min' => :'Integer',
78
88
  :'age_max' => :'Integer',
79
89
  :'countries' => :'Array<String>',
@@ -104,6 +114,18 @@ module Zernio
104
114
  h[k.to_sym] = v
105
115
  }
106
116
 
117
+ if attributes.key?(:'keywords')
118
+ if (value = attributes[:'keywords']).is_a?(Array)
119
+ self.keywords = value
120
+ end
121
+ end
122
+
123
+ if attributes.key?(:'negative_keywords')
124
+ if (value = attributes[:'negative_keywords']).is_a?(Array)
125
+ self.negative_keywords = value
126
+ end
127
+ end
128
+
107
129
  if attributes.key?(:'age_min')
108
130
  self.age_min = attributes[:'age_min']
109
131
  end
@@ -217,6 +239,8 @@ module Zernio
217
239
  def ==(o)
218
240
  return true if self.equal?(o)
219
241
  self.class == o.class &&
242
+ keywords == o.keywords &&
243
+ negative_keywords == o.negative_keywords &&
220
244
  age_min == o.age_min &&
221
245
  age_max == o.age_max &&
222
246
  countries == o.countries &&
@@ -233,7 +257,7 @@ module Zernio
233
257
  # Calculates hash code according to all attributes.
234
258
  # @return [Integer] Hash code
235
259
  def hash
236
- [age_min, age_max, countries, interests, advantage_audience].hash
260
+ [keywords, negative_keywords, age_min, age_max, countries, interests, advantage_audience].hash
237
261
  end
238
262
 
239
263
  # Builds the object from hash
@@ -0,0 +1,104 @@
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
+ module UpdateAdRequestTargetingKeywordsInner
18
+ class << self
19
+ # List of class defined in oneOf (OpenAPI v3)
20
+ def openapi_one_of
21
+ [
22
+ :'String',
23
+ :'UpdateAdRequestTargetingKeywordsInnerOneOf'
24
+ ]
25
+ end
26
+
27
+ # Builds the object
28
+ # @param [Mixed] Data to be matched against the list of oneOf items
29
+ # @return [Object] Returns the model or the data itself
30
+ def build(data)
31
+ # Go through the list of oneOf items and attempt to identify the appropriate one.
32
+ # Note:
33
+ # - We do not attempt to check whether exactly one item matches.
34
+ # - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
35
+ # due to the way the deserialization is made in the base_object template (it just casts without verifying).
36
+ # - TODO: scalar values are de facto behaving as if they were nullable.
37
+ # - TODO: logging when debugging is set.
38
+ openapi_one_of.each do |klass|
39
+ begin
40
+ next if klass == :AnyType # "nullable: true"
41
+ return find_and_cast_into_type(klass, data)
42
+ rescue # rescue all errors so we keep iterating even if the current item lookup raises
43
+ end
44
+ end
45
+
46
+ openapi_one_of.include?(:AnyType) ? data : nil
47
+ end
48
+
49
+ private
50
+
51
+ SchemaMismatchError = Class.new(StandardError)
52
+
53
+ # Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
54
+ def find_and_cast_into_type(klass, data)
55
+ return if data.nil?
56
+
57
+ case klass.to_s
58
+ when 'Boolean'
59
+ return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
60
+ when 'Float'
61
+ return data if data.instance_of?(Float)
62
+ when 'Integer'
63
+ return data if data.instance_of?(Integer)
64
+ when 'Time'
65
+ return Time.parse(data)
66
+ when 'Date'
67
+ return Date.iso8601(data)
68
+ when 'String'
69
+ return data if data.instance_of?(String)
70
+ when 'Object' # "type: object"
71
+ return data if data.instance_of?(Hash)
72
+ when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
73
+ if data.instance_of?(Array)
74
+ sub_type = Regexp.last_match[:sub_type]
75
+ return data.map { |item| find_and_cast_into_type(sub_type, item) }
76
+ end
77
+ when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
78
+ if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
79
+ sub_type = Regexp.last_match[:sub_type]
80
+ return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
81
+ end
82
+ else # model
83
+ const = Zernio.const_get(klass)
84
+ if const
85
+ if const.respond_to?(:openapi_one_of) # nested oneOf model
86
+ model = const.build(data)
87
+ return model if model
88
+ else
89
+ # raise if data contains keys that are not known to the model
90
+ raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
91
+ model = const.build_from_hash(data)
92
+ return model if model
93
+ end
94
+ end
95
+ end
96
+
97
+ raise # if no match by now, raise
98
+ rescue
99
+ raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
100
+ end
101
+ end
102
+ end
103
+
104
+ end
@@ -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
@@ -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.713'
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
@@ -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
@@ -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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: late-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.712
4
+ version: 0.0.713
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
@@ -1446,6 +1446,8 @@ files:
1446
1446
  - docs/UpdateAdRequestCreative.md
1447
1447
  - docs/UpdateAdRequestTargeting.md
1448
1448
  - docs/UpdateAdRequestTargetingInterestsInner.md
1449
+ - docs/UpdateAdRequestTargetingKeywordsInner.md
1450
+ - docs/UpdateAdRequestTargetingKeywordsInnerOneOf.md
1449
1451
  - docs/UpdateAdSet200Response.md
1450
1452
  - docs/UpdateAdSetRequest.md
1451
1453
  - docs/UpdateAdSetRequestBudget.md
@@ -3144,6 +3146,8 @@ files:
3144
3146
  - lib/zernio-sdk/models/update_ad_request_creative.rb
3145
3147
  - lib/zernio-sdk/models/update_ad_request_targeting.rb
3146
3148
  - lib/zernio-sdk/models/update_ad_request_targeting_interests_inner.rb
3149
+ - lib/zernio-sdk/models/update_ad_request_targeting_keywords_inner.rb
3150
+ - lib/zernio-sdk/models/update_ad_request_targeting_keywords_inner_one_of.rb
3147
3151
  - lib/zernio-sdk/models/update_ad_set200_response.rb
3148
3152
  - lib/zernio-sdk/models/update_ad_set_request.rb
3149
3153
  - lib/zernio-sdk/models/update_ad_set_request_budget.rb
@@ -4821,6 +4825,8 @@ files:
4821
4825
  - spec/models/update_ad_request_creative_spec.rb
4822
4826
  - spec/models/update_ad_request_spec.rb
4823
4827
  - spec/models/update_ad_request_targeting_interests_inner_spec.rb
4828
+ - spec/models/update_ad_request_targeting_keywords_inner_one_of_spec.rb
4829
+ - spec/models/update_ad_request_targeting_keywords_inner_spec.rb
4824
4830
  - spec/models/update_ad_request_targeting_spec.rb
4825
4831
  - spec/models/update_ad_set200_response_spec.rb
4826
4832
  - spec/models/update_ad_set_request_budget_spec.rb
@@ -5102,7 +5108,7 @@ files:
5102
5108
  - spec/models/you_tube_video_retention_response_retention_curve_inner_spec.rb
5103
5109
  - spec/models/you_tube_video_retention_response_spec.rb
5104
5110
  - spec/spec_helper.rb
5105
- - zernio-sdk-0.0.712.gem
5111
+ - zernio-sdk-0.0.713.gem
5106
5112
  - zernio-sdk.gemspec
5107
5113
  homepage: https://openapi-generator.tech
5108
5114
  licenses:
@@ -5857,6 +5863,7 @@ test_files:
5857
5863
  - spec/models/update_ad_request_budget_spec.rb
5858
5864
  - spec/models/review_webhook_review_reply_spec.rb
5859
5865
  - spec/models/list_logs200_response_spec.rb
5866
+ - spec/models/update_ad_request_targeting_keywords_inner_spec.rb
5860
5867
  - spec/models/send_private_reply_to_comment_request_buttons_inner_one_of2_spec.rb
5861
5868
  - spec/models/boost_post_request_targeting_regions_inner_spec.rb
5862
5869
  - spec/models/update_webhook_settings_request_spec.rb
@@ -6337,6 +6344,7 @@ test_files:
6337
6344
  - spec/models/get_inbox_post_comments200_response_pagination_spec.rb
6338
6345
  - spec/models/instagram_account_insights_response_metrics_value_values_inner_spec.rb
6339
6346
  - spec/models/send_conversions200_response_spec.rb
6347
+ - spec/models/update_ad_request_targeting_keywords_inner_one_of_spec.rb
6340
6348
  - spec/models/get_pending_o_auth_data200_response_spec.rb
6341
6349
  - spec/models/custom_conversion_spec.rb
6342
6350
  - spec/models/send_inbox_message_request_template_spec.rb
Binary file