flowtask 5.8.4__cp312-cp312-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-312-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-312-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-312-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-312-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-312-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-312-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-312-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-312-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-312-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,376 @@
1
+ """
2
+ QS Support.
3
+
4
+
5
+ Adding support for Querysource related functions as datasource support to components.
6
+ """
7
+ import os
8
+ from collections.abc import Callable
9
+ from abc import ABC
10
+ import asyncio
11
+ from importlib import import_module
12
+ from typing import Any
13
+ from navconfig import config
14
+ from sqlalchemy.orm import Session
15
+ from sqlalchemy import create_engine
16
+ from sqlalchemy.pool import NullPool
17
+ from asyncdb import AsyncDB
18
+ from asyncdb.drivers.pg import pg
19
+ from asyncdb.exceptions import NoDataFound
20
+ from querysource.exceptions import DataNotFound as NoData
21
+ from querysource.queries.qs import QS
22
+ from querysource.datasources.drivers import BaseDriver
23
+ from querysource.conf import (
24
+ default_dsn,
25
+ sqlalchemy_url,
26
+ DB_TIMEOUT,
27
+ DB_STATEMENT_TIMEOUT,
28
+ DB_SESSION_TIMEOUT,
29
+ DB_KEEPALIVE_IDLE,
30
+ POSTGRES_TIMEOUT,
31
+ BIGQUERY_CREDENTIALS,
32
+ BIGQUERY_PROJECT_ID
33
+ )
34
+ import pandas as pd
35
+ import numpy as np
36
+ from ..exceptions import (
37
+ ConfigError,
38
+ ComponentError,
39
+ DataNotFound,
40
+ )
41
+ from ..utils import cPrint
42
+
43
+ class QSSupport(ABC):
44
+ """QSSupport.
45
+
46
+ Adding Support for Querysource parameters.
47
+ """
48
+ use_sqlalchemy: bool = False
49
+
50
+ def get_config_value(self, key_name, default: str = None):
51
+ if key_name is None:
52
+ return default
53
+ if val := os.getenv(str(key_name)):
54
+ return val
55
+ if val := config.get(str(key_name), default):
56
+ return val
57
+ else:
58
+ # TODO: get from replacing masks or memecached
59
+ return key_name
60
+
61
+ def processing_credentials(self):
62
+ if self.credentials:
63
+ for key, value in self.credentials.items():
64
+ default = getattr(self, key, value)
65
+ try:
66
+ val = self.get_config_value(
67
+ key_name=value, default=default
68
+ )
69
+ self.credentials[key] = val
70
+ except (TypeError, KeyError) as err:
71
+ raise ConfigError(
72
+ f"{__name__}: Wrong or missing Credentials"
73
+ ) from err
74
+ return self.credentials
75
+
76
+ def set_datatypes(self):
77
+ if self.datatypes:
78
+ dtypes = {}
79
+ for field, dtype in self.datatypes.items():
80
+ if dtype == "uint8":
81
+ dtypes[field] = np.uint8
82
+ elif dtype == "uint16":
83
+ dtypes[field] = np.uint16
84
+ elif dtype == "uint32":
85
+ dtypes[field] = np.uint32
86
+ elif dtype == "int8":
87
+ dtypes[field] = np.int8
88
+ elif dtype == "int16":
89
+ dtypes[field] = np.int16
90
+ elif dtype == "int32":
91
+ dtypes[field] = np.int32
92
+ elif dtype == "float":
93
+ dtypes[field] = float
94
+ elif dtype == "float32":
95
+ dtypes[field] = float
96
+ elif dtype in ("varchar", "str"):
97
+ dtypes[field] = str
98
+ elif dtype == "string":
99
+ dtypes[field] = "string"
100
+ else:
101
+ # invalid datatype
102
+ self._logger.warning(
103
+ f"Invalid DataType value: {field} for field {dtype}"
104
+ )
105
+ continue
106
+ self._dtypes = dtypes
107
+
108
+ def get_connection(
109
+ self,
110
+ driver: str = 'pg',
111
+ dsn: str = None,
112
+ params: dict = None,
113
+ **kwargs
114
+ ) -> Callable:
115
+ """Useful for internal connections of QS.
116
+ """
117
+ args = {}
118
+ try:
119
+ loop = asyncio.get_event_loop()
120
+ except RuntimeError:
121
+ loop = asyncio.get_running_loop()
122
+ if driver == 'pg':
123
+ args: dict = {
124
+ "min_size": 2,
125
+ "server_settings": {
126
+ "application_name": "FlowTask:QS",
127
+ "client_min_messages": "notice",
128
+ "jit": "off",
129
+ "statement_timeout": f"{DB_STATEMENT_TIMEOUT}",
130
+ "idle_session_timeout": f"{DB_SESSION_TIMEOUT}",
131
+ "effective_cache_size": "2147483647",
132
+ "tcp_keepalives_idle": f"{DB_KEEPALIVE_IDLE}",
133
+ },
134
+ "timeout": int(POSTGRES_TIMEOUT),
135
+ **kwargs
136
+ }
137
+ if dsn:
138
+ return AsyncDB(
139
+ driver,
140
+ dsn=dsn,
141
+ loop=loop,
142
+ **args
143
+ )
144
+ elif params:
145
+ return AsyncDB(
146
+ driver,
147
+ params=params,
148
+ loop=loop,
149
+ **args
150
+ )
151
+ if not dsn and not params:
152
+ return self.default_connection()
153
+
154
+ def default_connection(self, dsn: str = None):
155
+ try:
156
+ timeout = int(DB_TIMEOUT)
157
+ except TypeError:
158
+ timeout = 360
159
+ if not dsn:
160
+ dsn = default_dsn
161
+ try:
162
+ if self._driver == 'pg':
163
+ kwargs: dict = {
164
+ "min_size": 2,
165
+ "server_settings": {
166
+ "application_name": "FlowTask:CopyToPg",
167
+ "client_min_messages": "notice",
168
+ "jit": "off",
169
+ "statement_timeout": f"{DB_STATEMENT_TIMEOUT}",
170
+ "idle_session_timeout": f"{DB_SESSION_TIMEOUT}",
171
+ "effective_cache_size": "2147483647",
172
+ "tcp_keepalives_idle": f"{DB_KEEPALIVE_IDLE}",
173
+ },
174
+ "timeout": timeout,
175
+ }
176
+ loop = asyncio.get_event_loop()
177
+ self._connection = pg(dsn=dsn, loop=loop, **kwargs)
178
+ return self._connection
179
+ if self._driver == 'bigquery':
180
+ self.credentials: dict = {
181
+ "credentials": BIGQUERY_CREDENTIALS,
182
+ "project_id": BIGQUERY_PROJECT_ID
183
+ }
184
+ return AsyncDB(
185
+ self._driver,
186
+ dsn=dsn,
187
+ params=self.credentials
188
+ )
189
+ except Exception as err:
190
+ raise ComponentError(
191
+ f"Error configuring Pg Connection: {err!s}"
192
+ ) from err
193
+
194
+ def get_driver(self, driver) -> BaseDriver:
195
+ """Getting a Database Driver from Datasource Drivers.
196
+ """
197
+ # load dynamically
198
+ clspath = f'querysource.datasources.drivers.{driver}'
199
+ clsname = f'{driver}Driver'
200
+ try:
201
+ self._dsmodule = import_module(clspath)
202
+ return getattr(self._dsmodule, clsname)
203
+ except (AttributeError, ImportError) as ex:
204
+ raise RuntimeError(
205
+ f"QS: There is no Driver {driver}: {ex}"
206
+ ) from ex
207
+
208
+ async def get_datasource(self, name: str):
209
+ """get_datasource.
210
+
211
+ Get the datasource from the database.
212
+ """
213
+ try:
214
+ db = self.default_connection()
215
+ async with await db.connection() as conn:
216
+ sql = f"SELECT * FROM public.datasources WHERE name = '{name}'"
217
+ row, error = await conn.queryrow(sql)
218
+ if error:
219
+ self._logger.warning(f'DS Error: {error}')
220
+ return False
221
+ try:
222
+ driver = self.get_driver(row['driver'])
223
+ # TODO: encrypting credentials in database:
224
+ if row['dsn']:
225
+ data = {
226
+ "dsn": row['dsn']
227
+ }
228
+ else:
229
+ try:
230
+ data = {
231
+ **dict(row['params']),
232
+ }
233
+ except TypeError:
234
+ data = dict(row['params'])
235
+ for key, val in row.get('credentials', {}).items():
236
+ data[key] = self.get_config_value(
237
+ key_name=val,
238
+ default=val
239
+ )
240
+ for key, val in row.get('params', {}).items():
241
+ data[key] = self.get_config_value(
242
+ key_name=val,
243
+ default=val
244
+ )
245
+ return driver(**data)
246
+ except Exception as ex: # pylint: disable=W0703
247
+ self._logger.error(ex)
248
+ return False
249
+ except Exception as exc:
250
+ self._logger.error(exc)
251
+ return False
252
+
253
+ def get_sqlalchemy_connection(self, dsn: str = None):
254
+ # TODO: migrate to async engine
255
+ if not dsn:
256
+ dsn = sqlalchemy_url
257
+ self._engine = create_engine(dsn, echo=False, poolclass=NullPool)
258
+ self._connection = Session(self._engine)
259
+ return self._connection
260
+
261
+ async def create_connection(self, driver: str = 'pg'):
262
+ if hasattr(self, "credentials"):
263
+ return self.get_connection(
264
+ driver=driver,
265
+ params=self.credentials
266
+ )
267
+ elif hasattr(self, 'dsn'):
268
+ dsn = self.get_config_value(self.dsn, self.dsn)
269
+ if self.use_sqlalchemy is True:
270
+ if dsn.startswith('postgres:'):
271
+ dsn = dsn.replace('postgres:', 'postgresql:')
272
+ return self.get_sqlalchemy_connection(
273
+ dsn=dsn
274
+ )
275
+ return self.get_connection(
276
+ driver=self._driver,
277
+ dsn=dsn
278
+ )
279
+ elif hasattr(self, "datasource"):
280
+ datasource = await self.get_datasource(name=self.datasource)
281
+ if datasource.driver_type == 'asyncdb':
282
+ driver = datasource.driver
283
+ return AsyncDB(
284
+ driver,
285
+ dsn=datasource.dsn,
286
+ params=datasource.params()
287
+ )
288
+ else:
289
+ raise ConfigError(
290
+ f"Invalid Datasource type {datasource.driver_type} for {self.datasource}"
291
+ )
292
+ else:
293
+ return self.default_connection()
294
+
295
+ async def get_qs(self, slug, conditions: dict = None):
296
+ result: Any = []
297
+ if not conditions:
298
+ conditions = self.conditions
299
+ try:
300
+ qry = QS(
301
+ slug=slug,
302
+ conditions=conditions,
303
+ loop=asyncio.get_event_loop(),
304
+ lazy=True
305
+ )
306
+ self.add_metric("QS CONDITIONS", conditions)
307
+ await qry.build_provider()
308
+ except (NoData, NoDataFound) as err:
309
+ raise DataNotFound(f"{err!s}") from err
310
+ except Exception as err:
311
+ raise ComponentError(f"{err}") from err
312
+ try:
313
+ res, error = await qry.query()
314
+ if not res:
315
+ raise DataNotFound(f"{slug}: Data Not Found")
316
+ if error:
317
+ if isinstance(error, BaseException):
318
+ raise error
319
+ else:
320
+ raise ComponentError(f"Error on Query: {error}")
321
+ result = result + [dict(row) for row in res]
322
+ return result
323
+ except (NoData, DataNotFound, NoDataFound) as err:
324
+ raise DataNotFound(f"{err!s}") from err
325
+ except Exception as err:
326
+ raise ComponentError(f"Error on Query: {err}") from err
327
+ finally:
328
+ try:
329
+ await qry.close()
330
+ except Exception as ex: # pylint: disable=W0703
331
+ self._logger.warning(ex)
332
+ del qry
333
+
334
+ async def get_dataframe(self, result, infer_types: bool = False):
335
+ self.set_datatypes()
336
+ try:
337
+ if self.as_objects is True:
338
+ df = pd.DataFrame(result, dtype=object)
339
+ else:
340
+ df = pd.DataFrame(result, dtype=str)
341
+ except Exception as err:
342
+ self._logger.exception(err, stack_info=True)
343
+ raise ComponentError(f"Unable to create Pandas DataFrame {err}") from err
344
+ # Attempt to infer better dtypes for object columns.
345
+ if infer_types is True:
346
+ try:
347
+ self._logger.debug("Auto-inferencing of Data Types")
348
+ df.infer_objects()
349
+ df = df.convert_dtypes(convert_string=self.to_string)
350
+ except Exception as err:
351
+ self.logger.error(f"QS Error: {err}")
352
+ if self._dtypes:
353
+ for column, dtype in self._dtypes.items():
354
+ self._logger.notice(f"Set Column {column} to type {dtype}")
355
+ try:
356
+ df[column] = df[column].astype(dtype)
357
+ except (ValueError, TypeError):
358
+ self._logger.warning(
359
+ f"Failed to convert column {column} to type {dtype}"
360
+ )
361
+ if self._debug is True:
362
+ cPrint("Data Types:")
363
+ print(df.dtypes)
364
+ if hasattr(self, "drop_empty"):
365
+ df.dropna(axis=1, how="all", inplace=True)
366
+ df.dropna(axis=0, how="all", inplace=True)
367
+ if hasattr(self, "dropna"):
368
+ df.dropna(subset=self.dropna, how="all", inplace=True)
369
+ if (
370
+ hasattr(self, "clean_strings") and getattr(self, "clean_strings", False) is True
371
+ ):
372
+ u = df.select_dtypes(include=["object", "string"])
373
+ df[u.columns] = u.fillna("")
374
+ numrows = len(df.index)
375
+ self.add_metric("NUMROWS", numrows)
376
+ return df
@@ -0,0 +1,87 @@
1
+ from abc import ABC
2
+ from typing import Optional, ParamSpec, Any
3
+ from collections.abc import Iterable
4
+ from asyncdb import AsyncDB
5
+ from asyncdb.drivers.base import BaseDriver
6
+ from ..conf import MEMCACHE_HOST, MEMCACHE_PORT
7
+
8
+ P = ParamSpec("P")
9
+
10
+ class ResultSupport(ABC):
11
+ """Support for manipulating the results of Components."""
12
+
13
+ _memory: Optional[BaseDriver] = None
14
+
15
+ def __init__(
16
+ self,
17
+ *args: P.args,
18
+ **kwargs: P.kwargs
19
+ ):
20
+ self.use_memory: bool = kwargs.pop('use_memory', False)
21
+ # collection of results:
22
+ self._result: Optional[Any] = None
23
+ self.data: Optional[Any] = None
24
+ # previous Component
25
+ self._component: Optional[Iterable] = None
26
+ # can pass a previous data as Argument:
27
+ self._input_result = kwargs.pop('input_result', None)
28
+ super(ResultSupport, self).__init__(*args, **kwargs)
29
+ # memcache connector
30
+ if self.use_memory is True:
31
+ self.get_memcached()
32
+
33
+ def get_memcached(self):
34
+ params = {"host": MEMCACHE_HOST, "port": MEMCACHE_PORT}
35
+ try:
36
+ self._memory = AsyncDB("memcache", params=params)
37
+ except Exception as err:
38
+ self.logger.exception(err)
39
+
40
+ def output(self):
41
+ return self._result
42
+
43
+ @property
44
+ def result(self):
45
+ return self._result
46
+
47
+ @result.setter
48
+ def result(self, value):
49
+ self._result = value
50
+
51
+ @property
52
+ def input(self):
53
+ if isinstance(self._component, list):
54
+ # TODO: get an array the results from different components
55
+ result = []
56
+ for component in self._component:
57
+ if component:
58
+ result.append(component.output())
59
+ if len(result) == 1:
60
+ return result[0]
61
+ else:
62
+ return result
63
+ elif self._component:
64
+ if self._input_result is not None:
65
+ return self._input_result
66
+ return self._component.output()
67
+ else:
68
+ return self._input_result
69
+
70
+ @input.setter
71
+ def input(self, value: Any):
72
+ self._input_result = value
73
+
74
+ @property
75
+ def previous(self):
76
+ if self._component is not None:
77
+ return self._component
78
+ elif self._input_result is not None:
79
+ return self # result data is already on component
80
+ else:
81
+ return None
82
+
83
+ async def close(self):
84
+ try:
85
+ await self._memory.close()
86
+ except Exception: # pylint: disable=W0718
87
+ pass