flowtask 5.8.4__cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

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 (470) hide show
  1. flowtask/__init__.py +93 -0
  2. flowtask/__main__.py +38 -0
  3. flowtask/bots/__init__.py +6 -0
  4. flowtask/bots/check.py +93 -0
  5. flowtask/bots/codebot.py +51 -0
  6. flowtask/components/ASPX.py +148 -0
  7. flowtask/components/AddDataset.py +352 -0
  8. flowtask/components/Amazon.py +523 -0
  9. flowtask/components/AutoTask.py +314 -0
  10. flowtask/components/Azure.py +80 -0
  11. flowtask/components/AzureUsers.py +106 -0
  12. flowtask/components/BaseAction.py +91 -0
  13. flowtask/components/BaseLoop.py +198 -0
  14. flowtask/components/BestBuy.py +800 -0
  15. flowtask/components/CSVToGCS.py +120 -0
  16. flowtask/components/CompanyScraper/__init__.py +1 -0
  17. flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
  18. flowtask/components/CompanyScraper/parsers/base.py +102 -0
  19. flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
  20. flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
  21. flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
  22. flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
  23. flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
  24. flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
  25. flowtask/components/CompanyScraper/scrapper.py +1054 -0
  26. flowtask/components/CopyTo.py +177 -0
  27. flowtask/components/CopyToBigQuery.py +243 -0
  28. flowtask/components/CopyToMongoDB.py +291 -0
  29. flowtask/components/CopyToPg.py +609 -0
  30. flowtask/components/CopyToRethink.py +207 -0
  31. flowtask/components/CreateGCSBucket.py +102 -0
  32. flowtask/components/CreateReport/CreateReport.py +228 -0
  33. flowtask/components/CreateReport/__init__.py +9 -0
  34. flowtask/components/CreateReport/charts/__init__.py +15 -0
  35. flowtask/components/CreateReport/charts/bar.py +51 -0
  36. flowtask/components/CreateReport/charts/base.py +66 -0
  37. flowtask/components/CreateReport/charts/pie.py +64 -0
  38. flowtask/components/CreateReport/utils.py +9 -0
  39. flowtask/components/CustomerSatisfaction.py +196 -0
  40. flowtask/components/DataInput.py +200 -0
  41. flowtask/components/DateList.py +255 -0
  42. flowtask/components/DbClient.py +163 -0
  43. flowtask/components/DialPad.py +146 -0
  44. flowtask/components/DocumentDBQuery.py +200 -0
  45. flowtask/components/DownloadFrom.py +371 -0
  46. flowtask/components/DownloadFromD2L.py +113 -0
  47. flowtask/components/DownloadFromFTP.py +181 -0
  48. flowtask/components/DownloadFromIMAP.py +315 -0
  49. flowtask/components/DownloadFromS3.py +198 -0
  50. flowtask/components/DownloadFromSFTP.py +265 -0
  51. flowtask/components/DownloadFromSharepoint.py +110 -0
  52. flowtask/components/DownloadFromSmartSheet.py +114 -0
  53. flowtask/components/DownloadS3File.py +229 -0
  54. flowtask/components/Dummy.py +59 -0
  55. flowtask/components/DuplicatePhoto.py +411 -0
  56. flowtask/components/EmployeeEvaluation.py +237 -0
  57. flowtask/components/ExecuteSQL.py +323 -0
  58. flowtask/components/ExtractHTML.py +178 -0
  59. flowtask/components/FileBase.py +178 -0
  60. flowtask/components/FileCopy.py +181 -0
  61. flowtask/components/FileDelete.py +82 -0
  62. flowtask/components/FileExists.py +146 -0
  63. flowtask/components/FileIteratorDelete.py +112 -0
  64. flowtask/components/FileList.py +194 -0
  65. flowtask/components/FileOpen.py +75 -0
  66. flowtask/components/FileRead.py +120 -0
  67. flowtask/components/FileRename.py +106 -0
  68. flowtask/components/FilterIf.py +284 -0
  69. flowtask/components/FilterRows/FilterRows.py +200 -0
  70. flowtask/components/FilterRows/__init__.py +10 -0
  71. flowtask/components/FilterRows/functions.py +4 -0
  72. flowtask/components/GCSToBigQuery.py +103 -0
  73. flowtask/components/GoogleA4.py +150 -0
  74. flowtask/components/GoogleGeoCoding.py +344 -0
  75. flowtask/components/GooglePlaces.py +315 -0
  76. flowtask/components/GoogleSearch.py +539 -0
  77. flowtask/components/HTTPClient.py +268 -0
  78. flowtask/components/ICIMS.py +146 -0
  79. flowtask/components/IF.py +179 -0
  80. flowtask/components/IcimsFolderCopy.py +173 -0
  81. flowtask/components/ImageFeatures/__init__.py +5 -0
  82. flowtask/components/ImageFeatures/process.py +233 -0
  83. flowtask/components/IteratorBase.py +251 -0
  84. flowtask/components/LangchainLoader/__init__.py +5 -0
  85. flowtask/components/LangchainLoader/loader.py +194 -0
  86. flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
  87. flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
  88. flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
  89. flowtask/components/LangchainLoader/loaders/docx.py +91 -0
  90. flowtask/components/LangchainLoader/loaders/html.py +119 -0
  91. flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
  92. flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
  93. flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
  94. flowtask/components/LangchainLoader/loaders/qa.py +67 -0
  95. flowtask/components/LangchainLoader/loaders/txt.py +55 -0
  96. flowtask/components/LeadIQ.py +650 -0
  97. flowtask/components/Loop.py +253 -0
  98. flowtask/components/Lowes.py +334 -0
  99. flowtask/components/MS365Usage.py +156 -0
  100. flowtask/components/MSTeamsMessages.py +320 -0
  101. flowtask/components/MarketClustering.py +1051 -0
  102. flowtask/components/MergeFiles.py +362 -0
  103. flowtask/components/MilvusOutput.py +87 -0
  104. flowtask/components/NearByStores.py +175 -0
  105. flowtask/components/NetworkNinja/__init__.py +6 -0
  106. flowtask/components/NetworkNinja/models/__init__.py +52 -0
  107. flowtask/components/NetworkNinja/models/abstract.py +177 -0
  108. flowtask/components/NetworkNinja/models/account.py +39 -0
  109. flowtask/components/NetworkNinja/models/client.py +19 -0
  110. flowtask/components/NetworkNinja/models/district.py +14 -0
  111. flowtask/components/NetworkNinja/models/events.py +101 -0
  112. flowtask/components/NetworkNinja/models/forms.py +499 -0
  113. flowtask/components/NetworkNinja/models/market.py +16 -0
  114. flowtask/components/NetworkNinja/models/organization.py +34 -0
  115. flowtask/components/NetworkNinja/models/photos.py +125 -0
  116. flowtask/components/NetworkNinja/models/project.py +44 -0
  117. flowtask/components/NetworkNinja/models/region.py +28 -0
  118. flowtask/components/NetworkNinja/models/store.py +203 -0
  119. flowtask/components/NetworkNinja/models/user.py +151 -0
  120. flowtask/components/NetworkNinja/router.py +854 -0
  121. flowtask/components/Odoo.py +175 -0
  122. flowtask/components/OdooInjector.py +192 -0
  123. flowtask/components/OpenFromXML.py +126 -0
  124. flowtask/components/OpenWeather.py +41 -0
  125. flowtask/components/OpenWithBase.py +616 -0
  126. flowtask/components/OpenWithPandas.py +715 -0
  127. flowtask/components/PGPDecrypt.py +199 -0
  128. flowtask/components/PandasIterator.py +187 -0
  129. flowtask/components/PandasToFile.py +189 -0
  130. flowtask/components/Paradox.py +339 -0
  131. flowtask/components/ParamIterator.py +117 -0
  132. flowtask/components/ParseHTML.py +84 -0
  133. flowtask/components/PlacerStores.py +249 -0
  134. flowtask/components/Pokemon.py +507 -0
  135. flowtask/components/PositiveBot.py +62 -0
  136. flowtask/components/PowerPointSlide.py +400 -0
  137. flowtask/components/PrintMessage.py +127 -0
  138. flowtask/components/ProductCompetitors/__init__.py +5 -0
  139. flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
  140. flowtask/components/ProductCompetitors/parsers/base.py +72 -0
  141. flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
  142. flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
  143. flowtask/components/ProductCompetitors/scrapper.py +155 -0
  144. flowtask/components/ProductCompliant.py +169 -0
  145. flowtask/components/ProductInfo/__init__.py +1 -0
  146. flowtask/components/ProductInfo/parsers/__init__.py +5 -0
  147. flowtask/components/ProductInfo/parsers/base.py +83 -0
  148. flowtask/components/ProductInfo/parsers/brother.py +97 -0
  149. flowtask/components/ProductInfo/parsers/canon.py +167 -0
  150. flowtask/components/ProductInfo/parsers/epson.py +118 -0
  151. flowtask/components/ProductInfo/parsers/hp.py +131 -0
  152. flowtask/components/ProductInfo/parsers/samsung.py +97 -0
  153. flowtask/components/ProductInfo/scraper.py +319 -0
  154. flowtask/components/ProductPricing.py +118 -0
  155. flowtask/components/QS.py +261 -0
  156. flowtask/components/QSBase.py +201 -0
  157. flowtask/components/QueryIterator.py +273 -0
  158. flowtask/components/QueryToInsert.py +327 -0
  159. flowtask/components/QueryToPandas.py +432 -0
  160. flowtask/components/RESTClient.py +195 -0
  161. flowtask/components/RethinkDBQuery.py +189 -0
  162. flowtask/components/Rsync.py +74 -0
  163. flowtask/components/RunSSH.py +59 -0
  164. flowtask/components/RunShell.py +71 -0
  165. flowtask/components/SalesForce.py +20 -0
  166. flowtask/components/SaveImageBank/__init__.py +257 -0
  167. flowtask/components/SchedulingVisits.py +592 -0
  168. flowtask/components/ScrapPage.py +216 -0
  169. flowtask/components/ScrapSearch.py +79 -0
  170. flowtask/components/SendNotify.py +257 -0
  171. flowtask/components/SentimentAnalysis.py +694 -0
  172. flowtask/components/ServiceScrapper/__init__.py +5 -0
  173. flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
  174. flowtask/components/ServiceScrapper/parsers/base.py +94 -0
  175. flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
  176. flowtask/components/ServiceScrapper/scrapper.py +199 -0
  177. flowtask/components/SetVariables.py +156 -0
  178. flowtask/components/SubTask.py +182 -0
  179. flowtask/components/SuiteCRM.py +48 -0
  180. flowtask/components/Switch.py +175 -0
  181. flowtask/components/TableBase.py +148 -0
  182. flowtask/components/TableDelete.py +312 -0
  183. flowtask/components/TableInput.py +143 -0
  184. flowtask/components/TableOutput/TableOutput.py +384 -0
  185. flowtask/components/TableOutput/__init__.py +3 -0
  186. flowtask/components/TableSchema.py +534 -0
  187. flowtask/components/Target.py +223 -0
  188. flowtask/components/ThumbnailGenerator.py +156 -0
  189. flowtask/components/ToPandas.py +67 -0
  190. flowtask/components/TransformRows/TransformRows.py +507 -0
  191. flowtask/components/TransformRows/__init__.py +9 -0
  192. flowtask/components/TransformRows/functions.py +559 -0
  193. flowtask/components/TransposeRows.py +176 -0
  194. flowtask/components/UPCDatabase.py +86 -0
  195. flowtask/components/UnGzip.py +171 -0
  196. flowtask/components/Uncompress.py +172 -0
  197. flowtask/components/UniqueRows.py +126 -0
  198. flowtask/components/Unzip.py +107 -0
  199. flowtask/components/UpdateOperationalVars.py +147 -0
  200. flowtask/components/UploadTo.py +299 -0
  201. flowtask/components/UploadToS3.py +136 -0
  202. flowtask/components/UploadToSFTP.py +160 -0
  203. flowtask/components/UploadToSharepoint.py +205 -0
  204. flowtask/components/UserFunc.py +122 -0
  205. flowtask/components/VivaTracker.py +140 -0
  206. flowtask/components/WSDLClient.py +123 -0
  207. flowtask/components/Wait.py +18 -0
  208. flowtask/components/Walmart.py +199 -0
  209. flowtask/components/Workplace.py +134 -0
  210. flowtask/components/XMLToPandas.py +267 -0
  211. flowtask/components/Zammad/__init__.py +41 -0
  212. flowtask/components/Zammad/models.py +0 -0
  213. flowtask/components/ZoomInfoScraper.py +409 -0
  214. flowtask/components/__init__.py +104 -0
  215. flowtask/components/abstract.py +18 -0
  216. flowtask/components/flow.py +530 -0
  217. flowtask/components/google.py +335 -0
  218. flowtask/components/group.py +221 -0
  219. flowtask/components/py.typed +0 -0
  220. flowtask/components/reviewscrap.py +132 -0
  221. flowtask/components/tAutoincrement.py +117 -0
  222. flowtask/components/tConcat.py +109 -0
  223. flowtask/components/tExplode.py +119 -0
  224. flowtask/components/tFilter.py +184 -0
  225. flowtask/components/tGroup.py +236 -0
  226. flowtask/components/tJoin.py +270 -0
  227. flowtask/components/tMap/__init__.py +9 -0
  228. flowtask/components/tMap/functions.py +54 -0
  229. flowtask/components/tMap/tMap.py +450 -0
  230. flowtask/components/tMelt.py +112 -0
  231. flowtask/components/tMerge.py +114 -0
  232. flowtask/components/tOrder.py +93 -0
  233. flowtask/components/tPandas.py +94 -0
  234. flowtask/components/tPivot.py +71 -0
  235. flowtask/components/tPluckCols.py +76 -0
  236. flowtask/components/tUnnest.py +82 -0
  237. flowtask/components/user.py +401 -0
  238. flowtask/conf.py +457 -0
  239. flowtask/download.py +102 -0
  240. flowtask/events/__init__.py +11 -0
  241. flowtask/events/events/__init__.py +20 -0
  242. flowtask/events/events/abstract.py +95 -0
  243. flowtask/events/events/alerts/__init__.py +362 -0
  244. flowtask/events/events/alerts/colfunctions.py +131 -0
  245. flowtask/events/events/alerts/functions.py +158 -0
  246. flowtask/events/events/dummy.py +12 -0
  247. flowtask/events/events/exec.py +124 -0
  248. flowtask/events/events/file/__init__.py +7 -0
  249. flowtask/events/events/file/base.py +51 -0
  250. flowtask/events/events/file/copy.py +23 -0
  251. flowtask/events/events/file/delete.py +16 -0
  252. flowtask/events/events/interfaces/__init__.py +9 -0
  253. flowtask/events/events/interfaces/client.py +67 -0
  254. flowtask/events/events/interfaces/credentials.py +28 -0
  255. flowtask/events/events/interfaces/notifications.py +58 -0
  256. flowtask/events/events/jira.py +122 -0
  257. flowtask/events/events/log.py +26 -0
  258. flowtask/events/events/logerr.py +52 -0
  259. flowtask/events/events/notify.py +59 -0
  260. flowtask/events/events/notify_event.py +160 -0
  261. flowtask/events/events/publish.py +54 -0
  262. flowtask/events/events/sendfile.py +104 -0
  263. flowtask/events/events/task.py +97 -0
  264. flowtask/events/events/teams.py +98 -0
  265. flowtask/events/events/webhook.py +58 -0
  266. flowtask/events/manager.py +287 -0
  267. flowtask/exceptions.c +39393 -0
  268. flowtask/exceptions.cpython-39-x86_64-linux-gnu.so +0 -0
  269. flowtask/extensions/__init__.py +3 -0
  270. flowtask/extensions/abstract.py +82 -0
  271. flowtask/extensions/logging/__init__.py +65 -0
  272. flowtask/hooks/__init__.py +9 -0
  273. flowtask/hooks/actions/__init__.py +22 -0
  274. flowtask/hooks/actions/abstract.py +66 -0
  275. flowtask/hooks/actions/dummy.py +23 -0
  276. flowtask/hooks/actions/jira.py +74 -0
  277. flowtask/hooks/actions/rest.py +320 -0
  278. flowtask/hooks/actions/sampledata.py +37 -0
  279. flowtask/hooks/actions/sensor.py +23 -0
  280. flowtask/hooks/actions/task.py +9 -0
  281. flowtask/hooks/actions/ticket.py +37 -0
  282. flowtask/hooks/actions/zammad.py +55 -0
  283. flowtask/hooks/hook.py +62 -0
  284. flowtask/hooks/models.py +17 -0
  285. flowtask/hooks/service.py +187 -0
  286. flowtask/hooks/step.py +91 -0
  287. flowtask/hooks/types/__init__.py +23 -0
  288. flowtask/hooks/types/base.py +129 -0
  289. flowtask/hooks/types/brokers/__init__.py +11 -0
  290. flowtask/hooks/types/brokers/base.py +54 -0
  291. flowtask/hooks/types/brokers/mqtt.py +35 -0
  292. flowtask/hooks/types/brokers/rabbitmq.py +82 -0
  293. flowtask/hooks/types/brokers/redis.py +83 -0
  294. flowtask/hooks/types/brokers/sqs.py +44 -0
  295. flowtask/hooks/types/fs.py +232 -0
  296. flowtask/hooks/types/http.py +49 -0
  297. flowtask/hooks/types/imap.py +200 -0
  298. flowtask/hooks/types/jira.py +279 -0
  299. flowtask/hooks/types/mail.py +205 -0
  300. flowtask/hooks/types/postgres.py +98 -0
  301. flowtask/hooks/types/responses/__init__.py +8 -0
  302. flowtask/hooks/types/responses/base.py +5 -0
  303. flowtask/hooks/types/sharepoint.py +288 -0
  304. flowtask/hooks/types/ssh.py +141 -0
  305. flowtask/hooks/types/tagged.py +59 -0
  306. flowtask/hooks/types/upload.py +85 -0
  307. flowtask/hooks/types/watch.py +71 -0
  308. flowtask/hooks/types/web.py +36 -0
  309. flowtask/interfaces/AzureClient.py +137 -0
  310. flowtask/interfaces/AzureGraph.py +839 -0
  311. flowtask/interfaces/Boto3Client.py +326 -0
  312. flowtask/interfaces/DropboxClient.py +173 -0
  313. flowtask/interfaces/ExcelHandler.py +94 -0
  314. flowtask/interfaces/FTPClient.py +131 -0
  315. flowtask/interfaces/GoogleCalendar.py +201 -0
  316. flowtask/interfaces/GoogleClient.py +133 -0
  317. flowtask/interfaces/GoogleDrive.py +127 -0
  318. flowtask/interfaces/GoogleGCS.py +89 -0
  319. flowtask/interfaces/GoogleGeocoding.py +93 -0
  320. flowtask/interfaces/GoogleLang.py +114 -0
  321. flowtask/interfaces/GooglePub.py +61 -0
  322. flowtask/interfaces/GoogleSheet.py +68 -0
  323. flowtask/interfaces/IMAPClient.py +137 -0
  324. flowtask/interfaces/O365Calendar.py +113 -0
  325. flowtask/interfaces/O365Client.py +220 -0
  326. flowtask/interfaces/OneDrive.py +284 -0
  327. flowtask/interfaces/Outlook.py +155 -0
  328. flowtask/interfaces/ParrotBot.py +130 -0
  329. flowtask/interfaces/SSHClient.py +378 -0
  330. flowtask/interfaces/Sharepoint.py +496 -0
  331. flowtask/interfaces/__init__.py +36 -0
  332. flowtask/interfaces/azureauth.py +119 -0
  333. flowtask/interfaces/cache.py +201 -0
  334. flowtask/interfaces/client.py +82 -0
  335. flowtask/interfaces/compress.py +525 -0
  336. flowtask/interfaces/credentials.py +124 -0
  337. flowtask/interfaces/d2l.py +239 -0
  338. flowtask/interfaces/databases/__init__.py +5 -0
  339. flowtask/interfaces/databases/db.py +223 -0
  340. flowtask/interfaces/databases/documentdb.py +55 -0
  341. flowtask/interfaces/databases/rethink.py +39 -0
  342. flowtask/interfaces/dataframes/__init__.py +11 -0
  343. flowtask/interfaces/dataframes/abstract.py +21 -0
  344. flowtask/interfaces/dataframes/arrow.py +71 -0
  345. flowtask/interfaces/dataframes/dt.py +69 -0
  346. flowtask/interfaces/dataframes/pandas.py +167 -0
  347. flowtask/interfaces/dataframes/polars.py +60 -0
  348. flowtask/interfaces/db.py +263 -0
  349. flowtask/interfaces/env.py +46 -0
  350. flowtask/interfaces/func.py +137 -0
  351. flowtask/interfaces/http.py +1780 -0
  352. flowtask/interfaces/locale.py +40 -0
  353. flowtask/interfaces/log.py +75 -0
  354. flowtask/interfaces/mask.py +143 -0
  355. flowtask/interfaces/notification.py +154 -0
  356. flowtask/interfaces/playwright.py +339 -0
  357. flowtask/interfaces/powerpoint.py +368 -0
  358. flowtask/interfaces/py.typed +0 -0
  359. flowtask/interfaces/qs.py +376 -0
  360. flowtask/interfaces/result.py +87 -0
  361. flowtask/interfaces/selenium_service.py +779 -0
  362. flowtask/interfaces/smartsheet.py +154 -0
  363. flowtask/interfaces/stat.py +39 -0
  364. flowtask/interfaces/task.py +96 -0
  365. flowtask/interfaces/template.py +118 -0
  366. flowtask/interfaces/vectorstores/__init__.py +1 -0
  367. flowtask/interfaces/vectorstores/abstract.py +133 -0
  368. flowtask/interfaces/vectorstores/milvus.py +669 -0
  369. flowtask/interfaces/zammad.py +107 -0
  370. flowtask/models.py +193 -0
  371. flowtask/parsers/__init__.py +15 -0
  372. flowtask/parsers/_yaml.c +11978 -0
  373. flowtask/parsers/_yaml.cpython-39-x86_64-linux-gnu.so +0 -0
  374. flowtask/parsers/argparser.py +235 -0
  375. flowtask/parsers/base.c +15155 -0
  376. flowtask/parsers/base.cpython-39-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-39-x86_64-linux-gnu.so +0 -0
  379. flowtask/parsers/maps.py +49 -0
  380. flowtask/parsers/toml.c +11968 -0
  381. flowtask/parsers/toml.cpython-39-x86_64-linux-gnu.so +0 -0
  382. flowtask/plugins/__init__.py +16 -0
  383. flowtask/plugins/components/__init__.py +0 -0
  384. flowtask/plugins/handler/__init__.py +45 -0
  385. flowtask/plugins/importer.py +31 -0
  386. flowtask/plugins/sources/__init__.py +0 -0
  387. flowtask/runner.py +283 -0
  388. flowtask/scheduler/__init__.py +9 -0
  389. flowtask/scheduler/functions.py +493 -0
  390. flowtask/scheduler/handlers/__init__.py +8 -0
  391. flowtask/scheduler/handlers/manager.py +504 -0
  392. flowtask/scheduler/handlers/models.py +58 -0
  393. flowtask/scheduler/handlers/service.py +72 -0
  394. flowtask/scheduler/notifications.py +65 -0
  395. flowtask/scheduler/scheduler.py +993 -0
  396. flowtask/services/__init__.py +0 -0
  397. flowtask/services/bots/__init__.py +0 -0
  398. flowtask/services/bots/telegram.py +264 -0
  399. flowtask/services/files/__init__.py +11 -0
  400. flowtask/services/files/manager.py +522 -0
  401. flowtask/services/files/model.py +37 -0
  402. flowtask/services/files/service.py +767 -0
  403. flowtask/services/jira/__init__.py +3 -0
  404. flowtask/services/jira/jira_actions.py +191 -0
  405. flowtask/services/tasks/__init__.py +13 -0
  406. flowtask/services/tasks/launcher.py +213 -0
  407. flowtask/services/tasks/manager.py +323 -0
  408. flowtask/services/tasks/service.py +275 -0
  409. flowtask/services/tasks/task_manager.py +376 -0
  410. flowtask/services/tasks/tasks.py +155 -0
  411. flowtask/storages/__init__.py +16 -0
  412. flowtask/storages/exceptions.py +12 -0
  413. flowtask/storages/files/__init__.py +8 -0
  414. flowtask/storages/files/abstract.py +29 -0
  415. flowtask/storages/files/filesystem.py +66 -0
  416. flowtask/storages/tasks/__init__.py +19 -0
  417. flowtask/storages/tasks/abstract.py +26 -0
  418. flowtask/storages/tasks/database.py +33 -0
  419. flowtask/storages/tasks/filesystem.py +108 -0
  420. flowtask/storages/tasks/github.py +119 -0
  421. flowtask/storages/tasks/memory.py +45 -0
  422. flowtask/storages/tasks/row.py +25 -0
  423. flowtask/tasks/__init__.py +0 -0
  424. flowtask/tasks/abstract.py +526 -0
  425. flowtask/tasks/command.py +118 -0
  426. flowtask/tasks/pile.py +486 -0
  427. flowtask/tasks/py.typed +0 -0
  428. flowtask/tasks/task.py +778 -0
  429. flowtask/template/__init__.py +161 -0
  430. flowtask/tests.py +257 -0
  431. flowtask/types/__init__.py +8 -0
  432. flowtask/types/typedefs.c +11347 -0
  433. flowtask/types/typedefs.cpython-39-x86_64-linux-gnu.so +0 -0
  434. flowtask/utils/__init__.py +24 -0
  435. flowtask/utils/constants.py +117 -0
  436. flowtask/utils/encoders.py +21 -0
  437. flowtask/utils/executor.py +112 -0
  438. flowtask/utils/functions.cpp +14280 -0
  439. flowtask/utils/functions.cpython-39-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-39-x86_64-linux-gnu.so +0 -0
  442. flowtask/utils/mail.py +63 -0
  443. flowtask/utils/parseqs.c +13324 -0
  444. flowtask/utils/parserqs.cpython-39-x86_64-linux-gnu.so +0 -0
  445. flowtask/utils/stats.py +308 -0
  446. flowtask/utils/transformations.py +74 -0
  447. flowtask/utils/uv.py +12 -0
  448. flowtask/utils/validators.py +97 -0
  449. flowtask/version.py +11 -0
  450. flowtask-5.8.4.dist-info/LICENSE +201 -0
  451. flowtask-5.8.4.dist-info/METADATA +209 -0
  452. flowtask-5.8.4.dist-info/RECORD +470 -0
  453. flowtask-5.8.4.dist-info/WHEEL +6 -0
  454. flowtask-5.8.4.dist-info/entry_points.txt +3 -0
  455. flowtask-5.8.4.dist-info/top_level.txt +2 -0
  456. plugins/components/CreateQR.py +39 -0
  457. plugins/components/TestComponent.py +28 -0
  458. plugins/components/Use1.py +13 -0
  459. plugins/components/Workplace.py +117 -0
  460. plugins/components/__init__.py +3 -0
  461. plugins/sources/__init__.py +0 -0
  462. plugins/sources/get_populartimes.py +78 -0
  463. plugins/sources/google.py +150 -0
  464. plugins/sources/hubspot.py +679 -0
  465. plugins/sources/icims.py +679 -0
  466. plugins/sources/mobileinsight.py +501 -0
  467. plugins/sources/newrelic.py +262 -0
  468. plugins/sources/uap.py +268 -0
  469. plugins/sources/venu.py +244 -0
  470. plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,339 @@
