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,308 @@
1
+ """TaskMonitor.
2
+
3
+ Collect and saves stats for execution of tasks.
4
+ """
5
+ import os
6
+ import sys
7
+ from typing import Any, Union
8
+ import random
9
+ import contextlib
10
+ import asyncio
11
+ import logging
12
+ from datetime import datetime
13
+ import time
14
+ from statistics import mean
15
+ from contextlib import suppress
16
+ from psutil import virtual_memory, cpu_percent, Process
17
+
18
+
19
+ class StepMonitor:
20
+ def __init__(self, name, parent=None) -> None:
21
+ self.name = name
22
+ self.executed_at: datetime = datetime.now()
23
+ self.stats: dict = {}
24
+ self.traceback: str = ""
25
+ self._parent: Any = parent
26
+
27
+ def add_metric(self, key, value) -> None:
28
+ self.stats[key] = value
29
+
30
+ def stacktrace(self, trace: str) -> None:
31
+ self.traceback = trace
32
+
33
+ def parent(self):
34
+ return self._parent
35
+
36
+ def __str__(self) -> str:
37
+ trace = ""
38
+ if self.traceback:
39
+ trace = f"StackTrace: <{self.traceback!s}>\n"
40
+ stat = (
41
+ f"{self.name}:\n"
42
+ f"Executed At: {self.executed_at}:\n"
43
+ f"<{self.stats!r}>\n"
44
+ f"{trace!s}\n"
45
+ )
46
+ return stat
47
+
48
+
49
+ class TaskMonitor:
50
+ def __init__(
51
+ self, name: str, program: str, task_id: str, userid: Union[int, str] = None
52
+ ) -> None:
53
+ self.task_name = name
54
+ self.task_id = task_id
55
+ self._started: bool = False
56
+ self.traceback = None
57
+ self.stats: dict = {}
58
+ self.user: Union[int, str] = None
59
+ self.steps: list[StepMonitor] = []
60
+ self.executed_at: datetime = datetime.now()
61
+ self.start_time: float = 0
62
+ self.finish_time: float = 0
63
+ self.duration: float = 0
64
+ self._sampling_task: asyncio.Task
65
+ self.program: str = program
66
+ # CPU and RAM stats:
67
+ self.baseline_cpu: float = 0
68
+ self.baseline_ram: float = 0
69
+ self._cpu_usage_data: list = []
70
+ self._ram_usage_data: list = []
71
+ self._memory_info: list = []
72
+ # returned values of Stats
73
+ self.max_cpu_used: float = 0
74
+ self.avg_cpu_used: float = 0
75
+ self.max_ram_used: float = 0
76
+ self.avg_ram_used: float = 0
77
+ self.memory_usage: float = 0
78
+ # self.cpu_percent = partial(cpu_percent, interval=0)
79
+ ## Memory usage:
80
+ self._pid = os.getpid()
81
+ self._process = Process(self._pid)
82
+ self._memory_before = self._process.memory_info().rss
83
+ ## TODO: passing User information:
84
+ if sys.stdin and sys.stdin.isatty():
85
+ self.exec_type = "console"
86
+ try:
87
+ self.user = os.environ.get("USER")
88
+ except Exception:
89
+ self.user = os.environ.get("USERNAME")
90
+ else:
91
+ # was dispatched from code
92
+ try:
93
+ if "qw" in sys.argv[0]:
94
+ self.exec_type = "worker"
95
+ else:
96
+ self.exec_type = "task"
97
+ except IndexError:
98
+ self.exec_type = "code"
99
+ self.user = os.getlogin()
100
+ if not self.user:
101
+ self.user = userid
102
+ print(f"Execution Mode: {self.exec_type} by User: {self.user}")
103
+
104
+ def __str__(self) -> str:
105
+ steps = "\n".join([f"{step!s}" for step in self.steps])
106
+ if steps:
107
+ steps = f"Steps: \n{steps!s}\n"
108
+ stat = (
109
+ f"Task: {self.task_name}\n"
110
+ f"ID: {self.task_id}\n"
111
+ f"< {self.stats!r} >\n"
112
+ f"{steps!s}"
113
+ )
114
+ return stat
115
+
116
+ def to_json(self) -> dict:
117
+ steps = {}
118
+ for step in self.steps:
119
+ steps[step.name] = {"executed_at": step.executed_at, **step.stats}
120
+ stat = {
121
+ "Task": self.task_name,
122
+ "program": self.program,
123
+ "task_name": f"{self.program}.{self.task_name}",
124
+ "ID": self.task_id,
125
+ **self.stats,
126
+ "steps": {**steps},
127
+ }
128
+ return stat
129
+
130
+ def add_step(self, step: StepMonitor) -> None:
131
+ self.steps.append(step)
132
+
133
+ def start_timing(self):
134
+ self.start_time = time.time()
135
+
136
+ def end_timing(self):
137
+ self.finish_time = time.time()
138
+ self.duration = self.finish_time - self.start_time
139
+
140
+ def stacktrace(self, trace: str) -> None:
141
+ self.traceback = trace
142
+
143
+ def is_started(self) -> bool:
144
+ return self._started
145
+
146
+ def _get_virtual_memory(self):
147
+ return virtual_memory().percent
148
+
149
+ async def get_virtual_memory(self):
150
+ return virtual_memory().percent
151
+
152
+ async def get_memory_info(self):
153
+ try:
154
+ # Use a context manager to ensure file handles are closed
155
+ with contextlib.suppress(OSError):
156
+ proc = Process(self._pid)
157
+ return proc.memory_info().rss / 1048576
158
+ except OSError as e:
159
+ logging.warning(f"Error getting Memory Info: {e}")
160
+ return 0
161
+ except Exception as e:
162
+ logging.warning(f"Unexpected error getting Memory Info: {e}")
163
+ return 0
164
+
165
+ # Improve the cpu_percent method to ensure handles are closed
166
+ async def cpu_percent(self, *args, **kwargs):
167
+ try:
168
+ # psutil's cpu_percent can leak file handles on Linux
169
+ # Make a quick call with a safe wrapper
170
+ return cpu_percent(*args, **kwargs)
171
+ except OSError as e:
172
+ if e.errno == 24: # Too many open files
173
+ logging.warning(f"Too many files open in cpu_percent: {e}")
174
+ return 0.0
175
+
176
+ async def _get_current_state(self, interval: float = 1.0):
177
+ """_get_current_state.
178
+ Get the Current state of System, will be collected async every tick.
179
+ Implements backoff when errors occur.
180
+ Args:
181
+ interval (float, optional): initial interval of collecting information. Defaults to 0.3.
182
+ """
183
+ current_interval = interval
184
+ max_interval = 5.0 # Maximum interval in seconds
185
+ consecutive_errors = 0
186
+
187
+ while True:
188
+ try:
189
+ if not self._started: # Stop if _started is False.
190
+ break
191
+
192
+ # Get resource usage metrics
193
+ try:
194
+ memory = await self.get_memory_info()
195
+ cpu = await self.cpu_percent()
196
+ ram = await self.get_virtual_memory()
197
+
198
+ # If we got here without errors, add the data and reset backoff
199
+ self._cpu_usage_data.append(cpu)
200
+ self._ram_usage_data.append(ram)
201
+ self._memory_info.append(memory)
202
+
203
+ # Reset backoff if successful
204
+ if consecutive_errors > 0:
205
+ consecutive_errors = 0
206
+ current_interval = interval # Reset to original interval
207
+ logging.info("Resource monitoring recovered, resetting interval to normal")
208
+
209
+ except OSError as e:
210
+ # Handle "too many open files" error with backoff
211
+ if e.errno == 24: # "Too many open files" error
212
+ consecutive_errors += 1
213
+
214
+ # Apply exponential backoff with jitter
215
+ backoff_factor = min(2 ** consecutive_errors, 10) # Cap the backoff factor
216
+ jitter = 0.1 * backoff_factor * (random.random() * 0.5 + 0.75) # Add 25%-75% jitter
217
+ current_interval = min(interval * backoff_factor * jitter, max_interval)
218
+
219
+ logging.warning(
220
+ f"Too many open files error, backing off. New interval: {current_interval:.2f}s "
221
+ f"(consecutive errors: {consecutive_errors})"
222
+ )
223
+ else:
224
+ # For other OSErrors, just log and continue
225
+ logging.warning(f"OS Error during monitoring: {e}")
226
+
227
+ await asyncio.sleep(current_interval)
228
+
229
+ except asyncio.CancelledError:
230
+ break # Exit cleanly on task cancellation
231
+ except Exception as err:
232
+ logging.exception(f"Can't collect CPU/RAM metrics due to error: {err}")
233
+ # Still apply backoff for other errors
234
+ consecutive_errors += 1
235
+ current_interval = min(interval * (1.5 ** consecutive_errors), max_interval)
236
+ await asyncio.sleep(current_interval)
237
+
238
+ async def start(self, interval: float = 0.5):
239
+ try:
240
+ # check if not started:
241
+ if not self._started:
242
+ self._started = True
243
+ self.start_timing()
244
+ # Start task to call func periodically:
245
+ self._sampling_task = asyncio.create_task(
246
+ self._get_current_state(interval)
247
+ )
248
+ # is started
249
+ except Exception as err:
250
+ logging.exception(
251
+ f"Task Monitor Failed to Start, error: {err}"
252
+ )
253
+
254
+ def _calculate_stats(self):
255
+ if self._cpu_usage_data:
256
+ self.max_cpu_used = max(self._cpu_usage_data)
257
+ self.avg_cpu_used = mean(self._cpu_usage_data)
258
+ self.max_ram_used = max(self._ram_usage_data)
259
+ self.avg_ram_used = mean(self._ram_usage_data)
260
+ self.memory_usage = mean(self._memory_info)
261
+
262
+ async def stop(self) -> dict:
263
+ try:
264
+ # Check is sampling is happening
265
+ if self._started:
266
+ # Stopping Monitor.
267
+ self._started = False
268
+
269
+ # Stop task and await it stopped:
270
+ if hasattr(self, '_sampling_task') and self._sampling_task:
271
+ with contextlib.suppress(asyncio.CancelledError):
272
+ self._sampling_task.cancel()
273
+ await self._sampling_task
274
+
275
+ # Stop the clock, making calculations
276
+ self.end_timing()
277
+ self._calculate_stats()
278
+
279
+ # Calculate memory usage more safely
280
+ memory_after = 0
281
+ rss_in_bytes = 0
282
+ try:
283
+ with contextlib.suppress(OSError):
284
+ proc = Process(self._pid)
285
+ memory_after = proc.memory_info().rss
286
+ rss_in_bytes = memory_after - self._memory_before
287
+ except Exception as err:
288
+ logging.exception(f"Unable to get Memory Info: {err}")
289
+
290
+ self.stats.update({
291
+ "executed_at": f"{self.executed_at:%Y-%m-%d %H:%M}",
292
+ "duration": f"{self.duration:.5f}",
293
+ "pid": self._pid,
294
+ "max_cpu": round(float(self.max_cpu_used) if self._cpu_usage_data else 0, 2),
295
+ "avg_cpu": round(float(self.avg_cpu_used) if self._cpu_usage_data else 0, 2),
296
+ "max_ram": round(float(self.max_ram_used) if self._ram_usage_data else 0, 2),
297
+ "avg_ram": round(float(self.avg_ram_used) if self._ram_usage_data else 0, 2),
298
+ "memory_usage": self.memory_usage,
299
+ "thread_memory": round(rss_in_bytes / (1024 * 1024), 4),
300
+ "exec_type": self.exec_type,
301
+ "user": self.user,
302
+ })
303
+ return self.stats
304
+ else:
305
+ return {}
306
+ except Exception as err:
307
+ logging.exception(f"Task Monitor Failed to Stop, due to: {err}")
308
+ raise
@@ -0,0 +1,74 @@
1
+ import re
2
+
3
+ WORD_PATTERN = re.compile(r'[A-Z]?[a-z]+|[A-Z]+(?![a-z])|[0-9]+')
4
+ UNWANTED_PATTERN = re.compile(r"[^a-zA-Z0-9\s]")
5
+ ILLEGAL_CHARS = re.compile(r"[^A-Za-z0-9_\s]+")
6
+
7
+
8
+ def remove_illegal_chars(value: str) -> str:
9
+ return ILLEGAL_CHARS.sub('', value)
10
+
11
+
12
+ def is_camelcase(value):
13
+ return re.match(r"^[A-Za-z0-9]+\s?(?:[A-Za-z0-9])*$", value.strip()) is not None
14
+
15
+
16
+ def to_camel_case(s: str) -> str:
17
+ """to_camel_case.
18
+
19
+ Converts a phrase into CamelCase Format.
20
+
21
+ Args:
22
+ s (str): The string to convert.
23
+
24
+ Returns:
25
+ The converted string in CamelCase format.
26
+ """
27
+ # Remove unwanted characters
28
+ # s = re.sub(, "", s)
29
+ s = UNWANTED_PATTERN.sub("", s)
30
+ # Convert to CamelCase
31
+ s = "".join(word.capitalize() for word in s.split())
32
+ return s
33
+
34
+ def is_snakecase(value):
35
+ ## already in snake case:
36
+ return re.match(r"^[a-zA-Z][a-zA-Z0-9_]+_[a-zA-Z0-9]*$", value.strip()) is not None
37
+
38
+
39
+ def to_snake_case(s: str) -> str:
40
+ """to_snake_case.
41
+
42
+ Converts an string into snake_case format.
43
+
44
+ Args:
45
+ s (str): The string to convert.
46
+
47
+ Returns:
48
+ The converted string in snake_case format.
49
+ """
50
+ # Remove unwanted characters
51
+ s = UNWANTED_PATTERN.sub("", s)
52
+
53
+ # Find all words in the string
54
+ words = WORD_PATTERN.findall(s)
55
+
56
+ # Join the words with underscores
57
+ s = '_'.join(words)
58
+
59
+ return s.lower()
60
+
61
+
62
+ def camelcase_split(value):
63
+ """camelcase_split.
64
+
65
+ Splits a CamelCase word in other words.
66
+ """
67
+ if bool(re.match(r"[A-Z]+$", value)):
68
+ return re.findall(r"[A-Z]+$", value)
69
+ elif bool(re.search(r"\d", value)):
70
+ return re.findall(r"[A-Z](?:[a-z]+[1-9]?|[A-Z]*(?=[A-Z])|$)", value)
71
+ elif value[0].isupper():
72
+ return re.findall(r"[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))", value)
73
+ else:
74
+ return re.findall(r"^[a-z]+|[A-Z][^A-Z]*", value)
flowtask/utils/uv.py ADDED
@@ -0,0 +1,12 @@
1
+ import asyncio
2
+
3
+
4
+ def install_uvloop():
5
+ """install uvloop and set as default loop for asyncio."""
6
+ try:
7
+ import uvloop
8
+
9
+ asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
10
+ uvloop.install()
11
+ except ImportError:
12
+ pass
@@ -0,0 +1,97 @@
1
+ import uuid
2
+ from typing import Callable
3
+ import dateutil
4
+ import builtins
5
+
6
+
7
+ ### validations
8
+ def isdate(value):
9
+ try:
10
+ dateutil.parser.parse(value)
11
+ return True
12
+ except (TypeError, ValueError):
13
+ return False
14
+
15
+
16
+ is_date = isdate
17
+
18
+
19
+ def isinteger(value):
20
+ return bool(isinstance(value, int))
21
+
22
+
23
+ def isnumber(value):
24
+ return bool(isinstance(value, float) or isinstance(value, int))
25
+
26
+
27
+ def is_string(value):
28
+ if type(value) is str:
29
+ return True
30
+ else:
31
+ return False
32
+
33
+
34
+ def is_uuid(value):
35
+ try:
36
+ uuid.UUID(value)
37
+ return True
38
+ except ValueError:
39
+ return False
40
+
41
+
42
+ def validate_type_uuid(value):
43
+ try:
44
+ uuid.UUID(value)
45
+ except ValueError:
46
+ pass
47
+
48
+
49
+ def is_boolean(value):
50
+ if isinstance(value, bool):
51
+ return True
52
+ elif value == "null" or value == "NULL":
53
+ return True
54
+ elif value == "true" or value == "TRUE":
55
+ return True
56
+ else:
57
+ return False
58
+
59
+
60
+ """
61
+ PostgreSQL utilities
62
+ """
63
+ PG_CONSTANTS = ["CURRENT_DATE", "CURRENT_TIMESTAMP"]
64
+
65
+
66
+ def is_pgconstant(value):
67
+ return value in PG_CONSTANTS
68
+
69
+
70
+ # TODO: get the current list of supported UDF dynamic.
71
+ UDF = ["CURRENT_YEAR", "CURRENT_MONTH", "TODAY", "YESTERDAY", "FDOM", "LDOM"]
72
+
73
+
74
+ def is_an_udf(value):
75
+ return value in UDF
76
+
77
+
78
+ def is_udf(value: str, *args, **kwargs) -> Callable:
79
+ fn = None
80
+ try:
81
+ f = value.lower()
82
+ if value in UDF:
83
+ fn = globals()[f](*args, **kwargs)
84
+ else:
85
+ func = globals()[f]
86
+ if not func:
87
+ try:
88
+ func = getattr(builtins, f)
89
+ except AttributeError:
90
+ return None
91
+ if func and callable(func):
92
+ try:
93
+ fn = func(*args, **kwargs)
94
+ except Exception as err:
95
+ raise Exception(err)
96
+ finally:
97
+ return fn
flowtask/version.py ADDED
@@ -0,0 +1,11 @@
1
+ """Flow Task Meta information."""
2
+
3
+ __title__ = "flowtask"
4
+ __description__ = (
5
+ "Framework for running Tasks and from CLI and API for orchestation. "
6
+ "Component-based Task builder/Runner for non-programmers."
7
+ )
8
+ __version__ = "5.8.4"
9
+ __author__ = "Jesus Lara"
10
+ __author_email__ = "jesuslarag@gmail.com"
11
+ __license__ = "Apache-2.0"