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,268 @@
1
+ """Basic HTTP Connection Request.
2
+
3
+ Example:
4
+
5
+ ```yaml
6
+ HTTPClient:
7
+ Group: ICIMSDownload
8
+ url: https://api.icims.com/customers/{customer_id}/forms/{form_data_id}.txt
9
+ customer_id: '5674'
10
+ form_data_id: '1731'
11
+ form_id: '1823'
12
+ associate_id: '518491'
13
+ auth_type: basic
14
+ use_proxy: false
15
+ use_async: true
16
+ credentials:
17
+ username: ICIMS_API_USERNAME
18
+ password: ICIMS_API_PASSWORD
19
+ as_dataframe: false
20
+ download: true
21
+ timeout: 360
22
+ destination:
23
+ directory: /home/ubuntu/symbits/icims/files/forms/{associate_id}/
24
+ filename: '{form_id}_{filename}.html'
25
+ overwrite: false
26
+ no_errors:
27
+ '403':
28
+ errorMessage: This form has been disabled
29
+ errorCode: 3
30
+ ```
31
+
32
+ """
33
+ import asyncio
34
+ # configuration and settings
35
+ from pathlib import PurePath
36
+ from typing import Union
37
+ from collections.abc import Callable
38
+ from urllib.parse import urlencode
39
+ from navconfig import config
40
+ from querysource.types import strtobool
41
+ from ..exceptions import DataNotFound, ComponentError, FileNotFound
42
+ from .DownloadFrom import DownloadFromBase
43
+ from ..interfaces.http import HTTPService
44
+
45
+
46
+ class HTTPClient(DownloadFromBase, HTTPService):
47
+ """
48
+ HTTPClient.
49
+
50
+ Overview
51
+
52
+ UserComponent: (abstract) ->
53
+
54
+ .. table:: Properties
55
+ :widths: auto
56
+
57
+ +-----------+----------+-----------+----------------------------------------------+
58
+ | Name | Required | Summary |
59
+ +-----------+----------+-----------+----------------------------------------------+
60
+ | start | Yes | It is executed when the component is "initialized", |
61
+ | | | it MUST return TRUE if it does not fail |
62
+ +-----------+----------+-----------+----------------------------------------------+
63
+ | run | Yes | Is the code that will execute the component ,must return TRUE or |
64
+ | | | a content if it does not fail, but fails is declared |
65
+ +-----------+----------+-----------+-----------------------------------------------+
66
+ | close | Yes | It is used for any cleaning operation |
67
+ +-----------+----------+-----------+-----------------------------------------------+
68
+
69
+
70
+ Return the list of arbitrary days
71
+
72
+ """
73
+ accept: str = "application/xhtml+xml"
74
+ port: int = 80
75
+
76
+ def __init__(
77
+ self,
78
+ loop: asyncio.AbstractEventLoop = None,
79
+ job: Callable = None,
80
+ stat: Callable = None,
81
+ **kwargs,
82
+ ):
83
+ # Credentials
84
+ self._user: str = None
85
+ self._pwd: str = None
86
+ # beautiful soup and html parser:
87
+ self._bs: Callable = None
88
+ self._parser: Callable = None
89
+ self._environment = config
90
+ # Return a Dataframe:
91
+ self.as_dataframe: bool = kwargs.pop('as_dataframe', True)
92
+ if isinstance(self.as_dataframe, str):
93
+ self.as_dataframe = strtobool(self.as_dataframe)
94
+ # Data:
95
+ self._data: dict = kwargs.pop("data", {})
96
+ # Credentials:
97
+ self.credentials: dict = kwargs.pop("credentials", {})
98
+ self.method: str = kwargs.pop("method", "get")
99
+ # calling parents
100
+ DownloadFromBase.__init__(
101
+ self,
102
+ loop=loop,
103
+ job=job,
104
+ stat=stat,
105
+ **kwargs
106
+ )
107
+ HTTPService.__init__(
108
+ self,
109
+ **kwargs
110
+ )
111
+
112
+ async def evaluate_error(
113
+ self, response: Union[str, list], message: Union[str, list, dict]
114
+ ) -> tuple:
115
+ """evaluate_response.
116
+
117
+ Check Response status and available payloads.
118
+ Args:
119
+ response (_type_): _description_
120
+ url (str): _description_
121
+
122
+ Returns:
123
+ tuple: _description_
124
+ """
125
+ if isinstance(response, list):
126
+ # a list of potential errors:
127
+ for msg in response:
128
+ if message in msg:
129
+ return True
130
+ if isinstance(response, dict) and "errors" in response:
131
+ errors = response["errors"]
132
+ if isinstance(errors, list):
133
+ for error in errors:
134
+ try:
135
+ if message in error:
136
+ return True
137
+ except TypeError:
138
+ if message == error:
139
+ return True
140
+ else:
141
+ if message == errors:
142
+ return True
143
+ else:
144
+ if message in response:
145
+ return True
146
+ return False
147
+
148
+ def var_replacement(self):
149
+ """
150
+ Replaces variables in the arguments with their corresponding values.
151
+ """
152
+ for key, _ in self.arguments.items():
153
+ if key in self._variables:
154
+ self.arguments[key] = self._variables[key]
155
+
156
+ async def start(self, **kwargs):
157
+ """
158
+ Initializes the HTTPClient component, including fetching proxies if necessary.
159
+
160
+ :param kwargs: Additional keyword arguments.
161
+ :return: True if initialization is successful.
162
+ """
163
+ if self.use_proxy is True:
164
+ self._proxies = await self.get_proxies()
165
+ self.var_replacement()
166
+ await super(HTTPClient, self).start()
167
+ return True
168
+
169
+ async def close(self):
170
+ pass
171
+
172
+ async def run(self):
173
+ """
174
+ Executes the HTTPClient component, handling multiple URLs if provided.
175
+
176
+ :return: The result of the HTTP request(s).
177
+ """
178
+ if isinstance(self.url, list):
179
+ ## iterate over a list of URLs:
180
+ results = {}
181
+ for url in self.url:
182
+ uri = self.build_url(
183
+ url, args=self.arguments, queryparams=urlencode(self.parameters)
184
+ )
185
+ try:
186
+ if self.use_async is True:
187
+ result, err = await self.async_request(uri, self.method, data=self._data)
188
+ else:
189
+ result, error = await self.request(uri, self.method, data=self._data)
190
+ if not result:
191
+ raise DataNotFound(
192
+ f"Data was not found on: {uri}"
193
+ )
194
+ if error is not None:
195
+ if isinstance(error, BaseException):
196
+ raise error
197
+ else:
198
+ raise ComponentError(f"HTTPClient Error: {error}")
199
+ ## processing results:
200
+ if hasattr(self, "download"):
201
+ ## add result to resultset
202
+ results[result] = True
203
+ if self._debug:
204
+ self._logger.debug(f"File Exists > {result}")
205
+ else:
206
+ results[result] = result
207
+ except Exception as err:
208
+ self._logger.exception(err, stack_info=True)
209
+ raise ComponentError(f"HTTPClient Error: {err}") from err
210
+ ##
211
+ self.add_metric("FILENAME", results)
212
+ self._result = results
213
+ return self._result
214
+ else:
215
+ self.url = self.build_url(
216
+ self.url, args=self.arguments, queryparams=urlencode(self.parameters)
217
+ )
218
+ try:
219
+ if self.use_async is True:
220
+ result, error = await self.async_request(
221
+ self.url, self.method, data=self._data
222
+ )
223
+ else:
224
+ result, error = await self.request(self.url, self.method, data=self._data)
225
+ if not result:
226
+ raise DataNotFound(
227
+ f"Data was not found on: {self.url}"
228
+ )
229
+ elif error is not None:
230
+ if hasattr(self, "no_errors"):
231
+ # check if error is in no_errors
232
+ return False
233
+ if isinstance(error, BaseException):
234
+ raise error
235
+ else:
236
+ raise ComponentError(f"HTTPClient Error: {error}")
237
+ # at here, processing Result
238
+ if self.as_dataframe is True:
239
+ try:
240
+ result = await self.create_dataframe(result)
241
+ except Exception as err:
242
+ raise ComponentError(f"RESTClient Error: {err}") from err
243
+ elif hasattr(self, "download"):
244
+ # File downloaded, return same as FileExists
245
+ # TODO: error if result is a BytesIO
246
+ if isinstance(result, bytes):
247
+ self._result = result
248
+ elif isinstance(result, PurePath):
249
+ file = result
250
+ self._logger.debug(f" ::: Checking for File: {file}")
251
+ result = {}
252
+ if file.exists() and file.is_file():
253
+ result[file] = True
254
+ self.setTaskVar("DIRECTORY", file.parent)
255
+ self.setTaskVar("FILENAME", str(file.name))
256
+ self.setTaskVar("FILEPATH", file)
257
+ self.add_metric("FILENAME", file)
258
+ else:
259
+ raise FileNotFound(
260
+ f"FileExists: File Doesn't exists: {file}"
261
+ )
262
+ self._result = result
263
+ return self._result
264
+ except DataNotFound:
265
+ raise
266
+ except Exception as err:
267
+ self._logger.exception(err, stack_info=True)
268
+ raise ComponentError(f"HTTPClient: {err}") from err
@@ -0,0 +1,146 @@
1
+ from navconfig.logging import logging
2
+ from querysource.exceptions import DataNotFound as QSNotFound
3
+ from ..exceptions import ComponentError, DataNotFound
4
+ from .QSBase import QSBase
5
+
6
+
7
+ class ICIMS(QSBase):
8
+ """
9
+ ICIMS
10
+
11
+ Overview
12
+
13
+ The ICIMS class is a specialized component for handling form data interactions within the ICIMS system.
14
+ It extends the QSBase class and provides methods for retrieving people data, individual person data,
15
+ lists of forms, and form data with specific metrics mappings.
16
+
17
+ .. table:: Properties
18
+ :widths: auto
19
+
20
+ +------------------+----------+--------------------------------------------------------------------------------------+
21
+ | Name | Required | Description |
22
+ +------------------+----------+--------------------------------------------------------------------------------------+
23
+ | type | Yes | Defines the type of data handled by the component. |
24
+ +------------------+----------+--------------------------------------------------------------------------------------+
25
+ | conditions | No | If any condition is required to do the work. |
26
+ +------------------+----------+--------------------------------------------------------------------------------------+
27
+
28
+ Methods
29
+
30
+ people
31
+
32
+ Retrieves a list of people data from the ICIMS system.
33
+
34
+ Raises:
35
+ DataNotFound: If no data is found.
36
+ ComponentError: If any other error occurs during execution.
37
+
38
+ person
39
+
40
+ Retrieves individual person data from the ICIMS system and adds a person_id to the data.
41
+
42
+ Raises:
43
+ DataNotFound: If no data is found.
44
+ ComponentError: If any other error occurs during execution.
45
+
46
+ forms_list
47
+
48
+ Retrieves a list of forms from the ICIMS system.
49
+
50
+ Raises:
51
+ DataNotFound: If no data is found.
52
+ ComponentError: If any other error occurs during execution.
53
+
54
+ form_data
55
+
56
+ Retrieves form data from the ICIMS system and maps internal metrics to output names.
57
+
58
+ Raises:
59
+ DataNotFound: If no data is found.
60
+ ComponentError: If any other error occurs during execution.
61
+
62
+ Return
63
+
64
+ The methods in this class return the requested data from the ICIMS system, formatted according to the
65
+ specific requirements of each method.
66
+
67
+
68
+
69
+ Example:
70
+
71
+ ```yaml
72
+ ICIMS:
73
+ type: people
74
+ ```
75
+
76
+ """
77
+
78
+ type = "form_data"
79
+ _driver = "icims"
80
+ _metrics: dict = {
81
+ "requestedby": "requested_by",
82
+ "updatedby": "updated_by",
83
+ "formname": "form_name",
84
+ "updateddate": "updated_date",
85
+ "completeddate": "completed_date",
86
+ "completedby": "completed_by",
87
+ }
88
+
89
+ async def people(self):
90
+ try:
91
+ row = await self._qs.people()
92
+ if row:
93
+ return row
94
+ else:
95
+ return []
96
+ except QSNotFound as err:
97
+ raise DataNotFound(f"ICIMS Not Found: {err}") from err
98
+ except Exception as err:
99
+ logging.exception(err)
100
+ raise ComponentError(f"ICIMS ERROR: {err!s}") from err
101
+
102
+ async def person(self):
103
+ try:
104
+ row = await self._qs.person()
105
+ if row:
106
+ row["person_id"] = self._variables["person_id"]
107
+ return [row]
108
+ else:
109
+ return []
110
+ except QSNotFound as err:
111
+ raise DataNotFound(f"ICIMS Not Found: {err}") from err
112
+ except Exception as err:
113
+ logging.exception(err)
114
+ raise ComponentError(f"ICIMS ERROR: {err!s}") from err
115
+
116
+ async def forms_list(self):
117
+ try:
118
+ row = await self._qs.forms_list()
119
+ if row:
120
+ return row["forms"]
121
+ else:
122
+ return []
123
+ except QSNotFound as err:
124
+ raise DataNotFound(f"ICIMS Not Found: {err}") from err
125
+ except Exception as err:
126
+ logging.exception(err)
127
+ raise ComponentError(f"ICIMS ERROR: {err!s}") from err
128
+
129
+ async def form_data(self):
130
+ try:
131
+ row = await self._qs.form_data()
132
+ if row:
133
+ for key, name in self._metrics.items():
134
+ try:
135
+ row[name] = row[key]
136
+ del row[key]
137
+ except (TypeError, KeyError):
138
+ pass
139
+ return [row]
140
+ else:
141
+ return []
142
+ except QSNotFound as err:
143
+ raise DataNotFound(f"ICIMS Not Found: {err}") from err
144
+ except Exception as err:
145
+ logging.exception(err)
146
+ raise ComponentError(f"ICIMS ERROR: {err!s}") from err
@@ -0,0 +1,179 @@
1
+ from collections.abc import Callable
2
+ from jsonpath_ng import parse
3
+ import asyncio
4
+ import pandas as pd
5
+ from ..exceptions import ComponentError
6
+ from .BaseLoop import BaseLoop
7
+
8
+
9
+ class IF(BaseLoop):
10
+ """
11
+ IF Component
12
+
13
+ Executes one of two components based on a condition.
14
+
15
+ true_component: The component to execute if the condition evaluates to True.
16
+ false_component: The component to execute if the condition evaluates to False.
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ loop: asyncio.AbstractEventLoop = None,
22
+ job: Callable = None,
23
+ stat: Callable = None,
24
+ **kwargs,
25
+ ):
26
+ self._condition = kwargs.get("condition", None)
27
+ self._true_component = kwargs.get("true_component", None)
28
+ self._false_component = kwargs.get("false_component", None)
29
+ super(IF, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
30
+
31
+ async def start(self, **kwargs):
32
+ """
33
+ Initialize the component.
34
+ """
35
+ await super(IF, self).start(**kwargs)
36
+ # Ensure the condition and components are defined
37
+ if not self._condition:
38
+ raise ComponentError(
39
+ "The 'condition' argument must be provided."
40
+ )
41
+ if not self._true_component or not self._false_component:
42
+ raise ComponentError(
43
+ "Both 'true_component' and 'false_component' must be specified."
44
+ )
45
+ return True
46
+
47
+ def _evaluate_condition(self, condition: str) -> bool:
48
+ """
49
+ Evaluate a condition based on the type of self.data.
50
+
51
+ Args:
52
+ condition (str): A condition in the format "<jsonpath> <operator> <value>".
53
+
54
+ Returns:
55
+ bool: True if the condition is satisfied, else False.
56
+ """
57
+ if isinstance(self.data, dict):
58
+ try:
59
+ jsonpath_expr, operator, expected_value = self._parse_condition(condition)
60
+ jsonpath = parse(jsonpath_expr)
61
+ matches = jsonpath.find(self.data)
62
+ actual_value = matches[0].value if matches else None
63
+ return self._evaluate_operator(
64
+ actual_value,
65
+ operator,
66
+ expected_value
67
+ )
68
+ except Exception as err:
69
+ raise ComponentError(
70
+ f"Error evaluating condition '{condition}': {err}"
71
+ )
72
+
73
+ elif isinstance(self.data, pd.DataFrame):
74
+ try:
75
+ filtered = self.data.query(condition)
76
+ return not filtered.empty
77
+ except Exception as err:
78
+ raise ComponentError(
79
+ f"Error evaluating DataFrame condition '{condition}': {err}"
80
+ )
81
+
82
+ elif isinstance(self.data, str):
83
+ return condition in self.data
84
+
85
+ else:
86
+ raise ComponentError(
87
+ f"Unsupported data type for condition evaluation: {type(self.data)}"
88
+ )
89
+
90
+ def _parse_condition(self, condition: str):
91
+ """
92
+ Parse the condition into JSONPath, operator, and expected value.
93
+
94
+ Args:
95
+ condition (str): A condition string, e.g., "$.metadata.type == 'recapDefinition'".
96
+
97
+ Returns:
98
+ tuple: (jsonpath_expr, operator, expected_value)
99
+ """
100
+ operators = ["==", "!=", ">", "<", ">=", "<="]
101
+ for op in operators:
102
+ if op in condition:
103
+ parts = condition.split(op)
104
+ if len(parts) != 2:
105
+ raise ValueError(
106
+ f"Invalid condition format: {condition}"
107
+ )
108
+ jsonpath_expr, expected_value = parts
109
+ expected_value = expected_value.strip().strip("'\"") # Remove quotes
110
+ return jsonpath_expr.strip(), op, expected_value
111
+ raise ValueError(
112
+ f"No valid operator found in condition: {condition}"
113
+ )
114
+
115
+ def _evaluate_operator(self, actual_value, operator, expected_value):
116
+ """
117
+ Evaluate the comparison operator.
118
+
119
+ Args:
120
+ actual_value: The value extracted from JSONPath.
121
+ operator: The comparison operator as a string.
122
+ expected_value: The value to compare against.
123
+
124
+ Returns:
125
+ bool: True if the comparison is satisfied, else False.
126
+ """
127
+ if operator == "==":
128
+ return actual_value == expected_value
129
+ elif operator == "!=":
130
+ return actual_value != expected_value
131
+ elif operator == ">":
132
+ return actual_value > expected_value
133
+ elif operator == "<":
134
+ return actual_value < expected_value
135
+ elif operator == ">=":
136
+ return actual_value >= expected_value
137
+ elif operator == "<=":
138
+ return actual_value <= expected_value
139
+ else:
140
+ raise ValueError(
141
+ f"Unsupported operator: {operator}"
142
+ )
143
+
144
+ async def run(self):
145
+ """
146
+ Executes the appropriate component based on the condition.
147
+ """
148
+ try:
149
+ condition_result = self._evaluate_condition(self._condition)
150
+ except ComponentError as e:
151
+ raise ComponentError(
152
+ f"Error evaluating condition '{self._condition}': {e}"
153
+ )
154
+
155
+ selected_component = (
156
+ self._true_component if condition_result else self._false_component
157
+ )
158
+
159
+ step, idx = self._TaskPile.getStepByName(selected_component)
160
+ if step is None:
161
+ raise ComponentError(
162
+ f"Component '{selected_component}' not found in Task Definition."
163
+ )
164
+
165
+ target, params, stat = self.get_component(step)
166
+ component_instance = self.create_component(
167
+ target,
168
+ value=self.data,
169
+ stat=stat,
170
+ **params
171
+ )
172
+ self._result = await self.exec_component(
173
+ component_instance,
174
+ step.name
175
+ )
176
+ # Remove executed components
177
+ self._TaskPile.delStepByName(self._true_component)
178
+ self._TaskPile.delStepByName(self._false_component)
179
+ return self._result