zernio-sdk 0.0.824 → 0.0.826
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/docs/CreateStandaloneAdRequest.md +7 -1
- data/docs/InstagramPlatformData.md +9 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request.rb +122 -2
- data/lib/zernio-sdk/models/instagram_platform_data.rb +90 -4
- data/lib/zernio-sdk/version.rb +1 -1
- data/openapi.yaml +50 -1
- data/spec/models/create_standalone_ad_request_spec.rb +18 -0
- data/spec/models/instagram_platform_data_spec.rb +24 -0
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5294c926122620e2a54e3dcd1d08b004699cb23179f674fe312a214db225fd03
|
|
4
|
+
data.tar.gz: 415ea783c41fb587589db032e52fb733ffb66a1e1e023586684a0b4ba476a64e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 37e55b6ee6cf96370c972dd3e7ec43402e637e8e116c31be058c0ccea60dc79719e83c49aad3829be0623edcef18343a63971bc83aa70bccd012ec216fc13918
|
|
7
|
+
data.tar.gz: b11196d939f62042e0c3e7cf5dec85d743e389beaeee46611c9150e7090d9f959e9beaf322b3fe91b32e35d1f69fcc996a14709b34156248a3c296e851421abb
|
|
@@ -28,7 +28,10 @@
|
|
|
28
28
|
| **headline** | **String** | Required for Meta, Google, Pinterest, LinkedIn, and OpenAI Ads on legacy + attach shapes (skip for multi-creative — use `creatives[].headline`). Ignored for TikTok and X/Twitter. Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400, OpenAI=50 (min 3). On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title. On OpenAI Ads this is the chat card's title. | [optional] |
|
|
29
29
|
| **long_headline** | **String** | Google Display only — defaults to `headline` if omitted. On LinkedIn, reused as the optional secondary description text on traffic (link) ads; omitted if not provided. | [optional] |
|
|
30
30
|
| **body** | **String** | Required on legacy + attach shapes. For X/Twitter this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100. | [optional] |
|
|
31
|
-
| **description** | **String** | Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use
|
|
31
|
+
| **description** | **String** | Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead. | [optional] |
|
|
32
|
+
| **bodies** | **Array<String>** | Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`. | [optional] |
|
|
33
|
+
| **headlines** | **Array<String>** | Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name`. | [optional] |
|
|
34
|
+
| **descriptions** | **Array<String>** | Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`. | [optional] |
|
|
32
35
|
| **call_to_action** | **String** | Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X/Twitter. | [optional] |
|
|
33
36
|
| **link_url** | **String** | Required on legacy + attach shapes (skip for multi-creative). On LinkedIn it's the ad's destination URL; required for `traffic` ads, optional for `engagement` / `awareness`. NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead of a destination). On LinkedIn, `imageUrl` + `linkUrl` publishes an ARTICLE-content creative; this is LinkedIn's article ad format, with the image as thumbnail and `longHeadline` as description. Required for OpenAI Ads (the chat card's target_url). | [optional] |
|
|
34
37
|
| **lead_gen_form_id** | **String** | Lead Gen form ID to attach to the ad's creative. REQUIRED when `goal` is `lead_generation`. Create one via POST /v1/ads/lead-forms. On Meta (facebook/instagram) this is the leadgen_forms ID; the ad set's promoted_object.page_id + LEAD_GENERATION optimization + destination_type ON_AD are derived automatically from the goal. On LinkedIn this is the adForm ID; the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}` and the campaign objective is set to MAX_LEAD. Forms must be owned by the sponsoredAccount (not the organization) for the URN to resolve. Also required on every Meta ATTACH (`adSetId`) call that targets a lead ad set (the form attaches per-ad; Meta rejects a formless ad in a lead ad set). Both `placementAssets` (per-placement creative) and `dynamicCreative` (multi-text / multi-asset pool, e.g. multiple headlines and primary texts) ARE supported on Meta instant-form lead ads. | [optional] |
|
|
@@ -129,6 +132,9 @@ instance = Zernio::CreateStandaloneAdRequest.new(
|
|
|
129
132
|
long_headline: null,
|
|
130
133
|
body: null,
|
|
131
134
|
description: null,
|
|
135
|
+
bodies: null,
|
|
136
|
+
headlines: null,
|
|
137
|
+
descriptions: null,
|
|
132
138
|
call_to_action: null,
|
|
133
139
|
link_url: null,
|
|
134
140
|
lead_gen_form_id: null,
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
| **instagram_thumbnail** | **String** | Custom cover image URL for Instagram Reels (JPG or PNG, publicly accessible). Overrides thumbOffset when provided. Also accepted as reelCover (alias). | [optional] |
|
|
18
18
|
| **reel_cover** | **String** | Alias for instagramThumbnail. If both are provided, instagramThumbnail takes priority. | [optional] |
|
|
19
19
|
| **is_ai_generated** | **Boolean** | When true, the post is labeled by Instagram as containing AI-generated media. Per Meta, this self-disclosure label is for AI-generated media, not AI-written captions. Applies to feed posts, Reels, Stories, and carousels. | [optional][default to false] |
|
|
20
|
+
| **is_paid_partnership** | **Boolean** | When true, Instagram shows the \"Paid partnership\" label on the post. Applies to feed posts, Reels, and carousels; not supported on Stories (400). Requires an Instagram account connected via Facebook Login; classic Instagram Login accounts get a 400 (instagram_paid_partnership_requires_facebook_login). Implied when brandedContentSponsors is set. | [optional][default to false] |
|
|
21
|
+
| **branded_content_sponsors** | **Array<String>** | Up to 2 brands to tag as sponsors, each an Instagram username (leading @ optional) or a numeric Instagram user ID. Usernames are resolved at publish time via the Business Discovery API on the publishing account; a sponsor that cannot be resolved (private, personal, or nonexistent account) fails the post with a user error naming it. Sponsors must be professional (Business or Creator) accounts. A brand that has pre-approved the creator shows as \"Paid partnership with @brand\" immediately; otherwise the plain label shows and the brand receives an approval request. Sets isPaidPartnership. Same login and content-type rules as isPaidPartnership. | [optional] |
|
|
22
|
+
| **comments_enabled** | **Boolean** | When false, comments are turned off on the post right after it is published (Meta exposes this as comment_enabled on the media object). Applies to feed posts, Reels, and carousels; ignored for Stories, which have no comments. Works with both Instagram connection methods. Best-effort: if the toggle fails after a successful publish, the post still succeeds and stays live with comments on. | [optional][default to true] |
|
|
23
|
+
| **location_id** | **String** | Tags the post with a location. The ID of a Facebook Page that has location data (digits only); it is sent to Instagram as location_id. Applies to feed posts, Reels, and the carousel as a whole; Stories and individual carousel slides are unsupported (a Story with locationId is rejected with a 400). A Page without location data or that does not exist fails the post with a user error at publish time. | [optional] |
|
|
20
24
|
|
|
21
25
|
## Example
|
|
22
26
|
|
|
@@ -36,7 +40,11 @@ instance = Zernio::InstagramPlatformData.new(
|
|
|
36
40
|
thumb_offset: 5000,
|
|
37
41
|
instagram_thumbnail: null,
|
|
38
42
|
reel_cover: null,
|
|
39
|
-
is_ai_generated: null
|
|
43
|
+
is_ai_generated: null,
|
|
44
|
+
is_paid_partnership: true,
|
|
45
|
+
branded_content_sponsors: [nike, 17841400000000000],
|
|
46
|
+
comments_enabled: false,
|
|
47
|
+
location_id: 105890561436614
|
|
40
48
|
)
|
|
41
49
|
```
|
|
42
50
|
|
|
@@ -83,9 +83,18 @@ module Zernio
|
|
|
83
83
|
# Required on legacy + attach shapes. For X/Twitter this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100.
|
|
84
84
|
attr_accessor :body
|
|
85
85
|
|
|
86
|
-
# Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use
|
|
86
|
+
# Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead.
|
|
87
87
|
attr_accessor :description
|
|
88
88
|
|
|
89
|
+
# Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative (`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one). Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level `body` field is used as the `object_story_spec.link_data.message` (the preview text) and `headlines` must also be present. Mutually exclusive with `dynamicCreative`, `placementAssets`, `carouselCards`, and `creatives[]`.
|
|
90
|
+
attr_accessor :bodies
|
|
91
|
+
|
|
92
|
+
# Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name`.
|
|
93
|
+
attr_accessor :headlines
|
|
94
|
+
|
|
95
|
+
# Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`.
|
|
96
|
+
attr_accessor :descriptions
|
|
97
|
+
|
|
89
98
|
# Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X/Twitter.
|
|
90
99
|
attr_accessor :call_to_action
|
|
91
100
|
|
|
@@ -330,6 +339,9 @@ module Zernio
|
|
|
330
339
|
:'long_headline' => :'longHeadline',
|
|
331
340
|
:'body' => :'body',
|
|
332
341
|
:'description' => :'description',
|
|
342
|
+
:'bodies' => :'bodies',
|
|
343
|
+
:'headlines' => :'headlines',
|
|
344
|
+
:'descriptions' => :'descriptions',
|
|
333
345
|
:'call_to_action' => :'callToAction',
|
|
334
346
|
:'link_url' => :'linkUrl',
|
|
335
347
|
:'lead_gen_form_id' => :'leadGenFormId',
|
|
@@ -439,6 +451,9 @@ module Zernio
|
|
|
439
451
|
:'long_headline' => :'String',
|
|
440
452
|
:'body' => :'String',
|
|
441
453
|
:'description' => :'String',
|
|
454
|
+
:'bodies' => :'Array<String>',
|
|
455
|
+
:'headlines' => :'Array<String>',
|
|
456
|
+
:'descriptions' => :'Array<String>',
|
|
442
457
|
:'call_to_action' => :'String',
|
|
443
458
|
:'link_url' => :'String',
|
|
444
459
|
:'lead_gen_form_id' => :'String',
|
|
@@ -642,6 +657,24 @@ module Zernio
|
|
|
642
657
|
self.description = attributes[:'description']
|
|
643
658
|
end
|
|
644
659
|
|
|
660
|
+
if attributes.key?(:'bodies')
|
|
661
|
+
if (value = attributes[:'bodies']).is_a?(Array)
|
|
662
|
+
self.bodies = value
|
|
663
|
+
end
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
if attributes.key?(:'headlines')
|
|
667
|
+
if (value = attributes[:'headlines']).is_a?(Array)
|
|
668
|
+
self.headlines = value
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
if attributes.key?(:'descriptions')
|
|
673
|
+
if (value = attributes[:'descriptions']).is_a?(Array)
|
|
674
|
+
self.descriptions = value
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
|
|
645
678
|
if attributes.key?(:'call_to_action')
|
|
646
679
|
self.call_to_action = attributes[:'call_to_action']
|
|
647
680
|
end
|
|
@@ -1024,6 +1057,30 @@ module Zernio
|
|
|
1024
1057
|
invalid_properties.push('invalid value for "description", the character length must be smaller than or equal to 255.')
|
|
1025
1058
|
end
|
|
1026
1059
|
|
|
1060
|
+
if !@bodies.nil? && @bodies.length > 5
|
|
1061
|
+
invalid_properties.push('invalid value for "bodies", number of items must be less than or equal to 5.')
|
|
1062
|
+
end
|
|
1063
|
+
|
|
1064
|
+
if !@bodies.nil? && @bodies.length < 1
|
|
1065
|
+
invalid_properties.push('invalid value for "bodies", number of items must be greater than or equal to 1.')
|
|
1066
|
+
end
|
|
1067
|
+
|
|
1068
|
+
if !@headlines.nil? && @headlines.length > 5
|
|
1069
|
+
invalid_properties.push('invalid value for "headlines", number of items must be less than or equal to 5.')
|
|
1070
|
+
end
|
|
1071
|
+
|
|
1072
|
+
if !@headlines.nil? && @headlines.length < 1
|
|
1073
|
+
invalid_properties.push('invalid value for "headlines", number of items must be greater than or equal to 1.')
|
|
1074
|
+
end
|
|
1075
|
+
|
|
1076
|
+
if !@descriptions.nil? && @descriptions.length > 5
|
|
1077
|
+
invalid_properties.push('invalid value for "descriptions", number of items must be less than or equal to 5.')
|
|
1078
|
+
end
|
|
1079
|
+
|
|
1080
|
+
if !@descriptions.nil? && @descriptions.length < 1
|
|
1081
|
+
invalid_properties.push('invalid value for "descriptions", number of items must be greater than or equal to 1.')
|
|
1082
|
+
end
|
|
1083
|
+
|
|
1027
1084
|
if !@creatives.nil? && @creatives.length < 1
|
|
1028
1085
|
invalid_properties.push('invalid value for "creatives", number of items must be greater than or equal to 1.')
|
|
1029
1086
|
end
|
|
@@ -1141,6 +1198,12 @@ module Zernio
|
|
|
1141
1198
|
return false if !@currency.nil? && @currency.to_s.length < 3
|
|
1142
1199
|
return false if !@long_headline.nil? && @long_headline.to_s.length > 90
|
|
1143
1200
|
return false if !@description.nil? && @description.to_s.length > 255
|
|
1201
|
+
return false if !@bodies.nil? && @bodies.length > 5
|
|
1202
|
+
return false if !@bodies.nil? && @bodies.length < 1
|
|
1203
|
+
return false if !@headlines.nil? && @headlines.length > 5
|
|
1204
|
+
return false if !@headlines.nil? && @headlines.length < 1
|
|
1205
|
+
return false if !@descriptions.nil? && @descriptions.length > 5
|
|
1206
|
+
return false if !@descriptions.nil? && @descriptions.length < 1
|
|
1144
1207
|
call_to_action_validator = EnumAttributeValidator.new('String', ["LEARN_MORE", "SHOP_NOW", "SIGN_UP", "BOOK_TRAVEL", "CONTACT_US", "DOWNLOAD", "GET_OFFER", "GET_QUOTE", "SUBSCRIBE", "WATCH_MORE", "ADD_TO_CART", "APPLY_NOW", "BOOK_NOW", "BUY_TICKETS", "DONATE", "DONATE_NOW", "GET_DIRECTIONS", "GET_SHOWTIMES", "LISTEN_NOW", "ORDER_NOW", "PLAY_GAME", "REQUEST_TIME", "SEE_MENU", "START_ORDER", "INSTALL_MOBILE_APP", "USE_APP", "REGISTER", "JOIN", "ATTEND", "REQUEST_DEMO", "VIEW_QUOTE", "APPLY", "SEE_MORE", "BUY_NOW"])
|
|
1145
1208
|
return false unless call_to_action_validator.valid?(@call_to_action)
|
|
1146
1209
|
return false if !@creatives.nil? && @creatives.length < 1
|
|
@@ -1369,6 +1432,60 @@ module Zernio
|
|
|
1369
1432
|
@description = description
|
|
1370
1433
|
end
|
|
1371
1434
|
|
|
1435
|
+
# Custom attribute writer method with validation
|
|
1436
|
+
# @param [Object] bodies Value to be assigned
|
|
1437
|
+
def bodies=(bodies)
|
|
1438
|
+
if bodies.nil?
|
|
1439
|
+
fail ArgumentError, 'bodies cannot be nil'
|
|
1440
|
+
end
|
|
1441
|
+
|
|
1442
|
+
if bodies.length > 5
|
|
1443
|
+
fail ArgumentError, 'invalid value for "bodies", number of items must be less than or equal to 5.'
|
|
1444
|
+
end
|
|
1445
|
+
|
|
1446
|
+
if bodies.length < 1
|
|
1447
|
+
fail ArgumentError, 'invalid value for "bodies", number of items must be greater than or equal to 1.'
|
|
1448
|
+
end
|
|
1449
|
+
|
|
1450
|
+
@bodies = bodies
|
|
1451
|
+
end
|
|
1452
|
+
|
|
1453
|
+
# Custom attribute writer method with validation
|
|
1454
|
+
# @param [Object] headlines Value to be assigned
|
|
1455
|
+
def headlines=(headlines)
|
|
1456
|
+
if headlines.nil?
|
|
1457
|
+
fail ArgumentError, 'headlines cannot be nil'
|
|
1458
|
+
end
|
|
1459
|
+
|
|
1460
|
+
if headlines.length > 5
|
|
1461
|
+
fail ArgumentError, 'invalid value for "headlines", number of items must be less than or equal to 5.'
|
|
1462
|
+
end
|
|
1463
|
+
|
|
1464
|
+
if headlines.length < 1
|
|
1465
|
+
fail ArgumentError, 'invalid value for "headlines", number of items must be greater than or equal to 1.'
|
|
1466
|
+
end
|
|
1467
|
+
|
|
1468
|
+
@headlines = headlines
|
|
1469
|
+
end
|
|
1470
|
+
|
|
1471
|
+
# Custom attribute writer method with validation
|
|
1472
|
+
# @param [Object] descriptions Value to be assigned
|
|
1473
|
+
def descriptions=(descriptions)
|
|
1474
|
+
if descriptions.nil?
|
|
1475
|
+
fail ArgumentError, 'descriptions cannot be nil'
|
|
1476
|
+
end
|
|
1477
|
+
|
|
1478
|
+
if descriptions.length > 5
|
|
1479
|
+
fail ArgumentError, 'invalid value for "descriptions", number of items must be less than or equal to 5.'
|
|
1480
|
+
end
|
|
1481
|
+
|
|
1482
|
+
if descriptions.length < 1
|
|
1483
|
+
fail ArgumentError, 'invalid value for "descriptions", number of items must be greater than or equal to 1.'
|
|
1484
|
+
end
|
|
1485
|
+
|
|
1486
|
+
@descriptions = descriptions
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1372
1489
|
# Custom attribute writer method checking allowed values (enum).
|
|
1373
1490
|
# @param [Object] call_to_action Object to be assigned
|
|
1374
1491
|
def call_to_action=(call_to_action)
|
|
@@ -1674,6 +1791,9 @@ module Zernio
|
|
|
1674
1791
|
long_headline == o.long_headline &&
|
|
1675
1792
|
body == o.body &&
|
|
1676
1793
|
description == o.description &&
|
|
1794
|
+
bodies == o.bodies &&
|
|
1795
|
+
headlines == o.headlines &&
|
|
1796
|
+
descriptions == o.descriptions &&
|
|
1677
1797
|
call_to_action == o.call_to_action &&
|
|
1678
1798
|
link_url == o.link_url &&
|
|
1679
1799
|
lead_gen_form_id == o.lead_gen_form_id &&
|
|
@@ -1753,7 +1873,7 @@ module Zernio
|
|
|
1753
1873
|
# Calculates hash code according to all attributes.
|
|
1754
1874
|
# @return [Integer] Hash code
|
|
1755
1875
|
def hash
|
|
1756
|
-
[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, campaign_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, work_positions, work_employers, work_industries, income_tier, languages, placements, saved_targeting_id, raw_targeting, special_ad_categories, special_ad_category_country, regional_regulated_categories, regional_regulation_identities, 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, sitelinks, callouts, structured_snippets, 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, smart_plus, promoted_object].hash
|
|
1876
|
+
[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, campaign_status, budget_level, currency, headline, long_headline, body, description, bodies, headlines, descriptions, 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, work_positions, work_employers, work_industries, income_tier, languages, placements, saved_targeting_id, raw_targeting, special_ad_categories, special_ad_category_country, regional_regulated_categories, regional_regulation_identities, 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, sitelinks, callouts, structured_snippets, 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, smart_plus, promoted_object].hash
|
|
1757
1877
|
end
|
|
1758
1878
|
|
|
1759
1879
|
# Builds the object from hash
|
|
@@ -53,6 +53,18 @@ module Zernio
|
|
|
53
53
|
# When true, the post is labeled by Instagram as containing AI-generated media. Per Meta, this self-disclosure label is for AI-generated media, not AI-written captions. Applies to feed posts, Reels, Stories, and carousels.
|
|
54
54
|
attr_accessor :is_ai_generated
|
|
55
55
|
|
|
56
|
+
# When true, Instagram shows the \"Paid partnership\" label on the post. Applies to feed posts, Reels, and carousels; not supported on Stories (400). Requires an Instagram account connected via Facebook Login; classic Instagram Login accounts get a 400 (instagram_paid_partnership_requires_facebook_login). Implied when brandedContentSponsors is set.
|
|
57
|
+
attr_accessor :is_paid_partnership
|
|
58
|
+
|
|
59
|
+
# Up to 2 brands to tag as sponsors, each an Instagram username (leading @ optional) or a numeric Instagram user ID. Usernames are resolved at publish time via the Business Discovery API on the publishing account; a sponsor that cannot be resolved (private, personal, or nonexistent account) fails the post with a user error naming it. Sponsors must be professional (Business or Creator) accounts. A brand that has pre-approved the creator shows as \"Paid partnership with @brand\" immediately; otherwise the plain label shows and the brand receives an approval request. Sets isPaidPartnership. Same login and content-type rules as isPaidPartnership.
|
|
60
|
+
attr_accessor :branded_content_sponsors
|
|
61
|
+
|
|
62
|
+
# When false, comments are turned off on the post right after it is published (Meta exposes this as comment_enabled on the media object). Applies to feed posts, Reels, and carousels; ignored for Stories, which have no comments. Works with both Instagram connection methods. Best-effort: if the toggle fails after a successful publish, the post still succeeds and stays live with comments on.
|
|
63
|
+
attr_accessor :comments_enabled
|
|
64
|
+
|
|
65
|
+
# Tags the post with a location. The ID of a Facebook Page that has location data (digits only); it is sent to Instagram as location_id. Applies to feed posts, Reels, and the carousel as a whole; Stories and individual carousel slides are unsupported (a Story with locationId is rejected with a 400). A Page without location data or that does not exist fails the post with a user error at publish time.
|
|
66
|
+
attr_accessor :location_id
|
|
67
|
+
|
|
56
68
|
class EnumAttributeValidator
|
|
57
69
|
attr_reader :datatype
|
|
58
70
|
attr_reader :allowable_values
|
|
@@ -90,7 +102,11 @@ module Zernio
|
|
|
90
102
|
:'thumb_offset' => :'thumbOffset',
|
|
91
103
|
:'instagram_thumbnail' => :'instagramThumbnail',
|
|
92
104
|
:'reel_cover' => :'reelCover',
|
|
93
|
-
:'is_ai_generated' => :'isAiGenerated'
|
|
105
|
+
:'is_ai_generated' => :'isAiGenerated',
|
|
106
|
+
:'is_paid_partnership' => :'isPaidPartnership',
|
|
107
|
+
:'branded_content_sponsors' => :'brandedContentSponsors',
|
|
108
|
+
:'comments_enabled' => :'commentsEnabled',
|
|
109
|
+
:'location_id' => :'locationId'
|
|
94
110
|
}
|
|
95
111
|
end
|
|
96
112
|
|
|
@@ -119,7 +135,11 @@ module Zernio
|
|
|
119
135
|
:'thumb_offset' => :'Integer',
|
|
120
136
|
:'instagram_thumbnail' => :'String',
|
|
121
137
|
:'reel_cover' => :'String',
|
|
122
|
-
:'is_ai_generated' => :'Boolean'
|
|
138
|
+
:'is_ai_generated' => :'Boolean',
|
|
139
|
+
:'is_paid_partnership' => :'Boolean',
|
|
140
|
+
:'branded_content_sponsors' => :'Array<String>',
|
|
141
|
+
:'comments_enabled' => :'Boolean',
|
|
142
|
+
:'location_id' => :'String'
|
|
123
143
|
}
|
|
124
144
|
end
|
|
125
145
|
|
|
@@ -206,6 +226,28 @@ module Zernio
|
|
|
206
226
|
else
|
|
207
227
|
self.is_ai_generated = false
|
|
208
228
|
end
|
|
229
|
+
|
|
230
|
+
if attributes.key?(:'is_paid_partnership')
|
|
231
|
+
self.is_paid_partnership = attributes[:'is_paid_partnership']
|
|
232
|
+
else
|
|
233
|
+
self.is_paid_partnership = false
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
if attributes.key?(:'branded_content_sponsors')
|
|
237
|
+
if (value = attributes[:'branded_content_sponsors']).is_a?(Array)
|
|
238
|
+
self.branded_content_sponsors = value
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
if attributes.key?(:'comments_enabled')
|
|
243
|
+
self.comments_enabled = attributes[:'comments_enabled']
|
|
244
|
+
else
|
|
245
|
+
self.comments_enabled = true
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
if attributes.key?(:'location_id')
|
|
249
|
+
self.location_id = attributes[:'location_id']
|
|
250
|
+
end
|
|
209
251
|
end
|
|
210
252
|
|
|
211
253
|
# Show invalid properties with the reasons. Usually used together with valid?
|
|
@@ -217,6 +259,15 @@ module Zernio
|
|
|
217
259
|
invalid_properties.push('invalid value for "thumb_offset", must be greater than or equal to 0.')
|
|
218
260
|
end
|
|
219
261
|
|
|
262
|
+
if !@branded_content_sponsors.nil? && @branded_content_sponsors.length > 2
|
|
263
|
+
invalid_properties.push('invalid value for "branded_content_sponsors", number of items must be less than or equal to 2.')
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
pattern = Regexp.new(/^[0-9]+$/)
|
|
267
|
+
if !@location_id.nil? && @location_id !~ pattern
|
|
268
|
+
invalid_properties.push("invalid value for \"location_id\", must conform to the pattern #{pattern}.")
|
|
269
|
+
end
|
|
270
|
+
|
|
220
271
|
invalid_properties
|
|
221
272
|
end
|
|
222
273
|
|
|
@@ -227,6 +278,8 @@ module Zernio
|
|
|
227
278
|
content_type_validator = EnumAttributeValidator.new('String', ["story"])
|
|
228
279
|
return false unless content_type_validator.valid?(@content_type)
|
|
229
280
|
return false if !@thumb_offset.nil? && @thumb_offset < 0
|
|
281
|
+
return false if !@branded_content_sponsors.nil? && @branded_content_sponsors.length > 2
|
|
282
|
+
return false if !@location_id.nil? && @location_id !~ Regexp.new(/^[0-9]+$/)
|
|
230
283
|
true
|
|
231
284
|
end
|
|
232
285
|
|
|
@@ -254,6 +307,35 @@ module Zernio
|
|
|
254
307
|
@thumb_offset = thumb_offset
|
|
255
308
|
end
|
|
256
309
|
|
|
310
|
+
# Custom attribute writer method with validation
|
|
311
|
+
# @param [Object] branded_content_sponsors Value to be assigned
|
|
312
|
+
def branded_content_sponsors=(branded_content_sponsors)
|
|
313
|
+
if branded_content_sponsors.nil?
|
|
314
|
+
fail ArgumentError, 'branded_content_sponsors cannot be nil'
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
if branded_content_sponsors.length > 2
|
|
318
|
+
fail ArgumentError, 'invalid value for "branded_content_sponsors", number of items must be less than or equal to 2.'
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
@branded_content_sponsors = branded_content_sponsors
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
# Custom attribute writer method with validation
|
|
325
|
+
# @param [Object] location_id Value to be assigned
|
|
326
|
+
def location_id=(location_id)
|
|
327
|
+
if location_id.nil?
|
|
328
|
+
fail ArgumentError, 'location_id cannot be nil'
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
pattern = Regexp.new(/^[0-9]+$/)
|
|
332
|
+
if location_id !~ pattern
|
|
333
|
+
fail ArgumentError, "invalid value for \"location_id\", must conform to the pattern #{pattern}."
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
@location_id = location_id
|
|
337
|
+
end
|
|
338
|
+
|
|
257
339
|
# Checks equality by comparing each attribute.
|
|
258
340
|
# @param [Object] Object to be compared
|
|
259
341
|
def ==(o)
|
|
@@ -271,7 +353,11 @@ module Zernio
|
|
|
271
353
|
thumb_offset == o.thumb_offset &&
|
|
272
354
|
instagram_thumbnail == o.instagram_thumbnail &&
|
|
273
355
|
reel_cover == o.reel_cover &&
|
|
274
|
-
is_ai_generated == o.is_ai_generated
|
|
356
|
+
is_ai_generated == o.is_ai_generated &&
|
|
357
|
+
is_paid_partnership == o.is_paid_partnership &&
|
|
358
|
+
branded_content_sponsors == o.branded_content_sponsors &&
|
|
359
|
+
comments_enabled == o.comments_enabled &&
|
|
360
|
+
location_id == o.location_id
|
|
275
361
|
end
|
|
276
362
|
|
|
277
363
|
# @see the `==` method
|
|
@@ -283,7 +369,7 @@ module Zernio
|
|
|
283
369
|
# Calculates hash code according to all attributes.
|
|
284
370
|
# @return [Integer] Hash code
|
|
285
371
|
def hash
|
|
286
|
-
[content_type, share_to_feed, collaborators, first_comment, trial_params, user_tags, audio_name, audio_configuration, mute_audio, thumb_offset, instagram_thumbnail, reel_cover, is_ai_generated].hash
|
|
372
|
+
[content_type, share_to_feed, collaborators, first_comment, trial_params, user_tags, audio_name, audio_configuration, mute_audio, thumb_offset, instagram_thumbnail, reel_cover, is_ai_generated, is_paid_partnership, branded_content_sponsors, comments_enabled, location_id].hash
|
|
287
373
|
end
|
|
288
374
|
|
|
289
375
|
# Builds the object from hash
|
data/lib/zernio-sdk/version.rb
CHANGED
data/openapi.yaml
CHANGED
|
@@ -5855,6 +5855,27 @@ components:
|
|
|
5855
5855
|
type: boolean
|
|
5856
5856
|
default: false
|
|
5857
5857
|
description: When true, the post is labeled by Instagram as containing AI-generated media. Per Meta, this self-disclosure label is for AI-generated media, not AI-written captions. Applies to feed posts, Reels, Stories, and carousels.
|
|
5858
|
+
isPaidPartnership:
|
|
5859
|
+
type: boolean
|
|
5860
|
+
default: false
|
|
5861
|
+
description: 'When true, Instagram shows the "Paid partnership" label on the post. Applies to feed posts, Reels, and carousels; not supported on Stories (400). Requires an Instagram account connected via Facebook Login; classic Instagram Login accounts get a 400 (instagram_paid_partnership_requires_facebook_login). Implied when brandedContentSponsors is set.'
|
|
5862
|
+
example: true
|
|
5863
|
+
brandedContentSponsors:
|
|
5864
|
+
type: array
|
|
5865
|
+
maxItems: 2
|
|
5866
|
+
items: { type: string }
|
|
5867
|
+
description: 'Up to 2 brands to tag as sponsors, each an Instagram username (leading @ optional) or a numeric Instagram user ID. Usernames are resolved at publish time via the Business Discovery API on the publishing account; a sponsor that cannot be resolved (private, personal, or nonexistent account) fails the post with a user error naming it. Sponsors must be professional (Business or Creator) accounts. A brand that has pre-approved the creator shows as "Paid partnership with @brand" immediately; otherwise the plain label shows and the brand receives an approval request. Sets isPaidPartnership. Same login and content-type rules as isPaidPartnership.'
|
|
5868
|
+
example: ['nike', '17841400000000000']
|
|
5869
|
+
commentsEnabled:
|
|
5870
|
+
type: boolean
|
|
5871
|
+
default: true
|
|
5872
|
+
description: 'When false, comments are turned off on the post right after it is published (Meta exposes this as comment_enabled on the media object). Applies to feed posts, Reels, and carousels; ignored for Stories, which have no comments. Works with both Instagram connection methods. Best-effort: if the toggle fails after a successful publish, the post still succeeds and stays live with comments on.'
|
|
5873
|
+
example: false
|
|
5874
|
+
locationId:
|
|
5875
|
+
type: string
|
|
5876
|
+
pattern: '^[0-9]+$'
|
|
5877
|
+
description: 'Tags the post with a location. The ID of a Facebook Page that has location data (digits only); it is sent to Instagram as location_id. Applies to feed posts, Reels, and the carousel as a whole; Stories and individual carousel slides are unsupported (a Story with locationId is rejected with a 400). A Page without location data or that does not exist fails the post with a user error at publish time.'
|
|
5878
|
+
example: '105890561436614'
|
|
5858
5879
|
description: Feed aspect ratio 0.5625-1.91, carousels up to 10 items, stories require media (no captions). User tag coordinates 0.0-1.0 from top-left. Images over 8 MB and videos over platform limits are auto-compressed.
|
|
5859
5880
|
|
|
5860
5881
|
InstagramAudioAsset:
|
|
@@ -44593,7 +44614,35 @@ paths:
|
|
|
44593
44614
|
headline: { type: string, description: "Required for Meta, Google, Pinterest, LinkedIn, and OpenAI Ads on legacy + attach shapes (skip for multi-creative — use `creatives[].headline`). Ignored for TikTok and X/Twitter. Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400, OpenAI=50 (min 3). On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title. On OpenAI Ads this is the chat card's title." }
|
|
44594
44615
|
longHeadline: { type: string, maxLength: 90, description: "Google Display only — defaults to `headline` if omitted. On LinkedIn, reused as the optional secondary description text on traffic (link) ads; omitted if not provided." }
|
|
44595
44616
|
body: { type: string, description: "Required on legacy + attach shapes. For X/Twitter this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100." }
|
|
44596
|
-
description: { type: string, maxLength: 255, description: "Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use
|
|
44617
|
+
description: { type: string, maxLength: 255, description: "Meta only (facebook/instagram). Link description — the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description). When omitted, Meta auto-pulls the destination URL's OpenGraph description. Applies on legacy, attach, and placementAssets shapes; for multi-creative use creatives[].description (this field is the shared fallback). For multi-text variations use `descriptions` (array) instead." }
|
|
44618
|
+
bodies:
|
|
44619
|
+
type: array
|
|
44620
|
+
minItems: 1
|
|
44621
|
+
maxItems: 5
|
|
44622
|
+
items: { type: string }
|
|
44623
|
+
description: |
|
|
44624
|
+
Meta only. Multiple Text Options (Advantage+ Flexible Format): supply 1-5 primary-text
|
|
44625
|
+
variations and Meta optimises delivery across them, WITHOUT enabling full Dynamic Creative
|
|
44626
|
+
(`dynamicCreative`). Uses `optimization_type: DEGREES_OF_FREEDOM` on the asset feed, so
|
|
44627
|
+
multiple ads per ad set are allowed (unlike `dynamicCreative` which is limited to one).
|
|
44628
|
+
Requires `imageUrl` or `video`, `linkUrl`, and `callToAction`. When set, the top-level
|
|
44629
|
+
`body` field is used as the `object_story_spec.link_data.message` (the preview text) and
|
|
44630
|
+
`headlines` must also be present. Mutually exclusive with `dynamicCreative`,
|
|
44631
|
+
`placementAssets`, `carouselCards`, and `creatives[]`.
|
|
44632
|
+
headlines:
|
|
44633
|
+
type: array
|
|
44634
|
+
minItems: 1
|
|
44635
|
+
maxItems: 5
|
|
44636
|
+
items: { type: string, maxLength: 255 }
|
|
44637
|
+
description: |
|
|
44638
|
+
Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`.
|
|
44639
|
+
The top-level `headline` field is used as the `object_story_spec.link_data.name`.
|
|
44640
|
+
descriptions:
|
|
44641
|
+
type: array
|
|
44642
|
+
minItems: 1
|
|
44643
|
+
maxItems: 5
|
|
44644
|
+
items: { type: string, maxLength: 255 }
|
|
44645
|
+
description: 'Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`.'
|
|
44597
44646
|
callToAction: { type: string, enum: [LEARN_MORE, SHOP_NOW, SIGN_UP, BOOK_TRAVEL, CONTACT_US, DOWNLOAD, GET_OFFER, GET_QUOTE, SUBSCRIBE, WATCH_MORE, ADD_TO_CART, APPLY_NOW, BOOK_NOW, BUY_TICKETS, DONATE, DONATE_NOW, GET_DIRECTIONS, GET_SHOWTIMES, LISTEN_NOW, ORDER_NOW, PLAY_GAME, REQUEST_TIME, SEE_MENU, START_ORDER, INSTALL_MOBILE_APP, USE_APP, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, BUY_NOW], description: "Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X/Twitter." }
|
|
44598
44647
|
linkUrl: { type: string, format: uri, description: "Required on legacy + attach shapes (skip for multi-creative). On LinkedIn it's the ad's destination URL; required for `traffic` ads, optional for `engagement` / `awareness`. NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead of a destination). On LinkedIn, `imageUrl` + `linkUrl` publishes an ARTICLE-content creative; this is LinkedIn's article ad format, with the image as thumbnail and `longHeadline` as description. Required for OpenAI Ads (the chat card's target_url)." }
|
|
44599
44648
|
leadGenFormId: { type: string, description: "Lead Gen form ID to attach to the ad's creative. REQUIRED when `goal` is `lead_generation`. Create one via POST /v1/ads/lead-forms. On Meta (facebook/instagram) this is the leadgen_forms ID; the ad set's promoted_object.page_id + LEAD_GENERATION optimization + destination_type ON_AD are derived automatically from the goal. On LinkedIn this is the adForm ID; the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}` and the campaign objective is set to MAX_LEAD. Forms must be owned by the sponsoredAccount (not the organization) for the URN to resolve. Also required on every Meta ATTACH (`adSetId`) call that targets a lead ad set (the form attaches per-ad; Meta rejects a formless ad in a lead ad set). Both `placementAssets` (per-placement creative) and `dynamicCreative` (multi-text / multi-asset pool, e.g. multiple headlines and primary texts) ARE supported on Meta instant-form lead ads." }
|
|
@@ -209,6 +209,24 @@ describe Zernio::CreateStandaloneAdRequest do
|
|
|
209
209
|
end
|
|
210
210
|
end
|
|
211
211
|
|
|
212
|
+
describe 'test attribute "bodies"' do
|
|
213
|
+
it 'should work' do
|
|
214
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
describe 'test attribute "headlines"' do
|
|
219
|
+
it 'should work' do
|
|
220
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
describe 'test attribute "descriptions"' do
|
|
225
|
+
it 'should work' do
|
|
226
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
212
230
|
describe 'test attribute "call_to_action"' do
|
|
213
231
|
it 'should work' do
|
|
214
232
|
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
@@ -109,4 +109,28 @@ describe Zernio::InstagramPlatformData do
|
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
+
describe 'test attribute "is_paid_partnership"' do
|
|
113
|
+
it 'should work' do
|
|
114
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe 'test attribute "branded_content_sponsors"' do
|
|
119
|
+
it 'should work' do
|
|
120
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
describe 'test attribute "comments_enabled"' do
|
|
125
|
+
it 'should work' do
|
|
126
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe 'test attribute "location_id"' do
|
|
131
|
+
it 'should work' do
|
|
132
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
112
136
|
end
|