x_api_scraper 0.1.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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/lib/crystalline/enum.rbi +17 -0
  3. data/lib/crystalline/metadata_fields.rb +265 -0
  4. data/lib/crystalline/module.rb +188 -0
  5. data/lib/crystalline/types.rb +170 -0
  6. data/lib/crystalline/utils.rb +69 -0
  7. data/lib/crystalline.rb +13 -0
  8. data/lib/x_api_scraper.rb +41 -0
  9. data/lib/xapi_scraper/account.rb +194 -0
  10. data/lib/xapi_scraper/actions.rb +2166 -0
  11. data/lib/xapi_scraper/analysis.rb +230 -0
  12. data/lib/xapi_scraper/articles.rb +410 -0
  13. data/lib/xapi_scraper/client.rb +133 -0
  14. data/lib/xapi_scraper/communities.rb +1352 -0
  15. data/lib/xapi_scraper/dm.rb +990 -0
  16. data/lib/xapi_scraper/engagement.rb +792 -0
  17. data/lib/xapi_scraper/followers.rb +420 -0
  18. data/lib/xapi_scraper/following.rb +230 -0
  19. data/lib/xapi_scraper/lists.rb +1156 -0
  20. data/lib/xapi_scraper/models/callbacks.rb +12 -0
  21. data/lib/xapi_scraper/models/components/accountverifymodel.rb +82 -0
  22. data/lib/xapi_scraper/models/components/accountverifymodel.rbi +38 -0
  23. data/lib/xapi_scraper/models/components/accountverifyresponse.rb +47 -0
  24. data/lib/xapi_scraper/models/components/accountverifyresponse.rbi +26 -0
  25. data/lib/xapi_scraper/models/components/advancedsearchcursorquery.rb +51 -0
  26. data/lib/xapi_scraper/models/components/advancedsearchcursorquery.rbi +26 -0
  27. data/lib/xapi_scraper/models/components/advancedsearchcursorresponse.rb +76 -0
  28. data/lib/xapi_scraper/models/components/advancedsearchcursorresponse.rbi +38 -0
  29. data/lib/xapi_scraper/models/components/articleblock.rb +50 -0
  30. data/lib/xapi_scraper/models/components/articleblock.rbi +26 -0
  31. data/lib/xapi_scraper/models/components/articleblockrange.rb +47 -0
  32. data/lib/xapi_scraper/models/components/articleblockrange.rbi +26 -0
  33. data/lib/xapi_scraper/models/components/blockuserresponse.rb +54 -0
  34. data/lib/xapi_scraper/models/components/blockuserresponse.rbi +26 -0
  35. data/lib/xapi_scraper/models/components/bookmarkbody.rb +43 -0
  36. data/lib/xapi_scraper/models/components/bookmarkbody.rbi +20 -0
  37. data/lib/xapi_scraper/models/components/cashtagsquery.rb +192 -0
  38. data/lib/xapi_scraper/models/components/cashtagsquery.rbi +98 -0
  39. data/lib/xapi_scraper/models/components/cashtagsquery_language.rb +76 -0
  40. data/lib/xapi_scraper/models/components/cashtagsquery_language.rbi +9 -0
  41. data/lib/xapi_scraper/models/components/cashtagsquery_sortby.rb +18 -0
  42. data/lib/xapi_scraper/models/components/cashtagsquery_sortby.rbi +9 -0
  43. data/lib/xapi_scraper/models/components/communitymodel.rb +164 -0
  44. data/lib/xapi_scraper/models/components/communitymodel.rbi +92 -0
  45. data/lib/xapi_scraper/models/components/communitytweetsresponse.rb +47 -0
  46. data/lib/xapi_scraper/models/components/communitytweetsresponse.rbi +26 -0
  47. data/lib/xapi_scraper/models/components/context.rb +25 -0
  48. data/lib/xapi_scraper/models/components/context.rbi +9 -0
  49. data/lib/xapi_scraper/models/components/conversationv3model.rb +57 -0
  50. data/lib/xapi_scraper/models/components/conversationv3model.rbi +32 -0
  51. data/lib/xapi_scraper/models/components/createthreaddata.rb +35 -0
  52. data/lib/xapi_scraper/models/components/createthreaddata.rbi +14 -0
  53. data/lib/xapi_scraper/models/components/createthreadquery.rb +51 -0
  54. data/lib/xapi_scraper/models/components/createthreadquery.rbi +26 -0
  55. data/lib/xapi_scraper/models/components/createthreadresponse.rb +47 -0
  56. data/lib/xapi_scraper/models/components/createthreadresponse.rbi +26 -0
  57. data/lib/xapi_scraper/models/components/createthreadtweetitem.rb +31 -0
  58. data/lib/xapi_scraper/models/components/createthreadtweetitem.rbi +14 -0
  59. data/lib/xapi_scraper/models/components/deletebookmarkquery.rb +35 -0
  60. data/lib/xapi_scraper/models/components/deletebookmarkquery.rbi +14 -0
  61. data/lib/xapi_scraper/models/components/deleteretweetquery.rb +35 -0
  62. data/lib/xapi_scraper/models/components/deleteretweetquery.rbi +14 -0
  63. data/lib/xapi_scraper/models/components/deletetweetquery.rb +51 -0
  64. data/lib/xapi_scraper/models/components/deletetweetquery.rbi +26 -0
  65. data/lib/xapi_scraper/models/components/deletetweetresponse.rb +51 -0
  66. data/lib/xapi_scraper/models/components/deletetweetresponse.rbi +26 -0
  67. data/lib/xapi_scraper/models/components/dmhistoryv3data.rb +54 -0
  68. data/lib/xapi_scraper/models/components/dmhistoryv3data.rbi +26 -0
  69. data/lib/xapi_scraper/models/components/dmstatusmodelv2.rb +122 -0
  70. data/lib/xapi_scraper/models/components/dmstatusmodelv2.rbi +62 -0
  71. data/lib/xapi_scraper/models/components/dmstatusresponsev2.rb +47 -0
  72. data/lib/xapi_scraper/models/components/dmstatusresponsev2.rbi +26 -0
  73. data/lib/xapi_scraper/models/components/followersfollowingv3query.rb +51 -0
  74. data/lib/xapi_scraper/models/components/followersfollowingv3query.rbi +26 -0
  75. data/lib/xapi_scraper/models/components/followuserquery.rb +43 -0
  76. data/lib/xapi_scraper/models/components/followuserquery.rbi +20 -0
  77. data/lib/xapi_scraper/models/components/getalltweetsrepliescursorquery.rb +43 -0
  78. data/lib/xapi_scraper/models/components/getalltweetsrepliescursorquery.rbi +20 -0
  79. data/lib/xapi_scraper/models/components/getalltweetsrepliescursorresponse.rb +76 -0
  80. data/lib/xapi_scraper/models/components/getalltweetsrepliescursorresponse.rbi +38 -0
  81. data/lib/xapi_scraper/models/components/getcommunitymemberscursorquery.rb +43 -0
  82. data/lib/xapi_scraper/models/components/getcommunitymemberscursorquery.rbi +20 -0
  83. data/lib/xapi_scraper/models/components/getcommunitymemberscursorresponse.rb +72 -0
  84. data/lib/xapi_scraper/models/components/getcommunitymemberscursorresponse.rbi +38 -0
  85. data/lib/xapi_scraper/models/components/getcommunityresponse.rb +47 -0
  86. data/lib/xapi_scraper/models/components/getcommunityresponse.rbi +26 -0
  87. data/lib/xapi_scraper/models/components/getcommunitytweetscursorquery.rb +60 -0
  88. data/lib/xapi_scraper/models/components/getcommunitytweetscursorquery.rbi +26 -0
  89. data/lib/xapi_scraper/models/components/getcommunitytweetscursorresponse.rb +72 -0
  90. data/lib/xapi_scraper/models/components/getcommunitytweetscursorresponse.rbi +38 -0
  91. data/lib/xapi_scraper/models/components/getconversationsv3query.rb +62 -0
  92. data/lib/xapi_scraper/models/components/getconversationsv3query.rbi +32 -0
  93. data/lib/xapi_scraper/models/components/getconversationsv3response.rb +47 -0
  94. data/lib/xapi_scraper/models/components/getconversationsv3response.rbi +26 -0
  95. data/lib/xapi_scraper/models/components/getdmhistoryv3query.rb +94 -0
  96. data/lib/xapi_scraper/models/components/getdmhistoryv3query.rbi +50 -0
  97. data/lib/xapi_scraper/models/components/getdmhistoryv3response.rb +47 -0
  98. data/lib/xapi_scraper/models/components/getdmhistoryv3response.rbi +26 -0
  99. data/lib/xapi_scraper/models/components/getdmmediav3data.rb +77 -0
  100. data/lib/xapi_scraper/models/components/getdmmediav3data.rbi +44 -0
  101. data/lib/xapi_scraper/models/components/getdmmediav3query.rb +112 -0
  102. data/lib/xapi_scraper/models/components/getdmmediav3query.rbi +56 -0
  103. data/lib/xapi_scraper/models/components/getdmmediav3response.rb +47 -0
  104. data/lib/xapi_scraper/models/components/getdmmediav3response.rbi +26 -0
  105. data/lib/xapi_scraper/models/components/getlistmemberscursorquery.rb +43 -0
  106. data/lib/xapi_scraper/models/components/getlistmemberscursorquery.rbi +20 -0
  107. data/lib/xapi_scraper/models/components/getlistmemberscursorresponse.rb +72 -0
  108. data/lib/xapi_scraper/models/components/getlistmemberscursorresponse.rbi +38 -0
  109. data/lib/xapi_scraper/models/components/getlisttweetscursorquery.rb +43 -0
  110. data/lib/xapi_scraper/models/components/getlisttweetscursorquery.rbi +20 -0
  111. data/lib/xapi_scraper/models/components/getlisttweetscursorresponse.rb +72 -0
  112. data/lib/xapi_scraper/models/components/getlisttweetscursorresponse.rbi +38 -0
  113. data/lib/xapi_scraper/models/components/getquotescursorquery.rb +63 -0
  114. data/lib/xapi_scraper/models/components/getquotescursorquery.rbi +26 -0
  115. data/lib/xapi_scraper/models/components/getquotescursorquery_sort_by.rb +18 -0
  116. data/lib/xapi_scraper/models/components/getquotescursorquery_sort_by.rbi +9 -0
  117. data/lib/xapi_scraper/models/components/getquotescursorresponse.rb +72 -0
  118. data/lib/xapi_scraper/models/components/getquotescursorresponse.rbi +38 -0
  119. data/lib/xapi_scraper/models/components/getquotesquery.rb +59 -0
  120. data/lib/xapi_scraper/models/components/getquotesquery.rbi +26 -0
  121. data/lib/xapi_scraper/models/components/getquotesquery_sort_by.rb +18 -0
  122. data/lib/xapi_scraper/models/components/getquotesquery_sort_by.rbi +9 -0
  123. data/lib/xapi_scraper/models/components/getquotesresponse.rb +47 -0
  124. data/lib/xapi_scraper/models/components/getquotesresponse.rbi +26 -0
  125. data/lib/xapi_scraper/models/components/getrepliespagequery.rb +51 -0
  126. data/lib/xapi_scraper/models/components/getrepliespagequery.rbi +20 -0
  127. data/lib/xapi_scraper/models/components/getrepliespagequery_sort_by.rb +19 -0
  128. data/lib/xapi_scraper/models/components/getrepliespagequery_sort_by.rbi +9 -0
  129. data/lib/xapi_scraper/models/components/getrepliespageresponse.rb +85 -0
  130. data/lib/xapi_scraper/models/components/getrepliespageresponse.rbi +44 -0
  131. data/lib/xapi_scraper/models/components/getretweeterscursorquery.rb +43 -0
  132. data/lib/xapi_scraper/models/components/getretweeterscursorquery.rbi +20 -0
  133. data/lib/xapi_scraper/models/components/getretweeterscursorresponse.rb +72 -0
  134. data/lib/xapi_scraper/models/components/getretweeterscursorresponse.rbi +38 -0
  135. data/lib/xapi_scraper/models/components/gettweetsbyidresponse.rb +58 -0
  136. data/lib/xapi_scraper/models/components/gettweetsbyidresponse.rbi +26 -0
  137. data/lib/xapi_scraper/models/components/hashtagsquery.rb +192 -0
  138. data/lib/xapi_scraper/models/components/hashtagsquery.rbi +98 -0
  139. data/lib/xapi_scraper/models/components/hashtagsquery_language.rb +76 -0
  140. data/lib/xapi_scraper/models/components/hashtagsquery_language.rbi +9 -0
  141. data/lib/xapi_scraper/models/components/hashtagsquery_sortby.rb +18 -0
  142. data/lib/xapi_scraper/models/components/hashtagsquery_sortby.rbi +9 -0
  143. data/lib/xapi_scraper/models/components/likeactionbody.rb +43 -0
  144. data/lib/xapi_scraper/models/components/likeactionbody.rbi +20 -0
  145. data/lib/xapi_scraper/models/components/listmembersresponse.rb +47 -0
  146. data/lib/xapi_scraper/models/components/listmembersresponse.rbi +26 -0
  147. data/lib/xapi_scraper/models/components/listmodel.rb +77 -0
  148. data/lib/xapi_scraper/models/components/listmodel.rbi +44 -0
  149. data/lib/xapi_scraper/models/components/listsubscribersresponse.rb +47 -0
  150. data/lib/xapi_scraper/models/components/listsubscribersresponse.rbi +26 -0
  151. data/lib/xapi_scraper/models/components/listtweetsresponse.rb +47 -0
  152. data/lib/xapi_scraper/models/components/listtweetsresponse.rbi +26 -0
  153. data/lib/xapi_scraper/models/components/loc.rb +25 -0
  154. data/lib/xapi_scraper/models/components/loc.rbi +9 -0
  155. data/lib/xapi_scraper/models/components/mediamodel.rb +194 -0
  156. data/lib/xapi_scraper/models/components/mediamodel.rbi +110 -0
  157. data/lib/xapi_scraper/models/components/messagemodel.rb +100 -0
  158. data/lib/xapi_scraper/models/components/messagemodel.rbi +56 -0
  159. data/lib/xapi_scraper/models/components/posttweetdata.rb +51 -0
  160. data/lib/xapi_scraper/models/components/posttweetdata.rbi +26 -0
  161. data/lib/xapi_scraper/models/components/posttweetquery.rb +122 -0
  162. data/lib/xapi_scraper/models/components/posttweetquery.rbi +62 -0
  163. data/lib/xapi_scraper/models/components/posttweetresponse.rb +58 -0
  164. data/lib/xapi_scraper/models/components/posttweetresponse.rbi +26 -0
  165. data/lib/xapi_scraper/models/components/posttweetwithoutcookiequery.rb +102 -0
  166. data/lib/xapi_scraper/models/components/posttweetwithoutcookiequery.rbi +50 -0
  167. data/lib/xapi_scraper/models/components/quotetweetquery.rb +112 -0
  168. data/lib/xapi_scraper/models/components/quotetweetquery.rbi +56 -0
  169. data/lib/xapi_scraper/models/components/retweetactionbody.rb +43 -0
  170. data/lib/xapi_scraper/models/components/retweetactionbody.rbi +20 -0
  171. data/lib/xapi_scraper/models/components/searchcommunityquery.rb +43 -0
  172. data/lib/xapi_scraper/models/components/searchcommunityquery.rbi +20 -0
  173. data/lib/xapi_scraper/models/components/searchcommunityresponse.rb +47 -0
  174. data/lib/xapi_scraper/models/components/searchcommunityresponse.rbi +26 -0
  175. data/lib/xapi_scraper/models/components/searchcommunitytweetsquery.rb +51 -0
  176. data/lib/xapi_scraper/models/components/searchcommunitytweetsquery.rbi +26 -0
  177. data/lib/xapi_scraper/models/components/searchlistquery.rb +43 -0
  178. data/lib/xapi_scraper/models/components/searchlistquery.rbi +20 -0
  179. data/lib/xapi_scraper/models/components/searchlistresponse.rb +47 -0
  180. data/lib/xapi_scraper/models/components/searchlistresponse.rbi +26 -0
  181. data/lib/xapi_scraper/models/components/searchresponse.rb +54 -0
  182. data/lib/xapi_scraper/models/components/searchresponse.rbi +26 -0
  183. data/lib/xapi_scraper/models/components/searchuserresponse.rb +47 -0
  184. data/lib/xapi_scraper/models/components/searchuserresponse.rbi +26 -0
  185. data/lib/xapi_scraper/models/components/security.rb +34 -0
  186. data/lib/xapi_scraper/models/components/security.rbi +14 -0
  187. data/lib/xapi_scraper/models/components/senddmresponse.rb +47 -0
  188. data/lib/xapi_scraper/models/components/senddmresponse.rbi +26 -0
  189. data/lib/xapi_scraper/models/components/senddmv3query.rb +90 -0
  190. data/lib/xapi_scraper/models/components/senddmv3query.rbi +50 -0
  191. data/lib/xapi_scraper/models/components/sentimentanalysismodel.rb +43 -0
  192. data/lib/xapi_scraper/models/components/sentimentanalysismodel.rbi +20 -0
  193. data/lib/xapi_scraper/models/components/sentimentanalysisquery.rb +31 -0
  194. data/lib/xapi_scraper/models/components/sentimentanalysisquery.rbi +14 -0
  195. data/lib/xapi_scraper/models/components/sentimentanalysisresponse.rb +47 -0
  196. data/lib/xapi_scraper/models/components/sentimentanalysisresponse.rbi +26 -0
  197. data/lib/xapi_scraper/models/components/standardresponse.rb +47 -0
  198. data/lib/xapi_scraper/models/components/standardresponse.rbi +26 -0
  199. data/lib/xapi_scraper/models/components/streammodel.rb +51 -0
  200. data/lib/xapi_scraper/models/components/streammodel.rbi +26 -0
  201. data/lib/xapi_scraper/models/components/tweet_type.rb +19 -0
  202. data/lib/xapi_scraper/models/components/tweet_type.rbi +9 -0
  203. data/lib/xapi_scraper/models/components/tweetactionresponse.rb +51 -0
  204. data/lib/xapi_scraper/models/components/tweetactionresponse.rbi +26 -0
  205. data/lib/xapi_scraper/models/components/tweetmodel.rb +518 -0
  206. data/lib/xapi_scraper/models/components/tweetmodel.rbi +302 -0
  207. data/lib/xapi_scraper/models/components/tweetthreadbyidbody.rb +53 -0
  208. data/lib/xapi_scraper/models/components/tweetthreadbyidbody.rbi +26 -0
  209. data/lib/xapi_scraper/models/components/twitteraccountbasedstandardresponse.rb +58 -0
  210. data/lib/xapi_scraper/models/components/twitteraccountbasedstandardresponse.rbi +26 -0
  211. data/lib/xapi_scraper/models/components/twitteruseraboutresponse.rb +208 -0
  212. data/lib/xapi_scraper/models/components/twitteruseraboutresponse.rbi +116 -0
  213. data/lib/xapi_scraper/models/components/twitteruseraboutstandardresponse.rb +58 -0
  214. data/lib/xapi_scraper/models/components/twitteruseraboutstandardresponse.rbi +26 -0
  215. data/lib/xapi_scraper/models/components/unfavoritetweetquery.rb +35 -0
  216. data/lib/xapi_scraper/models/components/unfavoritetweetquery.rbi +14 -0
  217. data/lib/xapi_scraper/models/components/unfollowuserquery.rb +43 -0
  218. data/lib/xapi_scraper/models/components/unfollowuserquery.rbi +20 -0
  219. data/lib/xapi_scraper/models/components/unfollowuserresponse.rb +47 -0
  220. data/lib/xapi_scraper/models/components/unfollowuserresponse.rbi +26 -0
  221. data/lib/xapi_scraper/models/components/urlmodel.rb +47 -0
  222. data/lib/xapi_scraper/models/components/urlmodel.rbi +26 -0
  223. data/lib/xapi_scraper/models/components/userinfo.rb +348 -0
  224. data/lib/xapi_scraper/models/components/userinfo.rbi +200 -0
  225. data/lib/xapi_scraper/models/components/usermodel.rb +344 -0
  226. data/lib/xapi_scraper/models/components/usermodel.rbi +200 -0
  227. data/lib/xapi_scraper/models/components/usersdetailsresponse.rb +47 -0
  228. data/lib/xapi_scraper/models/components/usersdetailsresponse.rbi +26 -0
  229. data/lib/xapi_scraper/models/components/usertimelinefillquery.rb +35 -0
  230. data/lib/xapi_scraper/models/components/usertimelinefillquery.rbi +14 -0
  231. data/lib/xapi_scraper/models/components/usertimelinepagequery.rb +43 -0
  232. data/lib/xapi_scraper/models/components/usertimelinepagequery.rbi +20 -0
  233. data/lib/xapi_scraper/models/components/usertimelinepageresponse.rb +112 -0
  234. data/lib/xapi_scraper/models/components/usertimelinepageresponse.rbi +56 -0
  235. data/lib/xapi_scraper/models/components/usertimelineresponse.rb +76 -0
  236. data/lib/xapi_scraper/models/components/usertimelineresponse.rbi +38 -0
  237. data/lib/xapi_scraper/models/components/usertweetitem.rb +225 -0
  238. data/lib/xapi_scraper/models/components/usertweetitem.rbi +122 -0
  239. data/lib/xapi_scraper/models/components/validationerror.rb +67 -0
  240. data/lib/xapi_scraper/models/components/validationerror.rbi +38 -0
  241. data/lib/xapi_scraper/models/components/verifiedfollowersdata.rb +58 -0
  242. data/lib/xapi_scraper/models/components/verifiedfollowersdata.rbi +26 -0
  243. data/lib/xapi_scraper/models/components/verifiedfollowersresponse.rb +47 -0
  244. data/lib/xapi_scraper/models/components/verifiedfollowersresponse.rbi +26 -0
  245. data/lib/xapi_scraper/models/components/xarticlemodel.rb +305 -0
  246. data/lib/xapi_scraper/models/components/xarticlemodel.rbi +170 -0
  247. data/lib/xapi_scraper/models/components/xarticleresponse.rb +47 -0
  248. data/lib/xapi_scraper/models/components/xarticleresponse.rbi +26 -0
  249. data/lib/xapi_scraper/models/components.rb +128 -0
  250. data/lib/xapi_scraper/models/errors/apierror.rb +39 -0
  251. data/lib/xapi_scraper/models/errors/apierror.rbi +27 -0
  252. data/lib/xapi_scraper/models/errors/httpvalidationerror.rb +48 -0
  253. data/lib/xapi_scraper/models/errors/httpvalidationerror.rbi +20 -0
  254. data/lib/xapi_scraper/models/errors.rb +13 -0
  255. data/lib/xapi_scraper/models/operations/accountgetbalance_response.rb +51 -0
  256. data/lib/xapi_scraper/models/operations/accountgetbalance_response.rbi +32 -0
  257. data/lib/xapi_scraper/models/operations/analysissentiment_response.rb +51 -0
  258. data/lib/xapi_scraper/models/operations/analysissentiment_response.rbi +32 -0
  259. data/lib/xapi_scraper/models/operations/articlesfetch_response.rb +51 -0
  260. data/lib/xapi_scraper/models/operations/articlesfetch_response.rbi +32 -0
  261. data/lib/xapi_scraper/models/operations/articlesmarkdown_request.rb +31 -0
  262. data/lib/xapi_scraper/models/operations/articlesmarkdown_request.rbi +14 -0
  263. data/lib/xapi_scraper/models/operations/articlesmarkdown_response.rb +51 -0
  264. data/lib/xapi_scraper/models/operations/articlesmarkdown_response.rbi +32 -0
  265. data/lib/xapi_scraper/models/operations/communitiesget_request.rb +34 -0
  266. data/lib/xapi_scraper/models/operations/communitiesget_request.rbi +14 -0
  267. data/lib/xapi_scraper/models/operations/communitiesget_response.rb +51 -0
  268. data/lib/xapi_scraper/models/operations/communitiesget_response.rbi +32 -0
  269. data/lib/xapi_scraper/models/operations/communitiesmembers_request.rb +42 -0
  270. data/lib/xapi_scraper/models/operations/communitiesmembers_request.rbi +20 -0
  271. data/lib/xapi_scraper/models/operations/communitiesmembers_response.rb +51 -0
  272. data/lib/xapi_scraper/models/operations/communitiesmembers_response.rbi +32 -0
  273. data/lib/xapi_scraper/models/operations/communitiesmemberspage_response.rb +54 -0
  274. data/lib/xapi_scraper/models/operations/communitiesmemberspage_response.rbi +32 -0
  275. data/lib/xapi_scraper/models/operations/communitiessearch_response.rb +51 -0
  276. data/lib/xapi_scraper/models/operations/communitiessearch_response.rbi +32 -0
  277. data/lib/xapi_scraper/models/operations/communitiessearchtweets_response.rb +51 -0
  278. data/lib/xapi_scraper/models/operations/communitiessearchtweets_response.rbi +32 -0
  279. data/lib/xapi_scraper/models/operations/communitiestweets_request.rb +50 -0
  280. data/lib/xapi_scraper/models/operations/communitiestweets_request.rbi +26 -0
  281. data/lib/xapi_scraper/models/operations/communitiestweets_response.rb +51 -0
  282. data/lib/xapi_scraper/models/operations/communitiestweets_response.rbi +32 -0
  283. data/lib/xapi_scraper/models/operations/communitiestweetspage_response.rb +54 -0
  284. data/lib/xapi_scraper/models/operations/communitiestweetspage_response.rbi +32 -0
  285. data/lib/xapi_scraper/models/operations/country.rb +79 -0
  286. data/lib/xapi_scraper/models/operations/country.rbi +9 -0
  287. data/lib/xapi_scraper/models/operations/dmconversations_response.rb +51 -0
  288. data/lib/xapi_scraper/models/operations/dmconversations_response.rbi +32 -0
  289. data/lib/xapi_scraper/models/operations/dmhistory_response.rb +51 -0
  290. data/lib/xapi_scraper/models/operations/dmhistory_response.rbi +32 -0
  291. data/lib/xapi_scraper/models/operations/dmmedia_response.rb +51 -0
  292. data/lib/xapi_scraper/models/operations/dmmedia_response.rbi +32 -0
  293. data/lib/xapi_scraper/models/operations/dmsend_response.rb +51 -0
  294. data/lib/xapi_scraper/models/operations/dmsend_response.rbi +32 -0
  295. data/lib/xapi_scraper/models/operations/dmstatus_response.rb +51 -0
  296. data/lib/xapi_scraper/models/operations/dmstatus_response.rbi +32 -0
  297. data/lib/xapi_scraper/models/operations/listsmembers_request.rb +38 -0
  298. data/lib/xapi_scraper/models/operations/listsmembers_request.rbi +20 -0
  299. data/lib/xapi_scraper/models/operations/listsmembers_response.rb +51 -0
  300. data/lib/xapi_scraper/models/operations/listsmembers_response.rbi +32 -0
  301. data/lib/xapi_scraper/models/operations/listsmemberspage_response.rb +54 -0
  302. data/lib/xapi_scraper/models/operations/listsmemberspage_response.rbi +32 -0
  303. data/lib/xapi_scraper/models/operations/listssearch_response.rb +51 -0
  304. data/lib/xapi_scraper/models/operations/listssearch_response.rbi +32 -0
  305. data/lib/xapi_scraper/models/operations/listssubscribers_request.rb +38 -0
  306. data/lib/xapi_scraper/models/operations/listssubscribers_request.rbi +20 -0
  307. data/lib/xapi_scraper/models/operations/listssubscribers_response.rb +51 -0
  308. data/lib/xapi_scraper/models/operations/listssubscribers_response.rbi +32 -0
  309. data/lib/xapi_scraper/models/operations/liststweets_request.rb +38 -0
  310. data/lib/xapi_scraper/models/operations/liststweets_request.rbi +20 -0
  311. data/lib/xapi_scraper/models/operations/liststweets_response.rb +51 -0
  312. data/lib/xapi_scraper/models/operations/liststweets_response.rbi +32 -0
  313. data/lib/xapi_scraper/models/operations/liststweetspage_response.rb +54 -0
  314. data/lib/xapi_scraper/models/operations/liststweetspage_response.rbi +32 -0
  315. data/lib/xapi_scraper/models/operations/searchadvanced_response.rb +54 -0
  316. data/lib/xapi_scraper/models/operations/searchadvanced_response.rbi +32 -0
  317. data/lib/xapi_scraper/models/operations/searchcashtags_response.rb +51 -0
  318. data/lib/xapi_scraper/models/operations/searchcashtags_response.rbi +32 -0
  319. data/lib/xapi_scraper/models/operations/searchhashtags_response.rb +51 -0
  320. data/lib/xapi_scraper/models/operations/searchhashtags_response.rbi +32 -0
  321. data/lib/xapi_scraper/models/operations/timelinestweetsandreplies_request.rb +35 -0
  322. data/lib/xapi_scraper/models/operations/timelinestweetsandreplies_request.rbi +20 -0
  323. data/lib/xapi_scraper/models/operations/timelinestweetsandreplies_response.rb +51 -0
  324. data/lib/xapi_scraper/models/operations/timelinestweetsandreplies_response.rbi +32 -0
  325. data/lib/xapi_scraper/models/operations/timelinestweetsandrepliespage_response.rb +54 -0
  326. data/lib/xapi_scraper/models/operations/timelinestweetsandrepliespage_response.rbi +32 -0
  327. data/lib/xapi_scraper/models/operations/timelinesuser_request.rb +35 -0
  328. data/lib/xapi_scraper/models/operations/timelinesuser_request.rbi +20 -0
  329. data/lib/xapi_scraper/models/operations/timelinesuser_response.rb +51 -0
  330. data/lib/xapi_scraper/models/operations/timelinesuser_response.rbi +32 -0
  331. data/lib/xapi_scraper/models/operations/timelinesuserpage_request.rb +35 -0
  332. data/lib/xapi_scraper/models/operations/timelinesuserpage_request.rbi +20 -0
  333. data/lib/xapi_scraper/models/operations/timelinesuserpage_response.rb +51 -0
  334. data/lib/xapi_scraper/models/operations/timelinesuserpage_response.rbi +32 -0
  335. data/lib/xapi_scraper/models/operations/trendingbycountry_request.rb +35 -0
  336. data/lib/xapi_scraper/models/operations/trendingbycountry_request.rbi +14 -0
  337. data/lib/xapi_scraper/models/operations/trendingbycountry_response.rb +51 -0
  338. data/lib/xapi_scraper/models/operations/trendingbycountry_response.rbi +32 -0
  339. data/lib/xapi_scraper/models/operations/trendingcontents_request.rb +35 -0
  340. data/lib/xapi_scraper/models/operations/trendingcontents_request.rbi +20 -0
  341. data/lib/xapi_scraper/models/operations/trendingcontents_response.rb +51 -0
  342. data/lib/xapi_scraper/models/operations/trendingcontents_response.rbi +32 -0
  343. data/lib/xapi_scraper/models/operations/trendingcountries_response.rb +51 -0
  344. data/lib/xapi_scraper/models/operations/trendingcountries_response.rbi +32 -0
  345. data/lib/xapi_scraper/models/operations/trendingtopics_response.rb +51 -0
  346. data/lib/xapi_scraper/models/operations/trendingtopics_response.rbi +32 -0
  347. data/lib/xapi_scraper/models/operations/trendingtweets_request.rb +63 -0
  348. data/lib/xapi_scraper/models/operations/trendingtweets_request.rbi +32 -0
  349. data/lib/xapi_scraper/models/operations/trendingtweets_response.rb +51 -0
  350. data/lib/xapi_scraper/models/operations/trendingtweets_response.rbi +32 -0
  351. data/lib/xapi_scraper/models/operations/tweet_type.rb +19 -0
  352. data/lib/xapi_scraper/models/operations/tweet_type.rbi +9 -0
  353. data/lib/xapi_scraper/models/operations/tweetsactionsbookmark_request.rb +35 -0
  354. data/lib/xapi_scraper/models/operations/tweetsactionsbookmark_request.rbi +20 -0
  355. data/lib/xapi_scraper/models/operations/tweetsactionsbookmark_response.rb +51 -0
  356. data/lib/xapi_scraper/models/operations/tweetsactionsbookmark_response.rbi +32 -0
  357. data/lib/xapi_scraper/models/operations/tweetsactionscreate_response.rb +51 -0
  358. data/lib/xapi_scraper/models/operations/tweetsactionscreate_response.rbi +32 -0
  359. data/lib/xapi_scraper/models/operations/tweetsactionscreatethread_response.rb +51 -0
  360. data/lib/xapi_scraper/models/operations/tweetsactionscreatethread_response.rbi +32 -0
  361. data/lib/xapi_scraper/models/operations/tweetsactionscreatewithoutcookie_response.rb +51 -0
  362. data/lib/xapi_scraper/models/operations/tweetsactionscreatewithoutcookie_response.rbi +32 -0
  363. data/lib/xapi_scraper/models/operations/tweetsactionsdeletebatch_response.rb +51 -0
  364. data/lib/xapi_scraper/models/operations/tweetsactionsdeletebatch_response.rbi +32 -0
  365. data/lib/xapi_scraper/models/operations/tweetsactionslike_request.rb +35 -0
  366. data/lib/xapi_scraper/models/operations/tweetsactionslike_request.rbi +20 -0
  367. data/lib/xapi_scraper/models/operations/tweetsactionslike_response.rb +51 -0
  368. data/lib/xapi_scraper/models/operations/tweetsactionslike_response.rbi +32 -0
  369. data/lib/xapi_scraper/models/operations/tweetsactionsquote_response.rb +51 -0
  370. data/lib/xapi_scraper/models/operations/tweetsactionsquote_response.rbi +32 -0
  371. data/lib/xapi_scraper/models/operations/tweetsactionsretweet_request.rb +35 -0
  372. data/lib/xapi_scraper/models/operations/tweetsactionsretweet_request.rbi +20 -0
  373. data/lib/xapi_scraper/models/operations/tweetsactionsretweet_response.rb +51 -0
  374. data/lib/xapi_scraper/models/operations/tweetsactionsretweet_response.rbi +32 -0
  375. data/lib/xapi_scraper/models/operations/tweetsactionsunbookmark_request.rb +35 -0
  376. data/lib/xapi_scraper/models/operations/tweetsactionsunbookmark_request.rbi +20 -0
  377. data/lib/xapi_scraper/models/operations/tweetsactionsunbookmark_response.rb +51 -0
  378. data/lib/xapi_scraper/models/operations/tweetsactionsunbookmark_response.rbi +32 -0
  379. data/lib/xapi_scraper/models/operations/tweetsactionsunlike_request.rb +35 -0
  380. data/lib/xapi_scraper/models/operations/tweetsactionsunlike_request.rbi +20 -0
  381. data/lib/xapi_scraper/models/operations/tweetsactionsunlike_response.rb +51 -0
  382. data/lib/xapi_scraper/models/operations/tweetsactionsunlike_response.rbi +32 -0
  383. data/lib/xapi_scraper/models/operations/tweetsactionsunretweet_request.rb +35 -0
  384. data/lib/xapi_scraper/models/operations/tweetsactionsunretweet_request.rbi +20 -0
  385. data/lib/xapi_scraper/models/operations/tweetsactionsunretweet_response.rb +51 -0
  386. data/lib/xapi_scraper/models/operations/tweetsactionsunretweet_response.rbi +32 -0
  387. data/lib/xapi_scraper/models/operations/tweetsdetail_response.rb +51 -0
  388. data/lib/xapi_scraper/models/operations/tweetsdetail_response.rbi +32 -0
  389. data/lib/xapi_scraper/models/operations/tweetsengagementquotes_response.rb +51 -0
  390. data/lib/xapi_scraper/models/operations/tweetsengagementquotes_response.rbi +32 -0
  391. data/lib/xapi_scraper/models/operations/tweetsengagementquotespage_response.rb +51 -0
  392. data/lib/xapi_scraper/models/operations/tweetsengagementquotespage_response.rbi +32 -0
  393. data/lib/xapi_scraper/models/operations/tweetsengagementretweeters_request.rb +39 -0
  394. data/lib/xapi_scraper/models/operations/tweetsengagementretweeters_request.rbi +20 -0
  395. data/lib/xapi_scraper/models/operations/tweetsengagementretweeters_response.rb +51 -0
  396. data/lib/xapi_scraper/models/operations/tweetsengagementretweeters_response.rbi +32 -0
  397. data/lib/xapi_scraper/models/operations/tweetsengagementretweeterspage_response.rb +51 -0
  398. data/lib/xapi_scraper/models/operations/tweetsengagementretweeterspage_response.rbi +32 -0
  399. data/lib/xapi_scraper/models/operations/tweetslookup_response.rb +51 -0
  400. data/lib/xapi_scraper/models/operations/tweetslookup_response.rbi +32 -0
  401. data/lib/xapi_scraper/models/operations/tweetsrepliespage_request.rb +35 -0
  402. data/lib/xapi_scraper/models/operations/tweetsrepliespage_request.rbi +20 -0
  403. data/lib/xapi_scraper/models/operations/tweetsrepliespage_response.rb +51 -0
  404. data/lib/xapi_scraper/models/operations/tweetsrepliespage_response.rbi +32 -0
  405. data/lib/xapi_scraper/models/operations/tweetssimilar_request.rb +30 -0
  406. data/lib/xapi_scraper/models/operations/tweetssimilar_request.rbi +14 -0
  407. data/lib/xapi_scraper/models/operations/tweetssimilar_response.rb +51 -0
  408. data/lib/xapi_scraper/models/operations/tweetssimilar_response.rbi +32 -0
  409. data/lib/xapi_scraper/models/operations/tweetsthread_response.rb +51 -0
  410. data/lib/xapi_scraper/models/operations/tweetsthread_response.rbi +32 -0
  411. data/lib/xapi_scraper/models/operations/usersfollow_response.rb +51 -0
  412. data/lib/xapi_scraper/models/operations/usersfollow_response.rbi +32 -0
  413. data/lib/xapi_scraper/models/operations/usersfollowerslist_response.rb +51 -0
  414. data/lib/xapi_scraper/models/operations/usersfollowerslist_response.rbi +32 -0
  415. data/lib/xapi_scraper/models/operations/usersfollowersverified_response.rb +51 -0
  416. data/lib/xapi_scraper/models/operations/usersfollowersverified_response.rbi +32 -0
  417. data/lib/xapi_scraper/models/operations/usersfollowinglist_response.rb +51 -0
  418. data/lib/xapi_scraper/models/operations/usersfollowinglist_response.rbi +32 -0
  419. data/lib/xapi_scraper/models/operations/usersgetabout_request.rb +31 -0
  420. data/lib/xapi_scraper/models/operations/usersgetabout_request.rbi +14 -0
  421. data/lib/xapi_scraper/models/operations/usersgetabout_response.rb +54 -0
  422. data/lib/xapi_scraper/models/operations/usersgetabout_response.rbi +32 -0
  423. data/lib/xapi_scraper/models/operations/usersgetaccountbased_response.rb +54 -0
  424. data/lib/xapi_scraper/models/operations/usersgetaccountbased_response.rbi +32 -0
  425. data/lib/xapi_scraper/models/operations/usersgetbyids_response.rb +51 -0
  426. data/lib/xapi_scraper/models/operations/usersgetbyids_response.rbi +32 -0
  427. data/lib/xapi_scraper/models/operations/usersgetbyusernames_response.rb +51 -0
  428. data/lib/xapi_scraper/models/operations/usersgetbyusernames_response.rbi +32 -0
  429. data/lib/xapi_scraper/models/operations/usersgetstatuses_response.rb +51 -0
  430. data/lib/xapi_scraper/models/operations/usersgetstatuses_response.rbi +32 -0
  431. data/lib/xapi_scraper/models/operations/userssearch_request.rb +39 -0
  432. data/lib/xapi_scraper/models/operations/userssearch_request.rbi +20 -0
  433. data/lib/xapi_scraper/models/operations/userssearch_response.rb +51 -0
  434. data/lib/xapi_scraper/models/operations/userssearch_response.rbi +32 -0
  435. data/lib/xapi_scraper/models/operations/usersunfollow_response.rb +51 -0
  436. data/lib/xapi_scraper/models/operations/usersunfollow_response.rbi +32 -0
  437. data/lib/xapi_scraper/models/operations/usersverifyaccount_response.rb +51 -0
  438. data/lib/xapi_scraper/models/operations/usersverifyaccount_response.rbi +32 -0
  439. data/lib/xapi_scraper/models/operations.rb +127 -0
  440. data/lib/xapi_scraper/replies.rb +235 -0
  441. data/lib/xapi_scraper/sdk_hooks/hooks.rb +99 -0
  442. data/lib/xapi_scraper/sdk_hooks/registration.rb +34 -0
  443. data/lib/xapi_scraper/sdk_hooks/types.rb +180 -0
  444. data/lib/xapi_scraper/sdkconfiguration.rb +107 -0
  445. data/lib/xapi_scraper/sdkconfiguration.rbi +83 -0
  446. data/lib/xapi_scraper/search.rb +610 -0
  447. data/lib/xapi_scraper/timelines.rb +805 -0
  448. data/lib/xapi_scraper/trending.rb +888 -0
  449. data/lib/xapi_scraper/tweets.rb +801 -0
  450. data/lib/xapi_scraper/users.rb +1748 -0
  451. data/lib/xapi_scraper/utils/forms.rb +232 -0
  452. data/lib/xapi_scraper/utils/headers.rb +82 -0
  453. data/lib/xapi_scraper/utils/query_params.rb +167 -0
  454. data/lib/xapi_scraper/utils/request_bodies.rb +79 -0
  455. data/lib/xapi_scraper/utils/retries.rb +139 -0
  456. data/lib/xapi_scraper/utils/security.rb +158 -0
  457. data/lib/xapi_scraper/utils/url.rb +124 -0
  458. data/lib/xapi_scraper/utils/utils.rb +241 -0
  459. metadata +720 -0
