flowtask 5.8.4__cp310-cp310-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-310-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-310-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-310-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-310-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-310-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-310-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-310-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-310-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-310-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,352 @@
1
+ import asyncio
2
+ from collections.abc import Callable
3
+ from pathlib import Path
4
+ import numpy as np
5
+ import pandas as pd
6
+ from asyncdb.exceptions import NoDataFound
7
+ from ..exceptions import ComponentError, DataNotFound, TaskError
8
+ from ..utils import cPrint
9
+ from .flow import FlowComponent
10
+ from ..conf import TASK_PATH
11
+ from ..interfaces import DBSupport, TemplateSupport
12
+
13
+
14
+ class AddDataset(DBSupport, FlowComponent, TemplateSupport):
15
+ """
16
+ AddDataset Component
17
+
18
+ Overview
19
+
20
+ This component joins two pandas DataFrames based on specified criteria.
21
+ It supports various join types and handles cases where one of the DataFrames might be empty.
22
+
23
+ .. table:: Properties
24
+ :widths: auto
25
+
26
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
27
+ | Name | Required | Summary |
28
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
29
+ | fields | Yes | List of field names to retrieve from the second dataset |
30
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
31
+ | dataset | Yes | Name of the second dataset to retrieve |
32
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
33
+ | datasource | No | Source of the second dataset ("datasets" or "vision") (default: "datasets") |
34
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
35
+ | join | No | List of columns to use for joining the DataFrames |
36
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
37
+ | type | No | Type of join to perform (left, inner) (default: left) |
38
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
39
+ | no_copy | No | If True, modifies original DataFrames instead of creating a copy (default: False) |
40
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
41
+ | distinct | No | If True, retrieves distinct rows based on join columns (default: False) |
42
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
43
+ | operator | No | Operator to use for joining rows (currently only "and" supported) |
44
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
45
+ | join_with | No | List of columns for a series of left joins (if main DataFrame has unmatched rows) |
46
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
47
+ | datatypes | No | Dictionary specifying data types for columns in the second dataset |
48
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
49
+ | infer_types | No | If True, attempts to infer better data types for object columns (default: False) |
50
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
51
+ | to_string | No | If True, attempts to convert object columns to strings during data type conversion (default: True) |
52
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
53
+ | as_objects | No | If True, creates resulting DataFrame with all columns as objects (default: False) |
54
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
55
+ | drop_empty | No | If True, drops columns with only missing values after join (default: False) |
56
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
57
+ | dropna | No | List of columns to remove rows with missing values after join |
58
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
59
+ | clean_strings | No | If True, replaces missing values in object/string columns with empty strings (default: False) |
60
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
61
+ | Group | No | usually used FormData |
62
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
63
+ | skipError | No | spected = skip - Log Errors - Enforce |
64
+ +---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
65
+
66
+ Returns the joined DataFrame and a metric ("JOINED_ROWS")
67
+ representing the number of rows in the result.
68
+
69
+
70
+
71
+ Example:
72
+
73
+ ```yaml
74
+ AddDataset:
75
+ datasource: banco_chile
76
+ dataset: vw_form_metadata
77
+ distinct: true
78
+ type: left
79
+ fields:
80
+ - formid
81
+ - form_name
82
+ - column_name
83
+ - description as question
84
+ join:
85
+ - formid
86
+ - column_name
87
+ ```
88
+
89
+ """ # noqa
90
+ def __init__(
91
+ self,
92
+ loop: asyncio.AbstractEventLoop = None,
93
+ job: Callable = None,
94
+ stat: Callable = None,
95
+ **kwargs,
96
+ ) -> None:
97
+ """Init Method."""
98
+ self.df1: pd.DataFrame = None
99
+ self.df2: pd.DataFrame = None
100
+ self.type: str = "left"
101
+ self._dtypes: dict = {}
102
+ self.infer_types: bool = False
103
+ self.to_string: bool = True
104
+ self.as_objects: bool = False
105
+ self.use_dataframe: bool = kwargs.pop("use_dataframe", False)
106
+ self.datasource: str = kwargs.pop("datasource", "datasets")
107
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
108
+ self._no_warnings = True
109
+
110
+ async def start(self, **kwargs):
111
+ """Obtain Pandas Dataframe."""
112
+ if self.previous:
113
+ self.data = self.input
114
+ try:
115
+ if self._multi:
116
+ self.df1 = self.previous[0].output()
117
+ else:
118
+ self.df1 = self.previous.output()
119
+ except IndexError as ex:
120
+ raise ComponentError("Missing LEFT Dataframe") from ex
121
+ ### check info for creating the second dataset:
122
+ self.df2 = None
123
+ # check if "file_sql" exists:
124
+ if hasattr(self, "file_sql"):
125
+ file_path = Path(TASK_PATH).joinpath(self._program, "sql", self.file_sql)
126
+ if file_path.exists() and file_path.is_file():
127
+ self.query = await self.open_tmpfile(file_path)
128
+ else:
129
+ raise TaskError(
130
+ f"Missing SQL File: {file_path}"
131
+ )
132
+ elif hasattr(self, "query") and self.query:
133
+ # Check-in if query:
134
+ self.query = self.mask_replacement(
135
+ self.query
136
+ )
137
+ else:
138
+ if not hasattr(self, "fields"):
139
+ raise TaskError("Wrong Task configuration: AddDataset needs *fields* declaration.")
140
+ if not hasattr(self, "dataset"):
141
+ raise TaskError(
142
+ "Wrong Task configuration: need *dataset* name declaration."
143
+ )
144
+ if not hasattr(self, "datasource"):
145
+ self.datasource = "datasets"
146
+ await super().start(**kwargs)
147
+ self.processing_credentials()
148
+ return True
149
+
150
+ async def run(self):
151
+ args = {}
152
+ if self.df1.empty:
153
+ raise DataNotFound("Data Was Not Found on Dataframe 1")
154
+ if self.datasource in ("datasets", "vision"):
155
+ # using current datasets on pg database
156
+ connection = self.pg_connection()
157
+ else:
158
+ # TODO: add datasource logic for discovering external data.
159
+ connection = self.pg_connection()
160
+ try:
161
+ ### TODO: instrumentation for getting dataset from different sources
162
+ async with await connection.connection() as conn:
163
+ if self.use_dataframe is True:
164
+ # from list self.join (list of columns), extract the unique list from self.data
165
+ # extract a list of unique from self.data:
166
+ result = []
167
+ _filter = self.data[self.join].drop_duplicates().to_dict(orient="records")
168
+ for element in _filter:
169
+ query = self.query.format(**element)
170
+ r, error = await conn.query(query)
171
+ result.extend(r)
172
+ if not result:
173
+ raise DataNotFound(
174
+ "Empty Dataset: No data was found on query"
175
+ )
176
+ else:
177
+ fields = ", ".join(self.fields)
178
+ if hasattr(self, 'query'):
179
+ query = self.query
180
+ elif hasattr(self, "distinct"):
181
+ join = ", ".join(self.join)
182
+ query = f"SELECT DISTINCT ON ({join}) {fields} FROM {self.datasource}.{self.dataset}"
183
+ else:
184
+ query = f"SELECT {fields} FROM {self.datasource}.{self.dataset}"
185
+ self._logger.info(
186
+ f"DATASET QUERY: {query}"
187
+ )
188
+ result, error = await conn.query(query)
189
+ if error or not result:
190
+ raise DataNotFound(
191
+ f"Empty Dataset: {error}"
192
+ )
193
+ ## converting on Dataframe:
194
+ self.df2 = await self.get_dataframe(result, infer_types=True)
195
+ except (DataNotFound, NoDataFound) as exc:
196
+ self._result = self.data
197
+ raise DataNotFound(str(exc)) from exc
198
+ if self.type == "left" and (self.df2 is None or self.df2.empty):
199
+ self._logger.warning(
200
+ "No data was found on right Dataframe, returned first dataframe."
201
+ )
202
+ self._result = self.df1
203
+ return self._result
204
+ elif self.df2 is None or self.df2.empty:
205
+ raise DataNotFound("Data Was Not Found on Dataset")
206
+ if hasattr(self, "no_copy"):
207
+ args["copy"] = self.no_copy
208
+ if not self.type:
209
+ self.type = "left"
210
+ if self.type == "inner":
211
+ args["left_index"] = True
212
+ if hasattr(self, "args") and isinstance(self.args, dict):
213
+ args = {**args, **self.args}
214
+ if hasattr(self, "operator"):
215
+ operator = self.operator
216
+ else:
217
+ operator = "and"
218
+ if hasattr(self, "join"):
219
+ args["on"] = self.join
220
+ else:
221
+ args["left_index"] = True
222
+ # making a Join between 2 dataframes
223
+ try:
224
+ if operator == "and":
225
+ df = pd.merge(
226
+ self.df1,
227
+ self.df2,
228
+ how=self.type,
229
+ suffixes=("_left", "_right"),
230
+ **args,
231
+ )
232
+ else:
233
+ if hasattr(self, "join"):
234
+ args["left_on"] = self.join
235
+ else:
236
+ args["left_index"] = True
237
+ ndf = self.df1
238
+ sdf = self.df2.copy()
239
+ merge = []
240
+ for key in self.join_with:
241
+ d = pd.merge(
242
+ ndf,
243
+ sdf,
244
+ right_on=key,
245
+ how=self.type,
246
+ suffixes=("_left", None),
247
+ **args,
248
+ )
249
+ ndf = d[d[key].isnull()]
250
+ ndf.drop(
251
+ ndf.columns[ndf.columns.str.contains("_left")],
252
+ axis=1,
253
+ inplace=True,
254
+ )
255
+ ddf = d[d[key].notnull()]
256
+ ddf.drop(
257
+ ddf.columns[ddf.columns.str.contains("_left")],
258
+ axis=1,
259
+ inplace=True,
260
+ )
261
+ merge.append(ddf)
262
+ # merge the last (not matched) rows
263
+ merge.append(ndf)
264
+ df = pd.concat(merge, axis=0)
265
+ df.reset_index(drop=True)
266
+ df.is_copy = None
267
+ except (ValueError, KeyError) as err:
268
+ raise ComponentError(f"Cannot Join with missing Column: {err!s}") from err
269
+ except Exception as err:
270
+ raise ComponentError(f"Unknown JOIN error {err!s}") from err
271
+ numrows = len(df.index)
272
+ if numrows == 0:
273
+ raise DataNotFound("Cannot make any JOIN, returns zero coincidences")
274
+ self._variables[f"{self.StepName}_NUMROWS"] = numrows
275
+ print("ON END> ", numrows)
276
+ self.add_metric("JOINED_ROWS", numrows)
277
+ if self._debug is True:
278
+ print("::: Printing Column Information === ")
279
+ for column, t in df.dtypes.items():
280
+ print(column, "->", t, "->", df[column].iloc[0])
281
+ # helping some transformations
282
+ df.is_copy = None
283
+ self._result = df
284
+ return self._result
285
+
286
+ async def close(self):
287
+ pass
288
+
289
+ async def get_dataframe(self, result, infer_types: bool = False):
290
+ self.set_datatypes()
291
+ print(self._dtypes)
292
+ ### TODO: using QS iterables instead
293
+ result = [dict(row) for row in result]
294
+ try:
295
+ if self.as_objects is True:
296
+ df = pd.DataFrame(result, dtype=object)
297
+ else:
298
+ df = pd.DataFrame(result, **self._dtypes)
299
+ except Exception as err: # pylint: disable=W0718
300
+ self._logger.exception(
301
+ err,
302
+ stack_info=True
303
+ )
304
+ # Attempt to infer better dtypes for object columns.
305
+ if hasattr(self, "infer_types") or infer_types is True:
306
+ df.infer_objects()
307
+ df = df.convert_dtypes(convert_string=self.to_string)
308
+ if self._debug is True:
309
+ cPrint("Data Types:")
310
+ print(df.dtypes)
311
+ if hasattr(self, "drop_empty"):
312
+ df.dropna(axis=1, how="all", inplace=True)
313
+ df.dropna(axis=0, how="all", inplace=True)
314
+ if hasattr(self, "dropna"):
315
+ df.dropna(subset=self.dropna, how="all", inplace=True)
316
+ if (
317
+ getattr(self, "clean_strings", False) is True
318
+ ):
319
+ u = df.select_dtypes(include=["object", "string"])
320
+ df[u.columns] = u.fillna("")
321
+ return df
322
+
323
+ def set_datatypes(self):
324
+ if hasattr(self, "datatypes"):
325
+ dtypes = {}
326
+ for field, dtype in self.datatypes.items():
327
+ if dtype == "uint8":
328
+ dtypes[field] = np.uint8
329
+ elif dtype == "uint16":
330
+ dtypes[field] = np.uint16
331
+ elif dtype == "uint32":
332
+ dtypes[field] = np.uint32
333
+ elif dtype == "int8":
334
+ dtypes[field] = np.int8
335
+ elif dtype == "int16":
336
+ dtypes[field] = np.int16
337
+ elif dtype == "int32":
338
+ dtypes[field] = np.int32
339
+ elif dtype == "float":
340
+ dtypes[field] = float
341
+ elif dtype == "float32":
342
+ dtypes[field] = float
343
+ elif dtype in ("string", "varchar", "str"):
344
+ dtypes[field] = str
345
+ else:
346
+ # invalid datatype
347
+ self._logger.warning(
348
+ f"Invalid DataType value: {field} for field {dtype}"
349
+ )
350
+ continue
351
+ if dtypes:
352
+ self._dtypes["dtype"] = dtypes