postboost 1.0.0 → 1.8.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 (364) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +119 -0
  3. data/docs/AIApi.md +439 -0
  4. data/docs/AICredits.md +22 -0
  5. data/docs/Account.md +14 -8
  6. data/docs/AccountAnalytics.md +28 -0
  7. data/docs/AccountAnalyticsInitialSync.md +20 -0
  8. data/docs/AccountSchedule.md +22 -0
  9. data/docs/AccountsApi.md +15 -5
  10. data/docs/AddPostToQueueRequest.md +18 -0
  11. data/docs/AnalyticsApi.md +401 -0
  12. data/docs/AnalyticsPeriod.md +24 -0
  13. data/docs/AnalyticsSummary.md +20 -0
  14. data/docs/AnalyticsSummaryData.md +38 -0
  15. data/docs/ApprovePostRequest.md +24 -0
  16. data/docs/BestPostingTimes.md +20 -0
  17. data/docs/BestPostingTimesTimesInner.md +24 -0
  18. data/docs/BlogToSocial200Response.md +18 -0
  19. data/docs/BlogToSocial429Response.md +18 -0
  20. data/docs/BlogToSocialCaption.md +28 -0
  21. data/docs/BlogToSocialInput.md +42 -0
  22. data/docs/BlogToSocialMedia.md +20 -0
  23. data/docs/BlogToSocialResponse.md +30 -0
  24. data/docs/CancelSubscription422Response.md +20 -0
  25. data/docs/CancelSubscription422ResponseErrors.md +18 -0
  26. data/docs/CancelSubscriptionRequest.md +18 -0
  27. data/docs/CompleteChunkedUploadRequest.md +20 -0
  28. data/docs/CreateMediaFolderRequest.md +20 -0
  29. data/docs/CreateMention201Response.md +18 -0
  30. data/docs/DeleteMediaBulkRequest.md +1 -1
  31. data/docs/DeleteMediaBulkRequestItemsInner.md +49 -0
  32. data/docs/DeleteMediaFolderRequest.md +18 -0
  33. data/docs/DeleteResult.md +3 -3
  34. data/docs/ImageAltText200Response.md +18 -0
  35. data/docs/ImageAltTextInput.md +18 -0
  36. data/docs/ImageAltTextResponse.md +24 -0
  37. data/docs/ImageEditInput.md +28 -0
  38. data/docs/ImageGenerate200Response.md +18 -0
  39. data/docs/ImageGenerate429Response.md +18 -0
  40. data/docs/ImageGenerateInput.md +36 -0
  41. data/docs/ImageGenerationResponse.md +30 -0
  42. data/docs/ImagePrompt200Response.md +18 -0
  43. data/docs/ImagePrompt429Response.md +18 -0
  44. data/docs/ImagePromptInput.md +28 -0
  45. data/docs/ImagePromptResponse.md +18 -0
  46. data/docs/ImageVariations200Response.md +18 -0
  47. data/docs/ImageVariationsInput.md +24 -0
  48. data/docs/ImageVariationsResponse.md +26 -0
  49. data/docs/{InitiateChunkedUpload200Response.md → InitiateChunkedUpload201Response.md} +2 -2
  50. data/docs/{InitiateRemoteUpload200Response.md → InitiateRemoteUpload201Response.md} +7 -7
  51. data/docs/{InitiateRemoteUpload200ResponseOneOf.md → InitiateRemoteUpload201ResponseOneOf.md} +2 -2
  52. data/docs/InitiateRemoteUploadRequest.md +3 -1
  53. data/docs/ListMediaFolders200Response.md +18 -0
  54. data/docs/ListMentions200Response.md +22 -0
  55. data/docs/ListMyWorkspaces200Response.md +18 -0
  56. data/docs/Media.md +22 -8
  57. data/docs/MediaApi.md +340 -26
  58. data/docs/MediaFolder.md +24 -0
  59. data/docs/MediaFolderInput.md +20 -0
  60. data/docs/MediaFolderRef.md +20 -0
  61. data/docs/Mention.md +28 -0
  62. data/docs/MentionIdentity.md +24 -0
  63. data/docs/MentionIdentityInput.md +26 -0
  64. data/docs/MentionInput.md +22 -0
  65. data/docs/MentionsApi.md +375 -0
  66. data/docs/Post.md +10 -8
  67. data/docs/PostAnalytics.md +22 -0
  68. data/docs/PostInput.md +3 -1
  69. data/docs/PostVersion.md +2 -0
  70. data/docs/PostingTimeSlot.md +22 -0
  71. data/docs/PostingTimes.md +32 -0
  72. data/docs/PostingTimesBestInner.md +24 -0
  73. data/docs/PostingTimesDayIntervalsInnerInner.md +28 -0
  74. data/docs/PostingTimesDaysInner.md +24 -0
  75. data/docs/PostsApi.md +174 -14
  76. data/docs/PublicWorkspace.md +24 -0
  77. data/docs/PublicWorkspacePivot.md +22 -0
  78. data/docs/PublishProgress.md +22 -0
  79. data/docs/Receipt.md +8 -8
  80. data/docs/ReceiptsApi.md +15 -1
  81. data/docs/RemoveGenericSubscription422Response.md +18 -0
  82. data/docs/RetryPostAccountResult.md +22 -0
  83. data/docs/SchedulePostRequest.md +9 -1
  84. data/docs/ScheduleResult.md +4 -2
  85. data/docs/Subscription.md +5 -5
  86. data/docs/SubscriptionsApi.md +27 -5
  87. data/docs/Tag.md +4 -4
  88. data/docs/TagsApi.md +10 -0
  89. data/docs/UpdateMediaRequest.md +6 -2
  90. data/docs/{UploadChunk200Response.md → UploadChunk201Response.md} +2 -2
  91. data/docs/User.md +7 -5
  92. data/docs/UsersApi.md +15 -1
  93. data/docs/Workspace.md +8 -6
  94. data/docs/WorkspaceInput.md +1 -1
  95. data/docs/WorkspacesApi.md +156 -3
  96. data/lib/postboost/api/accounts_api.rb +16 -4
  97. data/lib/postboost/api/ai_api.rb +466 -0
  98. data/lib/postboost/api/analytics_api.rb +425 -0
  99. data/lib/postboost/api/media_api.rb +365 -22
  100. data/lib/postboost/api/mentions_api.rb +386 -0
  101. data/lib/postboost/api/posts_api.rb +176 -12
  102. data/lib/postboost/api/receipts_api.rb +17 -2
  103. data/lib/postboost/api/subscriptions_api.rb +28 -3
  104. data/lib/postboost/api/tags_api.rb +12 -2
  105. data/lib/postboost/api/users_api.rb +17 -2
  106. data/lib/postboost/api/workspaces_api.rb +139 -2
  107. data/lib/postboost/api_client.rb +2 -2
  108. data/lib/postboost/api_error.rb +2 -2
  109. data/lib/postboost/configuration.rb +2 -2
  110. data/lib/postboost/models/account.rb +120 -3
  111. data/lib/postboost/models/account_analytics.rb +308 -0
  112. data/lib/postboost/models/account_analytics_initial_sync.rb +231 -0
  113. data/lib/postboost/models/account_schedule.rb +255 -0
  114. data/lib/postboost/models/add_generic_subscription_request.rb +2 -2
  115. data/lib/postboost/models/add_post_to_queue_request.rb +215 -0
  116. data/lib/postboost/models/ai_credits.rb +256 -0
  117. data/lib/postboost/models/analytics_period.rb +270 -0
  118. data/lib/postboost/models/analytics_summary.rb +237 -0
  119. data/lib/postboost/models/analytics_summary_data.rb +327 -0
  120. data/lib/postboost/models/approve_post_request.rb +247 -0
  121. data/lib/postboost/models/best_posting_times.rb +240 -0
  122. data/lib/postboost/models/best_posting_times_times_inner.rb +269 -0
  123. data/lib/postboost/models/blog_to_social200_response.rb +214 -0
  124. data/lib/postboost/models/blog_to_social429_response.rb +214 -0
  125. data/lib/postboost/models/blog_to_social_caption.rb +265 -0
  126. data/lib/postboost/models/blog_to_social_input.rb +536 -0
  127. data/lib/postboost/models/blog_to_social_media.rb +226 -0
  128. data/lib/postboost/models/blog_to_social_response.rb +276 -0
  129. data/lib/postboost/models/cancel_subscription422_response.rb +223 -0
  130. data/lib/postboost/models/cancel_subscription422_response_errors.rb +216 -0
  131. data/lib/postboost/models/cancel_subscription_request.rb +217 -0
  132. data/lib/postboost/models/change_subscription_plan_request.rb +2 -2
  133. data/lib/postboost/models/checkout_subscription200_response.rb +2 -2
  134. data/lib/postboost/models/checkout_subscription_request.rb +2 -2
  135. data/lib/postboost/models/complete_chunked_upload_request.rb +243 -0
  136. data/lib/postboost/models/create_media_folder_request.rb +258 -0
  137. data/lib/postboost/models/create_mention201_response.rb +214 -0
  138. data/lib/postboost/models/delete_media_bulk_request.rb +23 -4
  139. data/lib/postboost/models/{initiate_remote_upload200_response.rb → delete_media_bulk_request_items_inner.rb} +5 -5
  140. data/lib/postboost/models/delete_media_folder_request.rb +216 -0
  141. data/lib/postboost/models/delete_mode.rb +2 -2
  142. data/lib/postboost/models/delete_post_request.rb +2 -2
  143. data/lib/postboost/models/delete_posts_bulk_request.rb +2 -2
  144. data/lib/postboost/models/delete_receipts_bulk_request.rb +2 -2
  145. data/lib/postboost/models/delete_result.rb +23 -2
  146. data/lib/postboost/models/delete_user400_response.rb +2 -2
  147. data/lib/postboost/models/delete_users_bulk_request.rb +2 -2
  148. data/lib/postboost/models/delete_workspaces_bulk_request.rb +2 -2
  149. data/lib/postboost/models/get_remote_upload_status200_response.rb +2 -2
  150. data/lib/postboost/models/image_alt_text200_response.rb +221 -0
  151. data/lib/postboost/models/image_alt_text_input.rb +221 -0
  152. data/lib/postboost/models/image_alt_text_response.rb +262 -0
  153. data/lib/postboost/models/image_edit_input.rb +375 -0
  154. data/lib/postboost/models/image_generate200_response.rb +221 -0
  155. data/lib/postboost/models/image_generate429_response.rb +214 -0
  156. data/lib/postboost/models/image_generate_input.rb +447 -0
  157. data/lib/postboost/models/image_generation_response.rb +305 -0
  158. data/lib/postboost/models/image_prompt200_response.rb +221 -0
  159. data/lib/postboost/models/image_prompt429_response.rb +214 -0
  160. data/lib/postboost/models/image_prompt_input.rb +345 -0
  161. data/lib/postboost/models/image_prompt_response.rb +221 -0
  162. data/lib/postboost/models/image_variations200_response.rb +221 -0
  163. data/lib/postboost/models/image_variations_input.rb +328 -0
  164. data/lib/postboost/models/image_variations_response.rb +280 -0
  165. data/lib/postboost/models/{initiate_chunked_upload200_response.rb → initiate_chunked_upload201_response.rb} +5 -5
  166. data/lib/postboost/models/initiate_chunked_upload_request.rb +2 -2
  167. data/lib/postboost/models/initiate_remote_upload201_response.rb +105 -0
  168. data/lib/postboost/models/{initiate_remote_upload200_response_one_of.rb → initiate_remote_upload201_response_one_of.rb} +5 -5
  169. data/lib/postboost/models/initiate_remote_upload_request.rb +16 -6
  170. data/lib/postboost/models/list_accounts200_response.rb +2 -2
  171. data/lib/postboost/models/list_media200_response.rb +2 -2
  172. data/lib/postboost/models/list_media_folders200_response.rb +216 -0
  173. data/lib/postboost/models/list_mentions200_response.rb +241 -0
  174. data/lib/postboost/models/list_my_workspaces200_response.rb +216 -0
  175. data/lib/postboost/models/list_posts200_response.rb +2 -2
  176. data/lib/postboost/models/list_receipts200_response.rb +2 -2
  177. data/lib/postboost/models/list_tags200_response.rb +2 -2
  178. data/lib/postboost/models/list_users200_response.rb +2 -2
  179. data/lib/postboost/models/list_workspaces200_response.rb +2 -2
  180. data/lib/postboost/models/media.rb +128 -3
  181. data/lib/postboost/models/media_folder.rb +271 -0
  182. data/lib/postboost/models/media_folder_input.rb +244 -0
  183. data/lib/postboost/models/media_folder_ref.rb +237 -0
  184. data/lib/postboost/models/mention.rb +290 -0
  185. data/lib/postboost/models/mention_identity.rb +257 -0
  186. data/lib/postboost/models/mention_identity_input.rb +325 -0
  187. data/lib/postboost/models/mention_input.rb +279 -0
  188. data/lib/postboost/models/pagination_meta.rb +2 -2
  189. data/lib/postboost/models/pagination_meta_links.rb +2 -2
  190. data/lib/postboost/models/pagination_meta_meta.rb +2 -2
  191. data/lib/postboost/models/post.rb +69 -3
  192. data/lib/postboost/models/post_analytics.rb +252 -0
  193. data/lib/postboost/models/post_content.rb +2 -2
  194. data/lib/postboost/models/post_input.rb +16 -3
  195. data/lib/postboost/models/post_status.rb +6 -3
  196. data/lib/postboost/models/post_version.rb +32 -3
  197. data/lib/postboost/models/posting_time_slot.rb +315 -0
  198. data/lib/postboost/models/posting_times.rb +362 -0
  199. data/lib/postboost/models/posting_times_best_inner.rb +269 -0
  200. data/lib/postboost/models/posting_times_day_intervals_inner_inner.rb +370 -0
  201. data/lib/postboost/models/posting_times_days_inner.rb +366 -0
  202. data/lib/postboost/models/public_workspace.rb +262 -0
  203. data/lib/postboost/models/public_workspace_pivot.rb +267 -0
  204. data/lib/postboost/models/publish_progress.rb +254 -0
  205. data/lib/postboost/models/receipt.rb +58 -2
  206. data/lib/postboost/models/receipt_input.rb +2 -2
  207. data/lib/postboost/models/receipt_update_input.rb +2 -2
  208. data/lib/postboost/models/remove_generic_subscription422_response.rb +214 -0
  209. data/lib/postboost/models/remove_user_from_workspace_request.rb +2 -2
  210. data/lib/postboost/models/retry_post_account_result.rb +275 -0
  211. data/lib/postboost/models/schedule_post_request.rb +48 -6
  212. data/lib/postboost/models/schedule_result.rb +23 -6
  213. data/lib/postboost/models/subscription.rb +37 -2
  214. data/lib/postboost/models/subscription_input.rb +2 -2
  215. data/lib/postboost/models/subscription_status.rb +2 -2
  216. data/lib/postboost/models/subscription_update_input.rb +2 -2
  217. data/lib/postboost/models/tag.rb +30 -2
  218. data/lib/postboost/models/tag_input.rb +2 -2
  219. data/lib/postboost/models/update_media_request.rb +61 -11
  220. data/lib/postboost/models/{upload_chunk200_response.rb → upload_chunk201_response.rb} +5 -5
  221. data/lib/postboost/models/user.rb +48 -3
  222. data/lib/postboost/models/user_input.rb +2 -2
  223. data/lib/postboost/models/user_update_input.rb +2 -2
  224. data/lib/postboost/models/workspace.rb +42 -3
  225. data/lib/postboost/models/workspace_input.rb +3 -9
  226. data/lib/postboost/models/workspace_user_input.rb +2 -2
  227. data/lib/postboost/version.rb +3 -3
  228. data/lib/postboost.rb +70 -6
  229. data/postboost.gemspec +3 -3
  230. data/spec/api/accounts_api_spec.rb +7 -3
  231. data/spec/api/ai_api_spec.rb +113 -0
  232. data/spec/api/analytics_api_spec.rb +113 -0
  233. data/spec/api/media_api_spec.rb +73 -10
  234. data/spec/api/mentions_api_spec.rb +103 -0
  235. data/spec/api/posts_api_spec.rb +38 -6
  236. data/spec/api/receipts_api_spec.rb +9 -2
  237. data/spec/api/subscriptions_api_spec.rb +12 -2
  238. data/spec/api/tags_api_spec.rb +7 -2
  239. data/spec/api/users_api_spec.rb +9 -2
  240. data/spec/api/workspaces_api_spec.rb +33 -2
  241. data/spec/models/account_analytics_initial_sync_spec.rb +42 -0
  242. data/spec/models/account_analytics_spec.rb +66 -0
  243. data/spec/models/account_schedule_spec.rb +48 -0
  244. data/spec/models/account_spec.rb +24 -2
  245. data/spec/models/add_generic_subscription_request_spec.rb +2 -2
  246. data/spec/models/add_post_to_queue_request_spec.rb +36 -0
  247. data/spec/models/ai_credits_spec.rb +48 -0
  248. data/spec/models/analytics_period_spec.rb +54 -0
  249. data/spec/models/analytics_summary_data_spec.rb +96 -0
  250. data/spec/models/analytics_summary_spec.rb +42 -0
  251. data/spec/models/approve_post_request_spec.rb +54 -0
  252. data/spec/models/best_posting_times_spec.rb +42 -0
  253. data/spec/models/best_posting_times_times_inner_spec.rb +54 -0
  254. data/spec/models/blog_to_social200_response_spec.rb +36 -0
  255. data/spec/models/blog_to_social429_response_spec.rb +36 -0
  256. data/spec/models/blog_to_social_caption_spec.rb +66 -0
  257. data/spec/models/blog_to_social_input_spec.rb +128 -0
  258. data/spec/models/blog_to_social_media_spec.rb +42 -0
  259. data/spec/models/blog_to_social_response_spec.rb +72 -0
  260. data/spec/models/cancel_subscription422_response_errors_spec.rb +36 -0
  261. data/spec/models/cancel_subscription422_response_spec.rb +42 -0
  262. data/spec/models/cancel_subscription_request_spec.rb +36 -0
  263. data/spec/models/change_subscription_plan_request_spec.rb +2 -2
  264. data/spec/models/checkout_subscription200_response_spec.rb +2 -2
  265. data/spec/models/checkout_subscription_request_spec.rb +2 -2
  266. data/spec/models/complete_chunked_upload_request_spec.rb +42 -0
  267. data/spec/models/create_media_folder_request_spec.rb +42 -0
  268. data/spec/models/create_mention201_response_spec.rb +36 -0
  269. data/spec/models/delete_media_bulk_request_items_inner_spec.rb +32 -0
  270. data/spec/models/delete_media_bulk_request_spec.rb +2 -2
  271. data/spec/models/delete_media_folder_request_spec.rb +36 -0
  272. data/spec/models/delete_mode_spec.rb +2 -2
  273. data/spec/models/delete_post_request_spec.rb +2 -2
  274. data/spec/models/delete_posts_bulk_request_spec.rb +2 -2
  275. data/spec/models/delete_receipts_bulk_request_spec.rb +2 -2
  276. data/spec/models/delete_result_spec.rb +2 -2
  277. data/spec/models/delete_user400_response_spec.rb +2 -2
  278. data/spec/models/delete_users_bulk_request_spec.rb +2 -2
  279. data/spec/models/delete_workspaces_bulk_request_spec.rb +2 -2
  280. data/spec/models/get_remote_upload_status200_response_spec.rb +2 -2
  281. data/spec/models/image_alt_text200_response_spec.rb +36 -0
  282. data/spec/models/image_alt_text_input_spec.rb +36 -0
  283. data/spec/models/image_alt_text_response_spec.rb +54 -0
  284. data/spec/models/image_edit_input_spec.rb +74 -0
  285. data/spec/models/image_generate200_response_spec.rb +36 -0
  286. data/spec/models/image_generate429_response_spec.rb +36 -0
  287. data/spec/models/image_generate_input_spec.rb +102 -0
  288. data/spec/models/image_generation_response_spec.rb +72 -0
  289. data/spec/models/image_prompt200_response_spec.rb +36 -0
  290. data/spec/models/image_prompt429_response_spec.rb +36 -0
  291. data/spec/models/image_prompt_input_spec.rb +70 -0
  292. data/spec/models/image_prompt_response_spec.rb +36 -0
  293. data/spec/models/image_variations200_response_spec.rb +36 -0
  294. data/spec/models/image_variations_input_spec.rb +62 -0
  295. data/spec/models/image_variations_response_spec.rb +60 -0
  296. data/spec/models/initiate_chunked_upload201_response_spec.rb +48 -0
  297. data/spec/models/initiate_chunked_upload_request_spec.rb +2 -2
  298. data/spec/models/initiate_remote_upload201_response_one_of_spec.rb +36 -0
  299. data/spec/models/initiate_remote_upload201_response_spec.rb +32 -0
  300. data/spec/models/initiate_remote_upload_request_spec.rb +8 -2
  301. data/spec/models/list_accounts200_response_spec.rb +2 -2
  302. data/spec/models/list_media200_response_spec.rb +2 -2
  303. data/spec/models/list_media_folders200_response_spec.rb +36 -0
  304. data/spec/models/list_mentions200_response_spec.rb +48 -0
  305. data/spec/models/list_my_workspaces200_response_spec.rb +36 -0
  306. data/spec/models/list_posts200_response_spec.rb +2 -2
  307. data/spec/models/list_receipts200_response_spec.rb +2 -2
  308. data/spec/models/list_tags200_response_spec.rb +2 -2
  309. data/spec/models/list_users200_response_spec.rb +2 -2
  310. data/spec/models/list_workspaces200_response_spec.rb +2 -2
  311. data/spec/models/media_folder_input_spec.rb +42 -0
  312. data/spec/models/media_folder_ref_spec.rb +42 -0
  313. data/spec/models/media_folder_spec.rb +54 -0
  314. data/spec/models/media_spec.rb +44 -2
  315. data/spec/models/mention_identity_input_spec.rb +60 -0
  316. data/spec/models/mention_identity_spec.rb +54 -0
  317. data/spec/models/mention_input_spec.rb +48 -0
  318. data/spec/models/mention_spec.rb +66 -0
  319. data/spec/models/pagination_meta_links_spec.rb +2 -2
  320. data/spec/models/pagination_meta_meta_spec.rb +2 -2
  321. data/spec/models/pagination_meta_spec.rb +2 -2
  322. data/spec/models/post_analytics_spec.rb +48 -0
  323. data/spec/models/post_content_spec.rb +2 -2
  324. data/spec/models/post_input_spec.rb +8 -2
  325. data/spec/models/post_spec.rb +8 -2
  326. data/spec/models/post_status_spec.rb +2 -2
  327. data/spec/models/post_version_spec.rb +8 -2
  328. data/spec/models/posting_time_slot_spec.rb +52 -0
  329. data/spec/models/posting_times_best_inner_spec.rb +54 -0
  330. data/spec/models/posting_times_day_intervals_inner_inner_spec.rb +70 -0
  331. data/spec/models/posting_times_days_inner_spec.rb +58 -0
  332. data/spec/models/posting_times_spec.rb +78 -0
  333. data/spec/models/public_workspace_pivot_spec.rb +52 -0
  334. data/spec/models/public_workspace_spec.rb +54 -0
  335. data/spec/models/publish_progress_spec.rb +48 -0
  336. data/spec/models/receipt_input_spec.rb +2 -2
  337. data/spec/models/receipt_spec.rb +2 -2
  338. data/spec/models/receipt_update_input_spec.rb +2 -2
  339. data/spec/models/remove_generic_subscription422_response_spec.rb +36 -0
  340. data/spec/models/remove_user_from_workspace_request_spec.rb +2 -2
  341. data/spec/models/retry_post_account_result_spec.rb +48 -0
  342. data/spec/models/schedule_post_request_spec.rb +26 -2
  343. data/spec/models/schedule_result_spec.rb +8 -2
  344. data/spec/models/subscription_input_spec.rb +2 -2
  345. data/spec/models/subscription_spec.rb +2 -2
  346. data/spec/models/subscription_status_spec.rb +2 -2
  347. data/spec/models/subscription_update_input_spec.rb +2 -2
  348. data/spec/models/tag_input_spec.rb +2 -2
  349. data/spec/models/tag_spec.rb +2 -2
  350. data/spec/models/update_media_request_spec.rb +14 -2
  351. data/spec/models/upload_chunk201_response_spec.rb +36 -0
  352. data/spec/models/user_input_spec.rb +2 -2
  353. data/spec/models/user_spec.rb +8 -2
  354. data/spec/models/user_update_input_spec.rb +2 -2
  355. data/spec/models/workspace_input_spec.rb +2 -2
  356. data/spec/models/workspace_spec.rb +8 -2
  357. data/spec/models/workspace_user_input_spec.rb +2 -2
  358. data/spec/spec_helper.rb +2 -2
  359. metadata +331 -75
  360. data/git_push.sh +0 -57
  361. data/spec/models/initiate_chunked_upload200_response_spec.rb +0 -48
  362. data/spec/models/initiate_remote_upload200_response_one_of_spec.rb +0 -36
  363. data/spec/models/initiate_remote_upload200_response_spec.rb +0 -32
  364. data/spec/models/upload_chunk200_response_spec.rb +0 -36