@@ -0,0 +1,232 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+ require "cgi"
7
+ require "date"
8
+ require "base64"
9
+ require "sorbet-runtime"
10
+
11
+ module XapiScraper
12
+ module Utils
13
+ extend T::Sig
14
+
15
+ sig do
16
+ params(
17
+ field_name: String,
18
+ explode: T::Boolean,
19
+ obj: Object,
20
+ delimiter: String,
21
+ get_field_name_lambda: T.proc.params(obj_field: ::Crystalline::MetadataFields::Field).returns(String)
22
+ )
23
+ .returns(T::Hash[String, T::Array[String]])
24
+ end
25
+ def self._populate_form(field_name, explode, obj, delimiter, &get_field_name_lambda)
26
+ params = {}
27
+
28
+ return params if obj.nil?
29
+
30
+ if obj.respond_to?(:fields)
31
+ items = []
32
+ T.unsafe(obj).fields.each do |obj_field|
33
+ obj_field_name = get_field_name_lambda.call(obj_field)
34
+ next if obj_field_name == ""
35
+
36
+ val = obj.send(obj_field.name.to_sym)
37
+ next if val.nil?
38
+
39
+ if explode
40
+ params[obj_field_name] = [val_to_string(val)]
41
+ else
42
+ items.append("#{obj_field_name}#{delimiter}#{val_to_string(val)}")
43
+ end
44
+ end
45
+
46
+ params[field_name] = [items.join(delimiter)] if !items.empty?
47
+ elsif obj.is_a?(Hash)
48
+ items = []
49
+ obj.each do |key, value|
50
+ next if value.nil?
51
+
52
+ if explode
53
+ params[key] = val_to_string(value)
54
+ else
55
+ items.append("#{key}#{delimiter}#{val_to_string(value)}")
56
+ end
57
+ end
58
+
59
+ params[field_name] = [items.join(delimiter)] if !items.empty?
60
+
61
+ elsif obj.is_a?(Array)
62
+ items = []
63
+ obj.each do |value|
64
+ next if value.nil?
65
+
66
+ if explode
67
+ params[field_name] = [] if !params.key?(field_name)
68
+
69
+ params[field_name].append(val_to_string(value))
70
+ else
71
+ items.append(val_to_string(value))
72
+ end
73
+ end
74
+
75
+ params[field_name] = items.map(&:to_s).join(delimiter) if !items.empty?
76
+
77
+ else
78
+ params[field_name] = val_to_string(obj)
79
+ end
80
+
81
+ params
82
+ end
83
+
84
+ sig {
85
+ params(media_type: String, request: Object).returns(
86
+ [String, Object, T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]]]
87
+ )
88
+ }
89
+ def self.serialize_multipart_form(media_type, request)
90
+ form = []
91
+ T.unsafe(request).fields.each do |field|
92
+ val = request.send(field.name)
93
+ next if val.nil?
94
+
95
+ field_metadata = field.metadata[:multipart_form]
96
+ next if field_metadata.nil?
97
+
98
+ if field_metadata[:file] == true
99
+ field_name = field_metadata[:field_name]
100
+
101
+ # Handle arrays of files
102
+ if val.is_a?(Array)
103
+ val.each do |file_obj|
104
+ file_name = T.let("", String)
105
+ content = nil
106
+
107
+ T.must(file_obj).fields.each do |file_field|
108
+ file_metadata = file_field.metadata[:multipart_form]
109
+ next if file_metadata.nil?
110
+
111
+ if file_metadata[:content] == true
112
+ content = T.let(file_obj.send(file_field.name), String)
113
+ else
114
+ file_name = T.let(file_obj.send(file_field.name), String)
115
+ end
116
+ end
117
+
118
+ if T.unsafe(file_name) == "" || T.unsafe(content).nil?
119
+ raise StandardError, "invalid multipart/form-data file"
120
+ end
121
+
122
+ form.append([field_name, [file_name, content]])
123
+ end
124
+ else
125
+ # Handle single file
126
+ file_name = T.let("", String)
127
+ content = nil
128
+
129
+ T.must(val).fields.each do |file_field|
130
+ file_metadata = file_field.metadata[:multipart_form]
131
+ next if file_metadata.nil?
132
+
133
+ if file_metadata[:content] == true
134
+ content = T.let(val.send(file_field.name), String)
135
+ else
136
+ file_name = T.let(val.send(file_field.name), String)
137
+ end
138
+ end
139
+
140
+ if T.unsafe(file_name) == "" || T.unsafe(content).nil?
141
+ raise StandardError, "invalid multipart/form-data file"
142
+ end
143
+
144
+ form.append([field_name, [file_name, content]])
145
+ end
146
+ elsif field_metadata[:json] == true
147
+ to_append = [
148
+ field_metadata.fetch(:field_name, field.name),
149
+ [
150
+ nil,
151
+ ::Crystalline.to_json(val),
152
+ "application/json"
153
+ ]
154
+ ]
155
+ form.append(to_append)
156
+ else
157
+ field_name = field_metadata.fetch(
158
+ :field_name,
159
+ field.name
160
+ )
161
+ if val.is_a?(Array)
162
+ val.each do |value|
163
+ next if value.nil?
164
+
165
+ form.append(
166
+ [field_name, [nil, val_to_string(value)]]
167
+ )
168
+ end
169
+ else
170
+ form.append([field_name, [nil, val_to_string(val)]])
171
+ end
172
+ end
173
+ end
174
+
175
+ [media_type, nil, form]
176
+ end
177
+
178
+ sig do
179
+ params(data: T.any(Object, T::Hash[String, String]))
180
+ .returns(T::Hash[T.any(String, Symbol), Object])
181
+ end
182
+ def self.serialize_form_data(data)
183
+ get_form_field_name = lambda do |obj_field|
184
+ obj_param_metadata = obj_field.metadata[:form]
185
+
186
+ return T.let({}, T::Hash[T.any(String, Symbol), Object]) if obj_param_metadata.nil?
187
+
188
+ return obj_param_metadata.fetch(:field_name, obj_field.name)
189
+ end
190
+
191
+ form = T.let({}, T::Hash[T.any(String, Symbol), Object])
192
+ if data.respond_to?(:fields)
193
+ T.unsafe(data).fields.each do |field|
194
+ val = data.send(field.name)
195
+ next if val.nil?
196
+
197
+ metadata = field.metadata[:form]
198
+
199
+ next if metadata.nil?
200
+
201
+ field_name = metadata.fetch(:field_name, field.name)
202
+
203
+ if metadata[:json]
204
+ form[field_name] = ::Crystalline.to_json(val)
205
+ else
206
+ if metadata.fetch(:style, "form") == "form"
207
+ form = form.merge(
208
+ _populate_form(
209
+ field_name,
210
+ metadata.fetch(:explode, true),
211
+ val,
212
+ ",",
213
+ &get_form_field_name
214
+ )
215
+ )
216
+ else
217
+ raise StandardError, "Invalid form style for field #{field.name}"
218
+ end
219
+ end
220
+ end
221
+ elsif data.is_a?(Hash)
222
+ data.each do |key, value|
223
+ form[key] = [val_to_string(value)]
224
+ end
225
+ else
226
+ raise StandardError, "Invalid request body type #{data.class}"
227
+ end
228
+
229
+ form
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,82 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+ require "cgi"
7
+ require "date"
8
+ require "base64"
9
+ require "sorbet-runtime"
10
+
11
+ module XapiScraper
12
+ module Utils
13
+ extend T::Sig
14
+
15
+ sig {
16
+ params(headers_params: Object, gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])).returns(
17
+ T::Hash[Symbol, String]
18
+ )
19
+ }
20
+ def self.get_headers(headers_params, gbls = nil)
21
+ return {} if headers_params.nil?
22
+
23
+ headers = {}
24
+ T.unsafe(headers_params).fields.each do |f|
25
+ metadata = f.metadata[:header]
26
+ next if metadata.nil?
27
+
28
+ value = _populate_from_globals(f.name, headers_params&.send(f.name), "header", gbls)
29
+ value = _serialize_header(metadata.fetch(:explode, false), value)
30
+ headers[metadata.fetch(:field_name, f.name)] = value if !T.must(value).empty?
31
+ end
32
+
33
+ headers
34
+ end
35
+
36
+ sig { params(explode: T::Boolean, obj: Object).returns(T.nilable(String)) }
37
+ def self._serialize_header(explode, obj)
38
+ return "" if obj.nil?
39
+
40
+ if obj.respond_to?(:fields)
41
+ items = []
42
+ T.unsafe(obj).fields.each do |obj_field|
43
+ obj_param_metadata = obj_field.metadata[:header]
44
+ next if obj_param_metadata.nil?
45
+
46
+ obj_field_name = obj_param_metadata.fetch(:field_name, obj_field.name)
47
+ next if obj_field_name == ""
48
+
49
+ val = obj.send(obj_field.name)
50
+ next if val.nil?
51
+
52
+ if explode
53
+ items.append("#{obj_field_name}=#{val_to_string(val)}")
54
+ else
55
+ items.append(obj_field_name)
56
+ items.append(val_to_string(val))
57
+ end
58
+ end
59
+
60
+ items.join(",") if !items.empty?
61
+ elsif obj.is_a?(Hash)
62
+ items = []
63
+ obj.each do |key, value|
64
+ next if value.nil?
65
+
66
+ if explode
67
+ items.append("#{key}=#{val_to_string(value)}")
68
+ else
69
+ items.append(key)
70
+ items.append(val_to_string(value))
71
+ end
72
+ end
73
+
74
+ items.join(",") if !items.empty?
75
+ elsif obj.is_a?(Array)
76
+ items = obj.filter { |v| !v.nil? }.map { |v| val_to_string(v) }.join(",")
77
+ else
78
+ val_to_string(obj)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,167 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+ require "date"
7
+ require "base64"
8
+ require "sorbet-runtime"
9
+
10
+ module XapiScraper
11
+ module Utils
12
+ extend T::Sig
13
+
14
+ sig {
15
+ params(
16
+ clazz: Object,
17
+ query_params: Object,
18
+ url_override: T.nilable(::String),
19
+ gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])
20
+ )
21
+ .returns(T::Hash[T.any(String, Symbol), T::Array[String]])
22
+ }
23
+ def self.get_query_params(clazz, query_params, url_override = nil, gbls = nil)
24
+ parsed_params = T.let({}, T::Hash[T.any(String, Symbol), T::Array[String]])
25
+ if !url_override.nil?
26
+ parsed_url = URI.parse(url_override)
27
+ URI.decode_www_form(parsed_url.query.to_s).each do |key, value|
28
+ parsed_params[key] ||= []
29
+ T.must(parsed_params[key]) << value
30
+ end
31
+ end
32
+
33
+ params = T.let({}, T::Hash[T.any(String, Symbol), T::Array[String]])
34
+ T.unsafe(clazz).fields.each do |f|
35
+ request_metadata = f.metadata[:request]
36
+ next if !request_metadata.nil?
37
+
38
+ metadata = f.metadata[:query_param]
39
+ next if metadata.nil?
40
+
41
+ param_name = f.name
42
+ value = query_params&.send(param_name.to_sym)
43
+ value = _populate_from_globals(param_name, value, "queryParam", gbls)
44
+
45
+ f_name = metadata[:field_name]
46
+ serialization = metadata.fetch(:serialization, "")
47
+ if serialization != ""
48
+ params = params.merge(
49
+ _get_serialized_params(
50
+ metadata,
51
+ f_name,
52
+ value
53
+ )
54
+ )
55
+ else
56
+ style = metadata.fetch(:style, "form")
57
+ case style
58
+ when "deepObject"
59
+ params = params.merge(
60
+ _get_deep_object_query_params(
61
+ metadata,
62
+ f_name,
63
+ value
64
+ )
65
+ )
66
+ when "form"
67
+ params = params.merge(
68
+ _get_delimited_query_params(
69
+ metadata,
70
+ f_name,
71
+ value,
72
+ ","
73
+ )
74
+ )
75
+ when "pipeDelimited"
76
+ params = params.merge(
77
+ _get_delimited_query_params(
78
+ metadata,
79
+ f_name,
80
+ value,
81
+ "|"
82
+ )
83
+ )
84
+ else
85
+ raise StandardError, "not yet implemented"
86
+ end
87
+ end
88
+ end
89
+
90
+ params.merge(parsed_params)
91
+ end
92
+
93
+ sig do
94
+ params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object)
95
+ .returns(T::Hash[T.any(String, Symbol), T::Array[String]])
96
+ end
97
+ def self._get_deep_object_query_params(metadata, field_name, obj)
98
+ params = T.let({}, T::Hash[T.any(String, Symbol), T::Array[String]])
99
+
100
+ return params if obj.nil?
101
+
102
+ if obj.respond_to?(:fields)
103
+ T.unsafe(obj).fields.each do |obj_field|
104
+ obj_param_metadata = obj_field.metadata[:query_param]
105
+ next if obj_param_metadata.nil?
106
+
107
+ val = obj.send(obj_field.name)
108
+ next if val.nil?
109
+
110
+ key = "#{metadata.fetch(:field_name, field_name)}[#{obj_param_metadata.fetch(:field_name, obj_field.name)}]"
111
+ if val.is_a?(Array)
112
+ val.each do |v|
113
+ next if v.nil?
114
+
115
+ params[key] = [] if !params.include?(key)
116
+
117
+ T.must(params[key]) << val_to_string(v)
118
+ end
119
+ else
120
+ params[key] = [val_to_string(val)]
121
+ end
122
+ end
123
+ elsif obj.is_a?(Hash)
124
+ obj.each do |key, value|
125
+ next if value.nil?
126
+
127
+ param_key = "#{metadata.fetch(:field_name, field_name)}[#{key}]"
128
+ if value.is_a?(Array)
129
+ value.each do |val|
130
+ next if val.nil?
131
+
132
+ params[param_key] = [] if !params.include?(param_key)
133
+
134
+ T.must(params[param_key]).append(val_to_string(val))
135
+ end
136
+ else
137
+ params[param_key] = [val_to_string(value)]
138
+ end
139
+ end
140
+ end
141
+
142
+ params
143
+ end
144
+
145
+ sig do
146
+ params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object, delimiter: String)
147
+ .returns(T::Hash[T.any(String, Symbol), T::Array[String]])
148
+ end
149
+ def self._get_delimited_query_params(metadata, field_name, obj, delimiter)
150
+ get_query_param_field_name = lambda do |obj_field|
151
+ obj_param_metadata = obj_field.metadata[:query_param]
152
+
153
+ return {} if obj_param_metadata.nil?
154
+
155
+ return obj_param_metadata.fetch(:field_name, obj_field.name)
156
+ end
157
+
158
+ _populate_form(
159
+ field_name,
160
+ T.cast(metadata.fetch(:explode, true), T::Boolean),
161
+ obj,
162
+ delimiter,
163
+ &get_query_param_field_name
164
+ )
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,79 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+ require "cgi"
7
+ require "date"
8
+ require "base64"
9
+ require "sorbet-runtime"
10
+
11
+ module XapiScraper
12
+ module Utils
13
+ extend T::Sig
14
+
15
+ SERIALIZATION_METHOD_TO_CONTENT_TYPE = {
16
+ 'json': "application/json",
17
+ 'form': "application/x-www-form-urlencoded",
18
+ 'multipart': "multipart/form-data",
19
+ 'raw': "application/octet-stream",
20
+ 'string': "text/plain"
21
+ }.freeze
22
+
23
+ sig do
24
+ params(
25
+ request: Object,
26
+ nullable: T::Boolean,
27
+ optional: T::Boolean,
28
+ request_field_name: Symbol,
29
+ serialization_method: Symbol
30
+ )
31
+ .returns([String, Object, T.nilable(T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]])])
32
+ end
33
+ def self.serialize_request_body(request, nullable, optional, request_field_name, serialization_method)
34
+ return ["", nil, nil] if request.nil? && !nullable && optional
35
+
36
+ if !request.respond_to?(:fields) || !request.respond_to?(request_field_name)
37
+ return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request)
38
+ end
39
+
40
+ request_metadata = T.let(nil, T.nilable(T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]]))
41
+ T.unsafe(request).fields.each do |f|
42
+ if f.name == request_field_name
43
+ request_metadata = f.metadata[:request]
44
+ break
45
+ end
46
+ end
47
+
48
+ if request_metadata.nil?
49
+ # Field name collision: model has a field matching request_field_name but without :request metadata.
50
+ # Serialize the entire object as the request body.
51
+ return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request)
52
+ end
53
+
54
+ request_val = request.send(request_field_name)
55
+ return ["", nil, nil] if request_val.nil?
56
+
57
+ serialize_content_type(
58
+ request_metadata.fetch(:media_type, "application/octet-stream"),
59
+ request_val
60
+ )
61
+ end
62
+
63
+ sig do
64
+ params(media_type: String, request: Object)
65
+ .returns([String, Object, T.nilable(T::Array[T::Array[T.any(T::Array[T.nilable(String)], String)]])])
66
+ end
67
+ def self.serialize_content_type(media_type, request)
68
+ if media_type.match("^(application|text)\\/([^+]+\\+)*json.*")
69
+ return media_type, ::Crystalline.to_json(request), nil
70
+ end
71
+
72
+ return serialize_multipart_form(media_type, request) if media_type.match("^multipart\\/.*")
73
+ return media_type, serialize_form_data(request), nil if media_type.match("^application\\/x-www-form-urlencoded.*")
74
+ return media_type, request, nil if request.is_a?(String) || request.is_a?(Array)
75
+
76
+ raise StandardError, "invalid request body type #{request.class} for mediaType #{media_type}"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,139 @@
1
+ # Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
2
+
3
+ # typed: true
4
+ # frozen_string_literal: true
5
+
6
+ require "faraday/retry"
7
+ require "time"
8
+ require "sorbet-runtime"
9
+
10
+ module XapiScraper
11
+ module Utils
12
+ class BackoffStrategy
13
+ extend T::Sig
14
+
15
+ sig { returns(T.nilable(::Float)) }
16
+ attr_accessor :exponent
17
+
18
+ sig { returns(T.nilable(::Integer)) }
19
+ attr_accessor :initial_interval
20
+
21
+ sig { returns(T.nilable(::Integer)) }
22
+ attr_accessor :max_elapsed_time
23
+
24
+ sig { returns(T.nilable(::Integer)) }
25
+ attr_accessor :max_interval
26
+
27
+ sig do
28
+ params(
29
+ exponent: T.nilable(::Float),
30
+ initial_interval: T.nilable(::Integer),
31
+ max_elapsed_time: T.nilable(::Integer),
32
+ max_interval: T.nilable(::Integer)
33
+ )
34
+ .void
35
+ end
36
+ def initialize(exponent: nil, initial_interval: nil, max_elapsed_time: nil, max_interval: nil)
37
+ @exponent = T.let(exponent, T.nilable(::Float))
38
+ @initial_interval = T.let(initial_interval, T.nilable(::Integer))
39
+ @max_elapsed_time = T.let(max_elapsed_time, T.nilable(::Integer))
40
+ @max_interval = T.let(max_interval, T.nilable(::Integer))
41
+ end
42
+ end
43
+
44
+ class RetryConfig
45
+ extend T::Sig
46
+
47
+ sig { returns(T.nilable(BackoffStrategy)) }
48
+ attr_accessor :backoff
49
+
50
+ sig { returns(T.nilable(T::Boolean)) }
51
+ attr_accessor :retry_connection_errors
52
+
53
+ sig { returns(T.nilable(::String)) }
54
+ attr_accessor :strategy
55
+
56
+ sig do
57
+ params(
58
+ backoff: T.nilable(BackoffStrategy),
59
+ retry_connection_errors: T.nilable(T::Boolean),
60
+ strategy: T.nilable(::String)
61
+ )
62
+ .void
63
+ end
64
+ def initialize(backoff: nil, retry_connection_errors: nil, strategy: nil)
65
+ @backoff = T.let(backoff, T.nilable(BackoffStrategy))
66
+ @retry_connection_errors = T.let(retry_connection_errors, T.nilable(T::Boolean))
67
+ @strategy = T.let(strategy, T.nilable(::String))
68
+ end
69
+
70
+ sig { params(initial_time: ::Time).returns(::Hash) }
71
+ def to_faraday_retry_options(initial_time:)
72
+ retry_options = {
73
+ # must overwrite default max of 2 retries and it must be positive
74
+ max: 1_000_000_000,
75
+ # ensure all HTTP methods are retried, especially via retry_if
76
+ methods: []
77
+ }
78
+
79
+ if @retry_connection_errors
80
+ retry_options[:exceptions] = Faraday::Retry::Middleware::DEFAULT_EXCEPTIONS + [Faraday::ConnectionFailed]
81
+ end
82
+
83
+ if @strategy == "backoff" && @backoff
84
+ retry_options[:backoff_factor] = @backoff.exponent unless @backoff.exponent.nil?
85
+ retry_options[:interval] = (@backoff.initial_interval.to_f / 1000) unless @backoff.initial_interval.nil?
86
+ retry_options[:max_interval] = (@backoff.max_interval.to_f / 1000) unless @backoff.max_interval.nil?
87
+
88
+ unless @backoff.max_elapsed_time.nil?
89
+ stop_time = initial_time + (@backoff.max_elapsed_time.to_f / 1000)
90
+ retry_options[:retry_if] = -> (_env, _exc) { Time.now < stop_time }
91
+ end
92
+
93
+ end
94
+
95
+ retry_options
96
+ end
97
+ end
98
+
99
+ class RetryMiddleware < Faraday::Retry::Middleware
100
+ extend T::Sig
101
+
102
+ sig { params(retries: T.untyped, env: T.untyped).returns(T.untyped) }
103
+ def calculate_sleep_amount(retries, env)
104
+ retry_after = [calculate_retry_after(env), calculate_rate_limit_reset(env)].compact.max
105
+ retry_interval = calculate_retry_interval(retries)
106
+ return retry_interval if retry_after.nil?
107
+
108
+ # unlike the stock middleware, cap server delays at max_interval rather
109
+ # than abandoning the retry
110
+ [[retry_after, @options.max_interval].min, retry_interval].max
111
+ end
112
+
113
+ private
114
+
115
+ sig { params(env: T.untyped).returns(T.untyped) }
116
+ def calculate_retry_after(env)
117
+ response_headers = env[:response_headers]
118
+ return unless response_headers
119
+
120
+ ms_value = response_headers["retry-after-ms"]
121
+ return ms_value.to_f / 1000 if ms_value&.match?(/\A\s*\d+\s*\z/)
122
+
123
+ value = response_headers["retry-after"]
124
+ return if value.nil? || value.strip.empty?
125
+ return value.to_f if value.match?(/\A\s*\d+\s*\z/)
126
+
127
+ begin
128
+ Time.httpdate(value) - Time.now
129
+ rescue ArgumentError
130
+ begin
131
+ Time.iso8601(value) - Time.now
132
+ rescue ArgumentError
133
+ nil
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end