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,114 @@
1
+ """
2
+ DownloadFromSmartSheet
3
+ Download an Excel file from SmartSheet.
4
+
5
+
6
+ Example:
7
+
8
+ ```yaml
9
+ DownloadFromSmartSheet:
10
+ comments: Download an SmartSheet Tab into an Excel file.
11
+ file_id: '373896609326980'
12
+ file_format: application/vnd.ms-excel
13
+ destination:
14
+ filename: WORP MPL 2022.xlsx
15
+ directory: /home/ubuntu/symbits/worp/files/stores/
16
+ ```
17
+
18
+ """
19
+ import asyncio
20
+ from collections.abc import Callable
21
+ from pathlib import Path
22
+ from ..exceptions import ComponentError, FileNotFound
23
+ from .DownloadFrom import DownloadFromBase
24
+ from ..interfaces.smartsheet import SmartSheetClient
25
+
26
+ class DownloadFromSmartSheet(SmartSheetClient, DownloadFromBase):
27
+ """
28
+ DownloadFromSmartSheet
29
+
30
+ Overview
31
+
32
+ Download an Excel file or CSV file from SmartSheet.
33
+
34
+ Properties (inherited from DownloadFromBase)
35
+
36
+ .. table:: Properties
37
+ :widths: auto
38
+
39
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
40
+ | Name | Required | Summary |
41
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
42
+ | credentials | Yes | Credentials to establish connection with SharePoint site (username and password) |
43
+ | | | get credentials from environment if null. |
44
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
45
+ | create_destination | No | Boolean flag indicating whether to create the destination directory if it |
46
+ | | | doesn't exist (default: True). |
47
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
48
+ | api_key | No | The SmartSheet API key (can be provided as an environment variable or directly |
49
+ | | | set as a property). If not provided, tries to use the `SMARTSHEET_API_KEY` |
50
+ | | | environment variable. |
51
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
52
+ | url | No | Base URL for the SmartSheet Sheets API (default: |
53
+ | | | https://api.smartsheet.com/2.0/sheets/). |
54
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
55
+ | file_id | Yes | The ID of the SmartSheet file to download. |
56
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
57
+ | file_format | No | The desired file format for the downloaded data (default: |
58
+ | | | "application/vnd.ms-excel"). Supported formats are: |
59
+ | | | * "application/vnd.ms-excel" (Excel) |
60
+ | | | * "text/csv" (CSV) |
61
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
62
+ | filename | Yes | The filename to use for the downloaded file. |
63
+ +--------------------+----------+-----------+----------------------------------------------------------------------+
64
+
65
+ Save the downloaded files on the new destination.
66
+
67
+ """ # noqa
68
+ def __init__(
69
+ self,
70
+ loop: asyncio.AbstractEventLoop = None,
71
+ job: Callable = None,
72
+ stat: Callable = None,
73
+ **kwargs,
74
+ ):
75
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
76
+
77
+ async def start(self, **kwargs):
78
+ if self.file_format not in ["application/vnd.ms-excel", "text/csv"]:
79
+ # only supported
80
+ raise ComponentError(
81
+ f"SmartSheet: Format {self.file_format} is not suported"
82
+ )
83
+ try:
84
+ self.accept = (
85
+ "text/csv" if self.file_format == "dataframe" else self.file_format
86
+ )
87
+ except Exception as err:
88
+ print(err)
89
+ await super(DownloadFromSmartSheet, self).start(**kwargs)
90
+ return True
91
+
92
+ async def close(self):
93
+ pass
94
+
95
+ async def run(self):
96
+ self._result = None
97
+ try:
98
+ self._logger.info(f"Downloading SmartSheet file: {self.file_id}")
99
+ # check if self.filename is a relative path:
100
+ if isinstance(self.filename, str):
101
+ self.filename = Path(self.filename)
102
+ if not self.filename.is_absolute():
103
+ self.filename = self.directory.joinpath(self.filename)
104
+ if await self.download_file(file_id=self.file_id, destination=self.filename):
105
+ self._filenames = [str(self.filename)]
106
+ self._result = self._filenames
107
+ self.add_metric("SMARTSHEET_FILE", self.filename)
108
+ return self._result
109
+ except ComponentError as err:
110
+ raise FileNotFound(f"DownloadFromSmartSheet Error: {err}") from err
111
+ except Exception as err:
112
+ raise ComponentError(
113
+ f"DownloadFromSmartSheet: Unknown Error: {err}"
114
+ ) from err
@@ -0,0 +1,229 @@
1
+ from typing import Optional, Callable
2
+ import os
3
+ import mimetypes
4
+
5
+ import asyncio
6
+ from io import BytesIO
7
+ import aiofiles
8
+ from botocore.exceptions import ClientError
9
+ from urllib.parse import urlparse
10
+ from PIL import Image
11
+ from PIL.ExifTags import TAGS, GPSTAGS
12
+ from ..interfaces.Boto3Client import Boto3Client
13
+ from ..interfaces.dataframes.pandas import PandasDataframe
14
+ from .flow import FlowComponent
15
+ from ..exceptions import FileNotFound, ComponentError
16
+
17
+ _EXTENSION_MAP = {
18
+ # fall‑backs when `mimetypes` lacks something you need
19
+ 'image/heic': '.heic',
20
+ 'image/webp': '.webp',
21
+ }
22
+
23
+ class DownloadS3File(Boto3Client, FlowComponent, PandasDataframe):
24
+ """
25
+ Download a file from an S3 bucket.
26
+ """
27
+ def __init__(
28
+ self,
29
+ loop: asyncio.AbstractEventLoop = None,
30
+ job: Callable = None,
31
+ stat: Callable = None,
32
+ **kwargs,
33
+ ):
34
+ """
35
+ Initialize the DownloadS3File component.
36
+
37
+ Args:
38
+ loop (asyncio.AbstractEventLoop): The event loop to use.
39
+ job (Callable): The job to run.
40
+ stat (Callable): The statistics to collect.
41
+ **kwargs: Additional arguments.
42
+ """
43
+ self.path_column = kwargs.pop('path_column', 'file_path')
44
+ self.content_type = kwargs.pop('content_type', 'application/octet-stream')
45
+ self.filename_column: Optional[str] = kwargs.pop('filename_column', None)
46
+ self.download_dir: str = kwargs.pop('directory', '/tmp')
47
+ self.as_bytes: bool = kwargs.pop('as_bytes', False)
48
+ self.chunk_size: int = kwargs.get('chunk_size', 100)
49
+ self.task_parts: int = kwargs.get('task_parts', 10)
50
+ self.extract_exif: bool = kwargs.pop('extract_exif', False)
51
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
52
+ self.files_dict = {} # Dictionary to store downloaded files
53
+
54
+ async def start(self, **kwargs):
55
+ """
56
+ start.
57
+
58
+ Initialize Task.
59
+ """
60
+ self.processing_credentials()
61
+ await super().start(**kwargs)
62
+ if self.previous:
63
+ self.data = self.input
64
+ # check if self.filename_column and self.path_column are in self.data dataframe:
65
+ if self.filename_column not in self.data.columns:
66
+ raise ValueError(f'Filename column {self.filename_column} not found in data.')
67
+ if self.path_column not in self.data.columns:
68
+ raise ValueError(f'Path column {self.path_column} not found in data.')
69
+ # check if self.data is empty:
70
+ if self.data.empty:
71
+ raise ValueError('Dataframe is empty.')
72
+ # evaluate the download_dir:
73
+ if self.download_dir:
74
+ self.download_dir = self.download_dir.strip()
75
+ self.download_dir = self.mask_replacement(self.download_dir)
76
+ return True
77
+
78
+ def parse_s3_url(self, url: str) -> tuple:
79
+ """
80
+ Parse an S3 URL into bucket and key.
81
+
82
+ Args:
83
+ url (str): The S3 URL to parse.
84
+
85
+ Returns:
86
+ tuple: A tuple containing the bucket name and the key.
87
+ """
88
+ parsed_url = urlparse(url)
89
+ if parsed_url.scheme == 's3':
90
+ # s3://bucket-name/key
91
+ bucket_name = parsed_url.netloc
92
+ object_key = parsed_url.path.lstrip('/')
93
+ elif parsed_url.netloc.endswith('.s3.amazonaws.com'):
94
+ # https://bucket-name.s3.amazonaws.com/key
95
+ bucket_name = parsed_url.netloc.split('.s3.amazonaws.com')[0]
96
+ object_key = parsed_url.path.lstrip('/')
97
+ elif '.s3.' in parsed_url.netloc:
98
+ # https://s3.region.amazonaws.com/bucket-name/key or
99
+ # https://bucket-name.s3.region.amazonaws.com/key
100
+ if parsed_url.netloc.startswith('s3.'):
101
+ # https://s3.region.amazonaws.com/bucket-name/key
102
+ path_parts = parsed_url.path.lstrip('/').split('/', 1)
103
+ bucket_name = path_parts[0]
104
+ object_key = path_parts[1] if len(path_parts) > 1 else ''
105
+ else:
106
+ # https://bucket-name.s3.region.amazonaws.com/key
107
+ bucket_name = parsed_url.netloc.split('.s3.')[0]
108
+ object_key = parsed_url.path.lstrip('/')
109
+ elif self.prefix:
110
+ # Custom domain pointing to S3
111
+ # Use provided bucket or extract from path
112
+ bucket_name = self.bucket
113
+ object_key = self.prefix + parsed_url.path.lstrip('/')
114
+ else:
115
+ # Custom domain pointing to S3
116
+ # Use provided bucket or extract from path
117
+ bucket_name = self.bucket
118
+ object_key = parsed_url.path.lstrip('/')
119
+ return bucket_name, object_key
120
+
121
+ def _filename_from_key(
122
+ self,
123
+ object_key: str,
124
+ content_type: str | None = None
125
+ ) -> str:
126
+ """
127
+ Return a filename with an extension derived from either the key
128
+ or the S3 object's Content‑Type.
129
+ """
130
+ # 1) basename from the key
131
+ fname = os.path.basename(object_key)
132
+ root, ext = os.path.splitext(fname)
133
+
134
+ if ext: # key already has an extension
135
+ return fname
136
+
137
+ # 2) derive from Content‑Type
138
+ if content_type:
139
+ ext = mimetypes.guess_extension(content_type.split(';')[0].strip()) \
140
+ or _EXTENSION_MAP.get(content_type)
141
+
142
+ # 3) final fall‑back
143
+ ext = ext or '.jpg'
144
+ return f"{root}{ext}"
145
+
146
+ async def download_file(self, row, idx, client, as_bytes: bool = False):
147
+ path = row[self.path_column]
148
+ filename = row[self.filename_column]
149
+ if not path or not filename:
150
+ raise ValueError(f'Path or filename is empty for row {idx}.')
151
+ bucket_name, object_key = self.parse_s3_url(path)
152
+ if bucket_name != self.bucket:
153
+ raise ValueError(f'Bucket name {bucket_name} does not match {self.bucket}.')
154
+ try:
155
+ obj = await client.get_s3_object(
156
+ bucket=bucket_name,
157
+ filename=object_key,
158
+ )
159
+ content_type = obj.get("ContentType", self.content_type)
160
+ filename = self._filename_from_key(object_key, content_type)
161
+
162
+ self.data.at[idx, 'file_obj'] = obj
163
+ file_data = None
164
+ with obj["Body"] as stream:
165
+ file_data = stream.read()
166
+ if as_bytes:
167
+ # Read the file into BytesIO
168
+ output = BytesIO()
169
+ output.write(file_data)
170
+ output.seek(0)
171
+ self.data.at[idx, 'file_data'] = output
172
+ if self.download_dir:
173
+ # save file in download_dir:
174
+ output_path = f"{self.download_dir}/{filename}"
175
+ async with aiofiles.open(output_path, 'wb') as f:
176
+ await f.write(file_data)
177
+ self.data.at[idx, 'file_path'] = output_path
178
+ return row
179
+ except ClientError as e:
180
+ if e.response['Error']['Code'] == 'NoSuchKey':
181
+ raise FileNotFound(
182
+ f"File '{object_key}' not found in bucket '{bucket_name}'."
183
+ ) from e
184
+ elif e.response['Error']['Code'] == 'NoSuchBucket':
185
+ raise FileNotFound(
186
+ f"Bucket '{bucket_name}' does not exist."
187
+ ) from e
188
+ else:
189
+ raise ComponentError(
190
+ f"Error downloading file from S3: {str(e)}"
191
+ ) from e
192
+ except Exception as e:
193
+ self._logger.error(f'Error downloading file {filename}: {e}')
194
+ raise e
195
+
196
+ async def run(self):
197
+ """
198
+ run.
199
+
200
+ Download the file from S3.
201
+ """
202
+ async with await self.open() as client:
203
+ if self.bucket is None:
204
+ raise ValueError('Bucket name is required.')
205
+ if self.filename_column is None:
206
+ raise ValueError('Filename column is required.')
207
+ if self.path_column is None:
208
+ raise ValueError('Path column is required.')
209
+
210
+ # Create the new columns:
211
+ self.column_exists('file_obj')
212
+ self.column_exists('file_path')
213
+ self.column_exists('file_data')
214
+ # generate tasks from dataframe:
215
+ tasks = self._create_tasks(
216
+ self.data,
217
+ self.download_file,
218
+ client=client,
219
+ as_bytes=self.as_bytes
220
+ )
221
+ # process tasks:
222
+ results = await self._processing_tasks(tasks)
223
+ # process results:
224
+ for result in results:
225
+ if isinstance(result, Exception):
226
+ raise result
227
+ self._print_data_(self.data, ' DownloadS3File ')
228
+ self._result = self.data
229
+ return self._result
@@ -0,0 +1,59 @@
1
+ from ..utils import cPrint, SafeDict
2
+ from .flow import FlowComponent
3
+
4
+
5
+ class Dummy(FlowComponent):
6
+ async def start(self, **kwargs):
7
+ """
8
+ start.
9
+
10
+ Initialize (if needed) a task
11
+
12
+
13
+ Example:
14
+
15
+ ```yaml
16
+ Dummy:
17
+ message: 'Dummy Date: {firstdate} and {lastdate}'
18
+ masks:
19
+ firstdate:
20
+ - date_diff_dow
21
+ - day_of_week: monday
22
+ diff: 8
23
+ mask: '%Y-%m-%d'
24
+ lastdate:
25
+ - date_diff_dow
26
+ - day_of_week: monday
27
+ diff: 2
28
+ mask: '%Y-%m-%d'
29
+ ```
30
+
31
+ """
32
+ return True
33
+
34
+ async def run(self):
35
+ """
36
+ run.
37
+
38
+ Close (if needed) a task
39
+ """
40
+ try:
41
+ self.message = self.message.format_map(SafeDict(**self._mask))
42
+ cPrint(f"Message IS: {self.message}")
43
+ self.add_metric("message", self.message)
44
+ except Exception:
45
+ self.save_traceback()
46
+ raise
47
+ return True
48
+
49
+ async def close(self):
50
+ """
51
+ close.
52
+
53
+ Close (if needed) a task
54
+ """
55
+
56
+ def save_stats(self):
57
+ """
58
+ Extension to save stats for this component
59
+ """