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,507 @@
1
+ import asyncio
2
+ import copy
3
+ from typing import Any, Union
4
+ from collections.abc import Callable
5
+ import pandas
6
+ import numpy as np
7
+ from datamodel.typedefs.types import AttrDict
8
+ from asyncdb.exceptions import NoDataFound
9
+ from navconfig.logging import logging
10
+ from querysource.types import strtobool
11
+ from querysource.types.dt import transforms as qsdfunctions
12
+ from . import functions as dffunctions
13
+ from ...exceptions import (
14
+ ComponentError,
15
+ DataNotFound,
16
+ ConfigError
17
+ )
18
+ from ...utils.executor import getFunction
19
+ from ...utils.functions import check_empty
20
+ from ..flow import FlowComponent
21
+
22
+
23
+ class TransformRows(FlowComponent):
24
+ """
25
+ TransformRows
26
+
27
+ Overview
28
+
29
+ The TransformRows class is a component for transforming, adding, or modifying rows in a Pandas DataFrame based on
30
+ specified criteria. It supports single and multiple DataFrame transformations, and various operations on columns.
31
+
32
+ .. table:: Properties
33
+ :widths: auto
34
+
35
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
36
+ | Name | Required | Description |
37
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
38
+ | fields | No | A dictionary defining the fields and corresponding transformations to be applied. |
39
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
40
+ | filter_conditions | No | A dictionary defining the filter conditions for transformations. |
41
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
42
+ | clean_notnull | No | Boolean flag indicating if non-null values should be cleaned, defaults to True. |
43
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
44
+ | replace_columns | No | Boolean flag indicating if columns should be replaced, defaults to False. |
45
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
46
+ | multi | No | Boolean flag indicating if multiple DataFrame transformations should be supported, defaults to False. |
47
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
48
+ | function | No | View the list of function in the functions.py file on this directory |
49
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
50
+ | _applied | No | List to store the applied transformations. |
51
+ +--------------------+----------+-------------------------------------------------------------------------------------------------------+
52
+
53
+ Return
54
+
55
+ The methods in this class manage the transformation of DataFrames, including initialization, execution, and result handling.
56
+
57
+
58
+
59
+ Example:
60
+
61
+ ```yaml
62
+ TransformRows:
63
+ fields:
64
+ display_name:
65
+ value:
66
+ - concat
67
+ - columns:
68
+ - first_name
69
+ - last_name
70
+ legal_address:
71
+ value:
72
+ - concat
73
+ - columns:
74
+ - legal_street_address_1
75
+ - legal_street_address_2
76
+ work_address:
77
+ value:
78
+ - concat
79
+ - columns:
80
+ - work_location_address_1
81
+ - work_location_address_2
82
+ first_name:
83
+ value:
84
+ - capitalize
85
+ last_name:
86
+ value:
87
+ - capitalize
88
+ warp_id:
89
+ value:
90
+ - nullif
91
+ - chars:
92
+ - '*'
93
+ old_warp_id:
94
+ value:
95
+ - nullif
96
+ - chars:
97
+ - '*'
98
+ worker_category_description:
99
+ value:
100
+ - case
101
+ - column: benefits_eligibility_class_code
102
+ condition: PART-TIME
103
+ match: Part Time
104
+ notmatch: Full Time
105
+ file_number:
106
+ value:
107
+ - ereplace
108
+ - columns:
109
+ - position_id
110
+ - payroll_group
111
+ newvalue: ''
112
+ original_hire_date:
113
+ value:
114
+ - convert_to_datetime
115
+ hire_date:
116
+ value:
117
+ - convert_to_datetime
118
+ start_date:
119
+ value:
120
+ - convert_to_datetime
121
+ updated:
122
+ value:
123
+ - convert_to_datetime
124
+ gender_code:
125
+ value:
126
+ - convert_to_string
127
+ payroll_id:
128
+ value:
129
+ - convert_to_string
130
+ reports_to_payroll_id:
131
+ value:
132
+ - convert_to_string
133
+ ```
134
+
135
+ """ # noqa
136
+
137
+ def __init__(
138
+ self,
139
+ loop: asyncio.AbstractEventLoop = None,
140
+ job: Callable = None,
141
+ stat: Callable = None,
142
+ **kwargs,
143
+ ):
144
+ self.fields: dict = {}
145
+ self.filter_conditions: dict = {}
146
+ self.clean_notnull: bool = True
147
+ self.replace_columns: bool = False
148
+ self._applied: list = []
149
+ replace_cols = kwargs.pop("replace_columns", False)
150
+ if isinstance(replace_cols, str):
151
+ self.replace_columns = strtobool(replace_cols)
152
+ else:
153
+ self.replace_columns = bool(replace_cols)
154
+ # support for multiple dataframe transformations
155
+ try:
156
+ self.multi = bool(kwargs["multi"])
157
+ del kwargs["multi"]
158
+ except KeyError:
159
+ self.multi = False
160
+ if self.multi is False:
161
+ if "fields" in kwargs:
162
+ self.fields = kwargs["fields"]
163
+ del kwargs["fields"]
164
+ else:
165
+ self.fields = {}
166
+ super(TransformRows, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
167
+ self._logger.debug(f"Using Replace Columns: {self.replace_columns}")
168
+
169
+ async def start(self, **kwargs):
170
+ """Obtain Pandas Dataframe."""
171
+ if self.previous:
172
+ self.data = self.input
173
+ else:
174
+ raise ComponentError("a Previous Component was not found.")
175
+ if check_empty(self.data):
176
+ raise DataNotFound("No data was found")
177
+
178
+ async def run(self):
179
+ if self.data is None:
180
+ return False
181
+ if isinstance(self.data, pandas.DataFrame):
182
+ self.add_metric("started_rows", self.data.shape[0])
183
+ self.add_metric("started_columns", self.data.shape[1])
184
+ df = await self.transform(self, self.data)
185
+ self._result = df
186
+ # avoid threat the Dataframe as a Copy
187
+ self._result.is_copy = None
188
+ return self._result
189
+ elif self.multi is True:
190
+ # iteration over every Pandas DT:
191
+ try:
192
+ result = self.data.items()
193
+ except Exception as err:
194
+ raise ComponentError(
195
+ f"TransformRows: Invalid Result type for Multiple: {err}"
196
+ ) from err
197
+ self._result = {}
198
+ for name, rs in result:
199
+ try:
200
+ el = getattr(self, name)
201
+ except AttributeError:
202
+ self._result[name] = rs
203
+ continue
204
+ df = await self.transform(AttrDict(el), rs)
205
+ self._result[name] = df
206
+ return self._result
207
+ else:
208
+ raise NoDataFound(
209
+ "TransformRows: Pandas Dataframe Empty or is not a Dataframe"
210
+ )
211
+
212
+ async def _scalar_column(
213
+ self,
214
+ it: pandas.DataFrame,
215
+ field: str,
216
+ val: Any
217
+ ) -> None:
218
+ """_scalar_column.
219
+
220
+ Operating the Dataframe Function Column as an Scalar Value.
221
+ """
222
+ try:
223
+ if val.startswith('{'):
224
+ it[field] = self.mask_replacement(val)
225
+ else:
226
+ it[field] = it[val]
227
+ if self.replace_columns is True:
228
+ it.drop(val, axis="columns", inplace=True)
229
+ except KeyError:
230
+ self._logger.error(
231
+ f"Column doesn't exists: {val}"
232
+ )
233
+ except Exception as e:
234
+ self._logger.error(
235
+ f"Error dropping Column: {val}, {e}"
236
+ )
237
+
238
+ def _get_df_function(self, fn: str) -> Union[Callable, None]:
239
+ func = getattr(dffunctions, fn, None)
240
+ if func is None:
241
+ func = getattr(qsdfunctions, fn)
242
+ return func
243
+
244
+ async def _check_condition(self, df, field: str, fname: str, conditions: dict):
245
+ """Check if a field meets the specified condition."""
246
+ # Check column existence
247
+ if conditions.get("exists") and field not in df.columns:
248
+ return False
249
+
250
+ # Check for specific criteria (e.g., column must have non-null values)
251
+ if "not_null" in conditions and conditions["not_null"]:
252
+ try:
253
+ if df[field].notnull().all():
254
+ return False
255
+ except KeyError:
256
+ return False
257
+
258
+ # TODO: add more conditions to check
259
+ return True
260
+
261
+ async def _apply_one(
262
+ self,
263
+ it: pandas.DataFrame,
264
+ field: str,
265
+ val: Any
266
+ ) -> None:
267
+ """_apply_one.
268
+
269
+ Processing "fields" attributes as a Dictionary.
270
+ Apply to one column only.
271
+ """
272
+ conditions = {}
273
+ if "conditions" in val:
274
+ conditions = val.get('conditions')
275
+ if not isinstance(conditions, dict):
276
+ self._logger.warning(
277
+ f"TranformRows conditions need to be a dictionary, got {type(conditions)}"
278
+ )
279
+ if "value" in val:
280
+ operation = val.get('value')
281
+ else:
282
+ operation = val
283
+ args = {}
284
+ try:
285
+ fname = operation.pop(0)
286
+ except AttributeError:
287
+ fname = operation
288
+ operation = []
289
+ self._applied.append(f"Function: {fname!s} args: {operation}")
290
+ if not await self._check_condition(it, field, fname, conditions):
291
+ self._logger.warning(
292
+ f"Column {field} not met conditions {conditions}"
293
+ )
294
+ return it # Skip transformation if condition fails
295
+ # fname is a field and len > 1
296
+ if fname in it.columns and len(operation) == 0:
297
+ # simple field replacement
298
+ it[field] = it[fname]
299
+ it = it.copy()
300
+ return it
301
+
302
+ # only calls functions on TransformRows scope:
303
+ # first, check if is a Pandas-based Function
304
+ try:
305
+ args = operation[0]
306
+ except IndexError:
307
+ args = {}
308
+ try:
309
+ func = self._get_df_function(fname)
310
+ self._logger.notice(
311
+ f"Calling Function: {fname!s} with args: {operation}"
312
+ )
313
+ if fname == "fill_column":
314
+ args["variables"] = self._variables
315
+ if args:
316
+ it = func(df=it, field=field, **args)
317
+ else:
318
+ it = func(df=it, field=field)
319
+ it = it.copy()
320
+ return it
321
+ except AttributeError:
322
+ pass
323
+ # try to apply an scalar function:
324
+ func = getFunction(fname)
325
+ if callable(func):
326
+ # SCALAR FUNCTION
327
+ try:
328
+ tmp = operation[0]
329
+ for a, b in tmp.items():
330
+ if isinstance(b, list):
331
+ for idx, el in enumerate(b):
332
+ if el in self._variables:
333
+ b[idx] = el.replace(
334
+ str(el),
335
+ str(self._variables[str(el)]),
336
+ )
337
+ if b in self._variables:
338
+ args[a] = b.replace(
339
+ str(b), str(self._variables[str(b)])
340
+ )
341
+ result = func(**args)
342
+ except (KeyError, IndexError, ValueError):
343
+ result = func()
344
+ except Exception as err:
345
+ self._logger.warning(
346
+ f"Error or missing DF Function: {err!s}"
347
+ )
348
+ # using scalar functions to set value in columns
349
+ func = getFunction(fname)
350
+ if not callable(func):
351
+ return it
352
+ self._logger.debug(
353
+ f"Calling Scalar: {fname!s}: {func}"
354
+ )
355
+ try:
356
+ args = operation[0]
357
+ tmp = operation[0]
358
+ except IndexError:
359
+ args = {}
360
+ try:
361
+ for a, b in tmp.items():
362
+ if b in self._variables:
363
+ args[a] = b.replace(
364
+ str(b), str(self._variables[str(b)])
365
+ )
366
+ result = func(**args)
367
+ except (TypeError, KeyError, IndexError, ValueError):
368
+ # result doesn't need keyword arguments
369
+ result = func()
370
+ except Exception as e:
371
+ print(func, fname, field, val)
372
+ self._logger.exception(
373
+ f"Error Running an Scalar Function {fname!s} \
374
+ to set Dataframe: {e}"
375
+ )
376
+ return it
377
+ r = {field: result}
378
+ it = it.assign(**r)
379
+ it = it.copy()
380
+ return it
381
+ else:
382
+ self._logger.warning(
383
+ f"Function {func} is not callable."
384
+ )
385
+ return it
386
+
387
+ async def _apply_multiple(
388
+ self,
389
+ it: pandas.DataFrame,
390
+ field: str,
391
+ val: Any
392
+ ) -> None:
393
+ """_apply_multiple.
394
+
395
+ Apply Multiples functions to a single column.
396
+ """
397
+ if isinstance(val, dict):
398
+ for fn, args in val.items():
399
+ try:
400
+ func = self._get_df_function(fn)
401
+ self._logger.notice(
402
+ f"Calling Function: {fn!s} with args: {args}"
403
+ )
404
+ if not args:
405
+ args = {}
406
+ it = func(df=it, field=field, **args)
407
+ it = it.copy()
408
+ except AttributeError:
409
+ pass
410
+ return it
411
+ for value in val:
412
+ # iterate over a list of possible functions:
413
+ if isinstance(value, str):
414
+ # create the column based on value
415
+ await self._scalar_column(it, field, value)
416
+ continue
417
+ if isinstance(value, dict):
418
+ # function dictionary: {'split': {'separator': ','}}
419
+ # TODO: for now, only work with dataframe functions:
420
+ for fn, args in value.items():
421
+ try:
422
+ func = self._get_df_function(fn)
423
+ self._logger.notice(
424
+ f"Calling Function: {fn!s} with args: {args}"
425
+ )
426
+ if not args:
427
+ args = {}
428
+ it = func(df=it, field=field, **args)
429
+ it = it.copy()
430
+ except AttributeError:
431
+ pass
432
+ elif isinstance(value, list):
433
+ # list of functions to be applied:
434
+ # split the list element in fn and arguments
435
+ fn, args = value if len(value) == 2 else (value[0], {})
436
+ func = self._get_df_function(fn)
437
+ if func is not None:
438
+ it = func(df=it, field=field, **args)
439
+ it = it.copy()
440
+ else:
441
+ self._logger.warning(
442
+ f"Function {fn} is not callable."
443
+ )
444
+ else:
445
+ raise ConfigError(
446
+ f"Unable to work with this Function {value}: {type(value)}"
447
+ )
448
+ return it
449
+
450
+ async def transform(self, elem, df):
451
+ try:
452
+ fields = copy.deepcopy(elem.fields)
453
+ except KeyError:
454
+ fields = {}
455
+ if not isinstance(df, pandas.DataFrame):
456
+ raise NoDataFound("Pandas Dataframe Empty or is not a Dataframe")
457
+ if hasattr(elem, "clean_dates"):
458
+ u = df.select_dtypes(include=["datetime64[ns]"])
459
+ df[u.columns] = df[u.columns].replace({np.nan: None})
460
+ it = df.copy()
461
+ for field, val in fields.items():
462
+ if isinstance(val, str):
463
+ await self._scalar_column(it, field, val)
464
+ continue
465
+ elif isinstance(val, dict) and 'value' in val:
466
+ # Function to be applied:
467
+ it = await self._apply_one(it, field, val)
468
+ continue
469
+ elif isinstance(val, (dict, list)):
470
+ # Applying multiple functions to same column:
471
+ it = await self._apply_multiple(it, field, val)
472
+ continue
473
+ # at the end
474
+ df = it
475
+ # starting changes:
476
+ if hasattr(elem, "clean_str"):
477
+ df.is_copy = None
478
+ u = df.select_dtypes(include=["object", "string"])
479
+ u = u.applymap(lambda x: x.strip() if isinstance(x, str) else x)
480
+ df[u.columns] = df[u.columns].fillna("")
481
+ if hasattr(elem, "drop_empty"):
482
+ # First filter out those rows which
483
+ # does not contain any data
484
+ df.dropna(how="all")
485
+ # removing empty cols
486
+ df.is_copy = None
487
+ df.dropna(axis=1, how="all")
488
+ df.dropna(axis=0, how="all")
489
+ if self._debug is True:
490
+ print("TRANSFORM ===")
491
+ print(df)
492
+ print("::: Printing Column Information === ")
493
+ for column, t in df.dtypes.items():
494
+ print(column, "->", t, "->", df[column].iloc[0])
495
+ # avoid threat the Dataframe as a Copy
496
+ df.is_copy = None
497
+ self._result = df
498
+ try:
499
+ self.add_metric("ended_rows", df.shape[0])
500
+ self.add_metric("ended_columns", df.shape[1])
501
+ self.add_metric("Transformations", self._applied)
502
+ except Exception as err:
503
+ logging.error(f"TransformRows: Error setting Metrics: {err}")
504
+ return self._result
505
+
506
+ def close(self):
507
+ pass
@@ -0,0 +1,9 @@
1
+ """
2
+ TransformRows.
3
+
4
+ TransformRows allow making column transformation over a Pandas Dataframe.
5
+ """
6
+
7
+ from .TransformRows import TransformRows
8
+
9
+ __all__ = ["TransformRows"]