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,384 @@
1
+ import asyncio
2
+ import logging
3
+ from collections.abc import Callable
4
+ from sqlalchemy.exc import NoSuchTableError
5
+ import pandas as pd
6
+ from datamodel.typedefs.types import AttrDict
7
+ from querysource.outputs.tables import (
8
+ PgOutput,
9
+ MysqlOutput,
10
+ SaOutput,
11
+ RethinkOutput,
12
+ BigQueryOutput,
13
+ MongoDBOutput
14
+ )
15
+ from querysource.outputs.tables.TableOutput.documentdb import (
16
+ DocumentDBOutput
17
+ )
18
+ from ...exceptions import (
19
+ ComponentError,
20
+ DataNotFound
21
+ )
22
+ from ..flow import FlowComponent
23
+ from ...utils.functions import is_empty
24
+ from ...interfaces.credentials import CredentialsInterface
25
+
26
+
27
+ class TableOutput(FlowComponent, CredentialsInterface):
28
+ """
29
+ TableOutput
30
+
31
+ Overview
32
+
33
+ The TableOutput class is a component for copying data to SQL tables using Pandas and SQLAlchemy features. It supports
34
+ various SQL flavors such as PostgreSQL, MySQL, and SQLAlchemy. The class handles data type detection, data transformation,
35
+ and the INSERT-UPDATE mechanism.
36
+
37
+ .. table:: Properties
38
+ :widths: auto
39
+
40
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
41
+ | Name | Required | Description |
42
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
43
+ | _pk | No | A list of primary keys for the table. |
44
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
45
+ | _fk | No | The foreign key for the table. |
46
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
47
+ | data | Yes | The data to be copied to the table. |
48
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
49
+ | _engine | Yes | The database engine used for the SQL operations. |
50
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
51
+ | _columns | No | A list of columns in the table. |
52
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
53
+ | _schema | No | The schema of the table. |
54
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
55
+ | _constraint | No | A list of constraints for the table. |
56
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
57
+ | _dsn | Yes | The data source name (DSN) for the database connection. |
58
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
59
+ | flavor | Yes | The SQL flavor for the database, defaults to "postgresql". |
60
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
61
+ | multi | No | A flag indicating if multiple DataFrame transformations are supported, defaults to False. |
62
+ +------------------+----------+--------------------------------------------------------------------------------------------------+
63
+
64
+ Returns:
65
+ DataFrame: The data that was copied to the table.
66
+
67
+
68
+ Example:
69
+
70
+ ```yaml
71
+ TableOutput:
72
+ tablename: business_hours
73
+ flavor: postgres
74
+ schema: banco_chile
75
+ pk:
76
+ - store_id
77
+ - weekday
78
+ if_exists: append
79
+ ```
80
+
81
+ """ # noqa
82
+
83
+ def __init__(
84
+ self,
85
+ loop: asyncio.AbstractEventLoop = None,
86
+ job: Callable = None,
87
+ stat: Callable = None,
88
+ **kwargs,
89
+ ):
90
+ self._pk = []
91
+ self._fk: str = None
92
+ self._engine = None
93
+ self._columns: list = []
94
+ self._schema: str = kwargs.pop('schema', None)
95
+ self.multi_schema: bool = kwargs.pop('multi_schema', False)
96
+ self._constraint: list = None
97
+ dsn = kwargs.get('dsn', None)
98
+ self.data = kwargs.get('data', None)
99
+ self.tablename = kwargs.pop('tablename', None)
100
+ self.only_update = kwargs.pop('only_update', False)
101
+ self.use_cache = kwargs.pop('use_cache', True)
102
+ if self.tablename is None:
103
+ self.tablename = kwargs.pop('table', None)
104
+ if dsn is not None and dsn.startswith('postgres:'):
105
+ dsn = dsn.replace('postgres:', 'postgresql:')
106
+ # DB Flavor
107
+ self.flavor: str = kwargs.pop('flavor', 'postgresql')
108
+ self.multi: bool = bool(kwargs.pop('multi', False))
109
+ super().__init__(
110
+ loop=loop,
111
+ job=job,
112
+ stat=stat,
113
+ **kwargs
114
+ )
115
+ # get DSN:
116
+ self._dsn = self.get_env_value(dsn, default=dsn)
117
+
118
+ def constraints(self):
119
+ return self._constraint
120
+
121
+ def get_schema(self):
122
+ return self._schema
123
+
124
+ def foreign_keys(self):
125
+ return self._fk
126
+
127
+ def primary_keys(self):
128
+ return self._pk
129
+
130
+ async def start(self, **kwargs):
131
+ if self.previous:
132
+ self.data = self.input
133
+ else:
134
+ if is_empty(self.data):
135
+ raise DataNotFound(
136
+ "Previous Data was Not Found"
137
+ )
138
+ await super(TableOutput, self).start(**kwargs)
139
+ args = {}
140
+ if hasattr(self, "do_update"):
141
+ args = {"do_update": self.do_update}
142
+ if hasattr(self, "use_merge"):
143
+ args["use_merge"] = self.use_merge
144
+ if hasattr(self, 'only_update'):
145
+ args["only_update"] = self.only_update
146
+ if self.flavor in ("postgres", "postgresql"):
147
+ self._engine = PgOutput(
148
+ parent=self,
149
+ external=False,
150
+ use_cache=self.use_cache,
151
+ **args
152
+ )
153
+ elif self.flavor == "mysql":
154
+ self._engine = MysqlOutput(parent=self, dsn=self._dsn, external=False)
155
+ elif self.flavor == "sqlalchemy":
156
+ self._engine = SaOutput(parent=self, dsn=self._dsn, external=False)
157
+ elif self.flavor in ("rethinkdb", "rethink"):
158
+ self._engine = RethinkOutput(parent=self, external=True)
159
+ elif self.flavor in ("bigquery", "bq"):
160
+ self._engine = BigQueryOutput(parent=self, external=True, **args)
161
+ elif self.flavor in ("mongodb", "mongo"):
162
+ self._engine = MongoDBOutput(parent=self, external=True)
163
+ elif self.flavor in ("documentdb", "docdb"):
164
+ self._engine = DocumentDBOutput(parent=self, external=True)
165
+ else:
166
+ raise ComponentError(
167
+ f"TableOutput: unsupported DB flavor: {self.flavor}"
168
+ )
169
+ if self.data is None:
170
+ raise DataNotFound(
171
+ "TableOutput: Data missing"
172
+ )
173
+ elif isinstance(self.data, pd.DataFrame):
174
+ if self._schema is None and hasattr(self, "schema_column"):
175
+ # split the dataframe based on the "schema_column" and declared as "multiple":
176
+ self.multi = True
177
+ self.multi_schema = True
178
+ schema_column = self.schema_column
179
+ unique_values = self.data[schema_column].unique()
180
+ result = {}
181
+ for value in unique_values:
182
+ result[value] = self.data[self.data[schema_column] == value]
183
+ self.data = result
184
+ return True
185
+ # detect data type for colums
186
+ columns = list(self.data.columns)
187
+ for column in columns:
188
+ t = self.data[column].dtype
189
+ if isinstance(t, pd.core.dtypes.dtypes.DatetimeTZDtype):
190
+ self.data[column] = pd.to_datetime(
191
+ self.data[column],
192
+ format="%Y-%m-%dT%H:%M:%S.%f%z",
193
+ cache=True,
194
+ utc=True,
195
+ )
196
+ self.data[column].dt.tz_convert("UTC")
197
+ elif str(t) == "datetime64[ns]":
198
+ tmp_data = self.data.copy()
199
+ tmp_data[column] = pd.to_datetime(
200
+ self.data[column],
201
+ format="%Y-%m-%dT%H:%M:%S.%f%z",
202
+ cache=True,
203
+ utc=True,
204
+ )
205
+ self.data = tmp_data.copy()
206
+ else:
207
+ # this is an special column from RethinkDB
208
+ # rethinkdb.ast.RqlTzinfo
209
+ if column == "inserted_at":
210
+ try:
211
+ self.data[column] = pd.to_datetime(
212
+ self.data[column],
213
+ format="%Y-%m-%dT%H:%M:%S.%f%z",
214
+ cache=True,
215
+ utc=True,
216
+ )
217
+ except ValueError:
218
+ self.data[column] = pd.to_datetime(
219
+ self.data[column],
220
+ # format='%Y-%m-%d %H:%M:%S.%f+%z',
221
+ cache=True,
222
+ utc=True,
223
+ )
224
+ elif self.multi is True:
225
+ # iteration over every Pandas DT:
226
+ try:
227
+ result = self.data.items()
228
+ except Exception as err:
229
+ raise ComponentError(
230
+ f"Invalid Result type for Multiple: {err}"
231
+ ) from err
232
+ for name, rs in result:
233
+ if hasattr(self, name):
234
+ el = getattr(self, name)
235
+ print(el)
236
+ if not isinstance(rs, pd.DataFrame):
237
+ raise ComponentError(
238
+ "Invalid origin Dataset: not a Dataframe"
239
+ )
240
+ return True
241
+
242
+ async def close(self):
243
+ """Closing Operations."""
244
+ try:
245
+ await self._engine.close()
246
+ except Exception as err:
247
+ logging.error(err)
248
+
249
+ async def table_output(self, elem, datasource):
250
+ # get info
251
+ options = {"chunksize": 100}
252
+ table = elem.tablename
253
+ try:
254
+ schema = elem.schema
255
+ except AttributeError:
256
+ if self._schema:
257
+ schema = self._schema
258
+ else:
259
+ schema = 'public'
260
+ # starting metric:
261
+ try:
262
+ data = {"NUM_ROWS": datasource.shape[0], "NUM_COLUMNS": datasource.shape[1]}
263
+ self.add_metric(f"{schema}.{table}", data)
264
+ except Exception:
265
+ pass
266
+ if self._engine.is_external is False:
267
+ options["schema"] = schema
268
+ if hasattr(elem, "sql_options"):
269
+ options = {**options, **elem.sql_options}
270
+ if hasattr(elem, "pk") or hasattr(elem, "constraint"):
271
+ options["index"] = False
272
+ if hasattr(elem, "if_exists"):
273
+ options["if_exists"] = elem.if_exists
274
+ else:
275
+ options["if_exists"] = "append"
276
+ # define index:
277
+ try:
278
+ self._pk = elem.pk
279
+ options["index_label"] = self._pk
280
+ except AttributeError:
281
+ self._pk = []
282
+ # set the upsert method:
283
+ options["method"] = self._engine.db_upsert
284
+ if hasattr(elem, "foreign_key"):
285
+ self._fk = elem.foreign_key
286
+ else:
287
+ self._fk = None
288
+ if hasattr(elem, "constraint"):
289
+ self._constraint = elem.constraint
290
+ else:
291
+ self._constraint = None
292
+ self._columns = list(datasource.columns)
293
+ self._engine.columns = self._columns
294
+ self._schema = schema
295
+ # add metrics for Table Output
296
+ try:
297
+ u = datasource.select_dtypes(include=["object", "string"])
298
+ replacement_values = u.replace(["<NA>", "None"], None)
299
+ datasource[u.columns] = replacement_values
300
+ except ValueError as ex:
301
+ self._logger.warning(
302
+ f"Column mismatch: {len(u.columns)} vs {len(replacement_values.columns)}, error: {ex}"
303
+ )
304
+ try:
305
+ datasource.to_sql(name=table, con=self._engine.engine(), **options)
306
+ logging.debug(f":: Saving Table Data {schema}.{table} ...")
307
+ return True
308
+ except NoSuchTableError as exc:
309
+ raise ComponentError(f"There is no Table {table}: {exc}") from exc
310
+ except Exception as exc:
311
+ raise ComponentError(f"{exc}") from exc
312
+ else:
313
+ # Using Engine External method write:
314
+ on_conflict = 'replace'
315
+ if hasattr(elem, 'if_exists'):
316
+ on_conflict = elem.if_exists
317
+
318
+ # Configuración para BigQuery MERGE
319
+ kwargs = {
320
+ 'table': table,
321
+ 'schema': schema,
322
+ 'data': datasource,
323
+ 'on_conflict': on_conflict,
324
+ }
325
+
326
+ # Si es BigQuery y tiene PK definidas, agregar configuración de MERGE
327
+ if self.flavor in ('bigquery', 'bq'):
328
+ if hasattr(elem, 'pk'):
329
+ kwargs['pk'] = elem.pk
330
+ self._logger.debug(f"Using primary keys for merge: {elem.pk}")
331
+ if hasattr(elem, 'use_merge'):
332
+ kwargs['use_merge'] = elem.use_merge
333
+ self._logger.debug(f"MERGE enabled: {elem.use_merge}")
334
+
335
+ await self._engine.db_upsert(**kwargs)
336
+
337
+ async def run(self):
338
+ """Run TableOutput."""
339
+ try:
340
+ self._result = None
341
+ if self.multi is False:
342
+ # set the number of rows:
343
+ self._variables["{self.StepName}_NUMROWS"] = len(self.data.index)
344
+ await self.table_output(self, self.data)
345
+ self._result = self.data
346
+ try:
347
+ self.add_metric("ROWS_SAVED", len(self.data.index))
348
+ except (TypeError, ValueError):
349
+ pass
350
+ return self._result
351
+ else:
352
+ # running in multi Mode
353
+ try:
354
+ result = self.data.items()
355
+ except Exception as err:
356
+ raise ComponentError(
357
+ f"Invalid Result type for Multiple: {err}"
358
+ ) from err
359
+ for name, rs in result:
360
+ if self.multi_schema is False:
361
+ try:
362
+ el = getattr(self, name)
363
+ obj = AttrDict(el)
364
+ except AttributeError:
365
+ continue
366
+ else:
367
+ obj = self
368
+ self._schema = name
369
+ await self.table_output(obj, rs)
370
+ # set the number of rows:
371
+ self._variables[f"{self.StepName}_{name}_NUMROWS"] = len(rs.index)
372
+ # return the same dataframe
373
+ self._result = self.data
374
+ try:
375
+ self.add_metric(
376
+ "ROWS_SAVED", self._engine.result()
377
+ )
378
+ except Exception as err:
379
+ logging.error(err)
380
+ return self._result
381
+ except ValueError as err:
382
+ raise ComponentError(f"Value Error: {err}") from err
383
+ except Exception as err:
384
+ raise ComponentError(f"TableOutput: {err}") from err
@@ -0,0 +1,3 @@
1
+ from .TableOutput import TableOutput
2
+
3
+ __all__ = ("TableOutput",)