flowtask 5.8.4__cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. flowtask/__init__.py +93 -0
  2. flowtask/__main__.py +38 -0
  3. flowtask/bots/__init__.py +6 -0
  4. flowtask/bots/check.py +93 -0
  5. flowtask/bots/codebot.py +51 -0
  6. flowtask/components/ASPX.py +148 -0
  7. flowtask/components/AddDataset.py +352 -0
  8. flowtask/components/Amazon.py +523 -0
  9. flowtask/components/AutoTask.py +314 -0
  10. flowtask/components/Azure.py +80 -0
  11. flowtask/components/AzureUsers.py +106 -0
  12. flowtask/components/BaseAction.py +91 -0
  13. flowtask/components/BaseLoop.py +198 -0
  14. flowtask/components/BestBuy.py +800 -0
  15. flowtask/components/CSVToGCS.py +120 -0
  16. flowtask/components/CompanyScraper/__init__.py +1 -0
  17. flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
  18. flowtask/components/CompanyScraper/parsers/base.py +102 -0
  19. flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
  20. flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
  21. flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
  22. flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
  23. flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
  24. flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
  25. flowtask/components/CompanyScraper/scrapper.py +1054 -0
  26. flowtask/components/CopyTo.py +177 -0
  27. flowtask/components/CopyToBigQuery.py +243 -0
  28. flowtask/components/CopyToMongoDB.py +291 -0
  29. flowtask/components/CopyToPg.py +609 -0
  30. flowtask/components/CopyToRethink.py +207 -0
  31. flowtask/components/CreateGCSBucket.py +102 -0
  32. flowtask/components/CreateReport/CreateReport.py +228 -0
  33. flowtask/components/CreateReport/__init__.py +9 -0
  34. flowtask/components/CreateReport/charts/__init__.py +15 -0
  35. flowtask/components/CreateReport/charts/bar.py +51 -0
  36. flowtask/components/CreateReport/charts/base.py +66 -0
  37. flowtask/components/CreateReport/charts/pie.py +64 -0
  38. flowtask/components/CreateReport/utils.py +9 -0
  39. flowtask/components/CustomerSatisfaction.py +196 -0
  40. flowtask/components/DataInput.py +200 -0
  41. flowtask/components/DateList.py +255 -0
  42. flowtask/components/DbClient.py +163 -0
  43. flowtask/components/DialPad.py +146 -0
  44. flowtask/components/DocumentDBQuery.py +200 -0
  45. flowtask/components/DownloadFrom.py +371 -0
  46. flowtask/components/DownloadFromD2L.py +113 -0
  47. flowtask/components/DownloadFromFTP.py +181 -0
  48. flowtask/components/DownloadFromIMAP.py +315 -0
  49. flowtask/components/DownloadFromS3.py +198 -0
  50. flowtask/components/DownloadFromSFTP.py +265 -0
  51. flowtask/components/DownloadFromSharepoint.py +110 -0
  52. flowtask/components/DownloadFromSmartSheet.py +114 -0
  53. flowtask/components/DownloadS3File.py +229 -0
  54. flowtask/components/Dummy.py +59 -0
  55. flowtask/components/DuplicatePhoto.py +411 -0
  56. flowtask/components/EmployeeEvaluation.py +237 -0
  57. flowtask/components/ExecuteSQL.py +323 -0
  58. flowtask/components/ExtractHTML.py +178 -0
  59. flowtask/components/FileBase.py +178 -0
  60. flowtask/components/FileCopy.py +181 -0
  61. flowtask/components/FileDelete.py +82 -0
  62. flowtask/components/FileExists.py +146 -0
  63. flowtask/components/FileIteratorDelete.py +112 -0
  64. flowtask/components/FileList.py +194 -0
  65. flowtask/components/FileOpen.py +75 -0
  66. flowtask/components/FileRead.py +120 -0
  67. flowtask/components/FileRename.py +106 -0
  68. flowtask/components/FilterIf.py +284 -0
  69. flowtask/components/FilterRows/FilterRows.py +200 -0
  70. flowtask/components/FilterRows/__init__.py +10 -0
  71. flowtask/components/FilterRows/functions.py +4 -0
  72. flowtask/components/GCSToBigQuery.py +103 -0
  73. flowtask/components/GoogleA4.py +150 -0
  74. flowtask/components/GoogleGeoCoding.py +344 -0
  75. flowtask/components/GooglePlaces.py +315 -0
  76. flowtask/components/GoogleSearch.py +539 -0
  77. flowtask/components/HTTPClient.py +268 -0
  78. flowtask/components/ICIMS.py +146 -0
  79. flowtask/components/IF.py +179 -0
  80. flowtask/components/IcimsFolderCopy.py +173 -0
  81. flowtask/components/ImageFeatures/__init__.py +5 -0
  82. flowtask/components/ImageFeatures/process.py +233 -0
  83. flowtask/components/IteratorBase.py +251 -0
  84. flowtask/components/LangchainLoader/__init__.py +5 -0
  85. flowtask/components/LangchainLoader/loader.py +194 -0
  86. flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
  87. flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
  88. flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
  89. flowtask/components/LangchainLoader/loaders/docx.py +91 -0
  90. flowtask/components/LangchainLoader/loaders/html.py +119 -0
  91. flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
  92. flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
  93. flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
  94. flowtask/components/LangchainLoader/loaders/qa.py +67 -0
  95. flowtask/components/LangchainLoader/loaders/txt.py +55 -0
  96. flowtask/components/LeadIQ.py +650 -0
  97. flowtask/components/Loop.py +253 -0
  98. flowtask/components/Lowes.py +334 -0
  99. flowtask/components/MS365Usage.py +156 -0
  100. flowtask/components/MSTeamsMessages.py +320 -0
  101. flowtask/components/MarketClustering.py +1051 -0
  102. flowtask/components/MergeFiles.py +362 -0
  103. flowtask/components/MilvusOutput.py +87 -0
  104. flowtask/components/NearByStores.py +175 -0
  105. flowtask/components/NetworkNinja/__init__.py +6 -0
  106. flowtask/components/NetworkNinja/models/__init__.py +52 -0
  107. flowtask/components/NetworkNinja/models/abstract.py +177 -0
  108. flowtask/components/NetworkNinja/models/account.py +39 -0
  109. flowtask/components/NetworkNinja/models/client.py +19 -0
  110. flowtask/components/NetworkNinja/models/district.py +14 -0
  111. flowtask/components/NetworkNinja/models/events.py +101 -0
  112. flowtask/components/NetworkNinja/models/forms.py +499 -0
  113. flowtask/components/NetworkNinja/models/market.py +16 -0
  114. flowtask/components/NetworkNinja/models/organization.py +34 -0
  115. flowtask/components/NetworkNinja/models/photos.py +125 -0
  116. flowtask/components/NetworkNinja/models/project.py +44 -0
  117. flowtask/components/NetworkNinja/models/region.py +28 -0
  118. flowtask/components/NetworkNinja/models/store.py +203 -0
  119. flowtask/components/NetworkNinja/models/user.py +151 -0
  120. flowtask/components/NetworkNinja/router.py +854 -0
  121. flowtask/components/Odoo.py +175 -0
  122. flowtask/components/OdooInjector.py +192 -0
  123. flowtask/components/OpenFromXML.py +126 -0
  124. flowtask/components/OpenWeather.py +41 -0
  125. flowtask/components/OpenWithBase.py +616 -0
  126. flowtask/components/OpenWithPandas.py +715 -0
  127. flowtask/components/PGPDecrypt.py +199 -0
  128. flowtask/components/PandasIterator.py +187 -0
  129. flowtask/components/PandasToFile.py +189 -0
  130. flowtask/components/Paradox.py +339 -0
  131. flowtask/components/ParamIterator.py +117 -0
  132. flowtask/components/ParseHTML.py +84 -0
  133. flowtask/components/PlacerStores.py +249 -0
  134. flowtask/components/Pokemon.py +507 -0
  135. flowtask/components/PositiveBot.py +62 -0
  136. flowtask/components/PowerPointSlide.py +400 -0
  137. flowtask/components/PrintMessage.py +127 -0
  138. flowtask/components/ProductCompetitors/__init__.py +5 -0
  139. flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
  140. flowtask/components/ProductCompetitors/parsers/base.py +72 -0
  141. flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
  142. flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
  143. flowtask/components/ProductCompetitors/scrapper.py +155 -0
  144. flowtask/components/ProductCompliant.py +169 -0
  145. flowtask/components/ProductInfo/__init__.py +1 -0
  146. flowtask/components/ProductInfo/parsers/__init__.py +5 -0
  147. flowtask/components/ProductInfo/parsers/base.py +83 -0
  148. flowtask/components/ProductInfo/parsers/brother.py +97 -0
  149. flowtask/components/ProductInfo/parsers/canon.py +167 -0
  150. flowtask/components/ProductInfo/parsers/epson.py +118 -0
  151. flowtask/components/ProductInfo/parsers/hp.py +131 -0
  152. flowtask/components/ProductInfo/parsers/samsung.py +97 -0
  153. flowtask/components/ProductInfo/scraper.py +319 -0
  154. flowtask/components/ProductPricing.py +118 -0
  155. flowtask/components/QS.py +261 -0
  156. flowtask/components/QSBase.py +201 -0
  157. flowtask/components/QueryIterator.py +273 -0
  158. flowtask/components/QueryToInsert.py +327 -0
  159. flowtask/components/QueryToPandas.py +432 -0
  160. flowtask/components/RESTClient.py +195 -0
  161. flowtask/components/RethinkDBQuery.py +189 -0
  162. flowtask/components/Rsync.py +74 -0
  163. flowtask/components/RunSSH.py +59 -0
  164. flowtask/components/RunShell.py +71 -0
  165. flowtask/components/SalesForce.py +20 -0
  166. flowtask/components/SaveImageBank/__init__.py +257 -0
  167. flowtask/components/SchedulingVisits.py +592 -0
  168. flowtask/components/ScrapPage.py +216 -0
  169. flowtask/components/ScrapSearch.py +79 -0
  170. flowtask/components/SendNotify.py +257 -0
  171. flowtask/components/SentimentAnalysis.py +694 -0
  172. flowtask/components/ServiceScrapper/__init__.py +5 -0
  173. flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
  174. flowtask/components/ServiceScrapper/parsers/base.py +94 -0
  175. flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
  176. flowtask/components/ServiceScrapper/scrapper.py +199 -0
  177. flowtask/components/SetVariables.py +156 -0
  178. flowtask/components/SubTask.py +182 -0
  179. flowtask/components/SuiteCRM.py +48 -0
  180. flowtask/components/Switch.py +175 -0
  181. flowtask/components/TableBase.py +148 -0
  182. flowtask/components/TableDelete.py +312 -0
  183. flowtask/components/TableInput.py +143 -0
  184. flowtask/components/TableOutput/TableOutput.py +384 -0
  185. flowtask/components/TableOutput/__init__.py +3 -0
  186. flowtask/components/TableSchema.py +534 -0
  187. flowtask/components/Target.py +223 -0
  188. flowtask/components/ThumbnailGenerator.py +156 -0
  189. flowtask/components/ToPandas.py +67 -0
  190. flowtask/components/TransformRows/TransformRows.py +507 -0
  191. flowtask/components/TransformRows/__init__.py +9 -0
  192. flowtask/components/TransformRows/functions.py +559 -0
  193. flowtask/components/TransposeRows.py +176 -0
  194. flowtask/components/UPCDatabase.py +86 -0
  195. flowtask/components/UnGzip.py +171 -0
  196. flowtask/components/Uncompress.py +172 -0
  197. flowtask/components/UniqueRows.py +126 -0
  198. flowtask/components/Unzip.py +107 -0
  199. flowtask/components/UpdateOperationalVars.py +147 -0
  200. flowtask/components/UploadTo.py +299 -0
  201. flowtask/components/UploadToS3.py +136 -0
  202. flowtask/components/UploadToSFTP.py +160 -0
  203. flowtask/components/UploadToSharepoint.py +205 -0
  204. flowtask/components/UserFunc.py +122 -0
  205. flowtask/components/VivaTracker.py +140 -0
  206. flowtask/components/WSDLClient.py +123 -0
  207. flowtask/components/Wait.py +18 -0
  208. flowtask/components/Walmart.py +199 -0
  209. flowtask/components/Workplace.py +134 -0
  210. flowtask/components/XMLToPandas.py +267 -0
  211. flowtask/components/Zammad/__init__.py +41 -0
  212. flowtask/components/Zammad/models.py +0 -0
  213. flowtask/components/ZoomInfoScraper.py +409 -0
  214. flowtask/components/__init__.py +104 -0
  215. flowtask/components/abstract.py +18 -0
  216. flowtask/components/flow.py +530 -0
  217. flowtask/components/google.py +335 -0
  218. flowtask/components/group.py +221 -0
  219. flowtask/components/py.typed +0 -0
  220. flowtask/components/reviewscrap.py +132 -0
  221. flowtask/components/tAutoincrement.py +117 -0
  222. flowtask/components/tConcat.py +109 -0
  223. flowtask/components/tExplode.py +119 -0
  224. flowtask/components/tFilter.py +184 -0
  225. flowtask/components/tGroup.py +236 -0
  226. flowtask/components/tJoin.py +270 -0
  227. flowtask/components/tMap/__init__.py +9 -0
  228. flowtask/components/tMap/functions.py +54 -0
  229. flowtask/components/tMap/tMap.py +450 -0
  230. flowtask/components/tMelt.py +112 -0
  231. flowtask/components/tMerge.py +114 -0
  232. flowtask/components/tOrder.py +93 -0
  233. flowtask/components/tPandas.py +94 -0
  234. flowtask/components/tPivot.py +71 -0
  235. flowtask/components/tPluckCols.py +76 -0
  236. flowtask/components/tUnnest.py +82 -0
  237. flowtask/components/user.py +401 -0
  238. flowtask/conf.py +457 -0
  239. flowtask/download.py +102 -0
  240. flowtask/events/__init__.py +11 -0
  241. flowtask/events/events/__init__.py +20 -0
  242. flowtask/events/events/abstract.py +95 -0
  243. flowtask/events/events/alerts/__init__.py +362 -0
  244. flowtask/events/events/alerts/colfunctions.py +131 -0
  245. flowtask/events/events/alerts/functions.py +158 -0
  246. flowtask/events/events/dummy.py +12 -0
  247. flowtask/events/events/exec.py +124 -0
  248. flowtask/events/events/file/__init__.py +7 -0
  249. flowtask/events/events/file/base.py +51 -0
  250. flowtask/events/events/file/copy.py +23 -0
  251. flowtask/events/events/file/delete.py +16 -0
  252. flowtask/events/events/interfaces/__init__.py +9 -0
  253. flowtask/events/events/interfaces/client.py +67 -0
  254. flowtask/events/events/interfaces/credentials.py +28 -0
  255. flowtask/events/events/interfaces/notifications.py +58 -0
  256. flowtask/events/events/jira.py +122 -0
  257. flowtask/events/events/log.py +26 -0
  258. flowtask/events/events/logerr.py +52 -0
  259. flowtask/events/events/notify.py +59 -0
  260. flowtask/events/events/notify_event.py +160 -0
  261. flowtask/events/events/publish.py +54 -0
  262. flowtask/events/events/sendfile.py +104 -0
  263. flowtask/events/events/task.py +97 -0
  264. flowtask/events/events/teams.py +98 -0
  265. flowtask/events/events/webhook.py +58 -0
  266. flowtask/events/manager.py +287 -0
  267. flowtask/exceptions.c +39393 -0
  268. flowtask/exceptions.cpython-312-x86_64-linux-gnu.so +0 -0
  269. flowtask/extensions/__init__.py +3 -0
  270. flowtask/extensions/abstract.py +82 -0
  271. flowtask/extensions/logging/__init__.py +65 -0
  272. flowtask/hooks/__init__.py +9 -0
  273. flowtask/hooks/actions/__init__.py +22 -0
  274. flowtask/hooks/actions/abstract.py +66 -0
  275. flowtask/hooks/actions/dummy.py +23 -0
  276. flowtask/hooks/actions/jira.py +74 -0
  277. flowtask/hooks/actions/rest.py +320 -0
  278. flowtask/hooks/actions/sampledata.py +37 -0
  279. flowtask/hooks/actions/sensor.py +23 -0
  280. flowtask/hooks/actions/task.py +9 -0
  281. flowtask/hooks/actions/ticket.py +37 -0
  282. flowtask/hooks/actions/zammad.py +55 -0
  283. flowtask/hooks/hook.py +62 -0
  284. flowtask/hooks/models.py +17 -0
  285. flowtask/hooks/service.py +187 -0
  286. flowtask/hooks/step.py +91 -0
  287. flowtask/hooks/types/__init__.py +23 -0
  288. flowtask/hooks/types/base.py +129 -0
  289. flowtask/hooks/types/brokers/__init__.py +11 -0
  290. flowtask/hooks/types/brokers/base.py +54 -0
  291. flowtask/hooks/types/brokers/mqtt.py +35 -0
  292. flowtask/hooks/types/brokers/rabbitmq.py +82 -0
  293. flowtask/hooks/types/brokers/redis.py +83 -0
  294. flowtask/hooks/types/brokers/sqs.py +44 -0
  295. flowtask/hooks/types/fs.py +232 -0
  296. flowtask/hooks/types/http.py +49 -0
  297. flowtask/hooks/types/imap.py +200 -0
  298. flowtask/hooks/types/jira.py +279 -0
  299. flowtask/hooks/types/mail.py +205 -0
  300. flowtask/hooks/types/postgres.py +98 -0
  301. flowtask/hooks/types/responses/__init__.py +8 -0
  302. flowtask/hooks/types/responses/base.py +5 -0
  303. flowtask/hooks/types/sharepoint.py +288 -0
  304. flowtask/hooks/types/ssh.py +141 -0
  305. flowtask/hooks/types/tagged.py +59 -0
  306. flowtask/hooks/types/upload.py +85 -0
  307. flowtask/hooks/types/watch.py +71 -0
  308. flowtask/hooks/types/web.py +36 -0
  309. flowtask/interfaces/AzureClient.py +137 -0
  310. flowtask/interfaces/AzureGraph.py +839 -0
  311. flowtask/interfaces/Boto3Client.py +326 -0
  312. flowtask/interfaces/DropboxClient.py +173 -0
  313. flowtask/interfaces/ExcelHandler.py +94 -0
  314. flowtask/interfaces/FTPClient.py +131 -0
  315. flowtask/interfaces/GoogleCalendar.py +201 -0
  316. flowtask/interfaces/GoogleClient.py +133 -0
  317. flowtask/interfaces/GoogleDrive.py +127 -0
  318. flowtask/interfaces/GoogleGCS.py +89 -0
  319. flowtask/interfaces/GoogleGeocoding.py +93 -0
  320. flowtask/interfaces/GoogleLang.py +114 -0
  321. flowtask/interfaces/GooglePub.py +61 -0
  322. flowtask/interfaces/GoogleSheet.py +68 -0
  323. flowtask/interfaces/IMAPClient.py +137 -0
  324. flowtask/interfaces/O365Calendar.py +113 -0
  325. flowtask/interfaces/O365Client.py +220 -0
  326. flowtask/interfaces/OneDrive.py +284 -0
  327. flowtask/interfaces/Outlook.py +155 -0
  328. flowtask/interfaces/ParrotBot.py +130 -0
  329. flowtask/interfaces/SSHClient.py +378 -0
  330. flowtask/interfaces/Sharepoint.py +496 -0
  331. flowtask/interfaces/__init__.py +36 -0
  332. flowtask/interfaces/azureauth.py +119 -0
  333. flowtask/interfaces/cache.py +201 -0
  334. flowtask/interfaces/client.py +82 -0
  335. flowtask/interfaces/compress.py +525 -0
  336. flowtask/interfaces/credentials.py +124 -0
  337. flowtask/interfaces/d2l.py +239 -0
  338. flowtask/interfaces/databases/__init__.py +5 -0
  339. flowtask/interfaces/databases/db.py +223 -0
  340. flowtask/interfaces/databases/documentdb.py +55 -0
  341. flowtask/interfaces/databases/rethink.py +39 -0
  342. flowtask/interfaces/dataframes/__init__.py +11 -0
  343. flowtask/interfaces/dataframes/abstract.py +21 -0
  344. flowtask/interfaces/dataframes/arrow.py +71 -0
  345. flowtask/interfaces/dataframes/dt.py +69 -0
  346. flowtask/interfaces/dataframes/pandas.py +167 -0
  347. flowtask/interfaces/dataframes/polars.py +60 -0
  348. flowtask/interfaces/db.py +263 -0
  349. flowtask/interfaces/env.py +46 -0
  350. flowtask/interfaces/func.py +137 -0
  351. flowtask/interfaces/http.py +1780 -0
  352. flowtask/interfaces/locale.py +40 -0
  353. flowtask/interfaces/log.py +75 -0
  354. flowtask/interfaces/mask.py +143 -0
  355. flowtask/interfaces/notification.py +154 -0
  356. flowtask/interfaces/playwright.py +339 -0
  357. flowtask/interfaces/powerpoint.py +368 -0
  358. flowtask/interfaces/py.typed +0 -0
  359. flowtask/interfaces/qs.py +376 -0
  360. flowtask/interfaces/result.py +87 -0
  361. flowtask/interfaces/selenium_service.py +779 -0
  362. flowtask/interfaces/smartsheet.py +154 -0
  363. flowtask/interfaces/stat.py +39 -0
  364. flowtask/interfaces/task.py +96 -0
  365. flowtask/interfaces/template.py +118 -0
  366. flowtask/interfaces/vectorstores/__init__.py +1 -0
  367. flowtask/interfaces/vectorstores/abstract.py +133 -0
  368. flowtask/interfaces/vectorstores/milvus.py +669 -0
  369. flowtask/interfaces/zammad.py +107 -0
  370. flowtask/models.py +193 -0
  371. flowtask/parsers/__init__.py +15 -0
  372. flowtask/parsers/_yaml.c +11978 -0
  373. flowtask/parsers/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
  374. flowtask/parsers/argparser.py +235 -0
  375. flowtask/parsers/base.c +15155 -0
  376. flowtask/parsers/base.cpython-312-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-312-x86_64-linux-gnu.so +0 -0
  379. flowtask/parsers/maps.py +49 -0
  380. flowtask/parsers/toml.c +11968 -0
  381. flowtask/parsers/toml.cpython-312-x86_64-linux-gnu.so +0 -0
  382. flowtask/plugins/__init__.py +16 -0
  383. flowtask/plugins/components/__init__.py +0 -0
  384. flowtask/plugins/handler/__init__.py +45 -0
  385. flowtask/plugins/importer.py +31 -0
  386. flowtask/plugins/sources/__init__.py +0 -0
  387. flowtask/runner.py +283 -0
  388. flowtask/scheduler/__init__.py +9 -0
  389. flowtask/scheduler/functions.py +493 -0
  390. flowtask/scheduler/handlers/__init__.py +8 -0
  391. flowtask/scheduler/handlers/manager.py +504 -0
  392. flowtask/scheduler/handlers/models.py +58 -0
  393. flowtask/scheduler/handlers/service.py +72 -0
  394. flowtask/scheduler/notifications.py +65 -0
  395. flowtask/scheduler/scheduler.py +993 -0
  396. flowtask/services/__init__.py +0 -0
  397. flowtask/services/bots/__init__.py +0 -0
  398. flowtask/services/bots/telegram.py +264 -0
  399. flowtask/services/files/__init__.py +11 -0
  400. flowtask/services/files/manager.py +522 -0
  401. flowtask/services/files/model.py +37 -0
  402. flowtask/services/files/service.py +767 -0
  403. flowtask/services/jira/__init__.py +3 -0
  404. flowtask/services/jira/jira_actions.py +191 -0
  405. flowtask/services/tasks/__init__.py +13 -0
  406. flowtask/services/tasks/launcher.py +213 -0
  407. flowtask/services/tasks/manager.py +323 -0
  408. flowtask/services/tasks/service.py +275 -0
  409. flowtask/services/tasks/task_manager.py +376 -0
  410. flowtask/services/tasks/tasks.py +155 -0
  411. flowtask/storages/__init__.py +16 -0
  412. flowtask/storages/exceptions.py +12 -0
  413. flowtask/storages/files/__init__.py +8 -0
  414. flowtask/storages/files/abstract.py +29 -0
  415. flowtask/storages/files/filesystem.py +66 -0
  416. flowtask/storages/tasks/__init__.py +19 -0
  417. flowtask/storages/tasks/abstract.py +26 -0
  418. flowtask/storages/tasks/database.py +33 -0
  419. flowtask/storages/tasks/filesystem.py +108 -0
  420. flowtask/storages/tasks/github.py +119 -0
  421. flowtask/storages/tasks/memory.py +45 -0
  422. flowtask/storages/tasks/row.py +25 -0
  423. flowtask/tasks/__init__.py +0 -0
  424. flowtask/tasks/abstract.py +526 -0
  425. flowtask/tasks/command.py +118 -0
  426. flowtask/tasks/pile.py +486 -0
  427. flowtask/tasks/py.typed +0 -0
  428. flowtask/tasks/task.py +778 -0
  429. flowtask/template/__init__.py +161 -0
  430. flowtask/tests.py +257 -0
  431. flowtask/types/__init__.py +8 -0
  432. flowtask/types/typedefs.c +11347 -0
  433. flowtask/types/typedefs.cpython-312-x86_64-linux-gnu.so +0 -0
  434. flowtask/utils/__init__.py +24 -0
  435. flowtask/utils/constants.py +117 -0
  436. flowtask/utils/encoders.py +21 -0
  437. flowtask/utils/executor.py +112 -0
  438. flowtask/utils/functions.cpp +14280 -0
  439. flowtask/utils/functions.cpython-312-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-312-x86_64-linux-gnu.so +0 -0
  442. flowtask/utils/mail.py +63 -0
  443. flowtask/utils/parseqs.c +13324 -0
  444. flowtask/utils/parserqs.cpython-312-x86_64-linux-gnu.so +0 -0
  445. flowtask/utils/stats.py +308 -0
  446. flowtask/utils/transformations.py +74 -0
  447. flowtask/utils/uv.py +12 -0
  448. flowtask/utils/validators.py +97 -0
  449. flowtask/version.py +11 -0
  450. flowtask-5.8.4.dist-info/LICENSE +201 -0
  451. flowtask-5.8.4.dist-info/METADATA +209 -0
  452. flowtask-5.8.4.dist-info/RECORD +470 -0
  453. flowtask-5.8.4.dist-info/WHEEL +6 -0
  454. flowtask-5.8.4.dist-info/entry_points.txt +3 -0
  455. flowtask-5.8.4.dist-info/top_level.txt +2 -0
  456. plugins/components/CreateQR.py +39 -0
  457. plugins/components/TestComponent.py +28 -0
  458. plugins/components/Use1.py +13 -0
  459. plugins/components/Workplace.py +117 -0
  460. plugins/components/__init__.py +3 -0
  461. plugins/sources/__init__.py +0 -0
  462. plugins/sources/get_populartimes.py +78 -0
  463. plugins/sources/google.py +150 -0
  464. plugins/sources/hubspot.py +679 -0
  465. plugins/sources/icims.py +679 -0
  466. plugins/sources/mobileinsight.py +501 -0
  467. plugins/sources/newrelic.py +262 -0
  468. plugins/sources/uap.py +268 -0
  469. plugins/sources/venu.py +244 -0
  470. plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,40 @@
