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,161 @@
1
+ from typing import Optional
2
+ import datetime
3
+ from pathlib import Path
4
+ from navconfig import config
5
+ from jinja2 import (
6
+ BaseLoader,
7
+ Environment,
8
+ FileSystemLoader,
9
+ FileSystemBytecodeCache,
10
+ TemplateError,
11
+ TemplateNotFound,
12
+ StrictUndefined
13
+ )
14
+ from ..utils.json import json_encoder
15
+ from ..conf import TEMPLATE_DIR
16
+
17
+ jinja_config = {
18
+ "enable_async": True,
19
+ "autoescape": True,
20
+ "extensions": [
21
+ "jinja2.ext.i18n",
22
+ "jinja2.ext.loopcontrols",
23
+ "jinja2_time.TimeExtension",
24
+ "jinja2_iso8601.ISO8601Extension",
25
+ "jinja2.ext.do",
26
+ "jinja2_humanize_extension.HumanizeExtension"
27
+ ],
28
+ }
29
+
30
+ string_config = {
31
+ "autoescape": True,
32
+ "extensions": [
33
+ "jinja2.ext.i18n",
34
+ "jinja2.ext.loopcontrols",
35
+ "jinja2_time.TimeExtension",
36
+ "jinja2_iso8601.ISO8601Extension",
37
+ "jinja2.ext.do",
38
+ "jinja2_humanize_extension.HumanizeExtension"
39
+ ],
40
+ }
41
+
42
+ DEFAULT_TEMPLATE_HANDLER = None
43
+
44
+
45
+ def getTemplateHandler(newdir: str = None):
46
+ global DEFAULT_TEMPLATE_HANDLER
47
+ if newdir:
48
+ return TemplateHandler(directory=newdir)
49
+ else:
50
+ if DEFAULT_TEMPLATE_HANDLER is None:
51
+ DEFAULT_TEMPLATE_HANDLER = TemplateHandler(directory=TEMPLATE_DIR)
52
+ return DEFAULT_TEMPLATE_HANDLER
53
+
54
+
55
+ class TemplateHandler(object):
56
+ """
57
+ TemplateHandler.
58
+
59
+ This is a wrapper for the Jinja2 template engine.
60
+ """
61
+
62
+ _prefix: str = "dataintegration"
63
+
64
+ def __init__(self, directory: Path, **kwargs):
65
+ self.path = directory.resolve()
66
+ if not self.path.exists():
67
+ raise RuntimeError(
68
+ f"Flowtask: template directory {directory} does not exist"
69
+ )
70
+ if "config" in kwargs:
71
+ self.config = {**jinja_config, **kwargs["config"]}
72
+ else:
73
+ self.config = jinja_config
74
+ template_debug = config.getboolean("TEMPLATE_DEBUG", fallback=False)
75
+ if template_debug is True:
76
+ self.config["extensions"].append("jinja2.ext.debug")
77
+ # creating loader:
78
+ templateLoader = FileSystemLoader(searchpath=[str(self.path)])
79
+ # Bytecode Cache that saves to filesystem
80
+ bcache = FileSystemBytecodeCache(str(self.path), "%s.cache")
81
+ # initialize the environment
82
+ try:
83
+ self.env = Environment(
84
+ loader=templateLoader,
85
+ bytecode_cache=bcache,
86
+ **self.config
87
+ )
88
+ # compiled_path = str(self.path.joinpath('.compiled'))
89
+ # self.env.compile_templates(
90
+ # target=compiled_path, zip='deflated'
91
+ # )
92
+ self._strparser = Environment(
93
+ loader=BaseLoader,
94
+ bytecode_cache=bcache,
95
+ undefined=StrictUndefined,
96
+ **string_config
97
+ )
98
+ ## Adding Filters:
99
+ self.env.filters["jsonify"] = json_encoder
100
+ self._strparser.filters["jsonify"] = json_encoder
101
+ self.env.filters["datetime"] = datetime.datetime.fromtimestamp
102
+ self._strparser.filters["datetime"] = datetime.datetime.fromtimestamp
103
+ except Exception as err:
104
+ raise RuntimeError(
105
+ f"DI: Error loading Template Environment: {err!s}"
106
+ ) from err
107
+
108
+ def get_template(self, filename: str):
109
+ """
110
+ Get a template from Template Environment using the Filename.
111
+ """
112
+ try:
113
+ return self.env.get_template(str(filename))
114
+ except TemplateNotFound as ex:
115
+ raise FileNotFoundError(f"Template cannot be found: {filename}") from ex
116
+
117
+ def from_string(self, content: str, params: dict):
118
+ try:
119
+ template = self._strparser.from_string(content)
120
+ result = template.render(**params)
121
+ return result
122
+ except Exception as err:
123
+ raise RuntimeError(
124
+ f"DI: Error rendering string Template, error: {err}"
125
+ ) from err
126
+
127
+ @property
128
+ def environment(self):
129
+ return self.env
130
+
131
+ def render(self, filename: str, params):
132
+ result = None
133
+ try:
134
+ template = self.env.get_template(str(filename))
135
+ result = template.render(**params)
136
+ return result
137
+ except Exception as err:
138
+ raise RuntimeError(
139
+ f"DI: Error rendering template: {filename}, error: {err}"
140
+ ) from err
141
+
142
+ async def async_render(self, filename: str, params: Optional[dict] = None) -> str:
143
+ """async_render.
144
+
145
+ Renders a Jinja2 template using async-await syntax.
146
+ """
147
+ result = None
148
+ if not params:
149
+ params = {}
150
+ try:
151
+ template = self.env.get_template(str(filename))
152
+ result = await template.render_async(**params)
153
+ return result
154
+ except TemplateError as ex:
155
+ raise ValueError(
156
+ f"Template parsing error, template: {filename}: {ex}"
157
+ ) from ex
158
+ except Exception as err:
159
+ raise RuntimeError(
160
+ f"NAV: Error rendering: {filename}, error: {err}"
161
+ ) from err
flowtask/tests.py ADDED
@@ -0,0 +1,257 @@
1
+ import asyncio
2
+ from typing import Any, Optional, List
3
+ from collections.abc import Awaitable
4
+ from abc import ABC
5
+ import pandas as pd
6
+ import pytest
7
+ from navconfig import BASE_DIR
8
+ from .components import getComponent
9
+ from .components.flow import FlowComponent
10
+
11
+
12
+ @pytest.fixture(autouse=True, scope="session")
13
+ def component():
14
+ cp = "Dummy"
15
+ yield cp
16
+
17
+
18
+ pytestmark = pytest.mark.asyncio
19
+
20
+
21
+ class BaseTestCase(ABC):
22
+ """BaseTestCase.
23
+
24
+ Args:
25
+ BoilerPlate for Testing Dataintegration Components.
26
+ """
27
+
28
+ arguments: dict = {}
29
+ component = None
30
+ name: str = None
31
+ expected_result: Any = None
32
+ expected_result_type: type = None
33
+ expected_exception_msg: str = None
34
+
35
+ @pytest.fixture(autouse=True, scope="class")
36
+ def setup_class(self, component):
37
+ self.component = None
38
+ error = None
39
+ self.name = component
40
+ try:
41
+ obj = getComponent(component)
42
+ self.component = obj(**self.arguments)
43
+ except Exception as e:
44
+ print(e)
45
+ error = e
46
+ assert not error
47
+ yield f"Starting Component {self.name}"
48
+
49
+ def teardown_class(self):
50
+ try:
51
+ asyncio.run_until_complete(self.component.close())
52
+ except Exception:
53
+ pass
54
+ self.component = None
55
+
56
+ @pytest.fixture(autouse=True)
57
+ def setup_method(self, component):
58
+ self.name = component
59
+ error = None
60
+ try:
61
+ obj = getComponent(component)
62
+ self.component = obj(**self.arguments)
63
+ except Exception as e:
64
+ print(e)
65
+ error = e
66
+ assert not error
67
+
68
+ def teardown_method(self):
69
+ try:
70
+ asyncio.run_until_complete(self.component.close())
71
+ except Exception:
72
+ pass
73
+ self.component = None
74
+
75
+ async def test_initialize(self, component):
76
+ assert self.name == component
77
+ assert isinstance(self.component, FlowComponent) is True
78
+ assert self.component.ComponentName() == component
79
+
80
+ async def test_start(self):
81
+ assert self.component is not None
82
+ assert callable(self.component.start)
83
+ if asyncio.iscoroutinefunction(self.component.start):
84
+ start = await self.component.start()
85
+ else:
86
+ start = self.component.start()
87
+ assert start is True
88
+ if asyncio.iscoroutinefunction(self.component.close):
89
+ await self.component.close()
90
+ else:
91
+ self.component.close()
92
+
93
+ async def test_run(self):
94
+ result = None
95
+ error = None
96
+ assert self.component is not None
97
+ # start firsts:
98
+ if asyncio.iscoroutinefunction(self.component.start):
99
+ start = await self.component.start()
100
+ else:
101
+ start = self.component.start()
102
+ try:
103
+ if asyncio.iscoroutinefunction(self.component.run):
104
+ result = await self.component.run()
105
+ else:
106
+ result = self.component.run()
107
+ # print('RESULT : ', result)
108
+ if self.expected_result is not None:
109
+ assert self.expected_result == result
110
+ if self.expected_result_type:
111
+ assert isinstance(result, self.expected_result_type)
112
+ except Exception as e:
113
+ if self.expected_exception_msg:
114
+ assert e, self.expected_exception_msg
115
+ result = True
116
+
117
+ else:
118
+ error = e
119
+ if error:
120
+ print("Test ERROR >", error)
121
+ assert result is not None
122
+ assert error is None
123
+ if asyncio.iscoroutinefunction(self.component.close):
124
+ await self.component.close()
125
+ else:
126
+ self.component.close()
127
+
128
+ async def test_close(self):
129
+ error = None
130
+ assert self.component is not None
131
+ # starts first:
132
+ if asyncio.iscoroutinefunction(self.component.start):
133
+ start = await self.component.start()
134
+ else:
135
+ start = self.component.start()
136
+ try:
137
+ if asyncio.iscoroutinefunction(self.component.close):
138
+ await self.component.close()
139
+ else:
140
+ self.component.close()
141
+ except Exception as e:
142
+ error = e
143
+ assert error is None
144
+ await asyncio.sleep(1.5)
145
+
146
+
147
+ class PandasTestCase(BaseTestCase):
148
+ """PandasTestCase.
149
+
150
+ Args:
151
+ Test Case for components that requires a previous Pandas Dataframe.
152
+ """
153
+
154
+ file_test: str = None
155
+ data: Optional[List[dict]] = None
156
+ renamed_cols: list = []
157
+
158
+ async def startup_function(self) -> Awaitable:
159
+ return True
160
+
161
+ async def ending_function(self) -> Awaitable:
162
+ return True
163
+
164
+ @pytest.fixture(scope='session', autouse=True)
165
+ async def setup_and_teardown(self):
166
+ """Setup and Teardown for creating and dropping the table."""
167
+ # Create table at the beginning of the session
168
+ # Ensure the setup function is called
169
+ await self.startup_function()
170
+ print(':: Calling Setup Function :: ')
171
+ yield
172
+ # Ensure the teardown function is called
173
+ await self.ending_function()
174
+ print(':: Calling Ending Function :: ')
175
+
176
+ @pytest.fixture(scope='session')
177
+ def return_pandas(self, request):
178
+ df = None
179
+ if self.file_test:
180
+ filepath = BASE_DIR.joinpath("docs", self.file_test)
181
+ assert filepath.exists()
182
+ df = pd.read_csv(filepath)
183
+ elif self.data:
184
+ df = pd.DataFrame(self.data)
185
+ else:
186
+ # If file_test is None, look for the 'data_sample' fixture
187
+ data_fixture = request.getfixturevalue('data_sample')
188
+ assert data_fixture is not None, "No data provided and no file_test available"
189
+ df = pd.DataFrame(data_fixture)
190
+ assert df is not None
191
+ return df
192
+
193
+ @pytest.fixture(autouse=True)
194
+ def setup_method(self, component, return_pandas):
195
+ self.name = component
196
+ error = None
197
+ try:
198
+ obj = getComponent(component)
199
+ df = return_pandas
200
+ self.arguments["input_result"] = df
201
+ self.component = obj(**self.arguments)
202
+ except Exception as e:
203
+ print(e)
204
+ error = e
205
+ assert not error
206
+
207
+ async def test_start(self):
208
+ assert self.component is not None
209
+ assert callable(self.component.start)
210
+ error = None
211
+ try:
212
+ await self.component.start()
213
+ except Exception as err:
214
+ error = err
215
+ assert error is None
216
+ if asyncio.iscoroutinefunction(self.component.close):
217
+ await self.component.close()
218
+ else:
219
+ self.component.close()
220
+
221
+ async def test_run(self):
222
+ result = None
223
+ error = None
224
+ assert self.component is not None
225
+ # start firsts:
226
+ if asyncio.iscoroutinefunction(self.component.start):
227
+ start = await self.component.start()
228
+ else:
229
+ start = self.component.start()
230
+ assert start is not False
231
+ try:
232
+ if asyncio.iscoroutinefunction(self.component.run):
233
+ result = await self.component.run()
234
+ else:
235
+ result = self.component.run()
236
+ assert isinstance(result, pd.DataFrame)
237
+ if self.expected_result is not None:
238
+ ## TODO: making proves of transformations
239
+ assert self.expected_result == result
240
+ if self.renamed_cols is not None:
241
+ columns = result.columns.values.tolist()
242
+ # check if those columns are present in Dataframe
243
+ for col in self.renamed_cols:
244
+ assert col in columns
245
+ except Exception as e:
246
+ error = e
247
+ print("ERROR :: ", error)
248
+ assert result is not None
249
+ assert error is None
250
+ if asyncio.iscoroutinefunction(self.component.close):
251
+ await self.component.close()
252
+ else:
253
+ self.component.close()
254
+
255
+
256
+ def pytest_sessionfinish(session, exitstatus):
257
+ asyncio.get_event_loop().close()
@@ -0,0 +1,8 @@
1
+ from .typedefs import SafeDict, AttrDict, NullDefault, Singleton, strtobool
2
+
3
+ __all__ = (
4
+ "SafeDict",
5
+ "AttrDict",
6
+ "NullDefault",
7
+ "strtobool",
8
+ )