1
+ import asyncio
2
+ import random
3
+ from abc import ABC
4
+ from typing import Optional, Dict, Any
5
+
6
+ from bs4 import BeautifulSoup
7
+ from lxml import html, etree
8
+
9
+ # Playwright Imports
10
+ from playwright.async_api import (
11
+ async_playwright,
12
+ TimeoutError as PlaywrightTimeoutError,
13
+ Browser,
14
+ Page,
15
+ BrowserContext,
16
+ )
17
+
18
+ # Import your logging, config, and exceptions as needed:
19
+ from navconfig.logging import logging
20
+ from ..conf import (
21
+ OXYLABS_USERNAME,
22
+ OXYLABS_PASSWORD,
23
+ OXYLABS_ENDPOINT,
24
+ GOOGLE_SEARCH_ENGINE_ID,
25
+ )
26
+ from ..exceptions import NotSupported, TimeOutError, ComponentError
27
+ from .http import ua, mobile_ua
28
+
29
+ # A list of mobile device names (these should match keys from playwright.devices)
30
+ mobile_devices = [
31
+ "iPhone X",
32
+ "Google Nexus 7",
33
+ "Pixel 2",
34
+ "Samsung Galaxy Tab",
35
+ "Nexus 5",
36
+ ]
37
+
38
+
39
+ class PlaywrightService(ABC):
40
+ """
41
+ PlaywrightService
42
+
43
+ An interface for making HTTP connections using Playwright,
44
+ analogous to your SeleniumService.
45
+ """
46
+ accept: str = (
47
+ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
48
+ )
49
+
50
+ def __init__(self, *args, **kwargs):
51
+ # Configuration options
52
+ self.accept_cookies: Optional[tuple] = kwargs.pop("accept_cookies", None)
53
+ self.as_mobile: bool = kwargs.pop("as_mobile", False)
54
+ self.use_proxy: bool = kwargs.pop("use_proxy", False)
55
+ self.mobile_device: str = kwargs.pop("mobile_device", random.choice(mobile_devices))
56
+ self.default_tag: str = kwargs.pop("default_tag", "body")
57
+ self.accept_is_clickable: bool = kwargs.pop("accept_is_clickable", False)
58
+ self.timeout: int = kwargs.pop("timeout", 60)
59
+ self.wait_until: Optional[tuple] = kwargs.pop("wait_until", None)
60
+ self.inner_tag: Optional[tuple] = kwargs.pop("inner_tag", None)
61
+
62
+ # Headers and cookies
63
+ self.headers: Dict[str, str] = {
64
+ "Accept": self.accept,
65
+ "User-Agent": random.choice(ua),
66
+ **kwargs.get("headers", {}),
67
+ }
68
+ self.cookies: Dict[str, str] = kwargs.get("cookies", {})
69
+ if isinstance(self.cookies, str):
70
+ self.cookies = self.parse_cookies(self.cookies)
71
+
72
+ # Playwright-related attributes
73
+ self._playwright = None
74
+ self.browser: Optional[Browser] = None
75
+ self.context: Optional[BrowserContext] = None
76
+ self.page: Optional[Page] = None
77
+
78
+ # Convert any element selectors provided as tuples into Playwright-friendly selectors.
79
+ if self.accept_cookies:
80
+ self.accept_cookies = self.check_by_attribute(self.accept_cookies)
81
+ if self.inner_tag:
82
+ self.inner_tag = self.check_by_attribute(self.inner_tag)
83
+
84
+ self.logger = logging.getLogger(__name__)
85
+
86
+ def parse_cookies(self, cookie_pair: str) -> dict:
87
+ """Parse a cookie string into a dictionary."""
88
+ cookies = {}
89
+ cookie_pairs = [c.strip() for c in cookie_pair.strip().split(";") if c.strip()]
90
+ for pair in cookie_pairs:
91
+ if "=" in pair:
92
+ name, value = pair.split("=", 1)
93
+ cookies[name.strip()] = value.strip().strip('"')
94
+ return cookies
95
+
96
+ def check_by_attribute(self, attribute: tuple) -> str:
97
+ """
98
+ Convert a tuple (attribute, value) into a Playwright selector.
99
+ For example, ('id', 'submit') becomes '#submit' and
100
+ ('xpath', '//button') becomes 'xpath=//button'.
101
+ """
102
+ if not attribute:
103
+ return ""
104
+ el, value = attribute
105
+ if el == "id":
106
+ return f"#{value}"
107
+ elif el in ("class", "class name"):
108
+ return f".{value}"
109
+ elif el == "name":
110
+ return f"[name='{value}']"
111
+ elif el == "xpath":
112
+ return f"xpath={value}"
113
+ elif el in ("css", "css selector"):
114
+ return value
115
+ elif el in ("tag", "tag name", "tagname", "tag_name"):
116
+ return value
117
+ else:
118
+ raise NotSupported(f"Playwright: Attribute {el} is not supported.")
119
+
120
+ def proxy_playwright(self, user: str, password: str, endpoint: str) -> dict:
121
+ """Return a proxy configuration dictionary for Playwright."""
122
+ proxy_server = f"http://{user}:{password}@{endpoint}"
123
+ self.logger.debug(f"Using proxy: {proxy_server}")
124
+ return {"server": proxy_server}
125
+
126
+ async def get_driver(self) -> Page:
127
+ """
128
+ Initialize Playwright, launch a browser (with proxy and/or mobile emulation if configured),
129
+ and return a new Page instance.
130
+ """
131
+ self._playwright = await async_playwright().start()
132
+ browser_args = {}
133
+ if self.use_proxy:
134
+ proxy_config = self.proxy_playwright(
135
+ f"customer-{OXYLABS_USERNAME}-sesstime-1", OXYLABS_PASSWORD, OXYLABS_ENDPOINT
136
+ )
137
+ browser_args["proxy"] = proxy_config
138
+
139
+ # Launch Chromium in headless mode (change to headless=False for debugging)
140
+ self.browser = await self._playwright.chromium.launch(headless=True, **browser_args)
141
+
142
+ # Set up context options (viewport, user agent, extra headers)
143
+ context_args: Dict[str, Any] = {
144
+ "viewport": {"width": 1280, "height": 720},
145
+ "user_agent": self.headers.get("User-Agent"),
146
+ "extra_http_headers": self.headers,
147
+ }
148
+ if self.as_mobile:
149
+ try:
150
+ # Use a built‐in device preset from Playwright.
151
+ device = self._playwright.devices[self.mobile_device]
152
+ except KeyError:
153
+ self.logger.warning(
154
+ f"Device {self.mobile_device} not found. Falling back to 'iPhone X'."
155
+ )
156
+ device = self._playwright.devices.get("iPhone X")
157
+ if device:
158
+ context_args.update(device)
159
+
160
+ self.context = await self.browser.new_context(**context_args)
161
+ self.page = await self.context.new_page()
162
+ self.page.set_default_timeout(self.timeout * 1000) # timeout is in milliseconds
163
+ return self.page
164
+
165
+ async def close_driver(self):
166
+ """Close the page, browser context, browser, and stop Playwright."""
167
+ if self.page:
168
+ await self.page.close()
169
+ if self.context:
170
+ await self.context.close()
171
+ if self.browser:
172
+ await self.browser.close()
173
+ if self._playwright:
174
+ await self._playwright.stop()
175
+
176
+ async def _execute_scroll(self):
177
+ """
178
+ Scroll to the bottom of the page (and then back to the top) to ensure
179
+ that lazy-loaded content is loaded.
180
+ """
181
+ await self.page.wait_for_load_state("load")
182
+ await self.page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
183
+ await asyncio.sleep(2) # Give time for content to load
184
+ await self.page.evaluate("window.scrollTo(0, 0)")
185
+
186
+ async def save_screenshot(self, filename: str) -> None:
187
+ """
188
+ Save a screenshot of the entire page or of a specific element if configured.
189
+ """
190
+ if not self.page:
191
+ raise ComponentError("No page available for screenshot.")
192
+
193
+ # If you have defined a 'screenshot' attribute with a 'portion' selector,
194
+ # capture that element only.
195
+ if hasattr(self, "screenshot") and "portion" in getattr(self, "screenshot"):
196
+ selector = self.check_by_attribute(self.screenshot["portion"])
197
+ element = self.page.locator(selector)
198
+ # Wait for the element to be visible (with nonzero dimensions)
199
+ await element.wait_for(state="visible", timeout=20000)
200
+ await element.screenshot(path=filename)
201
+ else:
202
+ # Full-page screenshot
203
+ await self.page.screenshot(path=filename, full_page=True)
204
+
205
+ async def get_soup(self, parser: str = "html.parser") -> BeautifulSoup:
206
+ """
207
+ Return a BeautifulSoup object for the current page content.
208
+ """
209
+ if not self.page:
210
+ raise ComponentError("No page available to retrieve content.")
211
+ content = await self.page.content()
212
+ return BeautifulSoup(content, parser)
213
+
214
+ async def get_etree(self) -> tuple:
215
+ """
216
+ Return a tuple of lxml etree objects (using etree.fromstring and html.fromstring)
217
+ for the current page content.
218
+ """
219
+ if not self.page:
220
+ raise ComponentError("No page available to retrieve content.")
221
+ content = await self.page.content()
222
+ try:
223
+ x = etree.fromstring(content)
224
+ except etree.XMLSyntaxError:
225
+ x = None
226
+ try:
227
+ h = html.fromstring(content)
228
+ except etree.XMLSyntaxError:
229
+ h = None
230
+ return x, h
231
+
232
+ async def get_page(
233
+ self,
234
+ url: str,
235
+ cookies: Optional[Dict[str, str]] = None,
236
+ retries: int = 3,
237
+ backoff_delay: int = 2,
238
+ ):
239
+ """
240
+ Navigate to a given URL, optionally set cookies, wait for page load,
241
+ and optionally handle any cookie-acceptance banners.
242
+ """
243
+ if not self.page:
244
+ await self.get_driver()
245
+ attempt = 0
246
+ while attempt < retries:
247
+ try:
248
+ await self.page.goto(url, wait_until="load")
249
+ if cookies:
250
+ # Convert your cookies to the format expected by Playwright.
251
+ cookie_list = []
252
+ for name, value in cookies.items():
253
+ cookie_list.append({
254
+ "name": name,
255
+ "value": value,
256
+ "url": url,
257
+ })
258
+ await self.context.add_cookies(cookie_list)
259
+ # Reload to ensure cookies take effect.
260
+ await self.page.reload(wait_until="load")
261
+
262
+ # Wait for a specific element if configured
263
+ if self.wait_until:
264
+ selector = self.check_by_attribute(self.wait_until)
265
+ await self.page.wait_for_selector(selector, timeout=20000)
266
+ else:
267
+ await self.page.wait_for_selector(self.default_tag, timeout=20000)
268
+
269
+ # Handle "Accept Cookies" if needed.
270
+ if self.accept_cookies:
271
+ try:
272
+ if self.accept_is_clickable:
273
+ await self.page.wait_for_selector(self.accept_cookies, state="visible", timeout=10000)
274
+ await self.page.click(self.accept_cookies)
275
+ else:
276
+ await self.page.wait_for_selector(self.accept_cookies, timeout=10000)
277
+ await self.page.eval_on_selector(self.accept_cookies, "el => el.click()")
278
+ except PlaywrightTimeoutError:
279
+ self.logger.warning("Accept Cookies button not found.")
280
+ await self._execute_scroll()
281
+ return # Exit after a successful navigation
282
+ except PlaywrightTimeoutError:
283
+ self.logger.warning(
284
+ f"Timeout occurred on attempt {attempt + 1}/{retries} for URL: {url}"
285
+ )
286
+ attempt += 1
287
+ if attempt < retries:
288
+ await asyncio.sleep(backoff_delay)
289
+ else:
290
+ raise TimeOutError(f"Timeout Error on URL {url} after {retries} attempts")
291
+ except Exception as exc:
292
+ raise ComponentError(f"Error during page navigation: {exc}")
293
+
294
+ async def search_google_cse(self, query: str, max_results: int = 5) -> list:
295
+ """
296
+ Perform a Google Custom Search Engine (CSE) search using Playwright.
297
+ Returns a list of results where each result is a dict with 'title' and 'link'.
298
+ """
299
+ search_url = f"https://cse.google.com/cse?cx={GOOGLE_SEARCH_ENGINE_ID}#gsc.tab=0&gsc.q={query}&gsc.sort="
300
+ try:
301
+ if not self.page:
302
+ await self.get_driver()
303
+ await self.page.goto(search_url, wait_until="load")
304
+ # Wait for the search results container to appear.
305
+ try:
306
+ await self.page.wait_for_selector(".gsc-results", timeout=5000)
307
+ except PlaywrightTimeoutError:
308
+ try:
309
+ await self.page.wait_for_selector(".gs-no-results-result", timeout=3000)
310
+ return [] # No results found
311
+ except PlaywrightTimeoutError:
312
+ raise RuntimeError("CSE: No results found or page failed to load.")
313
+
314
+ # Allow any JS to finish
315
+ await asyncio.sleep(2)
316
+ results = []
317
+ search_results = await self.page.query_selector_all(".gsc-webResult")
318
+ if not search_results:
319
+ search_results = await self.page.query_selector_all(".gsc-expansionArea")
320
+ for result in search_results[:max_results]:
321
+ try:
322
+ title_element = await result.query_selector(".gs-title")
323
+ if title_element:
324
+ title = (await title_element.inner_text()).strip()
325
+ url_element = await title_element.query_selector("a")
326
+ if url_element:
327
+ url = (await url_element.get_attribute("href")).strip()
328
+ if title and url:
329
+ results.append({"title": title, "link": url})
330
+ except Exception:
331
+ continue # Skip this result if any errors occur
332
+ return results
333
+
334
+ except PlaywrightTimeoutError as e:
335
+ raise RuntimeError(f"CSE Timeout: {e}")
336
+ except Exception as e:
337
+ raise RuntimeError(f"CSE Unexpected Error: {e}")
338
+ finally:
339
+ await self.close_driver()