@@ -0,0 +1,262 @@
1
+ =begin
2
+ #PostBoost API
3
+
4
+ #The PostBoost REST API lets you publish, schedule, and analyze social media posts across 12+ platforms from a single integration. No OAuth apps to maintain — PostBoost handles platform authorization for you. ## Base URL All workspace-scoped endpoints are prefixed with `/{workspaceUuid}`. Panel/admin endpoints are prefixed with `/panel`. ## Plan access Every workspace-scoped endpoint returns `403` when the workspace's plan does not include API access (capability `api`). ## Dates and times Post dates and times (`date`, `time`, `accounts_schedule`) are read in the request's `timezone` when one is given, otherwise in the workspace timezone. ## Authentication All requests require a Bearer token in the `Authorization` header. Generate tokens in your PostBoost dashboard under **Settings → Access Tokens**. ``` Authorization: Bearer YOUR_API_TOKEN ```
5
+
6
+ The version of the OpenAPI document: 1.8.0
7
+ Contact: hi@postboost.co
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.9.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module PostBoost
17
+ class ImageAltTextResponse
18
+ attr_accessor :media_uuid
19
+
20
+ attr_accessor :alt_text
21
+
22
+ attr_accessor :credits_used
23
+
24
+ attr_accessor :credits_remaining
25
+
26
+ # Attribute mapping from ruby-style variable name to JSON key.
27
+ def self.attribute_map
28
+ {
29
+ :'media_uuid' => :'media_uuid',
30
+ :'alt_text' => :'alt_text',
31
+ :'credits_used' => :'credits_used',
32
+ :'credits_remaining' => :'credits_remaining'
33
+ }
34
+ end
35
+
36
+ # Returns all the JSON keys this model knows about
37
+ def self.acceptable_attributes
38
+ attribute_map.values
39
+ end
40
+
41
+ # Attribute type mapping.
42
+ def self.openapi_types
43
+ {
44
+ :'media_uuid' => :'String',
45
+ :'alt_text' => :'String',
46
+ :'credits_used' => :'Integer',
47
+ :'credits_remaining' => :'Integer'
48
+ }
49
+ end
50
+
51
+ # List of attributes with nullable: true
52
+ def self.openapi_nullable
53
+ Set.new([
54
+ ])
55
+ end
56
+
57
+ # Initializes the object
58
+ # @param [Hash] attributes Model attributes in the form of hash
59
+ def initialize(attributes = {})
60
+ if (!attributes.is_a?(Hash))
61
+ fail ArgumentError, "The input argument (attributes) must be a hash in `PostBoost::ImageAltTextResponse` initialize method"
62
+ end
63
+
64
+ # check to see if the attribute exists and convert string to symbol for hash key
65
+ attributes = attributes.each_with_object({}) { |(k, v), h|
66
+ if (!self.class.attribute_map.key?(k.to_sym))
67
+ fail ArgumentError, "`#{k}` is not a valid attribute in `PostBoost::ImageAltTextResponse`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
68
+ end
69
+ h[k.to_sym] = v
70
+ }
71
+
72
+ if attributes.key?(:'media_uuid')
73
+ self.media_uuid = attributes[:'media_uuid']
74
+ else
75
+ self.media_uuid = nil
76
+ end
77
+
78
+ if attributes.key?(:'alt_text')
79
+ self.alt_text = attributes[:'alt_text']
80
+ else
81
+ self.alt_text = nil
82
+ end
83
+
84
+ if attributes.key?(:'credits_used')
85
+ self.credits_used = attributes[:'credits_used']
86
+ else
87
+ self.credits_used = nil
88
+ end
89
+
90
+ if attributes.key?(:'credits_remaining')
91
+ self.credits_remaining = attributes[:'credits_remaining']
92
+ end
93
+ end
94
+
95
+ # Show invalid properties with the reasons. Usually used together with valid?
96
+ # @return Array for valid properties with the reasons
97
+ def list_invalid_properties
98
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
99
+ invalid_properties = Array.new
100
+ if @media_uuid.nil?
101
+ invalid_properties.push('invalid value for "media_uuid", media_uuid cannot be nil.')
102
+ end
103
+
104
+ if @alt_text.nil?
105
+ invalid_properties.push('invalid value for "alt_text", alt_text cannot be nil.')
106
+ end
107
+
108
+ if @credits_used.nil?
109
+ invalid_properties.push('invalid value for "credits_used", credits_used cannot be nil.')
110
+ end
111
+
112
+ invalid_properties
113
+ end
114
+
115
+ # Check to see if the all the properties in the model are valid
116
+ # @return true if the model is valid
117
+ def valid?
118
+ warn '[DEPRECATED] the `valid?` method is obsolete'
119
+ return false if @media_uuid.nil?
120
+ return false if @alt_text.nil?
121
+ return false if @credits_used.nil?
122
+ true
123
+ end
124
+
125
+ # Checks equality by comparing each attribute.
126
+ # @param [Object] Object to be compared
127
+ def ==(o)
128
+ return true if self.equal?(o)
129
+ self.class == o.class &&
130
+ media_uuid == o.media_uuid &&
131
+ alt_text == o.alt_text &&
132
+ credits_used == o.credits_used &&
133
+ credits_remaining == o.credits_remaining
134
+ end
135
+
136
+ # @see the `==` method
137
+ # @param [Object] Object to be compared
138
+ def eql?(o)
139
+ self == o
140
+ end
141
+
142
+ # Calculates hash code according to all attributes.
143
+ # @return [Integer] Hash code
144
+ def hash
145
+ [media_uuid, alt_text, credits_used, credits_remaining].hash
146
+ end
147
+
148
+ # Builds the object from hash
149
+ # @param [Hash] attributes Model attributes in the form of hash
150
+ # @return [Object] Returns the model itself
151
+ def self.build_from_hash(attributes)
152
+ return nil unless attributes.is_a?(Hash)
153
+ attributes = attributes.transform_keys(&:to_sym)
154
+ transformed_hash = {}
155
+ openapi_types.each_pair do |key, type|
156
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
157
+ transformed_hash["#{key}"] = nil
158
+ elsif type =~ /\AArray<(.*)>/i
159
+ # check to ensure the input is an array given that the attribute
160
+ # is documented as an array but the input is not
161
+ if attributes[attribute_map[key]].is_a?(Array)
162
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
163
+ end
164
+ elsif !attributes[attribute_map[key]].nil?
165
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
166
+ end
167
+ end
168
+ new(transformed_hash)
169
+ end
170
+
171
+ # Deserializes the data based on type
172
+ # @param string type Data type
173
+ # @param string value Value to be deserialized
174
+ # @return [Object] Deserialized data
175
+ def self._deserialize(type, value)
176
+ case type.to_sym
177
+ when :Time
178
+ Time.parse(value)
179
+ when :Date
180
+ Date.parse(value)
181
+ when :String
182
+ value.to_s
183
+ when :Integer
184
+ value.to_i
185
+ when :Float
186
+ value.to_f
187
+ when :Boolean
188
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
189
+ true
190
+ else
191
+ false
192
+ end
193
+ when :Object
194
+ # generic object (usually a Hash), return directly
195
+ value
196
+ when /\AArray<(?<inner_type>.+)>\z/
197
+ inner_type = Regexp.last_match[:inner_type]
198
+ value.map { |v| _deserialize(inner_type, v) }
199
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
200
+ k_type = Regexp.last_match[:k_type]
201
+ v_type = Regexp.last_match[:v_type]
202
+ {}.tap do |hash|
203
+ value.each do |k, v|
204
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
205
+ end
206
+ end
207
+ else # model
208
+ # models (e.g. Pet) or oneOf
209
+ klass = PostBoost.const_get(type)
210
+ klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
211
+ end
212
+ end
213
+
214
+ # Returns the string representation of the object
215
+ # @return [String] String presentation of the object
216
+ def to_s
217
+ to_hash.to_s
218
+ end
219
+
220
+ # to_body is an alias to to_hash (backward compatibility)
221
+ # @return [Hash] Returns the object in the form of hash
222
+ def to_body
223
+ to_hash
224
+ end
225
+
226
+ # Returns the object in the form of hash
227
+ # @return [Hash] Returns the object in the form of hash
228
+ def to_hash
229
+ hash = {}
230
+ self.class.attribute_map.each_pair do |attr, param|
231
+ value = self.send(attr)
232
+ if value.nil?
233
+ is_nullable = self.class.openapi_nullable.include?(attr)
234
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
235
+ end
236
+
237
+ hash[param] = _to_hash(value)
238
+ end
239
+ hash
240
+ end
241
+
242
+ # Outputs non-array value in the form of hash
243
+ # For object, use to_hash. Otherwise, just return the value
244
+ # @param [Object] value Any valid value
245
+ # @return [Hash] Returns the value in the form of hash
246
+ def _to_hash(value)
247
+ if value.is_a?(Array)
248
+ value.compact.map { |v| _to_hash(v) }
249
+ elsif value.is_a?(Hash)
250
+ {}.tap do |hash|
251
+ value.each { |k, v| hash[k] = _to_hash(v) }
252
+ end
253
+ elsif value.respond_to? :to_hash
254
+ value.to_hash
255
+ else
256
+ value
257
+ end
258
+ end
259
+
260
+ end
261
+
262
+ end
@@ -0,0 +1,375 @@
1
+ =begin
2
+ #PostBoost API
3
+
4
+ #The PostBoost REST API lets you publish, schedule, and analyze social media posts across 12+ platforms from a single integration. No OAuth apps to maintain — PostBoost handles platform authorization for you. ## Base URL All workspace-scoped endpoints are prefixed with `/{workspaceUuid}`. Panel/admin endpoints are prefixed with `/panel`. ## Plan access Every workspace-scoped endpoint returns `403` when the workspace's plan does not include API access (capability `api`). ## Dates and times Post dates and times (`date`, `time`, `accounts_schedule`) are read in the request's `timezone` when one is given, otherwise in the workspace timezone. ## Authentication All requests require a Bearer token in the `Authorization` header. Generate tokens in your PostBoost dashboard under **Settings → Access Tokens**. ``` Authorization: Bearer YOUR_API_TOKEN ```
5
+
6
+ The version of the OpenAPI document: 1.8.0
7
+ Contact: hi@postboost.co
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.9.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module PostBoost
17
+ class ImageEditInput
18
+ # UUID of the source media item to edit
19
+ attr_accessor :media_uuid
20
+
21
+ # Describe what to change in the image
22
+ attr_accessor :prompt
23
+
24
+ # UUID of a mask image. Transparent areas will be edited.
25
+ attr_accessor :mask_uuid
26
+
27
+ attr_accessor :aspect_ratio
28
+
29
+ attr_accessor :count
30
+
31
+ attr_accessor :quality
32
+
33
+ class EnumAttributeValidator
34
+ attr_reader :datatype
35
+ attr_reader :allowable_values
36
+
37
+ def initialize(datatype, allowable_values)
38
+ @allowable_values = allowable_values.map do |value|
39
+ case datatype.to_s
40
+ when /Integer/i
41
+ value.to_i
42
+ when /Float/i
43
+ value.to_f
44
+ else
45
+ value
46
+ end
47
+ end
48
+ end
49
+
50
+ def valid?(value)
51
+ !value || allowable_values.include?(value)
52
+ end
53
+ end
54
+
55
+ # Attribute mapping from ruby-style variable name to JSON key.
56
+ def self.attribute_map
57
+ {
58
+ :'media_uuid' => :'media_uuid',
59
+ :'prompt' => :'prompt',
60
+ :'mask_uuid' => :'mask_uuid',
61
+ :'aspect_ratio' => :'aspect_ratio',
62
+ :'count' => :'count',
63
+ :'quality' => :'quality'
64
+ }
65
+ end
66
+
67
+ # Returns all the JSON keys this model knows about
68
+ def self.acceptable_attributes
69
+ attribute_map.values
70
+ end
71
+
72
+ # Attribute type mapping.
73
+ def self.openapi_types
74
+ {
75
+ :'media_uuid' => :'String',
76
+ :'prompt' => :'String',
77
+ :'mask_uuid' => :'String',
78
+ :'aspect_ratio' => :'String',
79
+ :'count' => :'Integer',
80
+ :'quality' => :'String'
81
+ }
82
+ end
83
+
84
+ # List of attributes with nullable: true
85
+ def self.openapi_nullable
86
+ Set.new([
87
+ ])
88
+ end
89
+
90
+ # Initializes the object
91
+ # @param [Hash] attributes Model attributes in the form of hash
92
+ def initialize(attributes = {})
93
+ if (!attributes.is_a?(Hash))
94
+ fail ArgumentError, "The input argument (attributes) must be a hash in `PostBoost::ImageEditInput` initialize method"
95
+ end
96
+
97
+ # check to see if the attribute exists and convert string to symbol for hash key
98
+ attributes = attributes.each_with_object({}) { |(k, v), h|
99
+ if (!self.class.attribute_map.key?(k.to_sym))
100
+ fail ArgumentError, "`#{k}` is not a valid attribute in `PostBoost::ImageEditInput`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
101
+ end
102
+ h[k.to_sym] = v
103
+ }
104
+
105
+ if attributes.key?(:'media_uuid')
106
+ self.media_uuid = attributes[:'media_uuid']
107
+ else
108
+ self.media_uuid = nil
109
+ end
110
+
111
+ if attributes.key?(:'prompt')
112
+ self.prompt = attributes[:'prompt']
113
+ else
114
+ self.prompt = nil
115
+ end
116
+
117
+ if attributes.key?(:'mask_uuid')
118
+ self.mask_uuid = attributes[:'mask_uuid']
119
+ end
120
+
121
+ if attributes.key?(:'aspect_ratio')
122
+ self.aspect_ratio = attributes[:'aspect_ratio']
123
+ else
124
+ self.aspect_ratio = '1:1'
125
+ end
126
+
127
+ if attributes.key?(:'count')
128
+ self.count = attributes[:'count']
129
+ else
130
+ self.count = 1
131
+ end
132
+
133
+ if attributes.key?(:'quality')
134
+ self.quality = attributes[:'quality']
135
+ else
136
+ self.quality = 'standard'
137
+ end
138
+ end
139
+
140
+ # Show invalid properties with the reasons. Usually used together with valid?
141
+ # @return Array for valid properties with the reasons
142
+ def list_invalid_properties
143
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
144
+ invalid_properties = Array.new
145
+ if @media_uuid.nil?
146
+ invalid_properties.push('invalid value for "media_uuid", media_uuid cannot be nil.')
147
+ end
148
+
149
+ if @prompt.nil?
150
+ invalid_properties.push('invalid value for "prompt", prompt cannot be nil.')
151
+ end
152
+
153
+ if @prompt.to_s.length > 4000
154
+ invalid_properties.push('invalid value for "prompt", the character length must be smaller than or equal to 4000.')
155
+ end
156
+
157
+ if !@count.nil? && @count > 4
158
+ invalid_properties.push('invalid value for "count", must be smaller than or equal to 4.')
159
+ end
160
+
161
+ if !@count.nil? && @count < 1
162
+ invalid_properties.push('invalid value for "count", must be greater than or equal to 1.')
163
+ end
164
+
165
+ invalid_properties
166
+ end
167
+
168
+ # Check to see if the all the properties in the model are valid
169
+ # @return true if the model is valid
170
+ def valid?
171
+ warn '[DEPRECATED] the `valid?` method is obsolete'
172
+ return false if @media_uuid.nil?
173
+ return false if @prompt.nil?
174
+ return false if @prompt.to_s.length > 4000
175
+ aspect_ratio_validator = EnumAttributeValidator.new('String', ["1:1", "16:9", "9:16", "4:5"])
176
+ return false unless aspect_ratio_validator.valid?(@aspect_ratio)
177
+ return false if !@count.nil? && @count > 4
178
+ return false if !@count.nil? && @count < 1
179
+ quality_validator = EnumAttributeValidator.new('String', ["standard", "hd"])
180
+ return false unless quality_validator.valid?(@quality)
181
+ true
182
+ end
183
+
184
+ # Custom attribute writer method with validation
185
+ # @param [Object] prompt Value to be assigned
186
+ def prompt=(prompt)
187
+ if prompt.nil?
188
+ fail ArgumentError, 'prompt cannot be nil'
189
+ end
190
+
191
+ if prompt.to_s.length > 4000
192
+ fail ArgumentError, 'invalid value for "prompt", the character length must be smaller than or equal to 4000.'
193
+ end
194
+
195
+ @prompt = prompt
196
+ end
197
+
198
+ # Custom attribute writer method checking allowed values (enum).
199
+ # @param [Object] aspect_ratio Object to be assigned
200
+ def aspect_ratio=(aspect_ratio)
201
+ validator = EnumAttributeValidator.new('String', ["1:1", "16:9", "9:16", "4:5"])
202
+ unless validator.valid?(aspect_ratio)
203
+ fail ArgumentError, "invalid value for \"aspect_ratio\", must be one of #{validator.allowable_values}."
204
+ end
205
+ @aspect_ratio = aspect_ratio
206
+ end
207
+
208
+ # Custom attribute writer method with validation
209
+ # @param [Object] count Value to be assigned
210
+ def count=(count)
211
+ if count.nil?
212
+ fail ArgumentError, 'count cannot be nil'
213
+ end
214
+
215
+ if count > 4
216
+ fail ArgumentError, 'invalid value for "count", must be smaller than or equal to 4.'
217
+ end
218
+
219
+ if count < 1
220
+ fail ArgumentError, 'invalid value for "count", must be greater than or equal to 1.'
221
+ end
222
+
223
+ @count = count
224
+ end
225
+
226
+ # Custom attribute writer method checking allowed values (enum).
227
+ # @param [Object] quality Object to be assigned
228
+ def quality=(quality)
229
+ validator = EnumAttributeValidator.new('String', ["standard", "hd"])
230
+ unless validator.valid?(quality)
231
+ fail ArgumentError, "invalid value for \"quality\", must be one of #{validator.allowable_values}."
232
+ end
233
+ @quality = quality
234
+ end
235
+
236
+ # Checks equality by comparing each attribute.
237
+ # @param [Object] Object to be compared
238
+ def ==(o)
239
+ return true if self.equal?(o)
240
+ self.class == o.class &&
241
+ media_uuid == o.media_uuid &&
242
+ prompt == o.prompt &&
243
+ mask_uuid == o.mask_uuid &&
244
+ aspect_ratio == o.aspect_ratio &&
245
+ count == o.count &&
246
+ quality == o.quality
247
+ end
248
+
249
+ # @see the `==` method
250
+ # @param [Object] Object to be compared
251
+ def eql?(o)
252
+ self == o
253
+ end
254
+
255
+ # Calculates hash code according to all attributes.
256
+ # @return [Integer] Hash code
257
+ def hash
258
+ [media_uuid, prompt, mask_uuid, aspect_ratio, count, quality].hash
259
+ end
260
+
261
+ # Builds the object from hash
262
+ # @param [Hash] attributes Model attributes in the form of hash
263
+ # @return [Object] Returns the model itself
264
+ def self.build_from_hash(attributes)
265
+ return nil unless attributes.is_a?(Hash)
266
+ attributes = attributes.transform_keys(&:to_sym)
267
+ transformed_hash = {}
268
+ openapi_types.each_pair do |key, type|
269
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
270
+ transformed_hash["#{key}"] = nil
271
+ elsif type =~ /\AArray<(.*)>/i
272
+ # check to ensure the input is an array given that the attribute
273
+ # is documented as an array but the input is not
274
+ if attributes[attribute_map[key]].is_a?(Array)
275
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
276
+ end
277
+ elsif !attributes[attribute_map[key]].nil?
278
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
279
+ end
280
+ end
281
+ new(transformed_hash)
282
+ end
283
+
284
+ # Deserializes the data based on type
285
+ # @param string type Data type
286
+ # @param string value Value to be deserialized
287
+ # @return [Object] Deserialized data
288
+ def self._deserialize(type, value)
289
+ case type.to_sym
290
+ when :Time
291
+ Time.parse(value)
292
+ when :Date
293
+ Date.parse(value)
294
+ when :String
295
+ value.to_s
296
+ when :Integer
297
+ value.to_i
298
+ when :Float
299
+ value.to_f
300
+ when :Boolean
301
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
302
+ true
303
+ else
304
+ false
305
+ end
306
+ when :Object
307
+ # generic object (usually a Hash), return directly
308
+ value
309
+ when /\AArray<(?<inner_type>.+)>\z/
310
+ inner_type = Regexp.last_match[:inner_type]
311
+ value.map { |v| _deserialize(inner_type, v) }
312
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
313
+ k_type = Regexp.last_match[:k_type]
314
+ v_type = Regexp.last_match[:v_type]
315
+ {}.tap do |hash|
316
+ value.each do |k, v|
317
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
318
+ end
319
+ end
320
+ else # model
321
+ # models (e.g. Pet) or oneOf
322
+ klass = PostBoost.const_get(type)
323
+ klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
324
+ end
325
+ end
326
+
327
+ # Returns the string representation of the object
328
+ # @return [String] String presentation of the object
329
+ def to_s
330
+ to_hash.to_s
331
+ end
332
+
333
+ # to_body is an alias to to_hash (backward compatibility)
334
+ # @return [Hash] Returns the object in the form of hash
335
+ def to_body
336
+ to_hash
337
+ end
338
+
339
+ # Returns the object in the form of hash
340
+ # @return [Hash] Returns the object in the form of hash
341
+ def to_hash
342
+ hash = {}
343
+ self.class.attribute_map.each_pair do |attr, param|
344
+ value = self.send(attr)
345
+ if value.nil?
346
+ is_nullable = self.class.openapi_nullable.include?(attr)
347
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
348
+ end
349
+
350
+ hash[param] = _to_hash(value)
351
+ end
352
+ hash
353
+ end
354
+
355
+ # Outputs non-array value in the form of hash
356
+ # For object, use to_hash. Otherwise, just return the value
357
+ # @param [Object] value Any valid value
358
+ # @return [Hash] Returns the value in the form of hash
359
+ def _to_hash(value)
360
+ if value.is_a?(Array)
361
+ value.compact.map { |v| _to_hash(v) }
362
+ elsif value.is_a?(Hash)
363
+ {}.tap do |hash|
364
+ value.each { |k, v| hash[k] = _to_hash(v) }
365
+ end
366
+ elsif value.respond_to? :to_hash
367
+ value.to_hash
368
+ else
369
+ value
370
+ end
371
+ end
372
+
373
+ end
374
+
375
+ end