1
+ from typing import Optional
2
+ from abc import ABC
3
+ import logging
4
+ import locale
5
+
6
+
7
+ class LocaleSupport(ABC):
8
+ """LocaleSupport.
9
+
10
+ Adding Support for Encoding and Locale to every Component in FlowTask.
11
+ """
12
+
13
+ encoding: str = "UTF-8"
14
+ _locale: Optional[str] = None
15
+
16
+ def __init__(self, *args, **kwargs):
17
+ self.encoding = kwargs.pop('encoding', "UTF-8")
18
+ self._locale = kwargs.pop('l18n', None)
19
+ # Localization
20
+ if self._locale is None:
21
+ newloc = (locale.getlocale())[0]
22
+ self._locale = f"{newloc}.{self.encoding}"
23
+ else:
24
+ if self.encoding not in self._locale:
25
+ self._locale = f"{self._locale}.{self.encoding}"
26
+ try:
27
+ # avoid errors on unsupported locales
28
+ locale.setlocale(locale.LC_TIME, self._locale)
29
+ except (RuntimeError, NameError, locale.Error) as err:
30
+ logging.warning(
31
+ f"Error on Locale Support: {err}"
32
+ )
33
+ newloc = (locale.getlocale())[0]
34
+ self._locale = f"{newloc}.UTF-8"
35
+ locale.setlocale(locale.LC_TIME, self._locale)
36
+ # Call super only if there’s a next class in the MRO
37
+ try:
38
+ super().__init__(*args, **kwargs)
39
+ except TypeError:
40
+ super().__init__()
@@ -0,0 +1,75 @@
1
+ from abc import ABC
2
+ from enum import Enum
3
+ import traceback
4
+ from navconfig.logging import logging
5
+ from ..utils import cPrint
6
+ from ..exceptions import ComponentError
7
+
8
+ ### TODO: Adding functions for Raising Errors.
9
+ class SkipErrors(Enum):
10
+ SKIP = "skip"
11
+ LOG = "log_only"
12
+ ENFORCE = None
13
+
14
+ def __str__(self):
15
+ return {
16
+ SkipErrors.SKIP: "skip",
17
+ SkipErrors.LOG: "Log Errors",
18
+ SkipErrors.ENFORCE: "Enforce",
19
+ }[self]
20
+
21
+ class LogSupport(ABC):
22
+ """LogSupport.
23
+
24
+ Adding Logging support to every FlowTask Component.
25
+ """
26
+
27
+ def __init__(self, *args, **kwargs):
28
+ self._name = kwargs.get('name', self.__class__.__name__)
29
+ self.skipError: SkipErrors = SkipErrors.ENFORCE
30
+ # logging object
31
+ self._logger = logging.getLogger(
32
+ f"FlowTask.Component.{self._name}"
33
+ )
34
+ # Debugging
35
+ self._debug: bool = kwargs.get('debug', False)
36
+ if self._debug:
37
+ self._logger.setLevel(logging.DEBUG)
38
+ super().__init__(*args, **kwargs)
39
+
40
+ def log(self, message) -> None:
41
+ self._logger.info(message)
42
+ if self._debug is True:
43
+ cPrint(message, level="INFO")
44
+
45
+ def debug(self, message):
46
+ self._logger.debug(message)
47
+ if self._debug is True:
48
+ cPrint(message, level="DEBUG")
49
+
50
+ def warning(self, message):
51
+ self._logger.warning(message)
52
+ if self._debug is True:
53
+ cPrint(message, level="WARN")
54
+
55
+ def exception(self, message):
56
+ self._logger.exception(message, stack_info=True)
57
+ if self._debug is True:
58
+ cPrint(message, level="CRITICAL")
59
+
60
+ def echo(self, message: str, level: str = "INFO") -> None:
61
+ cPrint(message, level=level)
62
+
63
+ def error(
64
+ self,
65
+ message: str,
66
+ exc: BaseException,
67
+ status: int = 400,
68
+ stacktrace: bool = False,
69
+ ):
70
+ payload = None
71
+ if stacktrace is True:
72
+ payload = traceback.format_exc()
73
+ raise ComponentError(
74
+ f"{message}, error={exc}", status=status, stacktrace=payload
75
+ ) from exc
@@ -0,0 +1,143 @@
1
+ from abc import ABC
2
+ from typing import ParamSpec, Any
3
+ from pathlib import Path, PurePath
4
+ from navconfig.logging import logging
5
+ from ..utils import SafeDict, fnExecutor
6
+
7
+
8
+ P = ParamSpec("P")
9
+
10
+
11
+ class MaskSupport(ABC):
12
+ """MaskSupport.
13
+
14
+ Processing Masks Support.
15
+ """
16
+ def __init__(
17
+ self,
18
+ *args: P.args,
19
+ **kwargs: P.kwargs
20
+ ):
21
+ self._mask = {} # masks for function replacing
22
+ masks = kwargs.pop('_masks', {})
23
+ self.logger = logging.getLogger('Flowtask.Mask')
24
+ # filling Masks:
25
+ if "masks" in kwargs:
26
+ self._mask = kwargs.pop('masks')
27
+ object.__setattr__(self, "masks", self._mask)
28
+ for mask, replace in masks.items():
29
+ self._mask[mask] = replace # override component's masks
30
+ try:
31
+ super().__init__(*args, **kwargs)
32
+ except TypeError:
33
+ super().__init__()
34
+
35
+ def _mask_processing(self, variables: dict) -> None:
36
+ try:
37
+ for mask, replace in self._mask.items():
38
+ # first: making replacement of masks based on vars:
39
+ try:
40
+ if mask in variables:
41
+ value = variables[mask]
42
+ else:
43
+ value = replace.format(**variables)
44
+ except Exception:
45
+ value = replace
46
+ value = fnExecutor(value)
47
+ self.logger.notice(
48
+ f":: Set Mask {mask} == {value!s}"
49
+ )
50
+ self._mask[mask] = value
51
+ except Exception as err:
52
+ self.logger.warning(
53
+ f"Mask Error: {err}"
54
+ )
55
+
56
+ def mask_replacement(self, obj: Any):
57
+ """mask_replacement.
58
+
59
+ Replacing occurrences of Masks into an String.
60
+ Args:
61
+ obj (Any): Any kind of object.
62
+
63
+ Returns:
64
+ Any: Object with replaced masks.
65
+ """
66
+ for mask, replace in self._mask.items():
67
+ if mask in self._variables:
68
+ value = self._variables[mask]
69
+ # Using SafeDict instead direct replacement:
70
+ value = str(obj).format_map(SafeDict(**self._variables))
71
+ else:
72
+ if str(obj) == mask and mask.startswith("#"):
73
+ # full replacement of the mask
74
+ obj = replace
75
+ return obj
76
+ else:
77
+ try:
78
+ if str(obj) == mask and mask.startswith("{"):
79
+ value = str(obj).replace(mask, str(replace))
80
+ elif mask in str(obj) and mask.startswith("{"):
81
+ try:
82
+ value = str(obj).replace(mask, str(replace))
83
+ except (ValueError, TypeError) as exc:
84
+ # remove the "{" and "}" from the mask
85
+ mask = mask[1:-1]
86
+ value = str(obj).format_map(
87
+ SafeDict({mask: replace})
88
+ )
89
+ else:
90
+ value = str(obj).format_map(
91
+ SafeDict({mask: replace})
92
+ )
93
+ except (ValueError, TypeError):
94
+ value = str(obj).replace(mask, str(replace))
95
+ if isinstance(obj, PurePath):
96
+ obj = Path(value).resolve()
97
+ else:
98
+ obj = value
99
+ return obj
100
+
101
+ def mask_replacement_recursively(self, obj: Any):
102
+ """
103
+ This function replaces all occurrences of "{key}" in the obj structure
104
+ with the corresponding value from the replacements dictionary, recursively.
105
+
106
+ Args:
107
+ obj: an object to process.
108
+
109
+ Returns:
110
+ The modified obj structure with curly brace replacements.
111
+ """
112
+
113
+ if isinstance(obj, dict):
114
+ # If it's a dictionary, iterate through each key-value pair
115
+ for key, value in obj.copy().items():
116
+ # Recursively replace in the key and value
117
+ obj[key] = self.mask_replacement_recursively(value)
118
+
119
+ # Check if the key itself has curly braces
120
+ if isinstance(key, str):
121
+ # Use f-string for formatted key
122
+ new_key = self.mask_replacement(key)
123
+
124
+ if new_key != key:
125
+ obj.pop(key) # Remove old key and add formatted one
126
+ obj[new_key] = value # Add key-value pair with formatted key
127
+
128
+ elif isinstance(obj, list):
129
+ # If it's a list, iterate through each element and replace recursively
130
+ for idx, value in enumerate(obj):
131
+ obj[idx] = self.mask_replacement_recursively(value)
132
+
133
+ elif isinstance(obj, str):
134
+ # If it's a string, use f-string formatting to replace
135
+ return self.mask_replacement(obj)
136
+
137
+ return obj
138
+
139
+ def mask_start(self, **kwargs):
140
+ # Usable by Hooks
141
+ self._masks: dict = kwargs.pop("masks", {})
142
+ self._variables = kwargs.pop("variables", {})
143
+ self._mask_processing(variables=self._variables)
@@ -0,0 +1,154 @@
1
+ """
2
+ Interface for sending messages using Notify.
3
+ """
4
+ import os
5
+ import asyncio
6
+ from pathlib import Path, PurePath
7
+ from navconfig.logging import logging
8
+ from notify import Notify
9
+ from notify.providers.email import Email
10
+ from notify.models import (
11
+ Actor,
12
+ Chat,
13
+ Channel,
14
+ TeamsChannel,
15
+ TeamsCard
16
+ )
17
+ from notify.conf import MS_TEAMS_DEFAULT_TEAMS_ID
18
+ from flowtask.conf import (
19
+ EVENT_CHAT_ID,
20
+ EVENT_CHAT_BOT,
21
+ DEFAULT_RECIPIENT,
22
+ EMAIL_USERNAME,
23
+ EMAIL_PASSWORD,
24
+ EMAIL_PORT,
25
+ EMAIL_HOST,
26
+ SLACK_DEFAULT_CHANNEL,
27
+ SLACK_DEFAULT_CHANNEL_NAME,
28
+ MS_TEAMS_NAVIGATOR_CHANNEL,
29
+ MS_TEAMS_NAVIGATOR_CHANNEL_ID,
30
+ )
31
+ from .mask import MaskSupport
32
+
33
+
34
+ class Notification(MaskSupport):
35
+ def __init__(self, *args, **kwargs):
36
+ super(Notification, self).__init__(*args, **kwargs)
37
+ self.provider: str = kwargs.pop("type", "dummy")
38
+ self.list_attachment: list = []
39
+ self.account: str = self.set_account(
40
+ kwargs.pop("account", {})
41
+ )
42
+ # recipient:
43
+ self._recipients = kwargs.pop("recipients", [])
44
+ self._channel = kwargs.pop("channel", "Navigator")
45
+ self._channel_id = kwargs.pop("channel_id", None)
46
+ self._chat_id = kwargs.pop('chat_id', EVENT_CHAT_ID)
47
+ self._bot_token = kwargs.pop('bot_token', EVENT_CHAT_BOT)
48
+ self._kwargs = kwargs
49
+ self.message = kwargs.pop("message", {})
50
+ template = self.message.pop("template", None)
51
+ self._template = kwargs.pop("template", template)
52
+ self._loop = kwargs.pop(
53
+ "event_loop",
54
+ asyncio.get_event_loop()
55
+ )
56
+
57
+ def set_account(self, account: dict):
58
+ for key, default in account.items():
59
+ val = self.get_env_value(account[key], default=default)
60
+ account[key] = val
61
+ return account
62
+
63
+ def get_env_value(self, key, default: str = None):
64
+ if key is None:
65
+ return None
66
+ if val := os.getenv(key):
67
+ return val
68
+ elif val := self._environment.get(key, default):
69
+ return val
70
+ else:
71
+ return key
72
+
73
+ def get_notify(self, **kwargs):
74
+ recipient = Actor(**DEFAULT_RECIPIENT)
75
+ if self.provider == "telegram":
76
+ recipient = Chat(**{"chat_id": self._chat_id, "chat_name": self._channel})
77
+ # send notifications to Telegram bot
78
+ args = {
79
+ "bot_token": self._bot_token,
80
+ "loop": asyncio.get_event_loop(),
81
+ **kwargs,
82
+ }
83
+ provider = Notify("telegram", **args)
84
+ elif self.provider == "outlook":
85
+ args = {"use_credentials": True, "loop": asyncio.get_event_loop(), **kwargs}
86
+ provider = Notify("outlook", **args)
87
+ elif self.provider == "slack":
88
+ _id = self._channel_id if self._channel_id else SLACK_DEFAULT_CHANNEL
89
+ name = self._channel if self._channel else SLACK_DEFAULT_CHANNEL_NAME
90
+ recipient = Channel(channel_id=_id, channel_name=name)
91
+ provider = Notify("slack", **kwargs)
92
+ elif self.provider == "email":
93
+ if not self.account:
94
+ account = {
95
+ "host": EMAIL_HOST,
96
+ "port": EMAIL_PORT,
97
+ "username": EMAIL_USERNAME,
98
+ "password": EMAIL_PASSWORD,
99
+ }
100
+ else:
101
+ account = self.account
102
+ account = {**account, **kwargs}
103
+ if not self._recipients:
104
+ recipient = Actor(**DEFAULT_RECIPIENT)
105
+ else:
106
+ recipient = [Actor(**user) for user in self._recipients]
107
+ provider = Email(debug=True, **account)
108
+ elif self.provider == "teams":
109
+ _id = (
110
+ self._channel_id if self._channel_id else MS_TEAMS_NAVIGATOR_CHANNEL_ID
111
+ )
112
+ name = self._channel if self._channel else MS_TEAMS_NAVIGATOR_CHANNEL
113
+ args = {"as_user": True, "loop": asyncio.get_event_loop(), **kwargs}
114
+ recipient = TeamsChannel(
115
+ name=name, team_id=MS_TEAMS_DEFAULT_TEAMS_ID, channel_id=_id
116
+ )
117
+ provider = Notify("teams", **args)
118
+ else:
119
+ # Any other Notify Provider:
120
+ if not self._recipient:
121
+ recipient = Actor(**DEFAULT_RECIPIENT)
122
+ else:
123
+ recipient = [Actor(**user) for user in self._recipients]
124
+ provider = Notify(self.provider, **kwargs)
125
+ logging.debug(f"Created Notify Component {provider}")
126
+ return [provider, recipient]
127
+
128
+ def get_attachment_files(self, result: list) -> list:
129
+ if result is None:
130
+ return []
131
+ elif isinstance(result, str):
132
+ result = [result]
133
+ files = []
134
+ for part in result:
135
+ if isinstance(part, str):
136
+ file = Path(part.strip("'"))
137
+ if file.exists():
138
+ files.append(file)
139
+ elif isinstance(part, PurePath):
140
+ if file.exists():
141
+ files.append(file)
142
+ return files
143
+
144
+ def get_message(self, message: str):
145
+ if self.provider in ("email", "gmail", "outlook"):
146
+ args = {"subject": message, **self.message}
147
+ elif self.provider == "teams":
148
+ msg = TeamsCard(text=message, summary="Task Summary")
149
+ args = {"message": msg, **self.message}
150
+ elif self.provider in ("slack", "telegram"):
151
+ args = {"message": message, **self.message}
152
+ else:
153
+ args = {"message": message, **self.message}
154
+ return args