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,117 @@
1
+ import asyncio
2
+ from collections.abc import Callable
3
+ import pandas as pd
4
+ from ..exceptions import ComponentError, DataNotFound, TaskError
5
+ from .flow import FlowComponent
6
+ from ..interfaces import DBSupport
7
+
8
+
9
+ class tAutoincrement(DBSupport, FlowComponent):
10
+ """
11
+ tAutoincrement
12
+
13
+ Overview
14
+
15
+ The `tAutoincrement` component is designed to automatically increment values in a specific column of a dataset.
16
+ This is particularly useful when you need to fill in missing (null) values in a column with unique, sequential
17
+ integers starting from the maximum value currently present in the column.
18
+
19
+ Properties
20
+
21
+ .. table:: Properties
22
+ :widths: auto
23
+
24
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
25
+ | Name | Required | Type | Description |
26
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
27
+ | datasource | Yes | str | The datasource name (e.g., schema name) where the dataset is located. |
28
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
29
+ | dataset | Yes | str | The name of the dataset (e.g., table name) to work on. |
30
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
31
+ | column | Yes | str | The name of the column in which values will be auto-incremented. |
32
+ +------------------+----------+-----------+--------------------------------------------------------------------------------------+
33
+
34
+ Return
35
+
36
+ Returns the dataframe with the given column and its auto-incremented sequence.
37
+
38
+
39
+
40
+ Example:
41
+
42
+ ```yaml
43
+ tAutoincrement:
44
+ skipError: skip
45
+ datasource: pokemon
46
+ dataset: districts
47
+ column: district_id
48
+ description: Auto-increment district_id for new districts
49
+ ```
50
+
51
+ """ # noqa
52
+
53
+ def __init__(
54
+ self,
55
+ loop: asyncio.AbstractEventLoop = None,
56
+ job: Callable = None,
57
+ stat: Callable = None,
58
+ **kwargs,
59
+ ) -> None:
60
+ """Init Method."""
61
+ self.datasource: str = None
62
+ self.dataset: str = None
63
+ self.column: str = None
64
+ self.pd_args = kwargs.pop("pd_args", {})
65
+ super(tAutoincrement, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
66
+
67
+ async def start(self, **kwargs):
68
+ """Start method."""
69
+ if not self.datasource:
70
+ raise TaskError("Missing *datasource* parameter.")
71
+ if not self.dataset:
72
+ raise TaskError("Missing *dataset* parameter.")
73
+ if not self.column:
74
+ raise TaskError("Missing *column* parameter.")
75
+
76
+ # Set the DataFrame if provided via kwargs
77
+ self.data = kwargs.get('data', None)
78
+ if self.data is None and hasattr(self, 'previous'):
79
+ self.data = self.previous.output()
80
+
81
+ if self.data is None:
82
+ raise ComponentError(
83
+ "No input DataFrame provided to tAutoincrement component."
84
+ )
85
+ await super().start(**kwargs)
86
+ self.processing_credentials()
87
+ return True
88
+
89
+ async def run(self):
90
+ """Run method to fetch the max value and auto-increment."""
91
+ # Establishing the connection
92
+ self.connection = self.pg_connection()
93
+ try:
94
+ async with await self.connection.connection() as conn:
95
+ query = f"SELECT MAX({self.column}) as alias_column FROM {self.datasource}.{self.dataset};"
96
+ result = await conn.fetchval(query)
97
+ if result is None:
98
+ result = 0
99
+ self._logger.info(f"Executing query: {query} MAX: {result}")
100
+ # Incrementing and assigning the values to null columns
101
+ if self.data.empty:
102
+ raise DataNotFound("Input DataFrame is empty.")
103
+
104
+ mask = self.data[self.column].isnull()
105
+ self.data.loc[mask, self.column] = range(result + 1, result + 1 + mask.sum())
106
+ self._result = self.data
107
+
108
+ except Exception as ex:
109
+ raise ComponentError(f"Error in tAutoincrement: {str(ex)}") from ex
110
+
111
+ finally:
112
+ self.connection = None
113
+
114
+ return True
115
+
116
+ async def close(self):
117
+ pass
@@ -0,0 +1,109 @@
1
+ import asyncio
2
+ from typing import Any
3
+ from collections.abc import Callable
4
+ import pandas
5
+ from ..exceptions import ComponentError, DataNotFound
6
+ from .flow import FlowComponent
7
+
8
+
9
+ class tConcat(FlowComponent):
10
+ """
11
+ tConcat
12
+
13
+ Overview
14
+
15
+ The tConcat class is a component for merging (concatenating) two DataFrames along a specified axis.
16
+ It supports handling multiple DataFrames and configurable options for the concatenation, with metrics
17
+ tracking for input and output row counts.
18
+
19
+ .. table:: Properties
20
+ :widths: auto
21
+
22
+ +----------------+----------+-----------+---------------------------------------------------------------+
23
+ | Name | Required | Summary |
24
+ +----------------+----------+-----------+---------------------------------------------------------------+
25
+ | df1 | Yes | The first DataFrame to concatenate. |
26
+ +----------------+----------+-----------+---------------------------------------------------------------+
27
+ | df2 | Yes | The second DataFrame to concatenate. |
28
+ +----------------+----------+-----------+---------------------------------------------------------------+
29
+ | args | No | Dictionary of arguments to pass to `pandas.concat`, such as `axis`. |
30
+ +----------------+----------+-----------+---------------------------------------------------------------+
31
+
32
+ Returns
33
+
34
+ This component returns a concatenated DataFrame based on the specified axis and additional arguments.
35
+ Metrics are recorded for the row counts of both input DataFrames and the final concatenated DataFrame.
36
+ If either DataFrame is missing or empty, an error is raised with a descriptive message.
37
+
38
+
39
+ Example:
40
+
41
+ ```yaml
42
+ tConcat:
43
+ depends:
44
+ - TransformRows_8
45
+ - TransformRows_15
46
+ args:
47
+ axis: 0
48
+ ```
49
+
50
+ """ # noqa
51
+
52
+ def __init__(
53
+ self,
54
+ loop: asyncio.AbstractEventLoop = None,
55
+ job: Callable = None,
56
+ stat: Callable = None,
57
+ **kwargs,
58
+ ):
59
+ """Init Method."""
60
+ self.df1: Any = None
61
+ self.df2: Any = None
62
+ self.type = None
63
+ super(tConcat, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
64
+
65
+ async def start(self, **kwargs):
66
+ """Obtain Pandas Dataframe.
67
+ TODO: iterate over all dataframes.
68
+ """
69
+ if self._multi:
70
+ self.df1 = self.previous[0].output()
71
+ self.df2 = self.previous[1].output()
72
+ return True
73
+
74
+ async def run(self):
75
+ args = {}
76
+ if self.df1.empty:
77
+ raise DataNotFound("Data Was Not Found on Dataframe 1")
78
+ elif self.df2 is None or self.df2.empty:
79
+ raise DataNotFound("Data Was Not Found on Dataframe 2")
80
+ if hasattr(self, "args") and isinstance(self.args, dict):
81
+ args = {**args, **self.args}
82
+ if "axis" not in args:
83
+ args["axis"] = 1
84
+ # Adding Metrics:
85
+ _left = len(self.df1.index)
86
+ self.add_metric("LEFT: ", _left)
87
+ _right = len(self.df2.index)
88
+ self.add_metric("RIGHT: ", _right)
89
+ # Concat two dataframes
90
+ try:
91
+ df = pandas.concat([self.df1, self.df2], **args)
92
+ except Exception as err:
93
+ raise ComponentError(
94
+ f"Error Merging Dataframes: {err}"
95
+ ) from err
96
+ numrows = len(df.index)
97
+ if numrows == 0:
98
+ raise DataNotFound(
99
+ "Concat: Cannot make any Merge"
100
+ )
101
+ self._variables[f"{self.StepName}_NUMROWS"] = numrows
102
+ self.add_metric("JOINED: ", numrows)
103
+ df.is_copy = None
104
+ print(df)
105
+ self._result = df
106
+ return self._result
107
+
108
+ async def close(self):
109
+ pass
@@ -0,0 +1,119 @@
1
+ import asyncio
2
+ from typing import Any
3
+ from collections.abc import Callable
4
+ import pandas
5
+ from pandas import json_normalize
6
+ from ..exceptions import ComponentError, DataNotFound
7
+ from .flow import FlowComponent
8
+
9
+
10
+ class tExplode(FlowComponent):
11
+ """
12
+ tExplode
13
+
14
+ Overview
15
+
16
+ The tExplode class is a component for transforming a DataFrame by converting a column of lists or dictionaries
17
+ into multiple rows. It supports options for dropping the original column after exploding, and for expanding
18
+ nested dictionary structures into separate columns.
19
+
20
+ .. table:: Properties
21
+ :widths: auto
22
+
23
+ +----------------+----------+-----------+-------------------------------------------------------------------------------+
24
+ | Name | Required | Summary |
25
+ +----------------+----------+-----------+-------------------------------------------------------------------------------+
26
+ | column | Yes | The name of the column to explode into multiple rows. |
27
+ +----------------+----------+-----------+-------------------------------------------------------------------------------+
28
+ | drop_original | No | Boolean indicating if the original column should be dropped after exploding. |
29
+ +----------------+----------+-----------+-------------------------------------------------------------------------------+
30
+ | explode_dataset| No | Boolean specifying if nested dictionaries in the column should be expanded as new columns.|
31
+ +----------------+----------+-----------+-------------------------------------------------------------------------------+
32
+
33
+ Returns
34
+
35
+ This component returns a DataFrame with the specified column exploded into multiple rows. If `explode_dataset` is
36
+ set to True and the column contains dictionaries, these are expanded into new columns. Metrics on the row count
37
+ after explosion are recorded, and any errors encountered during processing are logged and raised as exceptions.
38
+
39
+
40
+ Example:
41
+
42
+ ```yaml
43
+ tExplode:
44
+ column: reviews
45
+ drop_original: false
46
+ ```
47
+
48
+ """ # noqa
49
+
50
+ def __init__(
51
+ self,
52
+ loop: asyncio.AbstractEventLoop = None,
53
+ job: Callable = None,
54
+ stat: Callable = None,
55
+ **kwargs,
56
+ ):
57
+ """Init Method."""
58
+ self.data: Any = None
59
+ # Column to be exploded
60
+ self.column: str = kwargs.pop("column", None)
61
+ self.drop_original: bool = kwargs.pop("drop_original", False)
62
+ # Useful when exploded column is also composed of dictionary, the dictionary
63
+ # is also exploded as columns
64
+ self.explode_dataset: bool = kwargs.pop("explode_dataset", True)
65
+ super(tExplode, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
66
+
67
+ async def start(self, **kwargs):
68
+ # Si lo que llega no es un DataFrame de Pandas se cancela la tarea
69
+ if self.previous:
70
+ self.data = self.input
71
+ else:
72
+ raise ComponentError("Data Not Found", status=404)
73
+ if not isinstance(self.data, pandas.DataFrame):
74
+ raise ComponentError("Incompatible Pandas Dataframe", status=404)
75
+ return True
76
+
77
+ async def run(self):
78
+ args = {}
79
+ if self.data.empty:
80
+ raise DataNotFound("Data Was Not Found on Dataframe 1")
81
+
82
+ # Explode the Rows:
83
+ try:
84
+ # Step 1: Explode the 'field' column
85
+ exploded_df = self.data.explode(self.column)
86
+ # Reset index to ensure it's unique
87
+ exploded_df = exploded_df.reset_index(drop=True)
88
+ if self.explode_dataset is True:
89
+ # Step 2: Normalize the JSON data in 'exploded' col
90
+ # This will create a new DataFrame where each dictionary key becomes a column
91
+ data_df = json_normalize(exploded_df[self.column])
92
+ # Step 3: Concatenate with the original DataFrame
93
+ # Drop the original column from exploded_df and join with data_df
94
+ if self.drop_original is True:
95
+ exploded_df.drop(self.column, axis=1)
96
+ df = pandas.concat([exploded_df, data_df], axis=1)
97
+ else:
98
+ df = exploded_df
99
+ except Exception as err:
100
+ raise ComponentError(f"Error Merging Dataframes: {err}") from err
101
+ numrows = len(df.index)
102
+ if numrows == 0:
103
+ raise DataNotFound("Concat: Cannot make any Explode")
104
+ if hasattr(self, "index"):
105
+ df[self.index] = df["id"]
106
+ df.drop("id", axis="columns", inplace=True)
107
+ self._variables[f"{self.StepName}_NUMROWS"] = numrows
108
+ self.add_metric("EXPLODE: ", numrows)
109
+ df.is_copy = None
110
+ print(df)
111
+ self._result = df
112
+ if self._debug is True:
113
+ print("::: Printing Column Information === ")
114
+ for column, t in df.dtypes.items():
115
+ print(column, "->", t, "->", df[column].iloc[0])
116
+ return self._result
117
+
118
+ async def close(self):
119
+ pass
@@ -0,0 +1,184 @@
1
+ import asyncio
2
+ from collections.abc import Callable
3
+ import re
4
+ import pandas as pd
5
+ import numpy as np
6
+ from querysource.types.dt import filters as qsffunctions
7
+ from querysource.queries.multi.operators.filter.flt import (
8
+ create_filter,
9
+ valid_operators
10
+ )
11
+ from .FilterRows import functions as dffunctions
12
+ # create_filter
13
+ from ..exceptions import (
14
+ ConfigError,
15
+ ComponentError,
16
+ DataNotFound
17
+ )
18
+ from .flow import FlowComponent
19
+
20
+
21
+ class tFilter(FlowComponent):
22
+ """
23
+ tFilter
24
+
25
+ Overview
26
+
27
+ The tFilter class is a component that applies specified filters to a Pandas DataFrame.
28
+ It allows filtering rows based on multiple conditions and expressions, enabling targeted
29
+ data extraction within a task flow.
30
+
31
+ .. table:: Properties
32
+ :widths: auto
33
+
34
+ +--------------+----------+-----------+---------------------------------------------------------------+
35
+ | Name | Required | Summary |
36
+ +--------------+----------+-----------+---------------------------------------------------------------+
37
+ | operator | Yes | Logical operator (e.g., `and`, `or`) used to combine filter conditions. |
38
+ +--------------+----------+-----------+---------------------------------------------------------------+
39
+ | conditions | Yes | List of conditions with columns, values, and expressions for filtering. |
40
+ | | | Format: `{ "column": <col_name>, "value": <val>, "expression": <expr> }` |
41
+ +--------------+----------+-----------+---------------------------------------------------------------+
42
+
43
+ Returns
44
+
45
+ This component returns a filtered Pandas DataFrame based on the provided conditions.
46
+ The component tracks metrics
47
+ such as the initial and filtered row counts, and optionally limits the returned columns if specified.
48
+ Additional debugging information can be outputted based on configuration.
49
+
50
+
51
+ Example:
52
+
53
+ ```yaml
54
+ tFilter:
55
+ operator: '&'
56
+ filter:
57
+ - column: ClientId
58
+ value:
59
+ - 11076
60
+ expression: ==
61
+ ```
62
+
63
+ """ # noqa
64
+
65
+ def __init__(
66
+ self,
67
+ loop: asyncio.AbstractEventLoop = None,
68
+ job: Callable = None,
69
+ stat: Callable = None,
70
+ **kwargs,
71
+ ):
72
+ """Init Method."""
73
+ self.condition: str = ""
74
+ self.fields: dict = kwargs.pop('fields', {})
75
+ self.operator = kwargs.pop('operator', '&')
76
+ self.filter = kwargs.pop('filter', [])
77
+ self.filter_conditions: dict = {}
78
+ super(tFilter, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
79
+
80
+ async def start(self, **kwargs):
81
+ # Si lo que llega no es un DataFrame de Pandas se cancela la tarea
82
+ if self.previous:
83
+ self.data = self.input
84
+ else:
85
+ raise ComponentError("Data Not Found")
86
+ if not isinstance(self.data, pd.DataFrame):
87
+ raise ComponentError("Incompatible Pandas Dataframe")
88
+ return True
89
+
90
+ async def close(self):
91
+ pass
92
+
93
+ def _filter_conditions(self, df: pd.DataFrame) -> pd.DataFrame:
94
+ it = df.copy()
95
+ for ft, args in self.filter_conditions.items():
96
+ self._applied.append(f"Filter: {ft!s} args: {args}")
97
+ try:
98
+ try:
99
+ func = getattr(qsffunctions, ft)
100
+ except AttributeError:
101
+ try:
102
+ func = getattr(dffunctions, ft)
103
+ except AttributeError:
104
+ func = globals()[ft]
105
+ if callable(func):
106
+ it = func(it, **args)
107
+ except Exception as err:
108
+ print(f"Error on {ft}: {err}")
109
+ df = it
110
+ if df is None or df.empty:
111
+ raise DataNotFound(
112
+ "No Data was Found after Filtering."
113
+ )
114
+ return df
115
+
116
+ def _filter_fields(self, df: pd.DataFrame) -> pd.DataFrame:
117
+ for column, value in self.fields.items():
118
+ if column in df.columns:
119
+ if isinstance(value, list):
120
+ for v in value:
121
+ df = df[df[column] == v]
122
+ else:
123
+ df = df[df[column] == value]
124
+ return df
125
+
126
+ async def run(self):
127
+ self.add_metric("STARTED_ROWS", len(self.data.index))
128
+ df = self.data.copy()
129
+ # iterate over all filtering conditions:
130
+ df = self._filter_conditions(df)
131
+ # Applying filter expressions by Column:
132
+ if self.fields:
133
+ df = self._filter_fields()
134
+ if self.filter:
135
+ # conditions = self._create_filter()
136
+ conditions = create_filter(self.filter, df)
137
+ # Joining all conditions
138
+ self.condition = f" {self.operator} ".join(conditions)
139
+ self._logger.notice(
140
+ f"Filter conditions >> {self.condition}"
141
+ )
142
+ df = df.loc[
143
+ eval(self.condition)
144
+ ] # pylint: disable=W0123
145
+ if df is None or df.empty:
146
+ raise DataNotFound(
147
+ "No Data was Found after Filtering."
148
+ )
149
+ self._result = df
150
+ # print(": Filtered : ")
151
+ # print(self._result)
152
+ self.add_metric(
153
+ "FILTERED_ROWS", len(self._result.index)
154
+ )
155
+ # Calculate the rejected rows between self.data and df dataframe:
156
+ self.add_metric(
157
+ "REJECTED_ROWS", len(self.data.index) - len(self._result.index)
158
+ )
159
+ if hasattr(self, "save_rejected"):
160
+ # Identify the indices of the rows that were removed
161
+ removed_indices = set(self.data.index) - set(self._result.index)
162
+ # Select these rows from the original DataFrame
163
+ rejected = self.data.loc[list(removed_indices)]
164
+ filename = self.mask_replacement(
165
+ self.save_rejected.get("filename", "rejected_rows.csv")
166
+ )
167
+ try:
168
+ rejected.to_csv(filename, sep="|")
169
+ except IOError:
170
+ self._logger.warning(f"Error writing Rejectd File: {filename}")
171
+ self.add_metric(
172
+ "rejected_file", filename
173
+ )
174
+ if hasattr(self, "columns"):
175
+ # returning only a subset of data
176
+ self._result = self._result[self.columns]
177
+ if self._debug is True:
178
+ print("::: Printing Column Information === ")
179
+ for column, t in self._result.dtypes.items():
180
+ print(column, "->", t, "->", self._result[column].iloc[0])
181
+ self.add_metric(
182
+ "FILTERED_COLS", len(self._result.columns)
183
+ )
184
+ return self._result