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,177 @@
1
+ import os
2
+ from collections.abc import Callable
3
+ from abc import abstractmethod
4
+ import asyncio
5
+ from decimal import Decimal
6
+ import numpy as np
7
+ import pandas as pd
8
+ import datetime
9
+ from ..utils import SafeDict
10
+ from .flow import FlowComponent
11
+ from ..exceptions import (
12
+ ComponentError,
13
+ DataNotFound,
14
+ )
15
+ from ..interfaces.qs import QSSupport
16
+
17
+
18
+ dtypes = {
19
+ "varchar": str,
20
+ "character varying": str,
21
+ "string": str,
22
+ "object": str,
23
+ "int": int,
24
+ "int4": int,
25
+ "integer": int,
26
+ "bigint": np.int64,
27
+ "int64": np.int64,
28
+ "uint64": np.int64,
29
+ "Int8": int,
30
+ "float64": Decimal,
31
+ "float": Decimal,
32
+ "boolean": bool,
33
+ "bool": bool,
34
+ "datetime64[ns]": datetime.datetime,
35
+ "date": datetime.date,
36
+ }
37
+
38
+ class CopyTo(QSSupport, FlowComponent):
39
+ """CopyTo.
40
+
41
+ Abstract Class for Copying (saving) a Pandas Dataframe onto a Resource
42
+ (example: Copy to PostgreSQL).
43
+ """
44
+ def __init__(
45
+ self,
46
+ loop: asyncio.AbstractEventLoop = None,
47
+ job: Callable = None,
48
+ stat: Callable = None,
49
+ **kwargs,
50
+ ):
51
+ self.pk = []
52
+ self.truncate: bool = False
53
+ self.data = None
54
+ self._engine = None
55
+ self.tablename: str = ""
56
+ self.schema: str = ""
57
+ self.use_chunks = False
58
+ self.chunksize = None
59
+ self._connection: Callable = None
60
+ self._driver: str = kwargs.pop('driver', 'pg')
61
+ self.multi = bool(kwargs.pop('multi', False))
62
+ self._naive_columns: list = kwargs.pop('naive_tz', [])
63
+ self._json_columns: list = kwargs.pop('json_columns', [])
64
+ self._vector_columns: list = kwargs.pop('vector_columns', [])
65
+ self._array_columns: list = kwargs.pop('array_columns', [])
66
+ self._binary_columns: list = kwargs.pop('binary_columns', [])
67
+ self._atomic: bool = kwargs.pop('atomic', False)
68
+ super(CopyTo, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
69
+
70
+ async def start(self, **kwargs):
71
+ """Obtain Pandas Dataframe."""
72
+ if hasattr(self, 'credentials'):
73
+ self.processing_credentials()
74
+ if self.previous:
75
+ self.data = self.input
76
+ else:
77
+ raise ComponentError(
78
+ "CopyTo: Data Was Not Found"
79
+ )
80
+ for attr, value in self.__dict__.items():
81
+ if isinstance(value, str):
82
+ val = value.format_map(SafeDict(**self._variables))
83
+ object.__setattr__(self, attr, val)
84
+ if not self.schema:
85
+ try:
86
+ self.schema = self._program
87
+ except (ValueError, AttributeError, TypeError) as ex:
88
+ raise ComponentError(
89
+ "CopyTo: Schema name not defined."
90
+ ) from ex
91
+ # Getting the connection, DSN or credentials:
92
+ self._connection = await self.create_connection(
93
+ driver=self._driver
94
+ )
95
+
96
+ async def close(self):
97
+ """Close the connection to Database."""
98
+ try:
99
+ if self._connection:
100
+ await self._connection.close()
101
+ self._logger.info(
102
+ "CopyTo: Connection closed."
103
+ )
104
+ except Exception as err:
105
+ self._logger.error(
106
+ f"CopyTo: Error closing connection: {err}"
107
+ )
108
+
109
+ @abstractmethod
110
+ async def _create_table(self):
111
+ pass
112
+
113
+ @abstractmethod
114
+ async def _truncate_table(self):
115
+ pass
116
+
117
+ @abstractmethod
118
+ async def _copy_dataframe(self):
119
+ pass
120
+
121
+ @abstractmethod
122
+ async def _copy_iterable(self):
123
+ pass
124
+
125
+ async def run(self):
126
+ """Run Copy into table functionality."""
127
+ self._result = None
128
+ if self.data is None:
129
+ raise DataNotFound(
130
+ f"{self.__name__} Error: No data in Dataframe"
131
+ )
132
+ if isinstance(self.data, pd.DataFrame) and self.data.empty:
133
+ raise DataNotFound(
134
+ f"{self.__name__} Error: No data in Dataframe"
135
+ )
136
+ # Pass through data to next component.
137
+ self._result = self.data
138
+ if isinstance(self.data, pd.DataFrame):
139
+ columns = list(self.data.columns)
140
+ self.add_metric("NUM_ROWS", self.data.shape[0])
141
+ self.add_metric("NUM_COLUMNS", self.data.shape[1])
142
+ if self._debug:
143
+ print(f"Debugging: {self.__name__} ===")
144
+ for column in columns:
145
+ t = self.data[column].dtype
146
+ print(column, "->", t, "->", self.data[column].iloc[0])
147
+ elif isinstance(self.data, list):
148
+ columns = list(self.data[0].keys())
149
+ self.add_metric("NUM_ROWS", len(self.data))
150
+ self.add_metric("NUM_COLUMNS", len(columns))
151
+ else:
152
+ self.add_metric("DATA_SIZE", len(self.data))
153
+ if hasattr(self, "create_table"):
154
+ # Create a Table using Model
155
+ self._logger.debug(
156
+ f":: Creating table: {self.schema}.{self.tablename}"
157
+ )
158
+ await self._create_table()
159
+ if self.truncate is True:
160
+ if self._debug:
161
+ self._logger.debug(
162
+ f"Truncating table: {self.schema}.{self.tablename}"
163
+ )
164
+ await self._truncate_table()
165
+ if isinstance(self.data, pd.DataFrame):
166
+ # insert data directly into table
167
+ columns = list(self.data.columns)
168
+ await self._copy_dataframe()
169
+ else:
170
+ # insert data using iterable
171
+ await self._copy_iterable()
172
+ self._logger.debug(
173
+ f"{self.__name__}: Saving results into: {self.schema}.{self.tablename}"
174
+ )
175
+ # returning this
176
+ # passing through
177
+ return self._result
@@ -0,0 +1,243 @@
1
+ import asyncio
2
+ from collections.abc import Callable
3
+ import math
4
+ import pandas as pd
5
+ from asyncdb import AsyncDB
6
+ from asyncdb.exceptions import (
7
+ StatementError,
8
+ DataError
9
+ )
10
+ from .CopyTo import CopyTo
11
+ from ..interfaces.dataframes import PandasDataframe
12
+ from ..exceptions import (
13
+ ComponentError,
14
+ DataNotFound
15
+ )
16
+ from querysource.conf import (
17
+ BIGQUERY_CREDENTIALS,
18
+ BIGQUERY_PROJECT_ID
19
+ )
20
+
21
+
22
+ class CopyToBigQuery(CopyTo, PandasDataframe):
23
+ """
24
+ CopyToBigQuery.
25
+
26
+ Overview
27
+
28
+ This component allows copying data into a BigQuery table,
29
+ using write functionality from AsyncDB BigQuery driver.
30
+
31
+ .. table:: Properties
32
+ :widths: auto
33
+
34
+ +--------------+----------+-----------+--------------------------------------------+
35
+ | Name | Required | Summary |
36
+ +--------------+----------+-----------+--------------------------------------------+
37
+ | tablename | Yes | Name of the table in |
38
+ | | | BigQuery |
39
+ +--------------+----------+-----------+--------------------------------------------+
40
+ | schema | Yes | Name of the dataset |
41
+ | | | where the table is located |
42
+ +--------------+----------+-----------+--------------------------------------------+
43
+ | truncate | Yes | This option indicates if the component should empty |
44
+ | | | before copying the new data to the table. If set to |
45
+ | | | true, the table will be truncated before saving data. |
46
+ +--------------+----------+-----------+--------------------------------------------+
47
+ | use_buffer | No | When activated, this option allows optimizing the |
48
+ | | | performance of the task when dealing with large |
49
+ | | | volumes of data. |
50
+ +--------------+----------+-----------+--------------------------------------------+
51
+ | credentials | No | Path to BigQuery credentials JSON file |
52
+ | | | |
53
+ +--------------+----------+-----------+--------------------------------------------+
54
+ | project_id | No | Google Cloud Project ID |
55
+ | | | |
56
+ +--------------+----------+-----------+--------------------------------------------+
57
+
58
+
59
+ Example:
60
+
61
+ ```yaml
62
+ CopyToBigQuery:
63
+ schema: hisense
64
+ tablename: product_availability_all
65
+ ```
66
+
67
+ """
68
+ def __init__(
69
+ self,
70
+ loop: asyncio.AbstractEventLoop = None,
71
+ job: Callable = None,
72
+ stat: Callable = None,
73
+ **kwargs,
74
+ ):
75
+ self.pk = []
76
+ self.truncate: bool = False
77
+ self.data = None
78
+ self._engine = None
79
+ self.tablename: str = ""
80
+ self.schema: str = "" # dataset in BigQuery terminology
81
+ self.use_chunks = False
82
+ self._chunksize: int = kwargs.pop('chunksize', 10000)
83
+ self._connection: Callable = None
84
+ self._project_id: str = kwargs.pop('project_id', None)
85
+ try:
86
+ self.multi = bool(kwargs["multi"])
87
+ del kwargs["multi"]
88
+ except KeyError:
89
+ self.multi = False
90
+ super().__init__(
91
+ loop=loop,
92
+ job=job,
93
+ stat=stat,
94
+ **kwargs
95
+ )
96
+ self._driver: str = 'bigquery'
97
+
98
+ def default_connection(self):
99
+ """default_connection.
100
+
101
+ Default Connection to BigQuery.
102
+ """
103
+ try:
104
+ kwargs: dict = {
105
+ "credentials": BIGQUERY_CREDENTIALS,
106
+ "project_id": self._project_id or BIGQUERY_PROJECT_ID
107
+ }
108
+ self._connection = AsyncDB(
109
+ 'bigquery',
110
+ params=kwargs,
111
+ loop=self._loop,
112
+ **kwargs
113
+ )
114
+ return self._connection
115
+ except Exception as err:
116
+ raise ComponentError(
117
+ f"Error configuring BigQuery Connection: {err!s}"
118
+ ) from err
119
+
120
+ # Function to clean invalid float values
121
+ def clean_floats(self, data):
122
+ def sanitize_value(value):
123
+ if isinstance(value, float) and (math.isnan(value) or math.isinf(value)):
124
+ return None
125
+ return value
126
+
127
+ if isinstance(data, dict):
128
+ return {k: sanitize_value(v) for k, v in data.items()}
129
+ elif isinstance(data, list):
130
+ return [self.clean_floats(item) for item in data]
131
+ return data
132
+
133
+ async def _create_table(self):
134
+ """Create a Table in BigQuery if it doesn't exist."""
135
+ try:
136
+ async with await self._connection.connection() as conn:
137
+ # First ensure dataset exists
138
+ await conn.create_dataset(self.schema)
139
+
140
+ # Infer schema from DataFrame
141
+ bq_schema = []
142
+ type_mapping = {
143
+ 'object': 'STRING',
144
+ 'string': 'STRING',
145
+ 'int64': 'INTEGER',
146
+ 'float64': 'FLOAT',
147
+ 'bool': 'BOOLEAN',
148
+ 'datetime64[ns]': 'TIMESTAMP',
149
+ 'date': 'DATE'
150
+ }
151
+
152
+ for column, dtype in self.data.dtypes.items():
153
+ bq_type = type_mapping.get(str(dtype), 'STRING')
154
+ bq_schema.append({
155
+ "name": column,
156
+ "type": bq_type,
157
+ "mode": "NULLABLE"
158
+ })
159
+
160
+ # If create_table has clustering fields, add them to the config
161
+ table_config = {}
162
+ if hasattr(self, 'create_table'):
163
+ if isinstance(self.create_table, dict) and 'pk' in self.create_table:
164
+ table_config['clustering_fields'] = self.create_table['pk']
165
+
166
+ # Create the table with the inferred schema
167
+ await conn.create_table(
168
+ table_id=self.tablename,
169
+ dataset_id=self.schema,
170
+ schema=bq_schema,
171
+ **table_config
172
+ )
173
+
174
+ except Exception as err:
175
+ raise ComponentError(
176
+ f"Error creating BigQuery table: {err}"
177
+ ) from err
178
+
179
+ async def _truncate_table(self):
180
+ """Truncate the BigQuery table using the driver's built-in method."""
181
+ async with await self._connection.connection() as conn:
182
+ await self._connection.truncate_table(
183
+ table_id=self.tablename,
184
+ dataset_id=self.schema
185
+ )
186
+
187
+ async def _copy_dataframe(self):
188
+ """Copy a pandas DataFrame to BigQuery."""
189
+ try:
190
+ # Clean NA/NaT values from string fields
191
+ str_cols = self.data.select_dtypes(include=["string"])
192
+ if not str_cols.empty:
193
+ self.data[str_cols.columns] = str_cols.astype(object).where(
194
+ pd.notnull(str_cols), None
195
+ )
196
+
197
+ # Clean datetime fields - convert to ISO format strings
198
+ datetime_types = ["datetime64", "datetime64[ns]"]
199
+ datetime_cols = self.data.select_dtypes(include=datetime_types)
200
+ if not datetime_cols.empty:
201
+ for col in datetime_cols.columns:
202
+ # self.data[col] = self.data[col].apply(
203
+ # lambda x: x.isoformat() if pd.notnull(x) else None
204
+ # )
205
+ self.data[col] = self.data[col].dt.tz_localize(None)
206
+ async with await self._connection.connection() as conn:
207
+ result = await conn.write(
208
+ data=self.data,
209
+ table_id=self.tablename,
210
+ dataset_id=self.schema,
211
+ use_pandas=True,
212
+ if_exists="append"
213
+ )
214
+ print('CopyTo: ', result)
215
+ except StatementError as err:
216
+ raise ComponentError(
217
+ f"Statement error: {err}"
218
+ ) from err
219
+ except DataError as err:
220
+ raise ComponentError(
221
+ f"Data error: {err}"
222
+ ) from err
223
+ except Exception as err:
224
+ raise ComponentError(
225
+ f"{self.StepName} Error: {err!s}"
226
+ ) from err
227
+
228
+ async def _copy_iterable(self):
229
+ """Copy an iterable to BigQuery."""
230
+ try:
231
+ async with await self._connection.connection() as conn:
232
+ await conn.write(
233
+ data=self.data,
234
+ table_id=self.tablename,
235
+ dataset_id=self.schema,
236
+ use_pandas=False,
237
+ if_exists="append",
238
+ batch_size=self._chunksize
239
+ )
240
+ except Exception as err:
241
+ raise ComponentError(
242
+ f"Error copying iterable to BigQuery: {err}"
243
+ ) from err