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,312 @@
1
+ import asyncio
2
+
3
+ # logging system
4
+ import logging
5
+ import datetime
6
+ from decimal import Decimal
7
+ from typing import Any
8
+ from collections.abc import Callable
9
+ import pandas as pd
10
+ import numpy as np
11
+ from asyncdb.exceptions import NoDataFound
12
+ from asyncdb.models import Model
13
+ from asyncdb.drivers.pg import pg
14
+
15
+ # for database
16
+ from querysource.conf import (
17
+ sqlalchemy_url,
18
+ default_dsn,
19
+ DB_STATEMENT_TIMEOUT,
20
+ DB_SESSION_TIMEOUT,
21
+ DB_KEEPALIVE_IDLE,
22
+ )
23
+ from sqlalchemy.orm import Session
24
+ from sqlalchemy import create_engine, text
25
+ from sqlalchemy.pool import NullPool
26
+ from ..exceptions import ComponentError, DataNotFound
27
+ from ..utils import AttrDict
28
+ from .flow import FlowComponent
29
+ from ..interfaces.qs import QSSupport
30
+
31
+
32
+ dtypes = {
33
+ "varchar": str,
34
+ "string": str,
35
+ "object": str,
36
+ "int": int,
37
+ "int4": int,
38
+ "int64": int,
39
+ "uint64": int,
40
+ "Int64Dtype": np.int64,
41
+ "Int64": int,
42
+ "Int32": int,
43
+ "Int16": int,
44
+ "Int8": int,
45
+ "float64": Decimal,
46
+ "float": Decimal,
47
+ "bool": bool,
48
+ "datetime64[ns]": datetime.datetime,
49
+ "datetime64[ns, UTC]": datetime.datetime,
50
+ }
51
+
52
+
53
+ class TableDelete(QSSupport, FlowComponent):
54
+ """
55
+ TableDelete
56
+
57
+ Overview
58
+
59
+ The TableDelete class is a component for deleting rows from a SQL table based on specified primary keys. It uses
60
+ Pandas DataFrames to identify rows to delete and performs the deletion using SQLAlchemy and asyncpg.
61
+
62
+ .. table:: Properties
63
+ :widths: auto
64
+
65
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
66
+ | Name | Required | Description |
67
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
68
+ | flavor | No | The database flavor, defaults to "postgresql". |
69
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
70
+ | pk | Yes | A list of primary key columns to identify rows for deletion. |
71
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
72
+ | data | Yes | The data containing rows to be deleted, can be a Pandas DataFrame or other supported format. |
73
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
74
+ | _engine | No | The SQLAlchemy engine for database connections. |
75
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
76
+ | tablename | Yes | The name of the table from which rows will be deleted. |
77
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
78
+ | schema | No | The schema name, defaults to an empty string. |
79
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
80
+ | _dsn | No | The Data Source Name for the database connection. |
81
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
82
+ | multi | No | A flag indicating if multiple DataFrame deletions are supported, defaults to False. |
83
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
84
+
85
+ Return
86
+
87
+ The methods in this class manage the deletion of rows from a SQL table based on primary keys, including initialization,
88
+ execution, and result handling. It ensures proper handling of database connections and provides metrics on the deleted rows.
89
+
90
+
91
+
92
+ Example:
93
+
94
+ ```yaml
95
+ TableDelete:
96
+ tablename: totem_heartbeats
97
+ flavor: postgres
98
+ schema: banco_chile
99
+ pk:
100
+ - hearbeat_id
101
+ ```
102
+
103
+ """ # noqa
104
+
105
+ flavor: str = "postgresql"
106
+
107
+ def __init__(
108
+ self,
109
+ loop: asyncio.AbstractEventLoop = None,
110
+ job: Callable = None,
111
+ stat: Callable = None,
112
+ **kwargs,
113
+ ):
114
+ self.pk = []
115
+ self.data: Any = None
116
+ self._engine = None
117
+ self.tablename = ""
118
+ self.schema = ""
119
+ dsn = kwargs.get('dsn', '')
120
+ if dsn and dsn.startswith('postgres:'):
121
+ dsn = dsn.replace('postgres:', 'postgresql:')
122
+ self._dsn = self.get_config_value(dsn, dsn)
123
+ self.multi = bool(kwargs.pop('multi', False))
124
+ self._driver: str = kwargs.pop('driver', 'pg')
125
+ super(TableDelete, self).__init__(
126
+ loop=loop,
127
+ job=job,
128
+ stat=stat,
129
+ **kwargs
130
+ )
131
+
132
+ def get_engine(self, dsn: str = None):
133
+ if not dsn:
134
+ dsn = sqlalchemy_url
135
+ try:
136
+ self._engine = create_engine(dsn, echo=False, poolclass=NullPool)
137
+ self._session = Session(bind=self._engine)
138
+ except Exception as err:
139
+ logging.exception(err)
140
+
141
+ async def start(self, **kwargs):
142
+ """Get Pandas Dataframe."""
143
+ self.data = None
144
+ if self.previous:
145
+ self.data = self.input
146
+ else:
147
+ raise NoDataFound("TableDelete: Data missing")
148
+ await super().start(**kwargs)
149
+ try:
150
+ # getting sqlAlchemy engine
151
+ self.get_engine(dsn=self._dsn)
152
+ except Exception as err:
153
+ raise ComponentError(f"Connection Error: {err}") from err
154
+ if self.data is None:
155
+ raise NoDataFound("TableDelete: Data missing")
156
+ elif isinstance(self.data, pd.DataFrame):
157
+ # detect data type for colums
158
+ columns = list(self.data.columns)
159
+ for column in columns:
160
+ t = self.data[column].dtype
161
+ if isinstance(t, pd.core.dtypes.dtypes.DatetimeTZDtype):
162
+ self.data[column] = pd.to_datetime(
163
+ self.data[column],
164
+ format="%Y-%m-%dT%H:%M:%S.%f%z",
165
+ cache=True,
166
+ utc=True,
167
+ )
168
+ self.data[column].dt.tz_convert("UTC")
169
+ elif str(t) == "datetime64[ns]":
170
+ tmp_data = self.data.copy()
171
+ tmp_data[column] = pd.to_datetime(
172
+ self.data[column],
173
+ format="%Y-%m-%dT%H:%M:%S.%f%z",
174
+ cache=True,
175
+ utc=True,
176
+ )
177
+ self.data = tmp_data.copy()
178
+ elif self.multi is True:
179
+ # iteration over every Pandas DT:
180
+ try:
181
+ result = self.data.items()
182
+ except Exception as err:
183
+ raise ComponentError(
184
+ "Invalid Result type for Attribute Multiple: {err}"
185
+ ) from err
186
+ for name, rs in result:
187
+ el = getattr(self, name)
188
+ if not isinstance(rs, pd.DataFrame):
189
+ raise ComponentError("Invalid Resultset: not a Dataframe")
190
+ else:
191
+ # incompatible datasource:
192
+ raise DataNotFound("TableDelete: Incompatible Data Source")
193
+
194
+ async def close(self):
195
+ """Closing Operations."""
196
+ if self._engine:
197
+ try:
198
+ self._engine.dispose()
199
+ except Exception:
200
+ pass
201
+
202
+ async def table_delete(self, elem, df):
203
+ """Running the process of Upsert-delete."""
204
+ pk = elem.pk
205
+ options = {
206
+ "if_exists": "append",
207
+ "index_label": pk,
208
+ "index": False,
209
+ "method": "multi",
210
+ }
211
+ if hasattr(elem, "sql_options"):
212
+ options = {**options, **elem.sql_options}
213
+ tablename = elem.tablename
214
+ try:
215
+ schema_name = elem.schema
216
+ except AttributeError:
217
+ schema_name = "public"
218
+ options["schema"] = schema_name
219
+ cols = []
220
+ for field in pk:
221
+ datatype = df.dtypes[field]
222
+
223
+ t = dtypes[f"{datatype!s}"]
224
+ f = (field, t)
225
+ cols.append(f)
226
+ # make a intermediate model:
227
+ try:
228
+ cls = Model.make_model(
229
+ name=f"{tablename!s}_deleted", schema=schema_name, fields=cols
230
+ )
231
+ except Exception as err:
232
+ logging.exception(
233
+ f"TableDelete: Error creating DB Model for {tablename}: {err}"
234
+ )
235
+ return False
236
+ result = None
237
+ if sql := cls.model(dialect="sql"):
238
+ print("SQL is: ", sql)
239
+ deltable = text(
240
+ f"DROP TABLE IF EXISTS {schema_name}.{tablename!s}_deleted;"
241
+ )
242
+ qry = text(sql)
243
+ try:
244
+ with self._engine.begin() as connection:
245
+ connection.execute(deltable)
246
+ result = connection.execute(qry)
247
+ logging.debug(f"Created Temp Table: {cls!s}")
248
+ except Exception as error:
249
+ raise ComponentError(f"Error on Table creation: {error}") from error
250
+ else:
251
+ raise ComponentError("Cannot Create TEMP Table")
252
+
253
+ # table exists: copy data into table:
254
+ new = df[pk].copy()
255
+ with self._engine.begin() as connection:
256
+ new.to_sql(f"{tablename!s}_deleted", con=connection, **options)
257
+ # data is on temp Table, deleted
258
+ columns = ", ".join(pk)
259
+ # TODO: using an EXISTS instead IN to speed-up delete
260
+ delete = f"""DELETE FROM {schema_name!s}.{tablename!s} WHERE ({columns})
261
+ IN (SELECT {columns} FROM {schema_name}.{tablename!s}_deleted)"""
262
+ print(delete)
263
+ connection = await self.create_connection()
264
+ try:
265
+ async with await connection.connection() as conn:
266
+ try:
267
+ result, error = await conn.execute(sentence=delete)
268
+ print("TableDelete: ", result)
269
+ self.add_metric("TABLE_DELETED", result)
270
+ if error:
271
+ raise ComponentError(
272
+ f"Error Deleting Data: {error}"
273
+ )
274
+ if error:
275
+ raise ComponentError(
276
+ f"Error on TableDelete: {error}"
277
+ )
278
+ except Exception as err:
279
+ logging.error(err)
280
+ finally:
281
+ # at now, delete the table:
282
+ drop = f"DROP TABLE IF EXISTS {schema_name}.{tablename!s}_deleted"
283
+ result, error = await conn.execute(sentence=drop)
284
+ finally:
285
+ await connection.close()
286
+
287
+ async def run(self):
288
+ """Run TableDelete."""
289
+ if self.multi is False:
290
+ # set the number of rows:
291
+ numrows = len(self.data.index)
292
+ self._variables[f"{self.StepName}_NUMROWS"] = numrows
293
+ await self.table_delete(self, self.data)
294
+ self._result = self.data
295
+ return True
296
+ else:
297
+ # running in multi Mode
298
+ try:
299
+ result = self.data.items()
300
+ except Exception as err:
301
+ raise ComponentError(
302
+ "Invalid Result type for Attribute Multiple: {err}"
303
+ ) from err
304
+ for name, rs in result:
305
+ try:
306
+ el = getattr(self, name)
307
+ except AttributeError:
308
+ continue
309
+ await self.table_delete(AttrDict(el), rs)
310
+ # return the same dataframe
311
+ self._result = self.data
312
+ return True
@@ -0,0 +1,143 @@
1
+ from decimal import Decimal
2
+ import datetime
3
+ import dask.dataframe as dd
4
+ import pandas
5
+ import numpy as np
6
+ from ..exceptions import DataNotFound
7
+ from .TableBase import TableBase
8
+
9
+ dtypes = {
10
+ "varchar": str,
11
+ "string": str,
12
+ "object": str,
13
+ "int": int,
14
+ "int4": int,
15
+ "int64": np.int64,
16
+ "uint64": np.int64,
17
+ "Int64Dtype": np.int64,
18
+ "Int64": np.int64,
19
+ "Int8": int,
20
+ "float64": Decimal,
21
+ "float": Decimal,
22
+ "bool": bool,
23
+ "datetime64[ns]": datetime.datetime,
24
+ "datetime64[ns, UTC]": datetime.datetime,
25
+ }
26
+
27
+
28
+ class TableInput(TableBase):
29
+ """
30
+ TableInput
31
+
32
+ Overview
33
+
34
+ The TableInput class is a component for loading data from a SQL table or custom SQL query into a Pandas DataFrame.
35
+ It supports large tables by utilizing Dask for partitioned loading, along with options for column trimming,
36
+ primary key setting, and removal of empty rows or columns.
37
+
38
+ .. table:: Properties
39
+ :widths: auto
40
+
41
+ +----------------+----------+-----------+-------------------------------------------------------------------+
42
+ | Name | Required | Summary |
43
+ +----------------+----------+-----------+-------------------------------------------------------------------+
44
+ | tablename | Yes | The name of the SQL table to load into a DataFrame. |
45
+ +----------------+----------+-----------+-------------------------------------------------------------------+
46
+ | schema | No | Database schema where the table is located, if applicable. |
47
+ +----------------+----------+-----------+-------------------------------------------------------------------+
48
+ | query | No | SQL query string to load data if `tablename` is not used. |
49
+ +----------------+----------+-----------+-------------------------------------------------------------------+
50
+ | chunksize | No | Number of rows per chunk when reading data in chunks. |
51
+ +----------------+----------+-----------+-------------------------------------------------------------------+
52
+ | bigfile | No | Boolean indicating if Dask should be used for large tables. |
53
+ +----------------+----------+-----------+-------------------------------------------------------------------+
54
+ | drop_empty | No | Boolean to drop columns and rows with only null values. |
55
+ +----------------+----------+-----------+-------------------------------------------------------------------+
56
+ | trim | No | Boolean to trim whitespace from string columns. |
57
+ +----------------+----------+-----------+-------------------------------------------------------------------+
58
+ | pk | No | Dictionary specifying primary key columns and settings for DataFrame indexing.|
59
+ +----------------+----------+-----------+-------------------------------------------------------------------+
60
+
61
+ Returns
62
+
63
+ This component returns a DataFrame populated with data from the specified SQL table or query. If `drop_empty` is set,
64
+ columns and rows with only null values are removed. Metrics such as row and column counts are recorded, along with
65
+ information on the table or query used for data extraction. If no data is found, a `DataNotFound` exception is raised.
66
+
67
+
68
+ Example:
69
+
70
+ ```yaml
71
+ TableInput:
72
+ tablename: sales_raw
73
+ schema: epson
74
+ chunksize: 1000
75
+ pk:
76
+ columns:
77
+ - sales_id
78
+ ```
79
+
80
+ """
81
+
82
+
83
+ async def run(self):
84
+ df = None
85
+ if hasattr(self, "tablename"): # getting a direct Table
86
+ # run table to pandas
87
+ if hasattr(self, "bigfile"):
88
+ dk = dd.read_sql_table(
89
+ self.tablename,
90
+ self._engine,
91
+ npartitions=10,
92
+ head_rows=100,
93
+ **self.params,
94
+ )
95
+ df = dk.compute()
96
+ else:
97
+ tp = pandas.read_sql_table(
98
+ self.tablename,
99
+ self._engine,
100
+ schema=self.schema,
101
+ chunksize=self.chunksize,
102
+ **self.params,
103
+ )
104
+ df = pandas.concat(tp, ignore_index=True)
105
+ elif self.query:
106
+ # run the query to pandas
107
+ tp = pandas.read_sql_query(
108
+ self.query, self._engine, chunksize=self.chunksize, **self.params
109
+ )
110
+ df = pandas.concat(tp, ignore_index=True)
111
+ else:
112
+ return False
113
+ if df is None or df.empty:
114
+ raise DataNotFound("TableInput: Empty Dataframe")
115
+ # removing empty cols
116
+ if hasattr(self, "drop_empty"):
117
+ df.dropna(axis=1, how="all", inplace=True)
118
+ df.dropna(axis=0, how="all", inplace=True)
119
+ if hasattr(self, "trim"):
120
+ u = df.select_dtypes(include=["object", "string"])
121
+ df[u.columns] = df[u.columns].astype(str).str.strip()
122
+ # define the primary keys for DataFrame
123
+ if hasattr(self, "pk"):
124
+ try:
125
+ columns = self.pk["columns"]
126
+ del self.pk["columns"]
127
+ df.reset_index().set_index(columns, inplace=True, drop=False, **self.pk)
128
+ except Exception as err: # pylint: disable=W0703
129
+ self._logger.exception(f"TableInput: {err}")
130
+ self._result = df
131
+ numrows = len(df.index)
132
+ self._variables["_numRows_"] = numrows
133
+ self._variables[f"{self.StepName}_NUMROWS"] = numrows
134
+ self.add_metric("NUM_ROWS", df.shape[0])
135
+ self.add_metric("NUM_COLUMNS", df.shape[1])
136
+ if hasattr(self, "tablename"):
137
+ self.add_metric("Table", self.tablename)
138
+ self.add_metric("Schema", self.schema)
139
+ else:
140
+ self.add_metric("Query", self.query)
141
+ ## result
142
+ self._result = df
143
+ return self._result