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,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ class ItemIterator
6
+ include Enumerable
7
+
8
+ # The raw HTTP response from the most recent page request made by this pager or its `pages`.
9
+ # @return [Net::HTTPResponse, nil]
10
+ attr_reader :http_response
11
+
12
+ # Iterates over each item returned by the API, starting again from the first page on every call.
13
+ # Each loop is independent of other loops and of `next_element`.
14
+ #
15
+ # @param block [Proc] The block which each retrieved item is yielded to.
16
+ # @return [NilClass, Enumerator] An Enumerator when no block is given.
17
+ def each(&)
18
+ return enum_for(:each) unless block_given?
19
+
20
+ # Each loop reads through its own copy of the page stream, so repeated or nested loops never
21
+ # share a position with each other or with `next_element`.
22
+ pass = @item_pages.dup.tap(&:rewind)
23
+ while (page = pass.next_page)
24
+ (read_field(page, @item_field) || []).each(&)
25
+ end
26
+ nil
27
+ end
28
+
29
+ # Resets manual item-by-item iteration (`next_element` / `next?`) to the first page.
30
+ #
31
+ # @return [NilClass]
32
+ def rewind
33
+ @item_pages.rewind
34
+ @page = nil
35
+ @item_index = 0
36
+ nil
37
+ end
38
+
39
+ # Whether another item will be available from the API.
40
+ #
41
+ # @return [Boolean]
42
+ def next?
43
+ load_next_page if @page.nil?
44
+ return false if @page.nil?
45
+
46
+ return true if any_items_in_cached_page?
47
+
48
+ load_next_page
49
+ any_items_in_cached_page?
50
+ end
51
+
52
+ # Sends the request for the first page now instead of on the first iteration, so an API error for that page
53
+ # is raised here. The page is kept, and every loop (over items or `pages`) that starts from the first page
54
+ # reuses it instead of requesting it again. Does nothing if this pager already sent a request.
55
+ #
56
+ # @return [self]
57
+ def load_first_page
58
+ return self if @requested
59
+
60
+ @item_pages.load_first_page
61
+ @page_iterator.reuse_first_page(@item_pages)
62
+ self
63
+ end
64
+
65
+ # Retrieves the next item from the API.
66
+ def next_element
67
+ item = next_item_from_cached_page
68
+ return item if item
69
+
70
+ load_next_page
71
+ next_item_from_cached_page
72
+ end
73
+
74
+ private
75
+
76
+ # Wraps the page-fetching block so that `http_response` reflects the most recent request.
77
+ def track_http_responses(get_page)
78
+ proc do |*args|
79
+ result = get_page.call(*args)
80
+ @requested = true
81
+ @http_response = result[1] if result.is_a?(Array)
82
+ result
83
+ end
84
+ end
85
+
86
+ def cached_page_items
87
+ return [] unless @page
88
+
89
+ read_field(@page, @item_field) || []
90
+ end
91
+
92
+ def next_item_from_cached_page
93
+ items = cached_page_items
94
+ return if @item_index >= items.length
95
+
96
+ item = items[@item_index]
97
+ @item_index += 1
98
+ item
99
+ end
100
+
101
+ def any_items_in_cached_page?
102
+ @item_index < cached_page_items.length
103
+ end
104
+
105
+ def load_next_page
106
+ @page = @item_pages.next_page
107
+ @item_index = 0
108
+ end
109
+
110
+ # Reads a field from an API response, walking through enclosing objects when the field is nested.
111
+ #
112
+ # @param value [Object, nil] The API response.
113
+ # @param field [Symbol, Array<Symbol>] The field name, or the path of field names for a nested field.
114
+ # @return [Object, nil]
115
+ def read_field(value, field)
116
+ Array(field).reduce(value) { |object, name| object&.send(name) }
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ class OffsetItemIterator < ItemIterator
6
+ # Instantiates an OffsetItemIterator, an Enumerable class which wraps calls to an offset-based paginated API and yields the individual items from it.
7
+ #
8
+ # @param initial_page [Integer] The initial page or offset to start from when iterating.
9
+ # @param item_field [Symbol, Array<Symbol>] The name (or nested path) of the field in API responses to extract the items to iterate over.
10
+ # @param has_next_field [Symbol, Array<Symbol>] The name (or nested path) of the field in API responses containing a boolean of whether another page exists.
11
+ # @param step [Boolean] If true, treats the page number as a true offset (i.e. increments the page number by the number of items returned from each call rather than just 1)
12
+ # @param block [Proc] A block which is responsible for receiving a page number to use and returning the given page from the API.
13
+ #
14
+ # @return [Peal::Internal::OffsetItemIterator]
15
+ def initialize(initial_page:, item_field:, has_next_field:, step:, &block)
16
+ super()
17
+ @item_field = item_field
18
+ @http_response = nil
19
+ get_page = track_http_responses(block)
20
+ @page_iterator = OffsetPageIterator.new(initial_page:, item_field:, has_next_field:, step:, &get_page)
21
+ # Items are read through their own page cursor so that reading `pages` never skips items.
22
+ @item_pages = OffsetPageIterator.new(initial_page:, item_field:, has_next_field:, step:, &get_page)
23
+ @page = nil
24
+ @item_index = 0
25
+ end
26
+
27
+ # Returns the OffsetPageIterator that is mediating access to the underlying API.
28
+ #
29
+ # @return [Peal::Internal::OffsetPageIterator]
30
+ def pages
31
+ @page_iterator
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ class OffsetPageIterator
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 an OffsetPageIterator, an Enumerable class which wraps calls to an offset-based paginated API and yields pages of items from it.
13
+ #
14
+ # @param initial_page [Integer] The initial page to use when iterating, if any.
15
+ # @param item_field [Symbol, Array<Symbol>] The field (or nested path) to pull the list of items to iterate over.
16
+ # @param has_next_field [Symbol, Array<Symbol>] The field (or nested path) to pull the boolean of whether a next page exists from, if any.
17
+ # @param step [Boolean] If true, treats the page number as a true offset (i.e. increments the page number by the number of items returned from each call rather than just 1)
18
+ # @param block [Proc] A block which is responsible for receiving a page number to use and returning the given page from the API.
19
+ # The block should return a two-element array: [parsed_page, raw_http_response].
20
+ # @return [Peal::Internal::OffsetPageIterator]
21
+ def initialize(initial_page:, item_field:, has_next_field:, step:, &block)
22
+ @initial_page = initial_page || (step ? 0 : 1)
23
+ @item_field = item_field
24
+ @has_next_field = has_next_field
25
+ @step = step
26
+ @get_next_page = block
27
+ @http_response = nil
28
+ @first_page_requested = false
29
+ @first_page = nil
30
+ rewind
31
+ end
32
+
33
+ # Sends the request for the first page now instead of on the first iteration, so an API error for that page
34
+ # is raised here. The page is kept, and every loop that starts from the first page reuses it instead of
35
+ # requesting it again (an empty first page ends those loops without a new request). Does nothing if the first
36
+ # page was already requested.
37
+ #
38
+ # @return [self]
39
+ def load_first_page
40
+ return self if @first_page_requested
41
+
42
+ @first_page = fetch_page(@initial_page)
43
+ rewind
44
+ self
45
+ end
46
+
47
+ # Uses the first page that `other` loaded with `load_first_page`, unless this iterator already sent a request.
48
+ #
49
+ # @param other [Peal::Internal::OffsetPageIterator]
50
+ # @return [NilClass]
51
+ def reuse_first_page(other)
52
+ return if @first_page_requested || other.first_page.nil?
53
+
54
+ @first_page = other.first_page
55
+ rewind
56
+ end
57
+
58
+ # Iterates over each page returned by the API, starting again from the first page on every call.
59
+ #
60
+ # @param block [Proc] The block which each retrieved page is yielded to.
61
+ # @return [NilClass, Enumerator] An Enumerator when no block is given.
62
+ def each(&block)
63
+ return enum_for(:each) unless block_given?
64
+
65
+ rewind
66
+ while (page = next_page)
67
+ block.call(page)
68
+ end
69
+ end
70
+
71
+ # Resets page-by-page iteration (`next_page` / `next?`) to the first page.
72
+ #
73
+ # @return [NilClass]
74
+ def rewind
75
+ @page_number = @initial_page
76
+ # A cache of whether the API has another page, if it gives us that information...
77
+ @has_next_page = nil
78
+ # ...or the actual next page, preloaded, if it doesn't. A first page kept by `load_first_page` is reused.
79
+ @next_page = @first_page
80
+ nil
81
+ end
82
+
83
+ # Whether another page will be available from the API.
84
+ #
85
+ # @return [Boolean]
86
+ def next?
87
+ return @has_next_page unless @has_next_page.nil?
88
+ return true if @next_page && page_has_items?(@next_page)
89
+ return @has_next_page = false if @next_page
90
+
91
+ fetched_page = fetch_page(@page_number)
92
+ fetched_page_items = read_field(fetched_page, @item_field)
93
+ if fetched_page_items.nil? || fetched_page_items.empty?
94
+ @has_next_page = false
95
+ else
96
+ @next_page = fetched_page
97
+ true
98
+ end
99
+ end
100
+
101
+ # Returns the next page from the API.
102
+ def next_page
103
+ return nil if @page_number.nil?
104
+
105
+ if @next_page
106
+ this_page = @next_page
107
+ @next_page = nil
108
+ else
109
+ this_page = fetch_page(@page_number)
110
+ end
111
+
112
+ @has_next_page = read_field(this_page, @has_next_field) if @has_next_field
113
+
114
+ items = read_field(this_page, @item_field)
115
+ if items.nil? || items.empty?
116
+ @page_number = nil
117
+ return nil
118
+ elsif @step
119
+ @page_number += items.length
120
+ else
121
+ @page_number += 1
122
+ end
123
+
124
+ this_page
125
+ end
126
+
127
+ protected
128
+
129
+ attr_reader :first_page
130
+
131
+ private
132
+
133
+ def page_has_items?(page)
134
+ items = read_field(page, @item_field)
135
+ !items.nil? && !items.empty?
136
+ end
137
+
138
+ def fetch_page(page_number)
139
+ result = @get_next_page.call(page_number)
140
+ @first_page_requested = true
141
+ if result.is_a?(Array)
142
+ fetched_page, raw_response = result
143
+ @http_response = raw_response
144
+ fetched_page
145
+ else
146
+ result
147
+ end
148
+ end
149
+
150
+ # Reads a field from an API response, walking through enclosing objects when the field is nested.
151
+ #
152
+ # @param value [Object, nil] The API response.
153
+ # @param field [Symbol, Array<Symbol>] The field name, or the path of field names for a nested field.
154
+ # @return [Object, nil]
155
+ def read_field(value, field)
156
+ Array(field).reduce(value) { |object, name| object&.send(name) }
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module JSON
6
+ # @api private
7
+ class Request < Peal::Internal::Http::BaseRequest
8
+ attr_reader :body
9
+
10
+ # @param base_url [String] The base URL for the request
11
+ # @param path [String] The path for the request
12
+ # @param method [Symbol] 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 body [Object, nil] The JSON request body (optional)
16
+ # @param request_options [Peal::RequestOptions, Hash{Symbol=>Object}, nil]
17
+ # @param max_retries [Integer, nil] Overrides the client's retry count for this request
18
+ def initialize(base_url:, path:, method:, headers: {}, query: {}, body: nil, request_options: {}, max_retries: nil)
19
+ super(base_url:, path:, method:, headers:, query:, request_options:, max_retries:)
20
+
21
+ @body = body
22
+ end
23
+
24
+ # @return [Hash] The encoded HTTP request headers.
25
+ # @param protected_keys [Array<String>] Header keys set by the SDK client (e.g. auth, metadata)
26
+ # that must not be overridden by additional_headers from request_options.
27
+ def encode_headers(protected_keys: [])
28
+ sdk_headers = {
29
+ "Content-Type" => "application/json",
30
+ "Accept" => "application/json"
31
+ }.merge(@headers)
32
+ merge_additional_headers(sdk_headers, protected_keys:)
33
+ end
34
+
35
+ # @return [String, nil] The encoded HTTP request body, including any additional_body_parameters
36
+ # from request_options.
37
+ def encode_body
38
+ body = request_body
39
+ body.nil? ? nil : ::JSON.generate(Internal::Types::Utils.serialize_times(body))
40
+ end
41
+
42
+ private
43
+
44
+ # @return [Object, nil] The request body merged with additional_body_parameters.
45
+ def request_body
46
+ merge_additional_body_parameters(@body)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module JSON
6
+ module Serializable
7
+ # Loads data from JSON into its deserialized form
8
+ #
9
+ # @param str [String] Raw JSON to load into an object
10
+ # @return [Object]
11
+ def load(str)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ # Dumps data from its deserialized form into JSON
16
+ #
17
+ # @param value [Object] The deserialized value
18
+ # @return [String]
19
+ def dump(value)
20
+ raise NotImplementedError
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Multipart
6
+ # Encodes parameters into a `multipart/form-data` payload as described by RFC
7
+ # 2388:
8
+ #
9
+ # https://tools.ietf.org/html/rfc2388
10
+ #
11
+ # This is most useful for transferring file-like objects.
12
+ #
13
+ # Parameters should be added with `#encode`. When ready, use `#body` to get
14
+ # the encoded result and `#content_type` to get the value that should be
15
+ # placed in the `Content-Type` header of a subsequent request (which includes
16
+ # a boundary value).
17
+ #
18
+ # This abstraction is heavily inspired by Stripe's multipart/form-data implementation,
19
+ # which can be found here:
20
+ #
21
+ # https://github.com/stripe/stripe-ruby/blob/ca00b676f04ac421cf5cb5ff0325f243651677b6/lib/stripe/multipart_encoder.rb#L18
22
+ #
23
+ # @api private
24
+ class Encoder
25
+ CONTENT_TYPE = "multipart/form-data"
26
+ CRLF = "\r\n"
27
+
28
+ attr_reader :boundary, :body
29
+
30
+ def initialize
31
+ # Chose the same number of random bytes that Go uses in its standard
32
+ # library implementation. Easily enough entropy to ensure that it won't
33
+ # be present in a file we're sending.
34
+ @boundary = SecureRandom.hex(30)
35
+
36
+ @body = String.new
37
+ @closed = false
38
+ @first_field = true
39
+ end
40
+
41
+ # Gets the content type string including the boundary.
42
+ #
43
+ # @return [String] The content type with boundary
44
+ def content_type
45
+ "#{CONTENT_TYPE}; boundary=#{@boundary}"
46
+ end
47
+
48
+ # Encode the given FormData object into a multipart/form-data payload.
49
+ #
50
+ # @param form_data [FormData] The form data to encode
51
+ # @return [String] The encoded body.
52
+ def encode(form_data)
53
+ return "" if form_data.parts.empty?
54
+
55
+ form_data.parts.each do |part|
56
+ write_part(part)
57
+ end
58
+ close
59
+
60
+ @body
61
+ end
62
+
63
+ # Writes a FormDataPart to the encoder.
64
+ #
65
+ # @param part [FormDataPart] The part to write
66
+ # @return [nil]
67
+ def write_part(part)
68
+ raise "Cannot write to closed encoder" if @closed
69
+
70
+ write_field(
71
+ name: part.name,
72
+ data: part.contents,
73
+ filename: part.filename,
74
+ headers: part.headers
75
+ )
76
+
77
+ nil
78
+ end
79
+
80
+ # Writes a field to the encoder.
81
+ #
82
+ # @param name [String] The field name
83
+ # @param data [String] The field data
84
+ # @param filename [String, nil] Optional filename
85
+ # @param headers [Hash<String, String>, nil] Optional additional headers
86
+ # @return [nil]
87
+ def write_field(name:, data:, filename: nil, headers: nil)
88
+ raise "Cannot write to closed encoder" if @closed
89
+
90
+ if @first_field
91
+ @first_field = false
92
+ else
93
+ @body << CRLF
94
+ end
95
+
96
+ @body << "--#{@boundary}#{CRLF}"
97
+ @body << %(Content-Disposition: form-data; name="#{escape(name.to_s)}")
98
+ @body << %(; filename="#{escape(filename)}") if filename
99
+ @body << CRLF
100
+
101
+ if headers
102
+ headers.each do |key, value|
103
+ @body << "#{key}: #{value}#{CRLF}"
104
+ end
105
+ elsif filename
106
+ # Default content type for files.
107
+ @body << "Content-Type: application/octet-stream#{CRLF}"
108
+ end
109
+
110
+ @body << CRLF
111
+ @body << data.to_s
112
+
113
+ nil
114
+ end
115
+
116
+ # Finalizes the encoder by writing the final boundary.
117
+ #
118
+ # @return [nil]
119
+ def close
120
+ raise "Encoder already closed" if @closed
121
+
122
+ @body << CRLF
123
+ @body << "--#{@boundary}--"
124
+ @closed = true
125
+
126
+ nil
127
+ end
128
+
129
+ private
130
+
131
+ # Escapes quotes for use in header values and replaces line breaks with spaces.
132
+ #
133
+ # @param str [String] The string to escape
134
+ # @return [String] The escaped string
135
+ def escape(str)
136
+ str.to_s.gsub('"', "%22").tr("\n", " ").tr("\r", " ")
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peal
4
+ module Internal
5
+ module Multipart
6
+ # @api private
7
+ class FormData
8
+ # @return [Array<FormDataPart>] The parts in this multipart form data.
9
+ attr_reader :parts
10
+
11
+ # @return [Encoder] The encoder for this multipart form data.
12
+ private attr_reader :encoder
13
+
14
+ def initialize
15
+ @encoder = Encoder.new
16
+ @parts = []
17
+ end
18
+
19
+ # Adds a new part to the multipart form data.
20
+ #
21
+ # @param name [String] The name of the form field
22
+ # @param value [String, Integer, Float, Boolean, #read] The value of the field
23
+ # @param content_type [String, nil] Optional content type
24
+ # @return [self] Returns self for chaining
25
+ def add(name:, value:, content_type: nil)
26
+ headers = content_type ? { "Content-Type" => content_type } : nil
27
+ add_part(FormDataPart.new(name:, value:, headers:))
28
+ end
29
+
30
+ # Adds a file to the multipart form data.
31
+ #
32
+ # @param name [String] The name of the form field
33
+ # @param file [String, #read] A path to a file on disk, or a file/readable object
34
+ # @param filename [String, nil] Optional filename (defaults to basename of the path for paths and File objects,
35
+ # and to the field name for readable objects without a path or name, such as StringIO)
36
+ # @param content_type [String, nil] Optional content type (e.g. "image/png")
37
+ # @return [self] Returns self for chaining
38
+ def add_file(name:, file:, filename: nil, content_type: nil)
39
+ headers = content_type ? { "Content-Type" => content_type } : nil
40
+ if file.is_a?(::String)
41
+ filename ||= ::File.basename(file)
42
+ file = ::File.binread(file)
43
+ else
44
+ filename ||= filename_for(file) || name
45
+ end
46
+ add_part(FormDataPart.new(name:, value: file, filename:, headers:))
47
+ end
48
+
49
+ # Adds a pre-created part to the multipart form data.
50
+ #
51
+ # @param part [FormDataPart] The part to add
52
+ # @return [self] Returns self for chaining
53
+ def add_part(part)
54
+ @parts << part
55
+ self
56
+ end
57
+
58
+ # Gets the content type string including the boundary.
59
+ #
60
+ # @return [String] The content type with boundary.
61
+ def content_type
62
+ @encoder.content_type
63
+ end
64
+
65
+ # Encode the multipart form data into a multipart/form-data payload.
66
+ #
67
+ # @return [String] The encoded body.
68
+ def encode
69
+ @encoder.encode(self)
70
+ end
71
+
72
+ private
73
+
74
+ def filename_for(file)
75
+ if file.is_a?(::File) || file.respond_to?(:path)
76
+ ::File.basename(file.path)
77
+ elsif file.respond_to?(:name)
78
+ file.name
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module Peal
6
+ module Internal
7
+ module Multipart
8
+ # @api private
9
+ class FormDataPart
10
+ attr_reader :name, :contents, :filename, :headers
11
+
12
+ # @param name [String] The name of the form field
13
+ # @param value [String, Integer, Float, Boolean, File, #read] The value of the field
14
+ # @param filename [String, nil] Optional filename for file uploads
15
+ # @param headers [Hash<String, String>, nil] Optional additional headers
16
+ def initialize(name:, value:, filename: nil, headers: nil)
17
+ @name = name
18
+ @contents = convert_to_content(value)
19
+ @filename = filename
20
+ @headers = headers
21
+ end
22
+
23
+ # Converts the part to a hash suitable for serialization.
24
+ #
25
+ # @return [Hash] A hash representation of the part
26
+ def to_hash
27
+ result = {
28
+ name: @name,
29
+ contents: @contents
30
+ }
31
+ result[:filename] = @filename if @filename
32
+ result[:headers] = @headers if @headers
33
+ result
34
+ end
35
+
36
+ private
37
+
38
+ # Converts various types of values to a content representation
39
+ # @param value [String, Integer, Float, Boolean, #read] The value to convert
40
+ # @return [String] The string representation of the value
41
+ def convert_to_content(value)
42
+ if value.respond_to?(:read)
43
+ value.read
44
+ else
45
+ Internal::Types::Utils.serialize_times(value).to_s
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end