peal 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (747) hide show
  1. checksums.yaml +4 -4
  2. data/NOTICE +4 -0
  3. data/README.md +171 -319
  4. data/lib/peal/analytics/client.rb +120 -0
  5. data/lib/peal/analytics/types/post_analytics_request.rb +13 -0
  6. data/lib/peal/analytics/types/summary_analytics_request.rb +17 -0
  7. data/lib/peal/api_keys/client.rb +153 -0
  8. data/lib/peal/api_keys/types/list_api_keys_request.rb +11 -0
  9. data/lib/peal/api_keys/types/new_api_key.rb +17 -0
  10. data/lib/peal/api_keys/types/revoke_api_keys_request.rb +13 -0
  11. data/lib/peal/assistant/client.rb +112 -0
  12. data/lib/peal/assistant/types/status_assistant_request.rb +11 -0
  13. data/lib/peal/assistant/types/suggestion_request.rb +15 -0
  14. data/lib/peal/billing/client.rb +58 -0
  15. data/lib/peal/billing/types/get_billing_request.rb +11 -0
  16. data/lib/peal/channels/client.rb +366 -0
  17. data/lib/peal/channels/types/choose_accounts.rb +17 -0
  18. data/lib/peal/channels/types/connect_callback.rb +21 -0
  19. data/lib/peal/channels/types/connect_channel.rb +17 -0
  20. data/lib/peal/channels/types/disconnect_channels_request.rb +13 -0
  21. data/lib/peal/channels/types/list_channels_request.rb +11 -0
  22. data/lib/peal/channels/types/platforms_channels_request.rb +11 -0
  23. data/lib/peal/channels/types/reconnect_channels_request.rb +13 -0
  24. data/lib/peal/client.rb +93 -0
  25. data/lib/peal/environment.rb +7 -0
  26. data/lib/peal/errors/api_error.rb +8 -0
  27. data/lib/peal/errors/client_error.rb +17 -0
  28. data/lib/peal/errors/connection_error.rb +11 -0
  29. data/lib/peal/errors/redirect_error.rb +8 -0
  30. data/lib/peal/errors/response_error.rb +65 -0
  31. data/lib/peal/errors/server_error.rb +11 -0
  32. data/lib/peal/errors/timeout_error.rb +8 -0
  33. data/lib/peal/internal/errors/constraint_error.rb +10 -0
  34. data/lib/peal/internal/errors/type_error.rb +10 -0
  35. data/lib/peal/internal/http/base_request.rb +83 -0
  36. data/lib/peal/internal/http/raw_client.rb +297 -0
  37. data/lib/peal/internal/iterators/cursor_item_iterator.rb +33 -0
  38. data/lib/peal/internal/iterators/cursor_page_iterator.rb +126 -0
  39. data/lib/peal/internal/iterators/item_iterator.rb +120 -0
  40. data/lib/peal/internal/iterators/offset_item_iterator.rb +35 -0
  41. data/lib/peal/internal/iterators/offset_page_iterator.rb +160 -0
  42. data/lib/peal/internal/json/request.rb +51 -0
  43. data/lib/peal/internal/json/serializable.rb +25 -0
  44. data/lib/peal/internal/multipart/multipart_encoder.rb +141 -0
  45. data/lib/peal/internal/multipart/multipart_form_data.rb +84 -0
  46. data/lib/peal/internal/multipart/multipart_form_data_part.rb +51 -0
  47. data/lib/peal/internal/multipart/multipart_request.rb +42 -0
  48. data/lib/peal/internal/types/array.rb +47 -0
  49. data/lib/peal/internal/types/boolean.rb +34 -0
  50. data/lib/peal/internal/types/enum.rb +56 -0
  51. data/lib/peal/internal/types/hash.rb +36 -0
  52. data/lib/peal/internal/types/model/field.rb +38 -0
  53. data/lib/peal/internal/types/model.rb +258 -0
  54. data/lib/peal/internal/types/type.rb +35 -0
  55. data/lib/peal/internal/types/union.rb +161 -0
  56. data/lib/peal/internal/types/unknown.rb +15 -0
  57. data/lib/peal/internal/types/utils.rb +144 -0
  58. data/lib/peal/invitations/client.rb +160 -0
  59. data/lib/peal/invitations/types/list_invitations_request.rb +11 -0
  60. data/lib/peal/invitations/types/new_invitation.rb +15 -0
  61. data/lib/peal/invitations/types/revoke_invitations_request.rb +13 -0
  62. data/lib/peal/media/client.rb +360 -0
  63. data/lib/peal/media/types/complete_media_request.rb +13 -0
  64. data/lib/peal/media/types/delete_media_request.rb +13 -0
  65. data/lib/peal/media/types/get_media_request.rb +13 -0
  66. data/lib/peal/media/types/list_media_request.rb +15 -0
  67. data/lib/peal/media/types/media_description.rb +15 -0
  68. data/lib/peal/media/types/new_upload.rb +17 -0
  69. data/lib/peal/media/types/usage_media_request.rb +13 -0
  70. data/lib/peal/members/client.rb +58 -0
  71. data/lib/peal/members/types/list_members_request.rb +11 -0
  72. data/lib/peal/notices/client.rb +189 -0
  73. data/lib/peal/notices/types/list_notices_request.rb +13 -0
  74. data/lib/peal/notices/types/mark_notices_read.rb +11 -0
  75. data/lib/peal/notification_preferences/client.rb +100 -0
  76. data/lib/peal/notification_preferences/types/notification_preferences_change.rb +13 -0
  77. data/lib/peal/notification_preferences/types/notification_preferences_change_email.rb +19 -0
  78. data/lib/peal/posts/client.rb +703 -0
  79. data/lib/peal/posts/types/attempts_posts_request.rb +13 -0
  80. data/lib/peal/posts/types/cancel_posts_request.rb +13 -0
  81. data/lib/peal/posts/types/confirm_posts_request.rb +17 -0
  82. data/lib/peal/posts/types/create_posts_request.rb +13 -0
  83. data/lib/peal/posts/types/discard_posts_request.rb +13 -0
  84. data/lib/peal/posts/types/drafts_posts_request.rb +15 -0
  85. data/lib/peal/posts/types/get_posts_request.rb +13 -0
  86. data/lib/peal/posts/types/list_posts_request.rb +15 -0
  87. data/lib/peal/posts/types/repost_posts_request.rb +15 -0
  88. data/lib/peal/posts/types/reschedule_posts_request.rb +15 -0
  89. data/lib/peal/posts/types/schedule_post.rb +19 -0
  90. data/lib/peal/posts/types/unschedule_posts_request.rb +13 -0
  91. data/lib/peal/posts/types/update_posts_request.rb +15 -0
  92. data/lib/peal/session/client.rb +55 -0
  93. data/lib/peal/system/client.rb +82 -0
  94. data/lib/peal/tiktok/client.rb +62 -0
  95. data/lib/peal/tiktok/types/creator_tiktok_request.rb +13 -0
  96. data/lib/peal/types/already_member_encoded.rb +9 -0
  97. data/lib/peal/types/alt_text_too_long_encoded.rb +13 -0
  98. data/lib/peal/types/alt_text_too_long_encoded_tag.rb +13 -0
  99. data/lib/peal/types/analytics_summary.rb +23 -0
  100. data/lib/peal/types/api_key.rb +21 -0
  101. data/lib/peal/types/api_key_not_found_encoded.rb +9 -0
  102. data/lib/peal/types/assistant_action.rb +21 -0
  103. data/lib/peal/types/assistant_action_hashtags.rb +9 -0
  104. data/lib/peal/types/assistant_action_rewrite.rb +11 -0
  105. data/lib/peal/types/assistant_action_shorten.rb +11 -0
  106. data/lib/peal/types/assistant_action_translate.rb +11 -0
  107. data/lib/peal/types/assistant_failed_encoded.rb +13 -0
  108. data/lib/peal/types/assistant_failed_encoded_reason.rb +16 -0
  109. data/lib/peal/types/assistant_failed_encoded_tag.rb +13 -0
  110. data/lib/peal/types/assistant_input_rejected_encoded.rb +15 -0
  111. data/lib/peal/types/assistant_input_rejected_encoded_reason.rb +14 -0
  112. data/lib/peal/types/assistant_input_rejected_encoded_tag.rb +13 -0
  113. data/lib/peal/types/assistant_quota_exceeded_encoded.rb +15 -0
  114. data/lib/peal/types/assistant_quota_exceeded_encoded_tag.rb +13 -0
  115. data/lib/peal/types/assistant_status.rb +19 -0
  116. data/lib/peal/types/assistant_tone.rb +17 -0
  117. data/lib/peal/types/assistant_unavailable_encoded.rb +11 -0
  118. data/lib/peal/types/assistant_unavailable_encoded_tag.rb +13 -0
  119. data/lib/peal/types/attempt_result.rb +24 -0
  120. data/lib/peal/types/authorization.rb +11 -0
  121. data/lib/peal/types/billing.rb +21 -0
  122. data/lib/peal/types/billing_subscription.rb +17 -0
  123. data/lib/peal/types/calendar_day.rb +25 -0
  124. data/lib/peal/types/channel.rb +23 -0
  125. data/lib/peal/types/channel_cannot_post_encoded.rb +13 -0
  126. data/lib/peal/types/channel_cannot_post_encoded_reason.rb +14 -0
  127. data/lib/peal/types/channel_cannot_post_encoded_tag.rb +13 -0
  128. data/lib/peal/types/channel_metrics.rb +23 -0
  129. data/lib/peal/types/channel_not_found_encoded.rb +9 -0
  130. data/lib/peal/types/channel_options.rb +13 -0
  131. data/lib/peal/types/channel_status.rb +19 -0
  132. data/lib/peal/types/channel_status_active.rb +9 -0
  133. data/lib/peal/types/channel_status_disabled.rb +11 -0
  134. data/lib/peal/types/channel_status_refresh_needed.rb +9 -0
  135. data/lib/peal/types/choosable_account.rb +19 -0
  136. data/lib/peal/types/conflict_error_body.rb +17 -0
  137. data/lib/peal/types/connect_failed_encoded.rb +13 -0
  138. data/lib/peal/types/connect_failed_encoded_tag.rb +13 -0
  139. data/lib/peal/types/connect_failure_reason.rb +22 -0
  140. data/lib/peal/types/connect_outcome.rb +17 -0
  141. data/lib/peal/types/connect_outcome_choose.rb +15 -0
  142. data/lib/peal/types/connect_outcome_connected.rb +11 -0
  143. data/lib/peal/types/connectable_platforms.rb +11 -0
  144. data/lib/peal/types/content_violation.rb +65 -0
  145. data/lib/peal/types/content_violation_alt_text_too_long.rb +19 -0
  146. data/lib/peal/types/content_violation_aspect_ratio_unsupported.rb +23 -0
  147. data/lib/peal/types/content_violation_aspect_ratio_unsupported_maximum.rb +15 -0
  148. data/lib/peal/types/content_violation_aspect_ratio_unsupported_minimum.rb +15 -0
  149. data/lib/peal/types/content_violation_empty.rb +13 -0
  150. data/lib/peal/types/content_violation_forbidden_characters.rb +15 -0
  151. data/lib/peal/types/content_violation_media_required.rb +13 -0
  152. data/lib/peal/types/content_violation_media_too_large.rb +19 -0
  153. data/lib/peal/types/content_violation_media_too_small.rb +19 -0
  154. data/lib/peal/types/content_violation_media_type_unsupported.rb +17 -0
  155. data/lib/peal/types/content_violation_mixed_media.rb +13 -0
  156. data/lib/peal/types/content_violation_no_channels.rb +9 -0
  157. data/lib/peal/types/content_violation_option_invalid.rb +15 -0
  158. data/lib/peal/types/content_violation_option_missing.rb +15 -0
  159. data/lib/peal/types/content_violation_option_too_long.rb +19 -0
  160. data/lib/peal/types/content_violation_options_for_other_platform.rb +15 -0
  161. data/lib/peal/types/content_violation_options_without_channel.rb +11 -0
  162. data/lib/peal/types/content_violation_override_without_channel.rb +11 -0
  163. data/lib/peal/types/content_violation_side_out_of_range.rb +23 -0
  164. data/lib/peal/types/content_violation_text_too_long.rb +19 -0
  165. data/lib/peal/types/content_violation_too_many_hashtags.rb +17 -0
  166. data/lib/peal/types/content_violation_too_many_links.rb +17 -0
  167. data/lib/peal/types/content_violation_too_many_media.rb +17 -0
  168. data/lib/peal/types/content_violation_too_many_mentions.rb +17 -0
  169. data/lib/peal/types/content_violation_too_many_pixels.rb +21 -0
  170. data/lib/peal/types/content_violation_too_many_videos.rb +17 -0
  171. data/lib/peal/types/content_violation_video_too_long.rb +19 -0
  172. data/lib/peal/types/content_violation_video_too_short.rb +19 -0
  173. data/lib/peal/types/created_api_key.rb +13 -0
  174. data/lib/peal/types/database_unavailable_encoded.rb +11 -0
  175. data/lib/peal/types/database_unavailable_encoded_tag.rb +13 -0
  176. data/lib/peal/types/draft_page.rb +13 -0
  177. data/lib/peal/types/effect_http_api_error_bad_request_encoded.rb +11 -0
  178. data/lib/peal/types/effect_http_api_error_bad_request_encoded_tag.rb +13 -0
  179. data/lib/peal/types/engagement_day.rb +19 -0
  180. data/lib/peal/types/failure_reason.rb +24 -0
  181. data/lib/peal/types/forbidden_encoded.rb +11 -0
  182. data/lib/peal/types/forbidden_encoded_tag.rb +13 -0
  183. data/lib/peal/types/invalid_date_range_encoded.rb +11 -0
  184. data/lib/peal/types/invalid_date_range_encoded_tag.rb +13 -0
  185. data/lib/peal/types/invalid_time_range_encoded.rb +11 -0
  186. data/lib/peal/types/invalid_time_range_encoded_tag.rb +13 -0
  187. data/lib/peal/types/invalid_time_zone_encoded.rb +13 -0
  188. data/lib/peal/types/invalid_time_zone_encoded_tag.rb +13 -0
  189. data/lib/peal/types/invitation.rb +21 -0
  190. data/lib/peal/types/invitation_not_found_encoded.rb +9 -0
  191. data/lib/peal/types/me.rb +15 -0
  192. data/lib/peal/types/me_user.rb +21 -0
  193. data/lib/peal/types/me_user_locale.rb +14 -0
  194. data/lib/peal/types/media.rb +33 -0
  195. data/lib/peal/types/media_attachment.rb +13 -0
  196. data/lib/peal/types/media_content_type.rb +18 -0
  197. data/lib/peal/types/media_dimensions.rb +13 -0
  198. data/lib/peal/types/media_in_use_encoded.rb +13 -0
  199. data/lib/peal/types/media_in_use_encoded_tag.rb +13 -0
  200. data/lib/peal/types/media_kind.rb +14 -0
  201. data/lib/peal/types/media_not_found_encoded.rb +9 -0
  202. data/lib/peal/types/media_page.rb +13 -0
  203. data/lib/peal/types/media_status.rb +21 -0
  204. data/lib/peal/types/media_status_pending.rb +9 -0
  205. data/lib/peal/types/media_status_ready.rb +9 -0
  206. data/lib/peal/types/media_status_rejected.rb +11 -0
  207. data/lib/peal/types/media_status_uploaded.rb +11 -0
  208. data/lib/peal/types/media_store_unavailable_encoded.rb +11 -0
  209. data/lib/peal/types/media_store_unavailable_encoded_tag.rb +13 -0
  210. data/lib/peal/types/media_too_large_encoded.rb +15 -0
  211. data/lib/peal/types/media_too_large_encoded_kind.rb +14 -0
  212. data/lib/peal/types/media_usage.rb +13 -0
  213. data/lib/peal/types/membership.rb +19 -0
  214. data/lib/peal/types/metric_totals.rb +21 -0
  215. data/lib/peal/types/metrics_snapshot.rb +13 -0
  216. data/lib/peal/types/non_finite_number.rb +14 -0
  217. data/lib/peal/types/not_found_error_body.rb +17 -0
  218. data/lib/peal/types/notice.rb +19 -0
  219. data/lib/peal/types/notice_channel.rb +13 -0
  220. data/lib/peal/types/notice_event.rb +23 -0
  221. data/lib/peal/types/notice_event_channel_reconnect_required.rb +11 -0
  222. data/lib/peal/types/notice_event_channel_reconnect_soon.rb +13 -0
  223. data/lib/peal/types/notice_event_post_failed.rb +15 -0
  224. data/lib/peal/types/notice_event_post_published.rb +15 -0
  225. data/lib/peal/types/notice_event_post_unconfirmed.rb +13 -0
  226. data/lib/peal/types/notice_page.rb +13 -0
  227. data/lib/peal/types/notification_preferences.rb +13 -0
  228. data/lib/peal/types/notification_preferences_email.rb +17 -0
  229. data/lib/peal/types/paid_plan.rb +14 -0
  230. data/lib/peal/types/period_usage.rb +13 -0
  231. data/lib/peal/types/permission.rb +40 -0
  232. data/lib/peal/types/plan.rb +15 -0
  233. data/lib/peal/types/plan_allowances.rb +17 -0
  234. data/lib/peal/types/plan_limit.rb +16 -0
  235. data/lib/peal/types/plan_limit_reached_encoded.rb +15 -0
  236. data/lib/peal/types/plan_limit_reached_encoded_tag.rb +13 -0
  237. data/lib/peal/types/plan_offer.rb +13 -0
  238. data/lib/peal/types/platform.rb +22 -0
  239. data/lib/peal/types/platform_unreachable_encoded.rb +11 -0
  240. data/lib/peal/types/platform_unreachable_encoded_tag.rb +13 -0
  241. data/lib/peal/types/post.rb +23 -0
  242. data/lib/peal/types/post_analytics.rb +13 -0
  243. data/lib/peal/types/post_content.rb +15 -0
  244. data/lib/peal/types/post_content_invalid_encoded.rb +11 -0
  245. data/lib/peal/types/post_draft.rb +15 -0
  246. data/lib/peal/types/post_metrics.rb +19 -0
  247. data/lib/peal/types/post_not_found_encoded.rb +9 -0
  248. data/lib/peal/types/post_outcome.rb +17 -0
  249. data/lib/peal/types/post_schedule.rb +13 -0
  250. data/lib/peal/types/post_status.rb +17 -0
  251. data/lib/peal/types/post_status_conflict_encoded.rb +13 -0
  252. data/lib/peal/types/post_status_conflict_encoded_tag.rb +13 -0
  253. data/lib/peal/types/post_target.rb +29 -0
  254. data/lib/peal/types/post_target_status.rb +18 -0
  255. data/lib/peal/types/prepared_upload.rb +13 -0
  256. data/lib/peal/types/probe_state.rb +18 -0
  257. data/lib/peal/types/publication_attempt.rb +23 -0
  258. data/lib/peal/types/rejection_reason.rb +14 -0
  259. data/lib/peal/types/role.rb +17 -0
  260. data/lib/peal/types/schedule_in_past_encoded.rb +9 -0
  261. data/lib/peal/types/signed_request.rb +15 -0
  262. data/lib/peal/types/signed_request_method.rb +13 -0
  263. data/lib/peal/types/subscription_status.rb +20 -0
  264. data/lib/peal/types/suggestion.rb +17 -0
  265. data/lib/peal/types/suggestion_hashtags.rb +11 -0
  266. data/lib/peal/types/suggestion_text.rb +11 -0
  267. data/lib/peal/types/target_confirmation.rb +17 -0
  268. data/lib/peal/types/target_confirmation_not_published.rb +9 -0
  269. data/lib/peal/types/target_confirmation_published.rb +11 -0
  270. data/lib/peal/types/target_metrics.rb +25 -0
  271. data/lib/peal/types/target_options.rb +19 -0
  272. data/lib/peal/types/target_status_conflict_encoded.rb +11 -0
  273. data/lib/peal/types/text_override.rb +13 -0
  274. data/lib/peal/types/text_unit.rb +18 -0
  275. data/lib/peal/types/tik_tok_account.rb +13 -0
  276. data/lib/peal/types/tik_tok_account_posting.rb +17 -0
  277. data/lib/peal/types/tik_tok_account_posting_blocked.rb +11 -0
  278. data/lib/peal/types/tik_tok_account_posting_ready.rb +11 -0
  279. data/lib/peal/types/tik_tok_block.rb +15 -0
  280. data/lib/peal/types/tik_tok_creator.rb +25 -0
  281. data/lib/peal/types/tik_tok_options.rb +26 -0
  282. data/lib/peal/types/tik_tok_privacy_level.rb +16 -0
  283. data/lib/peal/types/too_many_invitations_encoded.rb +9 -0
  284. data/lib/peal/types/top_post.rb +23 -0
  285. data/lib/peal/types/translation_language.rb +22 -0
  286. data/lib/peal/types/unauthenticated_encoded.rb +11 -0
  287. data/lib/peal/types/unauthenticated_encoded_tag.rb +13 -0
  288. data/lib/peal/types/unconfirmed_reason.rb +16 -0
  289. data/lib/peal/types/unknown_channels_encoded.rb +11 -0
  290. data/lib/peal/types/unknown_media_encoded.rb +11 -0
  291. data/lib/peal/types/unprocessable_entity_error_body.rb +19 -0
  292. data/lib/peal/types/unread_notices.rb +11 -0
  293. data/lib/peal/types/unsupported_media_type_encoded.rb +11 -0
  294. data/lib/peal/types/upload_incomplete_encoded.rb +11 -0
  295. data/lib/peal/types/upload_incomplete_encoded_tag.rb +13 -0
  296. data/lib/peal/types/upload_part.rb +15 -0
  297. data/lib/peal/types/upload_rejected_encoded.rb +13 -0
  298. data/lib/peal/types/upload_rejected_encoded_tag.rb +13 -0
  299. data/lib/peal/types/upload_target.rb +17 -0
  300. data/lib/peal/types/upload_target_multipart.rb +15 -0
  301. data/lib/peal/types/upload_target_single.rb +13 -0
  302. data/lib/peal/types/usage.rb +17 -0
  303. data/lib/peal/types/workspace_member.rb +19 -0
  304. data/lib/peal/types/workspace_not_found_encoded.rb +11 -0
  305. data/lib/peal/types/workspace_not_found_encoded_tag.rb +13 -0
  306. data/lib/peal/types/you_tube_options.rb +24 -0
  307. data/lib/peal/types/you_tube_privacy.rb +15 -0
  308. data/lib/peal/version.rb +2 -12
  309. data/lib/peal.rb +315 -247
  310. metadata +313 -510
  311. data/Gemfile +0 -9
  312. data/Gemfile.lock +0 -136
  313. data/Rakefile +0 -10
  314. data/docs/AlreadyMemberEncoded.md +0 -18
  315. data/docs/AltTextTooLongEncoded.md +0 -20
  316. data/docs/AnalyticsApi.md +0 -155
  317. data/docs/AnalyticsSummary.md +0 -30
  318. data/docs/ApiKey.md +0 -28
  319. data/docs/ApiKeyNotFoundEncoded.md +0 -18
  320. data/docs/ApiKeysApi.md +0 -220
  321. data/docs/ApiKeysRevoke404Response.md +0 -18
  322. data/docs/AssistantAction.md +0 -24
  323. data/docs/AssistantActionAnyOf.md +0 -20
  324. data/docs/AssistantActionAnyOf1.md +0 -20
  325. data/docs/AssistantActionAnyOf2.md +0 -20
  326. data/docs/AssistantActionAnyOf3.md +0 -18
  327. data/docs/AssistantApi.md +0 -149
  328. data/docs/AssistantFailedEncoded.md +0 -20
  329. data/docs/AssistantInputRejectedEncoded.md +0 -22
  330. data/docs/AssistantQuotaExceededEncoded.md +0 -22
  331. data/docs/AssistantStatus.md +0 -26
  332. data/docs/AssistantTone.md +0 -15
  333. data/docs/AssistantUnavailableEncoded.md +0 -18
  334. data/docs/AttemptResult.md +0 -15
  335. data/docs/Authorization.md +0 -18
  336. data/docs/Billing.md +0 -28
  337. data/docs/BillingApi.md +0 -77
  338. data/docs/BillingSubscription.md +0 -24
  339. data/docs/Channel.md +0 -30
  340. data/docs/ChannelCannotPostEncoded.md +0 -20
  341. data/docs/ChannelMetrics.md +0 -30
  342. data/docs/ChannelNotFoundEncoded.md +0 -18
  343. data/docs/ChannelOptions.md +0 -20
  344. data/docs/ChannelStatus.md +0 -20
  345. data/docs/ChannelStatusAnyOf.md +0 -18
  346. data/docs/ChannelStatusAnyOf1.md +0 -18
  347. data/docs/ChannelStatusAnyOf2.md +0 -20
  348. data/docs/ChannelsApi.md +0 -512
  349. data/docs/ChannelsCompleteConnect404Response.md +0 -18
  350. data/docs/ChoosableAccount.md +0 -26
  351. data/docs/ChooseAccounts.md +0 -20
  352. data/docs/ConnectCallback.md +0 -24
  353. data/docs/ConnectChannel.md +0 -20
  354. data/docs/ConnectFailedEncoded.md +0 -20
  355. data/docs/ConnectFailureReason.md +0 -15
  356. data/docs/ConnectOutcome.md +0 -26
  357. data/docs/ConnectOutcomeAnyOf.md +0 -20
  358. data/docs/ConnectOutcomeAnyOf1.md +0 -24
  359. data/docs/ConnectablePlatforms.md +0 -18
  360. data/docs/ContentViolation.md +0 -54
  361. data/docs/ContentViolationAnyOf.md +0 -18
  362. data/docs/ContentViolationAnyOf1.md +0 -20
  363. data/docs/ContentViolationAnyOf10.md +0 -26
  364. data/docs/ContentViolationAnyOf11.md +0 -22
  365. data/docs/ContentViolationAnyOf12.md +0 -26
  366. data/docs/ContentViolationAnyOf13.md +0 -26
  367. data/docs/ContentViolationAnyOf14.md +0 -26
  368. data/docs/ContentViolationAnyOf15.md +0 -26
  369. data/docs/ContentViolationAnyOf16.md +0 -22
  370. data/docs/ContentViolationAnyOf17.md +0 -26
  371. data/docs/ContentViolationAnyOf18.md +0 -28
  372. data/docs/ContentViolationAnyOf19.md +0 -28
  373. data/docs/ContentViolationAnyOf2.md +0 -20
  374. data/docs/ContentViolationAnyOf20.md +0 -28
  375. data/docs/ContentViolationAnyOf21.md +0 -28
  376. data/docs/ContentViolationAnyOf22.md +0 -30
  377. data/docs/ContentViolationAnyOf23.md +0 -32
  378. data/docs/ContentViolationAnyOf24.md +0 -32
  379. data/docs/ContentViolationAnyOf24Maximum.md +0 -15
  380. data/docs/ContentViolationAnyOf25.md +0 -28
  381. data/docs/ContentViolationAnyOf3.md +0 -24
  382. data/docs/ContentViolationAnyOf4.md +0 -24
  383. data/docs/ContentViolationAnyOf5.md +0 -28
  384. data/docs/ContentViolationAnyOf6.md +0 -24
  385. data/docs/ContentViolationAnyOf7.md +0 -22
  386. data/docs/ContentViolationAnyOf8.md +0 -28
  387. data/docs/ContentViolationAnyOf9.md +0 -24
  388. data/docs/CreatedApiKey.md +0 -20
  389. data/docs/DatabaseUnavailableEncoded.md +0 -18
  390. data/docs/DraftPage.md +0 -20
  391. data/docs/EffectHttpApiErrorBadRequestEncoded.md +0 -18
  392. data/docs/EngagementDay.md +0 -26
  393. data/docs/FailureReason.md +0 -15
  394. data/docs/ForbiddenEncoded.md +0 -18
  395. data/docs/InvalidDateRangeEncoded.md +0 -18
  396. data/docs/InvalidTimeRangeEncoded.md +0 -18
  397. data/docs/InvalidTimeZoneEncoded.md +0 -20
  398. data/docs/Invitation.md +0 -28
  399. data/docs/InvitationNotFoundEncoded.md +0 -18
  400. data/docs/InvitationsApi.md +0 -220
  401. data/docs/InvitationsCreate409Response.md +0 -18
  402. data/docs/InvitationsRevoke404Response.md +0 -18
  403. data/docs/MarkNoticesRead.md +0 -18
  404. data/docs/Me.md +0 -22
  405. data/docs/MeUser.md +0 -28
  406. data/docs/Media.md +0 -40
  407. data/docs/MediaApi.md +0 -516
  408. data/docs/MediaAttachment.md +0 -20
  409. data/docs/MediaContentType.md +0 -15
  410. data/docs/MediaCreate422Response.md +0 -28
  411. data/docs/MediaDescription.md +0 -18
  412. data/docs/MediaDimensions.md +0 -20
  413. data/docs/MediaGet404Response.md +0 -18
  414. data/docs/MediaInUseEncoded.md +0 -20
  415. data/docs/MediaKind.md +0 -15
  416. data/docs/MediaNotFoundEncoded.md +0 -18
  417. data/docs/MediaPage.md +0 -20
  418. data/docs/MediaStatus.md +0 -22
  419. data/docs/MediaStatusAnyOf.md +0 -18
  420. data/docs/MediaStatusAnyOf1.md +0 -20
  421. data/docs/MediaStatusAnyOf2.md +0 -18
  422. data/docs/MediaStatusAnyOf3.md +0 -20
  423. data/docs/MediaStoreUnavailableEncoded.md +0 -18
  424. data/docs/MediaTooLargeEncoded.md +0 -24
  425. data/docs/MediaUsage.md +0 -20
  426. data/docs/MembersApi.md +0 -77
  427. data/docs/Membership.md +0 -26
  428. data/docs/MetricTotals.md +0 -28
  429. data/docs/MetricsSnapshot.md +0 -20
  430. data/docs/NewApiKey.md +0 -22
  431. data/docs/NewInvitation.md +0 -20
  432. data/docs/NewUpload.md +0 -22
  433. data/docs/NonFiniteNumber.md +0 -15
  434. data/docs/Notice.md +0 -26
  435. data/docs/NoticeChannel.md +0 -20
  436. data/docs/NoticeEvent.md +0 -28
  437. data/docs/NoticeEventAnyOf.md +0 -24
  438. data/docs/NoticeEventAnyOf1.md +0 -24
  439. data/docs/NoticeEventAnyOf2.md +0 -22
  440. data/docs/NoticeEventAnyOf3.md +0 -20
  441. data/docs/NoticeEventAnyOf4.md +0 -22
  442. data/docs/NoticePage.md +0 -20
  443. data/docs/NoticesApi.md +0 -285
  444. data/docs/NotificationPreferences.md +0 -20
  445. data/docs/NotificationPreferencesApi.md +0 -144
  446. data/docs/NotificationPreferencesChange.md +0 -20
  447. data/docs/NotificationPreferencesChangeEmail.md +0 -24
  448. data/docs/NotificationPreferencesEmail.md +0 -24
  449. data/docs/PaidPlan.md +0 -15
  450. data/docs/PeriodUsage.md +0 -20
  451. data/docs/Plan.md +0 -15
  452. data/docs/PlanAllowances.md +0 -24
  453. data/docs/PlanLimit.md +0 -15
  454. data/docs/PlanLimitReachedEncoded.md +0 -22
  455. data/docs/PlanOffer.md +0 -20
  456. data/docs/Platform.md +0 -15
  457. data/docs/PlatformUnreachableEncoded.md +0 -18
  458. data/docs/Post.md +0 -30
  459. data/docs/PostAnalytics.md +0 -20
  460. data/docs/PostContent.md +0 -22
  461. data/docs/PostContentInvalidEncoded.md +0 -20
  462. data/docs/PostDraft.md +0 -22
  463. data/docs/PostMetrics.md +0 -26
  464. data/docs/PostNotFoundEncoded.md +0 -18
  465. data/docs/PostOutcome.md +0 -15
  466. data/docs/PostSchedule.md +0 -20
  467. data/docs/PostStatus.md +0 -15
  468. data/docs/PostStatusConflictEncoded.md +0 -20
  469. data/docs/PostTarget.md +0 -36
  470. data/docs/PostTargetStatus.md +0 -15
  471. data/docs/PostsApi.md +0 -960
  472. data/docs/PostsCreate422Response.md +0 -24
  473. data/docs/PostsGet404Response.md +0 -18
  474. data/docs/PostsRepost409Response.md +0 -20
  475. data/docs/PostsSchedule422Response.md +0 -26
  476. data/docs/PreparedUpload.md +0 -20
  477. data/docs/ProbeState.md +0 -15
  478. data/docs/PublicationAttempt.md +0 -30
  479. data/docs/RejectionReason.md +0 -15
  480. data/docs/Role.md +0 -15
  481. data/docs/ScheduleInPastEncoded.md +0 -18
  482. data/docs/SchedulePost.md +0 -22
  483. data/docs/SessionApi.md +0 -74
  484. data/docs/SignedRequest.md +0 -22
  485. data/docs/SubscriptionStatus.md +0 -15
  486. data/docs/Suggestion.md +0 -22
  487. data/docs/SuggestionAnyOf.md +0 -20
  488. data/docs/SuggestionAnyOf1.md +0 -20
  489. data/docs/SuggestionRequest.md +0 -20
  490. data/docs/SystemApi.md +0 -129
  491. data/docs/TargetConfirmation.md +0 -20
  492. data/docs/TargetConfirmationAnyOf.md +0 -20
  493. data/docs/TargetConfirmationAnyOf1.md +0 -18
  494. data/docs/TargetMetrics.md +0 -32
  495. data/docs/TargetOptions.md +0 -48
  496. data/docs/TargetStatusConflictEncoded.md +0 -20
  497. data/docs/TextOverride.md +0 -20
  498. data/docs/TextUnit.md +0 -15
  499. data/docs/TikTokAccount.md +0 -20
  500. data/docs/TikTokAccountPosting.md +0 -22
  501. data/docs/TikTokAccountPostingAnyOf.md +0 -20
  502. data/docs/TikTokAccountPostingAnyOf1.md +0 -20
  503. data/docs/TikTokBlock.md +0 -15
  504. data/docs/TikTokCreator.md +0 -32
  505. data/docs/TikTokOptions.md +0 -34
  506. data/docs/TikTokPrivacyLevel.md +0 -15
  507. data/docs/TiktokApi.md +0 -79
  508. data/docs/TooManyInvitationsEncoded.md +0 -18
  509. data/docs/TopPost.md +0 -30
  510. data/docs/TranslationLanguage.md +0 -15
  511. data/docs/UnauthenticatedEncoded.md +0 -18
  512. data/docs/UnconfirmedReason.md +0 -15
  513. data/docs/UnknownChannelsEncoded.md +0 -20
  514. data/docs/UnknownMediaEncoded.md +0 -20
  515. data/docs/UnreadNotices.md +0 -18
  516. data/docs/UnsupportedMediaTypeEncoded.md +0 -20
  517. data/docs/UploadIncompleteEncoded.md +0 -18
  518. data/docs/UploadPart.md +0 -22
  519. data/docs/UploadRejectedEncoded.md +0 -20
  520. data/docs/UploadTarget.md +0 -26
  521. data/docs/UploadTargetAnyOf.md +0 -22
  522. data/docs/UploadTargetAnyOf1.md +0 -24
  523. data/docs/Usage.md +0 -24
  524. data/docs/WorkspaceMember.md +0 -26
  525. data/docs/WorkspaceNotFoundEncoded.md +0 -18
  526. data/docs/YouTubeOptions.md +0 -32
  527. data/docs/YouTubePrivacy.md +0 -15
  528. data/lib/peal/api/analytics_api.rb +0 -185
  529. data/lib/peal/api/api_keys_api.rb +0 -228
  530. data/lib/peal/api/assistant_api.rb +0 -159
  531. data/lib/peal/api/billing_api.rb +0 -85
  532. data/lib/peal/api/channels_api.rb +0 -526
  533. data/lib/peal/api/invitations_api.rb +0 -228
  534. data/lib/peal/api/media_api.rb +0 -526
  535. data/lib/peal/api/members_api.rb +0 -85
  536. data/lib/peal/api/notices_api.rb +0 -272
  537. data/lib/peal/api/notification_preferences_api.rb +0 -147
  538. data/lib/peal/api/posts_api.rb +0 -993
  539. data/lib/peal/api/session_api.rb +0 -79
  540. data/lib/peal/api/system_api.rb +0 -134
  541. data/lib/peal/api/tiktok_api.rb +0 -91
  542. data/lib/peal/api_client.rb +0 -441
  543. data/lib/peal/api_error.rb +0 -58
  544. data/lib/peal/api_model_base.rb +0 -88
  545. data/lib/peal/configuration.rb +0 -392
  546. data/lib/peal/models/already_member_encoded.rb +0 -201
  547. data/lib/peal/models/alt_text_too_long_encoded.rb +0 -245
  548. data/lib/peal/models/analytics_summary.rb +0 -361
  549. data/lib/peal/models/api_key.rb +0 -293
  550. data/lib/peal/models/api_key_not_found_encoded.rb +0 -201
  551. data/lib/peal/models/api_keys_revoke404_response.rb +0 -103
  552. data/lib/peal/models/assistant_action.rb +0 -105
  553. data/lib/peal/models/assistant_action_any_of.rb +0 -227
  554. data/lib/peal/models/assistant_action_any_of1.rb +0 -227
  555. data/lib/peal/models/assistant_action_any_of2.rb +0 -227
  556. data/lib/peal/models/assistant_action_any_of3.rb +0 -201
  557. data/lib/peal/models/assistant_failed_encoded.rb +0 -229
  558. data/lib/peal/models/assistant_input_rejected_encoded.rb +0 -273
  559. data/lib/peal/models/assistant_quota_exceeded_encoded.rb +0 -271
  560. data/lib/peal/models/assistant_status.rb +0 -335
  561. data/lib/peal/models/assistant_tone.rb +0 -43
  562. data/lib/peal/models/assistant_unavailable_encoded.rb +0 -201
  563. data/lib/peal/models/attempt_result.rb +0 -50
  564. data/lib/peal/models/authorization.rb +0 -177
  565. data/lib/peal/models/billing.rb +0 -303
  566. data/lib/peal/models/billing_subscription.rb +0 -263
  567. data/lib/peal/models/channel.rb +0 -313
  568. data/lib/peal/models/channel_cannot_post_encoded.rb +0 -229
  569. data/lib/peal/models/channel_metrics.rb +0 -425
  570. data/lib/peal/models/channel_not_found_encoded.rb +0 -201
  571. data/lib/peal/models/channel_options.rb +0 -203
  572. data/lib/peal/models/channel_status.rb +0 -104
  573. data/lib/peal/models/channel_status_any_of.rb +0 -201
  574. data/lib/peal/models/channel_status_any_of1.rb +0 -201
  575. data/lib/peal/models/channel_status_any_of2.rb +0 -227
  576. data/lib/peal/models/channels_complete_connect404_response.rb +0 -103
  577. data/lib/peal/models/choosable_account.rb +0 -253
  578. data/lib/peal/models/choose_accounts.rb +0 -241
  579. data/lib/peal/models/connect_callback.rb +0 -279
  580. data/lib/peal/models/connect_channel.rb +0 -207
  581. data/lib/peal/models/connect_failed_encoded.rb +0 -227
  582. data/lib/peal/models/connect_failure_reason.rb +0 -48
  583. data/lib/peal/models/connect_outcome.rb +0 -103
  584. data/lib/peal/models/connect_outcome_any_of.rb +0 -227
  585. data/lib/peal/models/connect_outcome_any_of1.rb +0 -281
  586. data/lib/peal/models/connectable_platforms.rb +0 -179
  587. data/lib/peal/models/content_violation.rb +0 -127
  588. data/lib/peal/models/content_violation_any_of.rb +0 -201
  589. data/lib/peal/models/content_violation_any_of1.rb +0 -227
  590. data/lib/peal/models/content_violation_any_of10.rb +0 -341
  591. data/lib/peal/models/content_violation_any_of11.rb +0 -253
  592. data/lib/peal/models/content_violation_any_of12.rb +0 -341
  593. data/lib/peal/models/content_violation_any_of13.rb +0 -341
  594. data/lib/peal/models/content_violation_any_of14.rb +0 -341
  595. data/lib/peal/models/content_violation_any_of15.rb +0 -341
  596. data/lib/peal/models/content_violation_any_of16.rb +0 -253
  597. data/lib/peal/models/content_violation_any_of17.rb +0 -305
  598. data/lib/peal/models/content_violation_any_of18.rb +0 -367
  599. data/lib/peal/models/content_violation_any_of19.rb +0 -367
  600. data/lib/peal/models/content_violation_any_of2.rb +0 -227
  601. data/lib/peal/models/content_violation_any_of20.rb +0 -367
  602. data/lib/peal/models/content_violation_any_of21.rb +0 -367
  603. data/lib/peal/models/content_violation_any_of22.rb +0 -411
  604. data/lib/peal/models/content_violation_any_of23.rb +0 -455
  605. data/lib/peal/models/content_violation_any_of24.rb +0 -419
  606. data/lib/peal/models/content_violation_any_of24_maximum.rb +0 -103
  607. data/lib/peal/models/content_violation_any_of25.rb +0 -367
  608. data/lib/peal/models/content_violation_any_of3.rb +0 -279
  609. data/lib/peal/models/content_violation_any_of4.rb +0 -279
  610. data/lib/peal/models/content_violation_any_of5.rb +0 -367
  611. data/lib/peal/models/content_violation_any_of6.rb +0 -279
  612. data/lib/peal/models/content_violation_any_of7.rb +0 -253
  613. data/lib/peal/models/content_violation_any_of8.rb +0 -367
  614. data/lib/peal/models/content_violation_any_of9.rb +0 -281
  615. data/lib/peal/models/created_api_key.rb +0 -203
  616. data/lib/peal/models/database_unavailable_encoded.rb +0 -201
  617. data/lib/peal/models/draft_page.rb +0 -191
  618. data/lib/peal/models/effect_http_api_error_bad_request_encoded.rb +0 -201
  619. data/lib/peal/models/engagement_day.rb +0 -364
  620. data/lib/peal/models/failure_reason.rb +0 -50
  621. data/lib/peal/models/forbidden_encoded.rb +0 -201
  622. data/lib/peal/models/invalid_date_range_encoded.rb +0 -201
  623. data/lib/peal/models/invalid_time_range_encoded.rb +0 -201
  624. data/lib/peal/models/invalid_time_zone_encoded.rb +0 -227
  625. data/lib/peal/models/invitation.rb +0 -307
  626. data/lib/peal/models/invitation_not_found_encoded.rb +0 -201
  627. data/lib/peal/models/invitations_create409_response.rb +0 -103
  628. data/lib/peal/models/invitations_revoke404_response.rb +0 -103
  629. data/lib/peal/models/mark_notices_read.rb +0 -197
  630. data/lib/peal/models/me.rb +0 -217
  631. data/lib/peal/models/me_user.rb +0 -317
  632. data/lib/peal/models/media.rb +0 -457
  633. data/lib/peal/models/media_attachment.rb +0 -212
  634. data/lib/peal/models/media_content_type.rb +0 -44
  635. data/lib/peal/models/media_create422_response.rb +0 -104
  636. data/lib/peal/models/media_description.rb +0 -163
  637. data/lib/peal/models/media_dimensions.rb +0 -239
  638. data/lib/peal/models/media_get404_response.rb +0 -103
  639. data/lib/peal/models/media_in_use_encoded.rb +0 -229
  640. data/lib/peal/models/media_kind.rb +0 -40
  641. data/lib/peal/models/media_not_found_encoded.rb +0 -201
  642. data/lib/peal/models/media_page.rb +0 -191
  643. data/lib/peal/models/media_status.rb +0 -105
  644. data/lib/peal/models/media_status_any_of.rb +0 -201
  645. data/lib/peal/models/media_status_any_of1.rb +0 -227
  646. data/lib/peal/models/media_status_any_of2.rb +0 -201
  647. data/lib/peal/models/media_status_any_of3.rb +0 -227
  648. data/lib/peal/models/media_store_unavailable_encoded.rb +0 -201
  649. data/lib/peal/models/media_too_large_encoded.rb +0 -317
  650. data/lib/peal/models/media_usage.rb +0 -207
  651. data/lib/peal/models/membership.rb +0 -295
  652. data/lib/peal/models/metric_totals.rb +0 -399
  653. data/lib/peal/models/metrics_snapshot.rb +0 -203
  654. data/lib/peal/models/new_api_key.rb +0 -277
  655. data/lib/peal/models/new_invitation.rb +0 -245
  656. data/lib/peal/models/new_upload.rb +0 -231
  657. data/lib/peal/models/non_finite_number.rb +0 -41
  658. data/lib/peal/models/notice.rb +0 -267
  659. data/lib/peal/models/notice_channel.rb +0 -225
  660. data/lib/peal/models/notice_event.rb +0 -106
  661. data/lib/peal/models/notice_event_any_of.rb +0 -251
  662. data/lib/peal/models/notice_event_any_of1.rb +0 -265
  663. data/lib/peal/models/notice_event_any_of2.rb +0 -239
  664. data/lib/peal/models/notice_event_any_of3.rb +0 -227
  665. data/lib/peal/models/notice_event_any_of4.rb +0 -253
  666. data/lib/peal/models/notice_page.rb +0 -191
  667. data/lib/peal/models/notification_preferences.rb +0 -203
  668. data/lib/peal/models/notification_preferences_change.rb +0 -169
  669. data/lib/peal/models/notification_preferences_change_email.rb +0 -187
  670. data/lib/peal/models/notification_preferences_email.rb +0 -255
  671. data/lib/peal/models/paid_plan.rb +0 -40
  672. data/lib/peal/models/period_usage.rb +0 -221
  673. data/lib/peal/models/plan.rb +0 -41
  674. data/lib/peal/models/plan_allowances.rb +0 -295
  675. data/lib/peal/models/plan_limit.rb +0 -42
  676. data/lib/peal/models/plan_limit_reached_encoded.rb +0 -271
  677. data/lib/peal/models/plan_offer.rb +0 -225
  678. data/lib/peal/models/platform.rb +0 -48
  679. data/lib/peal/models/platform_unreachable_encoded.rb +0 -201
  680. data/lib/peal/models/post.rb +0 -315
  681. data/lib/peal/models/post_analytics.rb +0 -205
  682. data/lib/peal/models/post_content.rb +0 -251
  683. data/lib/peal/models/post_content_invalid_encoded.rb +0 -229
  684. data/lib/peal/models/post_draft.rb +0 -216
  685. data/lib/peal/models/post_metrics.rb +0 -355
  686. data/lib/peal/models/post_not_found_encoded.rb +0 -201
  687. data/lib/peal/models/post_outcome.rb +0 -43
  688. data/lib/peal/models/post_schedule.rb +0 -203
  689. data/lib/peal/models/post_status.rb +0 -43
  690. data/lib/peal/models/post_status_conflict_encoded.rb +0 -227
  691. data/lib/peal/models/post_target.rb +0 -364
  692. data/lib/peal/models/post_target_status.rb +0 -44
  693. data/lib/peal/models/posts_create422_response.rb +0 -104
  694. data/lib/peal/models/posts_get404_response.rb +0 -103
  695. data/lib/peal/models/posts_repost409_response.rb +0 -103
  696. data/lib/peal/models/posts_schedule422_response.rb +0 -106
  697. data/lib/peal/models/prepared_upload.rb +0 -203
  698. data/lib/peal/models/probe_state.rb +0 -44
  699. data/lib/peal/models/publication_attempt.rb +0 -377
  700. data/lib/peal/models/rejection_reason.rb +0 -40
  701. data/lib/peal/models/role.rb +0 -43
  702. data/lib/peal/models/schedule_in_past_encoded.rb +0 -201
  703. data/lib/peal/models/schedule_post.rb +0 -240
  704. data/lib/peal/models/signed_request.rb +0 -255
  705. data/lib/peal/models/subscription_status.rb +0 -46
  706. data/lib/peal/models/suggestion.rb +0 -103
  707. data/lib/peal/models/suggestion_any_of.rb +0 -227
  708. data/lib/peal/models/suggestion_any_of1.rb +0 -229
  709. data/lib/peal/models/suggestion_request.rb +0 -212
  710. data/lib/peal/models/target_confirmation.rb +0 -103
  711. data/lib/peal/models/target_confirmation_any_of.rb +0 -228
  712. data/lib/peal/models/target_confirmation_any_of1.rb +0 -201
  713. data/lib/peal/models/target_metrics.rb +0 -319
  714. data/lib/peal/models/target_options.rb +0 -104
  715. data/lib/peal/models/target_status_conflict_encoded.rb +0 -227
  716. data/lib/peal/models/text_override.rb +0 -221
  717. data/lib/peal/models/text_unit.rb +0 -44
  718. data/lib/peal/models/tik_tok_account.rb +0 -203
  719. data/lib/peal/models/tik_tok_account_posting.rb +0 -103
  720. data/lib/peal/models/tik_tok_account_posting_any_of.rb +0 -227
  721. data/lib/peal/models/tik_tok_account_posting_any_of1.rb +0 -227
  722. data/lib/peal/models/tik_tok_block.rb +0 -41
  723. data/lib/peal/models/tik_tok_creator.rb +0 -357
  724. data/lib/peal/models/tik_tok_options.rb +0 -274
  725. data/lib/peal/models/tik_tok_privacy_level.rb +0 -42
  726. data/lib/peal/models/too_many_invitations_encoded.rb +0 -201
  727. data/lib/peal/models/top_post.rb +0 -337
  728. data/lib/peal/models/translation_language.rb +0 -48
  729. data/lib/peal/models/unauthenticated_encoded.rb +0 -201
  730. data/lib/peal/models/unconfirmed_reason.rb +0 -42
  731. data/lib/peal/models/unknown_channels_encoded.rb +0 -229
  732. data/lib/peal/models/unknown_media_encoded.rb +0 -229
  733. data/lib/peal/models/unread_notices.rb +0 -195
  734. data/lib/peal/models/unsupported_media_type_encoded.rb +0 -227
  735. data/lib/peal/models/upload_incomplete_encoded.rb +0 -201
  736. data/lib/peal/models/upload_part.rb +0 -265
  737. data/lib/peal/models/upload_rejected_encoded.rb +0 -227
  738. data/lib/peal/models/upload_target.rb +0 -103
  739. data/lib/peal/models/upload_target_any_of.rb +0 -253
  740. data/lib/peal/models/upload_target_any_of1.rb +0 -299
  741. data/lib/peal/models/usage.rb +0 -291
  742. data/lib/peal/models/workspace_member.rb +0 -281
  743. data/lib/peal/models/workspace_not_found_encoded.rb +0 -201
  744. data/lib/peal/models/you_tube_options.rb +0 -324
  745. data/lib/peal/models/you_tube_privacy.rb +0 -41
  746. data/peal.gemspec +0 -41
  747. data/project.json +0 -17
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Errors
5
+ class ResponseError < ApiError
6
+ attr_reader :code, :body, :headers
7
+
8
+ # @param msg [String] The raw response body.
9
+ # @param code [Integer] The HTTP status code.
10
+ # @param body [Object, nil] The response body parsed into the endpoint's declared error type, if any.
11
+ # @param headers [Hash{String => Array<String>}] The response headers, with lowercase names.
12
+ def initialize(msg, code:, body: nil, headers: {})
13
+ @code = code
14
+ @body = body
15
+ @headers = headers
16
+ super(msg)
17
+ end
18
+
19
+ def inspect
20
+ "#<#{self.class.name} @code=#{code} @body=#{message}>"
21
+ end
22
+
23
+ # Parses a raw error response body into the type declared for its status code.
24
+ #
25
+ # @param code [Integer]
26
+ # @param raw_body [String, nil]
27
+ # @param types [Hash{Integer, Range => Class}] Matchers in priority order.
28
+ # @return [Object, nil] nil when no type matches or the body cannot be parsed.
29
+ def self.load_error_body(code, raw_body, types)
30
+ type = types.find { |matcher, _| matcher.is_a?(::Range) ? matcher.cover?(code) : matcher == code }&.last
31
+ return nil if type.nil? || raw_body.to_s.empty?
32
+
33
+ begin
34
+ type.load(raw_body)
35
+ rescue StandardError
36
+ nil
37
+ end
38
+ end
39
+
40
+ # Returns the most appropriate error class for the given code.
41
+ #
42
+ # @return [Class]
43
+ def self.subclass_for_code(code)
44
+ case code
45
+ when 300..399
46
+ RedirectError
47
+ when 401
48
+ UnauthorizedError
49
+ when 403
50
+ ForbiddenError
51
+ when 404
52
+ NotFoundError
53
+ when 400..499
54
+ ClientError
55
+ when 503
56
+ ServiceUnavailableError
57
+ when 500..599
58
+ ServerError
59
+ else
60
+ ResponseError
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Errors
5
+ class ServerError < ResponseError
6
+ end
7
+
8
+ class ServiceUnavailableError < ResponseError
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Errors
5
+ class TimeoutError < ApiError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Errors
6
+ class ConstraintError < StandardError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Errors
6
+ class TypeError < StandardError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Http
6
+ # @api private
7
+ class BaseRequest
8
+ attr_reader :base_url, :path, :method, :headers, :query, :request_options, :max_retries
9
+
10
+ # @param base_url [String] The base URL for the request
11
+ # @param path [String] The path for the request
12
+ # @param method [String] The HTTP method for the request (:get, :post, etc.)
13
+ # @param headers [Hash] Additional headers for the request (optional)
14
+ # @param query [Hash] Query parameters for the request (optional)
15
+ # @param request_options [Peal::RequestOptions, Hash{Symbol=>Object}, nil]
16
+ # @param max_retries [Integer, nil] Overrides the client's retry count for this request
17
+ def initialize(base_url:, path:, method:, headers: {}, query: {}, request_options: {}, max_retries: nil)
18
+ @base_url = base_url
19
+ @path = path
20
+ @method = method
21
+ @headers = headers
22
+ @query = query
23
+ @request_options = request_options
24
+ @max_retries = max_retries
25
+ end
26
+
27
+ # @return [Hash] The query parameters merged with additional query parameters from request options.
28
+ def encode_query
29
+ additional_query = @request_options&.dig(:additional_query_parameters) || @request_options&.dig("additional_query_parameters") || {}
30
+ Internal::Types::Utils.serialize_times(@query.merge(additional_query))
31
+ end
32
+
33
+ # @return [Hash] The additional body parameters from request options, keyed by wire-format name.
34
+ def additional_body_parameters
35
+ @request_options&.dig(:additional_body_parameters) || @request_options&.dig("additional_body_parameters") || {}
36
+ end
37
+
38
+ # Child classes should implement:
39
+ # - encode_headers: Returns the encoded HTTP request headers.
40
+ # - encode_body: Returns the encoded HTTP request body.
41
+
42
+ private
43
+
44
+ # Merges additional_body_parameters from request_options on top of the request body.
45
+ # Keys are used as-is (API wire-format names) and are normalized to strings so that a
46
+ # caller-supplied key always overrides the SDK-serialized field with the same name.
47
+ # When the body is nil the additional parameters become the body, except for GET and HEAD
48
+ # requests, which are sent without a body (the additional parameters are ignored). Bodies
49
+ # that are not hash-like (arrays, primitives) are returned unchanged.
50
+ # @param body [Object, nil] The request body.
51
+ # @return [Object, nil] The merged request body.
52
+ def merge_additional_body_parameters(body)
53
+ additional_body = additional_body_parameters
54
+ return body if additional_body.nil? || additional_body.empty?
55
+ return body if body.nil? && bodyless_method?
56
+
57
+ additional_body = additional_body.to_h.transform_keys(&:to_s)
58
+ return additional_body if body.nil?
59
+ return body if body.is_a?(::Array) || !body.respond_to?(:to_h)
60
+
61
+ body.to_h.transform_keys(&:to_s).merge(additional_body)
62
+ end
63
+
64
+ # @return [Boolean] Whether the request method is one that is sent without a body (GET, HEAD).
65
+ def bodyless_method?
66
+ %w[GET HEAD].include?(@method.to_s.upcase)
67
+ end
68
+
69
+ # Merges additional_headers from request_options into sdk_headers, filtering out
70
+ # any keys that collide with SDK-set or client-protected headers (case-insensitive).
71
+ # @param sdk_headers [Hash] Headers set by the SDK for this request type.
72
+ # @param protected_keys [Array<String>] Additional header keys that must not be overridden.
73
+ # @return [Hash] The merged headers.
74
+ def merge_additional_headers(sdk_headers, protected_keys: [])
75
+ additional_headers = @request_options&.dig(:additional_headers) || @request_options&.dig("additional_headers") || {}
76
+ all_protected = (sdk_headers.keys + protected_keys).to_set { |k| k.to_s.downcase }
77
+ filtered = additional_headers.reject { |key, _| all_protected.include?(key.to_s.downcase) }
78
+ sdk_headers.merge(filtered)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,297 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Http
6
+ # @api private
7
+ class RawClient
8
+ # Default HTTP status codes that trigger a retry
9
+ RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504, 521, 522, 524].freeze
10
+ # Initial delay between retries in seconds
11
+ INITIAL_RETRY_DELAY = 0.5
12
+ # Maximum delay between retries in seconds
13
+ MAX_RETRY_DELAY = 60.0
14
+ # Jitter factor for randomizing retry delays (20%)
15
+ JITTER_FACTOR = 0.2
16
+
17
+ # @return [String] The base URL for requests
18
+ attr_reader :base_url
19
+
20
+ # @param base_url [String] The base url for the request.
21
+ # @param max_retries [Integer] The number of times to retry a failed request, defaults to 2.
22
+ # @param timeout [Float] The timeout for the request, defaults to 60.0 seconds.
23
+ # @param headers [Hash] The headers for the request.
24
+ # @param overridable_headers [Array<String>] The names of the client-level headers a request
25
+ # may replace via `additional_headers`. Holds the API's global headers; SDK metadata and
26
+ # auth headers are absent from it and so stay protected.
27
+ # @param auth_provider [Object, nil] An optional auth provider responding to
28
+ # `auth_headers`. When present its headers are resolved on every request so
29
+ # token-based schemes (e.g. OAuth) can refresh an expired token mid-session.
30
+ def initialize(base_url:, max_retries: 2, timeout: 60.0, headers: {}, overridable_headers: [], auth_provider: nil)
31
+ @base_url = base_url
32
+ @max_retries = max_retries
33
+ @timeout = timeout
34
+ @auth_provider = auth_provider
35
+ @default_headers = {
36
+ "X-Fern-Language": "Ruby",
37
+ "X-Fern-SDK-Name": "peal",
38
+ "X-Fern-SDK-Version": Peal::VERSION
39
+ }.merge(headers)
40
+ @overridable_headers = overridable_headers.to_set { |name| name.to_s.downcase }
41
+ end
42
+
43
+ # @param request [Peal::Internal::Http::BaseRequest] The HTTP request.
44
+ # @return [HTTP::Response] The HTTP response.
45
+ def send(request)
46
+ url = build_url(request)
47
+ # Resolve auth headers once per request (not per retry) so token-based
48
+ # providers refresh at most once here; static providers are cheap.
49
+ auth_headers = resolve_auth_headers
50
+ timeout = request_timeout(request)
51
+ attempt = 0
52
+ response = nil
53
+
54
+ loop do
55
+ http_request = build_http_request(
56
+ url:,
57
+ method: request.method,
58
+ headers: request.encode_headers(protected_keys: protected_header_keys + auth_headers.keys),
59
+ body: request.encode_body,
60
+ auth_headers: auth_headers
61
+ )
62
+
63
+ conn = connect(url)
64
+ conn.open_timeout = timeout
65
+ conn.read_timeout = timeout
66
+ conn.write_timeout = timeout
67
+ conn.continue_timeout = timeout
68
+
69
+ response = wrap_transport_errors { conn.request(http_request) }
70
+
71
+ break unless should_retry?(response, attempt, max_retries: request.max_retries)
72
+
73
+ delay = retry_delay(response, attempt)
74
+ sleep(delay)
75
+ attempt += 1
76
+ end
77
+
78
+ response
79
+ end
80
+
81
+ # Socket-level `Errno` failures. Other `SystemCallError`s, such as file errors raised by a
82
+ # custom HTTP client, are not connection failures and propagate unchanged.
83
+ NETWORK_ERRNOS = [
84
+ Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE,
85
+ Errno::EHOSTUNREACH, Errno::ENETUNREACH, Errno::ENETDOWN, Errno::EHOSTDOWN,
86
+ Errno::EADDRNOTAVAIL
87
+ ].freeze
88
+
89
+ # Runs a single request attempt, re-raising transport failures as SDK errors so that
90
+ # rescuing `Errors::ApiError` covers them. The original exception is kept as `cause`.
91
+ # These failures are not retried: the server may already have processed the request.
92
+ # @return [Net::HTTPResponse] The HTTP response.
93
+ def wrap_transport_errors
94
+ yield
95
+ rescue Net::OpenTimeout, Net::ReadTimeout, Net::WriteTimeout, Errno::ETIMEDOUT => e
96
+ raise Peal::Errors::TimeoutError, e.message
97
+ rescue EOFError, SocketError, OpenSSL::SSL::SSLError, *NETWORK_ERRNOS,
98
+ Net::ProtocolError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError => e
99
+ raise Peal::Errors::ConnectionError, e.message
100
+ end
101
+
102
+ # @param request [Peal::Internal::Http::BaseRequest] The HTTP request.
103
+ # @return [Float] The request's `timeout_in_seconds` option, or the client-level timeout.
104
+ def request_timeout(request)
105
+ options = request.request_options || {}
106
+ timeout = options.key?(:timeout_in_seconds) ? options[:timeout_in_seconds] : options["timeout_in_seconds"]
107
+ (timeout.nil? ? @timeout : timeout).to_f
108
+ end
109
+
110
+ # The client-level header names that `additional_headers` must not replace: every default
111
+ # header except the API's global headers, which are overridable per request.
112
+ # @return [Array<Symbol, String>] The protected header names.
113
+ def protected_header_keys
114
+ return @default_headers.keys if @overridable_headers.empty?
115
+
116
+ @default_headers.keys.reject { |name| @overridable_headers.include?(name.to_s.downcase) }
117
+ end
118
+
119
+ # Determines if a request should be retried based on the response status code.
120
+ # @param response [Net::HTTPResponse] The HTTP response.
121
+ # @param attempt [Integer] The current retry attempt (0-indexed).
122
+ # @param max_retries [Integer, nil] The request-level retry count, when the endpoint
123
+ # overrides the client-level setting.
124
+ # @return [Boolean] Whether the request should be retried.
125
+ def should_retry?(response, attempt, max_retries: nil)
126
+ return false if attempt >= (max_retries || @max_retries)
127
+
128
+ status = response.code.to_i
129
+ RETRYABLE_STATUSES.include?(status)
130
+ end
131
+
132
+ # Calculates the delay before the next retry attempt using exponential backoff with jitter.
133
+ # Respects Retry-After header if present.
134
+ # @param response [Net::HTTPResponse] The HTTP response.
135
+ # @param attempt [Integer] The current retry attempt (0-indexed).
136
+ # @return [Float] The delay in seconds before the next retry.
137
+ def retry_delay(response, attempt)
138
+ # Check for Retry-After header (can be seconds or HTTP date)
139
+ retry_after = response["Retry-After"]
140
+ if retry_after
141
+ delay = parse_retry_after(retry_after)
142
+ return [delay, MAX_RETRY_DELAY].min if delay&.positive?
143
+ end
144
+
145
+ # Exponential backoff with jitter: base_delay * 2^attempt
146
+ base_delay = INITIAL_RETRY_DELAY * (2**attempt)
147
+ add_jitter([base_delay, MAX_RETRY_DELAY].min)
148
+ end
149
+
150
+ # Parses the Retry-After header value.
151
+ # @param value [String] The Retry-After header value (seconds or HTTP date).
152
+ # @return [Float, nil] The delay in seconds, or nil if parsing fails.
153
+ def parse_retry_after(value)
154
+ # Try parsing as integer (seconds)
155
+ seconds = Integer(value, exception: false)
156
+ return seconds.to_f if seconds
157
+
158
+ # Try parsing as HTTP date
159
+ begin
160
+ retry_time = Time.httpdate(value)
161
+ delay = retry_time - Time.now
162
+ delay.positive? ? delay : nil
163
+ rescue ArgumentError
164
+ nil
165
+ end
166
+ end
167
+
168
+ # Adds random jitter to a delay value.
169
+ # @param delay [Float] The base delay in seconds.
170
+ # @return [Float] The delay with jitter applied.
171
+ def add_jitter(delay)
172
+ jitter = delay * JITTER_FACTOR * (rand - 0.5) * 2
173
+ [delay + jitter, 0].max
174
+ end
175
+
176
+ LOCALHOST_HOSTS = %w[localhost 127.0.0.1 [::1]].freeze
177
+
178
+ # @param request [Peal::Internal::Http::BaseRequest] The HTTP request.
179
+ # @return [URI::Generic] The URL.
180
+ def build_url(request)
181
+ encoded_query = request.encode_query
182
+
183
+ # If the path is already an absolute URL, use it directly
184
+ if request.path.start_with?("http://", "https://")
185
+ url = request.path
186
+ url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any?
187
+ parsed = URI.parse(url)
188
+ validate_https!(parsed)
189
+ return parsed
190
+ end
191
+
192
+ path = request.path.start_with?("/") ? request.path[1..] : request.path
193
+ base = request.base_url || @base_url
194
+ url = "#{base.chomp("/")}/#{path}"
195
+ url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any?
196
+ parsed = URI.parse(url)
197
+ validate_https!(parsed)
198
+ parsed
199
+ end
200
+
201
+ # Raises if the URL uses http:// for a non-localhost host, which would
202
+ # send authentication credentials in plaintext.
203
+ # @param url [URI::Generic] The parsed URL.
204
+ def validate_https!(url)
205
+ return if url.scheme != "http"
206
+ return if LOCALHOST_HOSTS.include?(url.host)
207
+
208
+ raise ArgumentError,
209
+ "Refusing to send request to non-HTTPS URL: #{url}. " \
210
+ "HTTP is only allowed for localhost. Use HTTPS or pass a localhost URL."
211
+ end
212
+
213
+ # Resolves the auth headers to send with the next request. Delegates to the
214
+ # configured auth provider (if any) on every call so that token-based
215
+ # providers (e.g. OAuth client-credentials) can refresh an expired token
216
+ # before the request is sent. Returns an empty hash when no provider is set,
217
+ # which keeps the api-key / basic / bearer / no-auth paths unchanged.
218
+ # @return [Hash] The auth headers for the current request.
219
+ def resolve_auth_headers
220
+ return {} if @auth_provider.nil?
221
+
222
+ @auth_provider.auth_headers
223
+ end
224
+
225
+ # @param url [URI::Generic] The url to the resource.
226
+ # @param method [String] The HTTP method to use.
227
+ # @param headers [Hash] The headers for the request.
228
+ # @param body [String, nil] The body for the request.
229
+ # @param auth_headers [Hash] The auth headers resolved for this request. These
230
+ # take precedence over the static default headers but not over per-request
231
+ # headers, mirroring the previous baked-header precedence.
232
+ # @return [HTTP::Request] The HTTP request.
233
+ def build_http_request(url:, method:, headers: {}, body: nil, auth_headers: {})
234
+ request = Net::HTTPGenericRequest.new(
235
+ method,
236
+ !body.nil?,
237
+ method != "HEAD",
238
+ url
239
+ )
240
+
241
+ request_headers = @default_headers.merge(auth_headers).merge(headers)
242
+ request_headers.each { |name, value| request[name] = value }
243
+ request.body = body if body
244
+
245
+ # Net::HTTP disables its transparent gzip/deflate decoding as soon as an
246
+ # Accept-Encoding header is set explicitly on the request. Re-enable it so
247
+ # that compressed response bodies are still inflated.
248
+ request.extend(DecodeContent) if request_headers.keys.any? { |name| name.to_s.casecmp("accept-encoding").zero? }
249
+
250
+ request
251
+ end
252
+
253
+ # Keeps Net::HTTP's transparent gzip/deflate response decoding enabled
254
+ # even when an Accept-Encoding header is set explicitly on the request.
255
+ # @api private
256
+ module DecodeContent
257
+ def decode_content # rubocop:disable Naming/PredicateMethod
258
+ true
259
+ end
260
+ end
261
+
262
+ # @param query [Hash] The query for the request.
263
+ # @return [String, nil] The encoded query.
264
+ def encode_query(query)
265
+ query.to_h.empty? ? nil : URI.encode_www_form(query)
266
+ end
267
+
268
+ # @param url [URI::Generic] The url to connect to.
269
+ # @return [Net::HTTP] The HTTP connection.
270
+ def connect(url)
271
+ is_https = (url.scheme == "https")
272
+
273
+ port = if url.port
274
+ url.port
275
+ elsif is_https
276
+ Net::HTTP.https_default_port
277
+ else
278
+ Net::HTTP.http_default_port
279
+ end
280
+
281
+ http = Net::HTTP.new(url.host, port)
282
+ http.use_ssl = is_https
283
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER if is_https
284
+ # NOTE: We handle retries at the application level with HTTP status code awareness,
285
+ # so we set max_retries to 0 to disable Net::HTTP's built-in network-level retries.
286
+ http.max_retries = 0
287
+ http
288
+ end
289
+
290
+ # @return [String]
291
+ def inspect
292
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} @base_url=#{@base_url.inspect}>"
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ class CursorItemIterator < ItemIterator
6
+ # Instantiates a CursorItemIterator, an Enumerable class which wraps calls to a cursor-based paginated API and yields individual items from it.
7
+ #
8
+ # @param initial_cursor [String] The initial cursor to use when iterating, if any.
9
+ # @param cursor_field [Symbol, Array<Symbol>] The field (or nested path) in API responses to extract the next cursor from.
10
+ # @param item_field [Symbol, Array<Symbol>] The field (or nested path) in API responses to extract the items to iterate over.
11
+ # @param block [Proc] A block which is responsible for receiving a cursor to use and returning the given page from the API.
12
+ # @return [Peal::Internal::CursorItemIterator]
13
+ def initialize(initial_cursor:, cursor_field:, item_field:, &block)
14
+ super()
15
+ @item_field = item_field
16
+ @http_response = nil
17
+ get_page = track_http_responses(block)
18
+ @page_iterator = CursorPageIterator.new(initial_cursor:, cursor_field:, &get_page)
19
+ # Items are read through their own page cursor so that reading `pages` never skips items.
20
+ @item_pages = CursorPageIterator.new(initial_cursor:, cursor_field:, &get_page)
21
+ @page = nil
22
+ @item_index = 0
23
+ end
24
+
25
+ # Returns the CursorPageIterator mediating access to the underlying API.
26
+ #
27
+ # @return [Peal::Internal::CursorPageIterator]
28
+ def pages
29
+ @page_iterator
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ class CursorPageIterator
6
+ include Enumerable
7
+
8
+ # The raw HTTP response from the most recent page response.
9
+ # @return [Net::HTTPResponse, nil]
10
+ attr_reader :http_response
11
+
12
+ # Instantiates a CursorPageIterator, an Enumerable class which wraps calls to a cursor-based paginated API and yields pages of items.
13
+ #
14
+ # @param initial_cursor [String] The initial cursor to use when iterating, if any.
15
+ # @param cursor_field [Symbol, Array<Symbol>] The name (or nested path) of the field in API responses to extract the next cursor from.
16
+ # @param block [Proc] A block which is responsible for receiving a cursor to use and returning the given page from the API.
17
+ # The block should return a two-element array: [parsed_page, raw_http_response].
18
+ # @return [Peal::Internal::CursorPageIterator]
19
+ def initialize(initial_cursor:, cursor_field:, &block)
20
+ @initial_cursor = initial_cursor
21
+ @cursor_field = cursor_field
22
+ @get_next_page = block
23
+ @http_response = nil
24
+ @first_page_requested = false
25
+ @first_page = nil
26
+ rewind
27
+ end
28
+
29
+ # Sends the request for the first page now instead of on the first iteration, so an API error for that page
30
+ # is raised here. The page is kept, and every loop that starts from the first page reuses it instead of
31
+ # requesting it again. Does nothing if the first page was already requested.
32
+ #
33
+ # @return [self]
34
+ def load_first_page
35
+ return self if @first_page_requested
36
+
37
+ @first_page = fetch_page(@initial_cursor)
38
+ rewind
39
+ self
40
+ end
41
+
42
+ # Uses the first page that `other` loaded with `load_first_page`, unless this iterator already sent a request.
43
+ #
44
+ # @param other [Peal::Internal::CursorPageIterator]
45
+ # @return [NilClass]
46
+ def reuse_first_page(other)
47
+ return if @first_page_requested || other.first_page.nil?
48
+
49
+ @first_page = other.first_page
50
+ rewind
51
+ end
52
+
53
+ # Iterates over each page returned by the API, starting again from the first page on every call.
54
+ #
55
+ # @param block [Proc] The block which each retrieved page is yielded to.
56
+ # @return [NilClass, Enumerator] An Enumerator when no block is given.
57
+ def each(&block)
58
+ return enum_for(:each) unless block_given?
59
+
60
+ rewind
61
+ while (page = next_page)
62
+ block.call(page)
63
+ end
64
+ end
65
+
66
+ # Resets page-by-page iteration (`next_page` / `next?`) to the first page.
67
+ #
68
+ # @return [NilClass]
69
+ def rewind
70
+ @need_initial_load = @initial_cursor.nil?
71
+ @cursor = @initial_cursor
72
+ @at_first_page = true
73
+ nil
74
+ end
75
+
76
+ # Whether another page will be available from the API.
77
+ #
78
+ # @return [Boolean]
79
+ def next?
80
+ (@at_first_page && !@first_page.nil?) || @need_initial_load || !@cursor.nil?
81
+ end
82
+
83
+ # Retrieves the next page from the API.
84
+ #
85
+ # @return [Object, nil]
86
+ def next_page
87
+ if @at_first_page && !@first_page.nil?
88
+ page = @first_page
89
+ else
90
+ return if !@need_initial_load && @cursor.nil?
91
+
92
+ page = fetch_page(@cursor)
93
+ end
94
+ @at_first_page = false
95
+ @need_initial_load = false
96
+ @cursor = read_field(page, @cursor_field)
97
+ page
98
+ end
99
+
100
+ protected
101
+
102
+ attr_reader :first_page
103
+
104
+ private
105
+
106
+ def fetch_page(cursor)
107
+ result = @get_next_page.call(cursor)
108
+ @first_page_requested = true
109
+ return result unless result.is_a?(Array)
110
+
111
+ fetched_page, raw_response = result
112
+ @http_response = raw_response
113
+ fetched_page
114
+ end
115
+
116
+ # Reads a field from an API response, walking through enclosing objects when the field is nested.
117
+ #
118
+ # @param value [Object, nil] The API response.
119
+ # @param field [Symbol, Array<Symbol>] The field name, or the path of field names for a nested field.
120
+ # @return [Object, nil]
121
+ def read_field(value, field)
122
+ Array(field).reduce(value) { |object, name| object&.send(name) }
123
+ end
124
+ end
125
+ end
126
+ end