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,181 @@
1
+ from typing import List
2
+ import asyncio
3
+ import shutil
4
+ import glob
5
+ from pathlib import Path
6
+ from tqdm import tqdm
7
+ from ..exceptions import FileNotFound, FileError, ComponentError
8
+ from .FileBase import FileBase
9
+ from ..utils import check_empty
10
+ from .FileList import FileList
11
+
12
+
13
+ class FileCopy(FileBase):
14
+ """
15
+ FileCopy
16
+
17
+ **Overview**
18
+
19
+ Copies files from a source directory to a destination directory.
20
+
21
+ **Properties** (inherited from FileBase)
22
+
23
+ .. table:: Properties
24
+ :widths: auto
25
+
26
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
27
+ | Name | Required | Summary |
28
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
29
+ | create_destination | No | Boolean flag indicating whether to create the destination |
30
+ | | | directory if it doesn't exist (default: True). |
31
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
32
+ | source | Yes | A dictionary specifying the source directory and filename. |
33
+ | | | (e.g., {"directory": "/path/to/source", "filename": "myfile.txt"}) |
34
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
35
+ | destination | Yes | A dictionary specifying the destination directory and optionally filename. |
36
+ | | | (e.g., {"directory": "/path/to/destination", "filename": "renamed_file.txt"}) |
37
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
38
+ | rename | No | Boolean flag indicating if the file have a new name |
39
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
40
+ | remove_source | No | Boolean flag indicating whether to remove the source file(s) after |
41
+ | | | copying (default: False). |
42
+ +--------------------+----------+-----------+-------------------------------------------------------------------+
43
+
44
+
45
+
46
+ Example:
47
+
48
+ ```yaml
49
+ FileCopy:
50
+ source:
51
+ filename: '*.xlsx'
52
+ directory: /home/ubuntu/symbits/bose/stores/
53
+ remove_source: true
54
+ destination:
55
+ directory: /home/ubuntu/symbits/bose/stores/backup/
56
+ ```
57
+
58
+ """ # noqa
59
+
60
+ progress: bool = True
61
+
62
+ async def start(self, **kwargs) -> bool:
63
+ """Check for File and Directory information."""
64
+ self._sources: List = []
65
+ self._source: str = None
66
+ self._destination: str = None
67
+ self._rename: bool = False
68
+ await super(FileCopy, self).start(**kwargs)
69
+ if hasattr(self, "move"):
70
+ self.remove_source = self.move
71
+ elif not hasattr(self, "remove_source"):
72
+ self.remove_source = False
73
+ if self.previous and not check_empty(self.input) and (not hasattr(self, "ignore_previous") or self.ignore_previous is False):
74
+ if isinstance(self.previous, FileList):
75
+ self._sources = self.input
76
+ return True
77
+ if hasattr(self, "source"):
78
+ # processing source
79
+ if "directory" not in self.source:
80
+ raise ComponentError(
81
+ "FileCopy: Missing Source Directory."
82
+ )
83
+ self._source = Path(self.source["directory"]).resolve()
84
+ filename = self.source["filename"]
85
+ if "*" in filename:
86
+ # is a glob list of files
87
+ path = self._source.joinpath(filename)
88
+ listing = glob.glob(str(path)) # TODO using glob from pathlib
89
+ for fname in listing:
90
+ self._logger.debug(f"Filename > {fname}")
91
+ self._sources.append(Path(fname))
92
+ else:
93
+ filename = self.mask_replacement(filename)
94
+ path = self._source.joinpath(filename)
95
+ if path.is_file():
96
+ self._logger.debug(f"Source Filename: {filename}")
97
+ self._sources.append(path)
98
+ else:
99
+ raise ComponentError(
100
+ "FileCopy: Missing Source information."
101
+ )
102
+ if hasattr(self, "destination"):
103
+ # processing destination
104
+ if "directory" not in self.destination:
105
+ raise ComponentError("FileCopy: Missing Destination Directory.")
106
+ self._destination = Path(self.destination["directory"]).resolve()
107
+ if not self._destination.exists(): # create the destination directory
108
+ self._logger.debug(
109
+ f"Creating new destination directory: {self._destination}"
110
+ )
111
+ try:
112
+ self._destination.mkdir(parents=True, exist_ok=True)
113
+ except OSError as ex:
114
+ raise FileError(
115
+ f"FileCopy: Error creating destination directory: \
116
+ {self._destination}"
117
+ ) from ex
118
+ if "filename" in self.destination:
119
+ # this is for renaming the file:
120
+ filename = self.destination["filename"]
121
+ filename = self.mask_replacement(filename)
122
+ path = self._destination.joinpath(filename)
123
+ if self.destination["rename"] is True:
124
+ self._rename = True
125
+ self._destination = path
126
+ if path.is_file():
127
+ self._logger.warning(
128
+ f"FileCopy: Warning, File {path} already exists,\
129
+ will be overwritten"
130
+ )
131
+ else:
132
+ self._rename = False
133
+ if path.is_file():
134
+ self._logger.warning(
135
+ f"FileCopy: Warning, File {path} already exists, \
136
+ will be overwritten"
137
+ )
138
+ else:
139
+ filename = None
140
+ self._rename = False
141
+ else:
142
+ raise FileNotFound(
143
+ "FileCopy: Missing Destination."
144
+ )
145
+ return True
146
+
147
+ async def run(self):
148
+ """
149
+ Delete File(s).
150
+ """
151
+ self._result = {}
152
+ print(f"::::: FileCopy: {self._sources}")
153
+ if self.progress is True:
154
+ with tqdm(total=len(self._sources)) as pbar:
155
+ for file in self._sources:
156
+ if self._rename is True:
157
+ destination = self._destination
158
+ else:
159
+ destination = self._destination.joinpath(file.name)
160
+ if self.remove_source is True:
161
+ await asyncio.to_thread(shutil.move, file, destination)
162
+ else:
163
+ await asyncio.to_thread(shutil.copyfile, file, destination)
164
+ pbar.update(1)
165
+ self._result[file.name] = destination
166
+ else:
167
+ for file in self._sources:
168
+ if self._rename is True:
169
+ destination = self._destination
170
+ else:
171
+ destination = self._destination.joinpath(file.name)
172
+ if self.remove_source is True:
173
+ await asyncio.to_thread(shutil.move, file, destination)
174
+ else:
175
+ await asyncio.to_thread(shutil.copyfile, file, destination)
176
+ self._result[file.name] = destination
177
+ self.add_metric("FILES_COPIED", self._result)
178
+ return self._result
179
+
180
+ async def close(self):
181
+ """Method."""
@@ -0,0 +1,82 @@
1
+ from tqdm import tqdm
2
+ from ..exceptions import FileError
3
+ from .FileBase import FileBase
4
+
5
+
6
+ class FileDelete(FileBase):
7
+ """
8
+ FileDelete
9
+
10
+
11
+ Overview
12
+
13
+ This component remove all files in a Directory.
14
+
15
+ .. table:: Properties
16
+ :widths: auto
17
+
18
+
19
+ +--------------+----------+-----------+-------------------------------------------------------+
20
+ | Name | Required | Summary |
21
+ +--------------+----------+-----------+-------------------------------------------------------+
22
+ | file | Yes | A dictionary containing two values, "pattern" and "value", |
23
+ | | | "pattern" and "value", "pattern" contains the path of the |
24
+ | | | file on the server, If it contains the mask "{value}", then |
25
+ | | | "value" is used to set the value of that mask |
26
+ +--------------+----------+-----------+-------------------------------------------------------+
27
+ | pattern | Yes | Allows you to replace values ( ".xls", ".csv", ) |
28
+ +--------------+----------+-----------+-------------------------------------------------------+
29
+ | directory | Yes | The directory where are the files to delete |
30
+ +--------------+----------+-----------+-------------------------------------------------------+
31
+ | value | Yes | Name of the function and the arguments it receives for example |
32
+ | | | [ "current_date", { "mask":"%Y&m%d" } -> 20220909 |
33
+ +--------------+----------+-----------+-------------------------------------------------------+
34
+ | dictionary | Yes | Path where to validate if the file exist |
35
+ +--------------+----------+-----------+-------------------------------------------------------+
36
+
37
+
38
+
39
+ Example:
40
+
41
+ ```yaml
42
+ FileDelete:
43
+ file:
44
+ pattern: '*.csv'
45
+ value: ''
46
+ directory: /home/ubuntu/symbits/bayardad/files/job_advertising/bulk/
47
+ ```
48
+
49
+ """
50
+ progress: bool = True
51
+
52
+ async def run(self):
53
+ """Delete File(s)."""
54
+ self._result = {}
55
+ if self.progress is True:
56
+ filelist = list(self.get_filelist())
57
+ with tqdm(total=len(filelist)) as pbar:
58
+ for file in filelist:
59
+ # remove all files based on pattern.
60
+ try:
61
+ file.unlink(missing_ok=True)
62
+ self.add_metric("FILE_DELETED", file)
63
+ pbar.update(1)
64
+ except OSError as err:
65
+ raise FileError(
66
+ f"FileDelete: Error was raised when delete a File {err}"
67
+ ) from err
68
+ else:
69
+ filelist = self.get_filelist()
70
+ for file in filelist:
71
+ try:
72
+ file.unlink(missing_ok=True)
73
+ self.add_metric("FILE_DELETED", file)
74
+ except OSError as err:
75
+ raise FileError(
76
+ f"FileDelete: Error was raised when delete a File {err}"
77
+ ) from err
78
+ self._result = self.input # passthroug the previous result.
79
+ return self._result
80
+
81
+ async def close(self):
82
+ """Method."""
@@ -0,0 +1,146 @@
1
+ import logging
2
+ from pathlib import Path, PurePath
3
+ from ..exceptions import FileNotFound, FileError, ComponentError
4
+ from .FileBase import FileBase
5
+
6
+
7
+ class FileExists(FileBase):
8
+ """
9
+ FileExists
10
+ Overview
11
+
12
+ This component validate if a file or a list of files exist in a directory.
13
+
14
+ .. table:: Properties
15
+ :widths: auto
16
+
17
+
18
+ +--------------+----------+-----------+-------------------------------------------------------+
19
+ | Name | Required | Summary |
20
+ +--------------+----------+-----------+-------------------------------------------------------+
21
+ | file | Yes | A dictionary containing two values, "pattern" and "value", |
22
+ | | | "pattern" and "value", "pattern" contains the path of the |
23
+ | | | file on the server, If it contains the mask "{value}", then |
24
+ | | | "value" is used to set the value of that mask |
25
+ +--------------+----------+-----------+-------------------------------------------------------+
26
+ | pattern | Yes | Allows you to replace values ( ".xls", ".csv" ) |
27
+ +--------------+----------+-----------+-------------------------------------------------------+
28
+ | value | No | Name of the function and the arguments it receives for example |
29
+ | | | [ "current_date", { "mask":"%Y&m%d" } -> 20220909 |
30
+ +--------------+----------+-----------+-------------------------------------------------------+
31
+ | mask | No | A mask is applied with the today attribute, with date format |
32
+ | | | {“Y-m-d”} |
33
+ +--------------+----------+-----------+-------------------------------------------------------+
34
+ | directory | Yes | Path to validate if the file exists |
35
+ +--------------+----------+-----------+-------------------------------------------------------+
36
+ | date | No | File date |
37
+ +--------------+----------+-----------+-------------------------------------------------------+
38
+ | diff | No | Evaluate the difference in the file |
39
+ +--------------+----------+-----------+-------------------------------------------------------+
40
+ | depens | No | The file depends on a previous process |
41
+ +--------------+----------+-----------+-------------------------------------------------------+
42
+ | filename | Yes | Identify the file name |
43
+ +--------------+----------+-----------+-------------------------------------------------------+
44
+
45
+ Return the validation if the file exist or not
46
+
47
+
48
+
49
+ Example:
50
+
51
+ ```yaml
52
+ FileExists:
53
+ file:
54
+ pattern: '{value}-adp_worker.csv'
55
+ value:
56
+ - today
57
+ - mask: '%Y-%m-%d'
58
+ directory: /home/ubuntu/symbits/walmart/files/adfs/
59
+ ```
60
+
61
+ """
62
+
63
+ async def run(self):
64
+ """Run File checking."""
65
+ self._result = {}
66
+ file = None
67
+ if isinstance(self._filenames, list) and len(self._filenames) > 0:
68
+ if hasattr(self, "last_file") or hasattr(self, "first_file"):
69
+ # only return the last/first file of the list
70
+ if hasattr(self, "first_file"):
71
+ file = self._filenames[0]
72
+ else:
73
+ file = self._filenames[-1]
74
+ if file.exists() and file.is_file():
75
+ self._result[file] = True
76
+ self.setTaskVar("DIRECTORY", file.parent)
77
+ self.setTaskVar("FILENAME", str(file.name))
78
+ self.setTaskVar("FILEPATH", self._path)
79
+ if self._debug:
80
+ logging.debug(f"fileExists> {file}")
81
+ else:
82
+ raise FileNotFound(f"FileExists: File doesn't exists: {file}")
83
+ else:
84
+ # processing a list of files
85
+ for file in self._filenames:
86
+ logging.debug(f" ::: Checking for File: {file}")
87
+ if isinstance(file, str):
88
+ file = Path(file)
89
+ if file.exists() and file.is_file():
90
+ self._result[file] = True
91
+ if self._debug:
92
+ logging.debug(f"fileExists> {file}")
93
+ filename = Path(file)
94
+ self.setTaskVar("DIRECTORY", filename.parent)
95
+ self.setTaskVar("FILENAME", str(filename.name))
96
+ self.setTaskVar("FILEPATH", filename)
97
+ else:
98
+ raise FileNotFound(f"FileExists: File doesn't exists: {file}")
99
+ elif isinstance(self._filenames, dict):
100
+ for _, val in self._filenames.items():
101
+ if "file" in val:
102
+ file = val["file"]
103
+ elif "filename" in val:
104
+ file = val["filename"]
105
+ else:
106
+ raise ComponentError(f"FileExists: Wrong Inherit format: {val!r}")
107
+ if isinstance(file, str):
108
+ file = Path(file)
109
+ elif isinstance(file, PurePath):
110
+ file = file.resolve()
111
+ else:
112
+ raise FileError(
113
+ f"FileExists: unrecognized type for Filename: {type(file)}"
114
+ )
115
+ logging.debug(f" ::: Checking for File: {file}")
116
+ if file.exists() and file.is_file():
117
+ self._result[file] = True
118
+ self.setTaskVar("DIRECTORY", file.parent)
119
+ self.setTaskVar("FILENAME", str(file.name))
120
+ self.setTaskVar("FILEPATH", file)
121
+ else:
122
+ raise FileNotFound(f"FileExists: Empty result: {file}")
123
+ elif hasattr(self, "filename"):
124
+ if isinstance(self.filename, str):
125
+ file = Path(self.filename)
126
+ elif isinstance(self.filename, PurePath):
127
+ file = self.filename.resolve()
128
+ else:
129
+ raise FileError(
130
+ f"FileExists: unrecognized type for Filename: {type(self.filename)}"
131
+ )
132
+ logging.debug(f" ::: Checking for File: {file}")
133
+ if file.exists() and file.is_file():
134
+ self._result[file] = True
135
+ self.setTaskVar("DIRECTORY", file.parent)
136
+ self.setTaskVar("FILENAME", str(file.name))
137
+ self.setTaskVar("FILEPATH", file)
138
+ else:
139
+ print("RAISE THIS >> ")
140
+ raise FileNotFound(f"FileExists: Empty result: {file}")
141
+ # add metric:
142
+ self.add_metric("FILENAME", self._filenames)
143
+ return self._result
144
+
145
+ async def close(self):
146
+ """Method."""
@@ -0,0 +1,112 @@
1
+ import asyncio
2
+ from typing import Any, List
3
+ from collections.abc import Callable
4
+ from pathlib import Path, PurePath
5
+ from tqdm import tqdm
6
+ from ..exceptions import ComponentError
7
+ from .IteratorBase import IteratorBase
8
+
9
+
10
+ class FileIteratorDelete(IteratorBase):
11
+ """
12
+ FileIteratorDelete
13
+
14
+ Overview
15
+
16
+ The FileIteratorDelete class is a component for removing all files in a specified directory. It extends the
17
+ IteratorBase class and provides methods for directory validation, file listing based on patterns, and file deletion.
18
+
19
+ .. table:: Properties
20
+ :widths: auto
21
+
22
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
23
+ | Name | Required | Description |
24
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
25
+ | directory | Yes | The directory from which files will be deleted. |
26
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
27
+ | _filenames | No | A list to store filenames that match the pattern. |
28
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
29
+ | _path | No | The Path object for the directory. |
30
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
31
+ | pattern | No | The pattern to match files for deletion. |
32
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
33
+ Return
34
+
35
+ The methods in this class manage the deletion of files in a specified directory, including initialization, file listing,
36
+ and deletion.
37
+
38
+ """
39
+
40
+ def __init__(
41
+ self,
42
+ loop: asyncio.AbstractEventLoop = None,
43
+ job: Callable = None,
44
+ stat: Callable = None,
45
+ **kwargs,
46
+ ):
47
+ """Init Method."""
48
+ # self.directory: str = None
49
+ self._filenames: List[PurePath] = []
50
+ self.directory: str = None
51
+ self._path: str = None
52
+ self.pattern = None
53
+ super(FileIteratorDelete, self).__init__(
54
+ loop=loop, job=job, stat=stat, **kwargs
55
+ )
56
+
57
+ async def start(self, **kwargs):
58
+ """Check if Directory exists."""
59
+ await super(FileIteratorDelete, self).start()
60
+ if not self.directory:
61
+ raise ComponentError(
62
+ "FileIteratorDelete Error: need to specify a Directory", status=404
63
+ )
64
+ # check if directory exists
65
+ p = Path(self.directory)
66
+ if p.exists() and p.is_dir():
67
+ self._path = p
68
+ else:
69
+ raise ComponentError(
70
+ "FileIteratorDelete Error: Directory doesn't exist!", status=404
71
+ )
72
+
73
+ def get_filelist(self) -> List[Any]:
74
+ if self.pattern:
75
+ value = self.pattern
76
+ if hasattr(self, "masks"):
77
+ for mask, replace in self._mask.items():
78
+ value = str(value).replace(mask, replace)
79
+ if self._variables:
80
+ value = value.format(**self._variables)
81
+ files = (f for f in self._path.glob(value))
82
+ elif hasattr(self, "file"):
83
+ # using pattern/file version
84
+ value = self.get_filepattern()
85
+ files = (f for f in self._path.glob(value))
86
+ else:
87
+ files = (f for f in self._path.iterdir() if f.is_file())
88
+ # files = sorted(files, key=os.path.getmtime)
89
+ return files
90
+
91
+ async def run(self):
92
+ if not self._path:
93
+ return False
94
+ iterator = list(self.get_filelist())
95
+ with tqdm(total=len(iterator)) as pbar:
96
+ deleted = []
97
+ for file in iterator:
98
+ # remove all files based on pattern.
99
+ try:
100
+ file.unlink(missing_ok=True)
101
+ deleted.append(file)
102
+ pbar.update(1)
103
+ except OSError as err:
104
+ raise ComponentError(
105
+ f"FileIteratorDelete: Error was raised when delete a File {err}"
106
+ ) from err
107
+ self.add_metric("FILES_DELETED", deleted)
108
+ self._result = self.input # passthroug the previous result.
109
+ return self._result
110
+
111
+ async def close(self):
112
+ pass