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,3 @@
1
+ from .jira_actions import JiraActions
2
+
3
+ __all__ = ('JiraActions', )
@@ -0,0 +1,191 @@
1
+ from jira import JIRA, JIRAError
2
+ import requests
3
+
4
+ class JiraActions():
5
+ def __init__(self, server: str, email: str, token: str):
6
+ """
7
+ Init class JiraActions.
8
+
9
+ :param server: Server URL.
10
+ :param email: User Email.
11
+ :param token: API token of Jira.
12
+ """
13
+ try:
14
+ self.server = server
15
+ self.jira = JIRA(server=server, basic_auth=(email, token))
16
+ except JIRAError as e:
17
+ self.handle_jira_error(e, "Authenticating in Jira")
18
+
19
+ def create_issue(self, project_key: str, summary: str, description: str, issue_type: str = 'Bug'):
20
+ """
21
+ Creates a new Jira issue in the specified project.
22
+
23
+ :param project_key: Key of the project in which the ticket is to be created.
24
+ :param summary: Summary or title of the ticket.
25
+ :param description: Description of the ticket.
26
+ :param issue_type: Type of ticket (default 'Task').
27
+ :return: Returns the ticket created.
28
+ """
29
+ try:
30
+ issue_data = {
31
+ 'project': {'key': project_key},
32
+ 'summary': summary,
33
+ 'description': description,
34
+ 'issuetype': {'name': issue_type}
35
+ }
36
+ issue = self.jira.create_issue(fields=issue_data)
37
+ return issue
38
+ except JIRAError as e:
39
+ self.handle_jira_error(e, "Creating an issue")
40
+
41
+ def add_comment(self, issue_key: str, comment: str):
42
+ """
43
+ Adds a comment to a Jira issue.
44
+
45
+ :param issue_key: Key of the issue to add the comment to.
46
+ :param comment: The comment to be added.
47
+ :return: Returns the added comment or raises an exception in case of error.
48
+ """
49
+ try:
50
+ issue = self.jira.issue(issue_key)
51
+ return self.jira.add_comment(issue, comment)
52
+ except JIRAError as e:
53
+ self.handle_jira_error(e, "Adding a comment")
54
+
55
+ def transition_issue(self, issue_key: str, transition_name: str, comment: str = None):
56
+ """
57
+ Transitions a Jira issue to a new status based on the transition name.
58
+ If the transition name is invalid, provides a list of valid transitions for the issue.
59
+
60
+ :param issue_key: Key of the issue to transition.
61
+ :param transition_name: Name of the transition to perform (e.g., 'Start Progress', 'Close Issue').
62
+ :param comment: Optional comment to add during the transition.
63
+ :return: Returns the issue after the transition or raises an exception in case of error.
64
+ """
65
+ try:
66
+ # Get all possible transitions for the issue
67
+ transitions = self.jira.transitions(issue_key)
68
+
69
+ # Find the transition ID corresponding to the provided transition name
70
+ valid_transitions = [t['name'] for t in transitions]
71
+ transition_id = next((t['id'] for t in transitions if t['name'].lower() == transition_name.lower()), None)
72
+
73
+ if not transition_id:
74
+ valid_transitions_str = ', '.join(valid_transitions)
75
+ raise ValueError(
76
+ f"Transition '{transition_name}' not found for issue {issue_key}. "
77
+ f"Valid transitions are: {valid_transitions_str}"
78
+ )
79
+
80
+ # Perform the transition
81
+ self.jira.transition_issue(issue_key, transition_id, comment=comment)
82
+ return self.jira.issue(issue_key)
83
+
84
+ except JIRAError as e:
85
+ self.handle_jira_error(e, "transitioning an issue")
86
+
87
+ def assign_issue(self, issue_key: str, assignee: str):
88
+ """
89
+ Assigns a Jira issue to a specified user.
90
+
91
+ :param issue_key: Key of the issue to be assigned (e.g., 'PROJ-123').
92
+ :param assignee: Username or email of the user to whom the issue will be assigned.
93
+ :return: The updated issue after the assignment.
94
+ """
95
+ try:
96
+ # Assign the issue to the specified user
97
+ issue = self.jira.issue(issue_key)
98
+ self.jira.assign_issue(issue, assignee)
99
+ return issue
100
+ except JIRAError as e:
101
+ self.handle_jira_error(e, f"assigning the issue {issue_key} to {assignee}")
102
+
103
+ def add_worklog(self, issue_key: str, time_spent: str, comment: str = None, started: str = None):
104
+ """
105
+ Adds a worklog entry to a Jira issue.
106
+
107
+ :param issue_key: Key of the issue to which the worklog will be added.
108
+ :param time_spent: Time spent on the issue (e.g., '2h', '3d', '1w').
109
+ :param comment: Optional comment to add with the worklog.
110
+ :param started: Date and time the work started (optional, format: 'YYYY-MM-DDTHH:MM:SS.000+0000').
111
+ :return: The worklog entry that was added, or raises an exception in case of error.
112
+ """
113
+ try:
114
+ valid_units = ['h', 'd', 'w']
115
+ if not any(time_spent.endswith(unit) for unit in valid_units):
116
+ raise ValueError(f"Invalid time format: {time_spent}. Must end with one of {valid_units}.")
117
+ # Add the worklog to the issue
118
+ worklog = self.jira.add_worklog(
119
+ issue=issue_key,
120
+ timeSpent=time_spent,
121
+ comment=comment,
122
+ started=started
123
+ )
124
+ return worklog
125
+ except JIRAError as e:
126
+ self.handle_jira_error(e, "Adding a worklog")
127
+
128
+ def list_issues(self):
129
+ """
130
+ Return a list of Jira issues.
131
+
132
+ :return: The list of closed issues assigned to user.
133
+ """
134
+ try:
135
+ qry = 'assignee = currentUser() and status != Closed and status != CANCELLED and status != Done order by created asc' # noqa
136
+ issues = self.jira.search_issues(qry)
137
+ return issues
138
+ except JIRAError as e:
139
+ self.handle_jira_error(e, "listing the issues")
140
+
141
+ def list_transitions(self, issue_key: str):
142
+ """
143
+ Return a list of a valid transitions of a issue.
144
+
145
+ :param issue_key: Key of the issue to transition.
146
+ :return: Returns the list of a valid transitions of a issue.
147
+ """
148
+ try:
149
+ transitions = self.jira.transitions(issue_key)
150
+ valid_transitions = [t['name'] for t in transitions]
151
+ return valid_transitions
152
+ except JIRAError as e:
153
+ self.handle_jira_error(e, "listing the transitions")
154
+
155
+ @staticmethod
156
+ def handle_jira_error(e: Exception, action: str):
157
+ """
158
+ Handles errors and exceptions that occur during interactions with Jira.
159
+
160
+ This function captures exceptions thrown during Jira operations and raises appropriate
161
+ errors with relevant messages based on the type of exception (e.g., JIRAError, connection issues).
162
+
163
+ :param e: Exception object. This can be a JIRAError or other types of exceptions (e.g., connection errors).
164
+ :param action: A string describing the action that was being attempted when the error occurred
165
+ (e.g., 'creating an issue', 'adding a comment').
166
+
167
+ :raises ValueError: If there is a validation error (e.g., incorrect data in Jira fields).
168
+ :raises PermissionError: If the user does not have sufficient permissions for the Jira operation.
169
+ :raises ConnectionError: If there is a problem connecting to the Jira server or if the requested resource was not found.
170
+ :raises TimeoutError: If the operation timed out while connecting to the Jira server.
171
+ :raises Exception: For any other unexpected errors that occur during the Jira operation.
172
+ """ # noqa
173
+ if isinstance(e, JIRAError):
174
+ if e.status_code == 400:
175
+ raise ValueError(f"Validation error while {action}, please, check the provided values.")
176
+ elif e.status_code == 403:
177
+ raise PermissionError(f"Insufficient permissions while {action}.")
178
+ elif e.status_code == 404:
179
+ raise ConnectionError(f"Resource not found while {action}.")
180
+ elif e.status_code in (500, 502):
181
+ raise Exception(f"Server error while {action}. The Jira server might be down.")
182
+ else:
183
+ raise Exception(f"Jira error while {action}: {e.text}")
184
+ elif isinstance(e, requests.ConnectionError):
185
+ raise ConnectionError(
186
+ f"Connection error: Unable to connect to the Jira server: {e}"
187
+ )
188
+ elif isinstance(e, requests.Timeout):
189
+ raise TimeoutError("Request timed out.")
190
+ else:
191
+ raise Exception(f"An unexpected error occurred while {action}: {str(e)}")
@@ -0,0 +1,13 @@
1
+ """
2
+ Tasks.
3
+
4
+ Task-based management, creation and execution of tasks.
5
+ """
6
+ from .service import TaskService
7
+ from .launcher import TaskLauncher
8
+ from .manager import TaskManager
9
+ from .tasks import launch_task
10
+
11
+ __all__ = (
12
+ "TaskManager", "TaskService", "TaskLauncher", "launch_task",
13
+ )
@@ -0,0 +1,213 @@
1
+ """
2
+ TaskService.
3
+
4
+ Work with managing tasks, creation, deleting, listing, etc.
5
+ """
6
+ import uuid
7
+ from navigator_session import get_session
8
+ from navigator.views import BaseView
9
+ from navigator.responses import JSONResponse
10
+ from navigator.conf import AUTH_SESSION_OBJECT
11
+ from querysource.types import strtobool
12
+ from ...exceptions import (
13
+ TaskNotFound,
14
+ DataNotFound,
15
+ TaskFailed,
16
+ FileError,
17
+ FileNotFound,
18
+ )
19
+ from .tasks import launch_task
20
+
21
+
22
+ def is_boolean(value: str) -> bool:
23
+ if isinstance(value, bool):
24
+ return value
25
+ try:
26
+ return strtobool(value)
27
+ except ValueError:
28
+ return False
29
+
30
+
31
+ class TaskLauncher(BaseView):
32
+ _logger_name = "TaskLauncher"
33
+
34
+ def get_user(self, session, idx: str = "user_id") -> int:
35
+ if not session:
36
+ self.error(response={"error": "Unauthorized"}, status=403)
37
+ try:
38
+ if AUTH_SESSION_OBJECT in session:
39
+ return session[AUTH_SESSION_OBJECT][idx]
40
+ else:
41
+ return session[idx]
42
+ except KeyError:
43
+ self.error(
44
+ response={
45
+ "error": "Unauthorized",
46
+ "message": "Hint: maybe you need to pass an Authorization token.",
47
+ },
48
+ status=403,
49
+ )
50
+
51
+ async def post(self):
52
+ """
53
+ POST Method.
54
+ description: Executing a Task
55
+ tags:
56
+ - tasks
57
+ - DataIntegration
58
+ consumes:
59
+ - application/json
60
+ produces:
61
+ - application/json
62
+ responses:
63
+ "200":
64
+ description: Existing Task was updated or executed.
65
+ "201":
66
+ description: New Task was inserted
67
+ "202":
68
+ description: Task was accepted to run
69
+ "400":
70
+ description: Task Failed to execute
71
+ "403":
72
+ description: Forbidden Call
73
+ "404":
74
+ description: No Data was found
75
+ "406":
76
+ description: Query Error
77
+ "409":
78
+ description: Conflict, a constraint was violated
79
+ """
80
+ # get the URL parameters
81
+ params = self.get_args()
82
+ # get post Data
83
+ data = await self.post_data()
84
+ # Default launch a task on Queue
85
+ longrunner = True
86
+ ## Getting User Information:
87
+ try:
88
+ usr = await get_session(self.request)
89
+ user = self.get_user(usr)
90
+ except (TypeError, ValueError):
91
+ user = None
92
+ self.logger.notice(f"Task User: {user}")
93
+ try:
94
+ program = params["program"]
95
+ del params["program"]
96
+ except KeyError:
97
+ # we need a program
98
+ try:
99
+ program = data["program"]
100
+ except KeyError:
101
+ headers = {
102
+ "X-STATUS": "Error",
103
+ "X-MESSAGE": "Resource Error: We need a Program Name",
104
+ }
105
+ msg = {
106
+ "state": "Failed",
107
+ "message": "Error: we need a program name",
108
+ "status": 400,
109
+ }
110
+ return self.error(response=msg, headers=headers, status=400)
111
+ try:
112
+ task_id = params["task_id"]
113
+ del params["task_id"]
114
+ except KeyError:
115
+ # we need a Task ID
116
+ try:
117
+ task_id = data["task_id"]
118
+ except KeyError:
119
+ headers = {
120
+ "X-STATUS": "Error",
121
+ "X-MESSAGE": "Resource Error: We need a Task Name",
122
+ }
123
+ msg = {
124
+ "state": "Failed",
125
+ "message": "Error: we need a Task ID",
126
+ "status": 400,
127
+ }
128
+ return self.error(response=msg, headers=headers, status=400)
129
+ try:
130
+ try:
131
+ longrunner = is_boolean(data["long_running"])
132
+ del data["long_running"]
133
+ except KeyError:
134
+ pass
135
+ try:
136
+ longrunner = is_boolean(params["long_running"])
137
+ del params["long_running"]
138
+ except KeyError:
139
+ pass
140
+ try:
141
+ no_worker = is_boolean(data["no_worker"])
142
+ del data["no_worker"]
143
+ except KeyError:
144
+ no_worker = False
145
+ self.logger.debug(
146
+ f"Long Runner: {longrunner}, No Using Workers: {no_worker}"
147
+ )
148
+ try:
149
+ priority = data["priority"]
150
+ del data["priority"]
151
+ except KeyError:
152
+ priority = "low"
153
+ # cannot update or insert a Task, we need to Run that task
154
+ result = {}
155
+ args = {}
156
+ if isinstance(params, dict):
157
+ args = params
158
+ if data:
159
+ args = {**args, **data}
160
+ task_uuid = uuid.uuid4()
161
+ uid, action, result = await launch_task(
162
+ program_slug=program,
163
+ task_id=task_id,
164
+ loop=self._loop,
165
+ task_uuid=task_uuid,
166
+ queued=longrunner,
167
+ no_worker=no_worker,
168
+ priority=priority,
169
+ userid=user,
170
+ **args,
171
+ )
172
+ if isinstance(result, BaseException):
173
+ state = 400
174
+ result = f"{result!s}"
175
+ elif action == "Queued":
176
+ state = 202
177
+ else:
178
+ state = 200
179
+ response = {
180
+ "message": f"Task {program}.{task_id} was {action}",
181
+ "task": f"{program}.{task_id}",
182
+ "task_execution": task_uuid,
183
+ "result": result,
184
+ "task_uuid": uid,
185
+ }
186
+ headers = {
187
+ "X-STATUS": "Task OK",
188
+ "X-MESSAGE": f"Execution of Task {program}.{task_id} on {action}",
189
+ }
190
+ try:
191
+ return JSONResponse(response, status=state, headers=headers)
192
+ except Exception as e:
193
+ print("ERROR: ", e)
194
+ except DataNotFound as err:
195
+ error = f"Error: Data not found {program}.{task_id}"
196
+ msg = {"message": error, "error": 404}
197
+ return self.error(response=msg, exception=err, status=404)
198
+ except TaskNotFound as err:
199
+ error = f"Error: Task not found {program}.{task_id}"
200
+ msg = {"message": error}
201
+ return self.error(response=msg, exception=err, status=401)
202
+ except TaskFailed as err:
203
+ error = f"Error on Task {program}.{task_id} Failed"
204
+ msg = {"message": error}
205
+ return self.error(response=msg, exception=err, status=406)
206
+ except (FileNotFound, FileError) as err:
207
+ error = f"Error on Task {program}.{task_id} File Not Found: {err}"
208
+ msg = {"message": error}
209
+ return self.error(response=msg, exception=err, status=404)
210
+ except Exception as err:
211
+ error = f"Uncaught exception on Task {program}.{task_id}"
212
+ msg = {"message": error}
213
+ return self.critical(reason=msg, exception=err, status=500)