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,261 @@
1
+ """
2
+ QuerySource.
3
+ QS is a new kind of component supporting the new sources for
4
+ QuerySource and making transformations of data, returning a transformed
5
+ Pandas DataFrame.
6
+
7
+
8
+ Example:
9
+
10
+ ```yaml
11
+ QS:
12
+ query: troc_mileage.tpl
13
+ from_templates_dir: true
14
+ conditions:
15
+ tenant: bose
16
+ firstdate: '{first}'
17
+ lastdate: '{last}'
18
+ forms:
19
+ - 4184
20
+ - 4149
21
+ - 4177
22
+ - 4152
23
+ - 3900
24
+ - 3931
25
+ - 3959
26
+ masks:
27
+ first:
28
+ - date_diff_dow
29
+ - day_of_week: monday
30
+ diff: 8
31
+ mask: '%Y-%m-%d'
32
+ last:
33
+ - date_diff_dow
34
+ - day_of_week: monday
35
+ diff: 2
36
+ mask: '%Y-%m-%d'
37
+ ```
38
+
39
+ """
40
+ import asyncio
41
+ from collections.abc import Callable
42
+ import pandas as pd
43
+ from asyncdb.exceptions import NoDataFound
44
+ from querysource.queries import MultiQS
45
+ from querysource.exceptions import DataNotFound as DNF
46
+ from querysource.exceptions import (
47
+ ParserError,
48
+ DriverError,
49
+ QueryException,
50
+ SlugNotFound,
51
+ )
52
+ from querysource.libs.encoders import DefaultEncoder
53
+ from querysource.types.validators import is_empty
54
+ from ..exceptions import ComponentError, DataNotFound, ConfigError
55
+ from .flow import FlowComponent
56
+ from ..interfaces.dataframes import PandasDataframe
57
+ from ..interfaces import TemplateSupport
58
+ from ..utils import SafeDict
59
+ from ..utils.transformations import to_camel_case, to_snake_case
60
+
61
+
62
+ class QS(FlowComponent, TemplateSupport, PandasDataframe):
63
+ """
64
+ QS.
65
+
66
+ Overview
67
+
68
+ Calling Complex QuerySource operations from Flowtask.
69
+ This component supports QuerySource,
70
+ making transformations of data and returning a transformed Pandas DataFrame.
71
+
72
+ Component Syntax:
73
+ "QS": {
74
+ "query": "path to file",
75
+ "conditions": {
76
+ "firstdate": "",
77
+ "lastdate": "",
78
+ forms: [1, 2, 3, 4]
79
+ }
80
+ }
81
+ or
82
+ "QS": {
83
+ "slug": "troc_mileage"
84
+ }
85
+
86
+ .. table:: Properties
87
+ :widths: auto
88
+
89
+ +------------------------+----------+-----------+------------------------------------------------------------------+
90
+ | Name | Required | Summary |
91
+ +------------------------+----------+-----------+------------------------------------------------------------------+
92
+ | slug | Yes | The slug identifier for the query. |
93
+ +------------------------+----------+-----------+------------------------------------------------------------------+
94
+ | query | No | The query template file to use. |
95
+ +------------------------+----------+-----------+------------------------------------------------------------------+
96
+ | conditions | No | Conditions to apply to the query. |
97
+ +------------------------+----------+-----------+------------------------------------------------------------------+
98
+ | map | No | Dictionary for mapping or transforming the resulting DataFrame. |
99
+ +------------------------+----------+-----------+------------------------------------------------------------------+
100
+ | infer_types | No | If True, converts DataFrame columns to appropriate dtypes. Default is False. |
101
+ +------------------------+----------+-----------+------------------------------------------------------------------+
102
+ | to_string | No | If True, converts DataFrame columns to string dtype. Default is True. |
103
+ +------------------------+----------+-----------+------------------------------------------------------------------+
104
+ | use_template | No | If True, use a query template for the query. Default is True. |
105
+ +------------------------+----------+-----------+------------------------------------------------------------------+
106
+
107
+ Returns
108
+
109
+ This component returns a pandas DataFrame containing the queried and transformed data.
110
+
111
+ """ # noqa
112
+ use_template: bool = True
113
+
114
+ def __init__(
115
+ self,
116
+ loop: asyncio.AbstractEventLoop = None,
117
+ job: Callable = None,
118
+ stat: Callable = None,
119
+ **kwargs,
120
+ ):
121
+ """Init Method."""
122
+ self.slug: str = None
123
+ self._kwargs: dict = {}
124
+ self.to_string: bool = True
125
+ self._queries: dict = {}
126
+ self._files: dict = {}
127
+ self._options: dict = {}
128
+ self.conditions: dict = {}
129
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
130
+ self._program_tpl = kwargs.get('program', self._program)
131
+ self._encoder = DefaultEncoder()
132
+
133
+ async def start(self, **kwargs):
134
+ if self.previous:
135
+ self.data = self.input
136
+ ## define conditions:
137
+ if self.conditions:
138
+ self.set_conditions()
139
+ # Processing Masks
140
+ if hasattr(self, "masks"):
141
+ for key, val in self.conditions.items():
142
+ print('QS KEY :', key, ' Value :', val, ' Masks: ', self._mask)
143
+ if key in self._variables:
144
+ self.conditions[key] = self._variables[key]
145
+ elif key in self._mask:
146
+ self.conditions[key] = self.mask_replacement(val)
147
+ elif isinstance(val, str):
148
+ if val in self._mask:
149
+ self.conditions[key] = self.mask_replacement(val)
150
+ else:
151
+ value = val.format_map(
152
+ SafeDict(**self._mask)
153
+ )
154
+ self.conditions[key] = value
155
+ if 'program' in self.conditions:
156
+ del self.conditions['program']
157
+ if hasattr(self, "query"):
158
+ query = await self.open_templatefile(
159
+ self.query,
160
+ program=self._program_tpl,
161
+ from_templates_dir=self.from_templates_dir,
162
+ **self.conditions
163
+ )
164
+ if not query:
165
+ raise ComponentError(
166
+ f"Empty Query on Template {self.query}"
167
+ )
168
+ try:
169
+ slug_data = self._encoder.load(query)
170
+ self._logger.notice(
171
+ f" :: Query :: {slug_data}"
172
+ )
173
+ self._options = slug_data
174
+ self._queries = slug_data.get('queries', {})
175
+ self._files = slug_data.get('files', {})
176
+ except Exception as exc:
177
+ raise ComponentError(
178
+ f"Unable to decode JSON from Query {query}: {exc}"
179
+ ) from exc
180
+
181
+ def from_dict(self, result):
182
+ if not result:
183
+ self._variables["_numRows_"] = 0
184
+ self._variables[f"{self.StepName}_NUMROWS"] = 0
185
+ raise NoDataFound("Data Not Found")
186
+ try:
187
+ df = pd.DataFrame.from_dict(result, orient="columns")
188
+ df.infer_objects()
189
+ if hasattr(self, "infer_types"):
190
+ df = df.convert_dtypes(convert_string=self.to_string)
191
+ if self._debug:
192
+ print(df)
193
+ print("::: Printing Column Information === ")
194
+ columns = list(df.columns)
195
+ for column in columns:
196
+ t = df[column].dtype
197
+ print(column, "->", t, "->", df[column].iloc[0])
198
+ self._variables["_numRows_"] = len(df.index)
199
+ self._variables[f"{self.StepName}_NUMROWS"] = len(df.index)
200
+ return df
201
+ except Exception as err:
202
+ self._logger.error(f"{self._driver}: Error Creating Dataframe {err!s}")
203
+
204
+ async def run(self):
205
+ try:
206
+ qs = MultiQS(
207
+ slug=self.slug,
208
+ queries=self._queries,
209
+ files=self._files,
210
+ query=self._options
211
+ )
212
+ result, _ = await qs.query()
213
+ if is_empty(result):
214
+ raise DataNotFound(
215
+ "Data Not Found"
216
+ )
217
+ self._result = result
218
+ except DNF as dnf:
219
+ raise DataNotFound(
220
+ f"Data Not Found in QS: {dnf}",
221
+ )
222
+ except SlugNotFound as snf:
223
+ raise ConfigError(
224
+ f"Slug Not Found: {snf}",
225
+ )
226
+ except ParserError as pe:
227
+ raise ConfigError(
228
+ f"Error parsing Query Slug: {pe}"
229
+ )
230
+ except (QueryException, DriverError) as qe:
231
+ raise ComponentError(
232
+ f"Query Error: {qe}"
233
+ )
234
+ # Mapping:
235
+ if hasattr(self, "map"):
236
+ # transforming dataframe using a Map or auto-map:
237
+ if "auto" in self.map:
238
+ # auto-mapping:
239
+ _case = self.map.get("case", "snake")
240
+ if _case == "snake":
241
+ self._result = self._result.rename(columns=to_snake_case)
242
+ elif _case == "camel":
243
+ self._result = self._result.rename(columns=to_camel_case)
244
+ else:
245
+ self._logger.warning(f"QS Map: Unsupported Map Case {_case}")
246
+ else:
247
+ raise NotImplementedError(
248
+ "QS Map: Not Implemented Yet."
249
+ )
250
+ numrows = len(self._result.index)
251
+ self.add_metric("NUMROWS", numrows)
252
+ self.add_metric('COLUMNS', self._result.columns.tolist())
253
+ self.add_metric('ROWS', numrows)
254
+ if self._debug is True:
255
+ print("::: Printing Column Information === ")
256
+ for column, t in self._result.dtypes.items():
257
+ print(column, "->", t, "->", self._result[column].iloc[0])
258
+ return self._result
259
+
260
+ async def close(self):
261
+ """Closing QS Object."""
@@ -0,0 +1,201 @@
1
+ """
2
+ QuerySource.
3
+ QSBase is a new kind of component supporting the new sources for
4
+ QuerySource and making transformations of data, returning a transformed
5
+ Pandas DataFrame.
6
+ """
7
+ import asyncio
8
+ import re
9
+ import importlib
10
+ from collections.abc import Callable
11
+ import pandas as pd
12
+ from querysource.exceptions import DataNotFound as DNF
13
+ from querysource import conf
14
+ from asyncdb.exceptions import NoDataFound
15
+ from ..exceptions import ComponentError, DataNotFound
16
+ from .flow import FlowComponent
17
+ from ..interfaces.dataframes import PandasDataframe
18
+ from ..utils.transformations import to_camel_case, to_snake_case
19
+
20
+
21
+ class QSBase(FlowComponent, PandasDataframe):
22
+ """
23
+ QSBase
24
+
25
+ Overview
26
+
27
+ This component is a helper to build components extending from QuerySource,
28
+ providing functionality to query data sources and
29
+ convert the results into pandas DataFrames.
30
+
31
+ .. table:: Properties
32
+ :widths: auto
33
+
34
+
35
+ +------------------------+----------+-----------+------------------------------------------------------------------+
36
+ | Name | Required | Summary |
37
+ +------------------------+----------+-----------+------------------------------------------------------------------+
38
+ | type | Yes | The type of query or operation to perform. |
39
+ +------------------------+----------+-----------+------------------------------------------------------------------+
40
+ | pattern | No | The pattern to use for setting attributes. |
41
+ +------------------------+----------+-----------+------------------------------------------------------------------+
42
+ | conditions | No | Conditions to apply to the query. |
43
+ +------------------------+----------+-----------+------------------------------------------------------------------+
44
+ | map | No | Dictionary for mapping or transforming the resulting DataFrame. |
45
+ +------------------------+----------+-----------+------------------------------------------------------------------+
46
+ | infer_types | No | If True, converts DataFrame columns to appropriate dtypes. Default is False. |
47
+ +------------------------+----------+-----------+------------------------------------------------------------------+
48
+ | to_string | No | If True, converts DataFrame columns to string dtype. Default is True. |
49
+ +------------------------+----------+-----------+------------------------------------------------------------------+
50
+
51
+ Returns
52
+
53
+ This component returns a pandas DataFrame containing the queried data. If multiple data sets are retrieved,
54
+ it returns a dictionary of DataFrames.
55
+ """ # noqa
56
+
57
+ type: str = "None"
58
+ _driver: str = "QSBase"
59
+
60
+ def __init__(
61
+ self,
62
+ loop: asyncio.AbstractEventLoop = None,
63
+ job: Callable = None,
64
+ stat: Callable = None,
65
+ **kwargs,
66
+ ):
67
+ """Init Method."""
68
+ self._qs: Callable = None
69
+ self._kwargs: dict = {}
70
+ self.to_string: bool = True
71
+ self.type = kwargs.pop('type', None)
72
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
73
+
74
+ async def start(self, **kwargs):
75
+ try:
76
+ self.data = self.input
77
+ except Exception:
78
+ pass
79
+ params = {"type": self.type}
80
+ if hasattr(self, "masks"):
81
+ for key, val in self._attrs.items():
82
+ if key in self._variables:
83
+ self._attrs[key] = self._variables[key]
84
+ else:
85
+ self._attrs[key] = self.mask_replacement(val)
86
+ if hasattr(self, "pattern"):
87
+ self.set_attributes("pattern")
88
+ if self._attrs:
89
+ params = {**params, **self._attrs}
90
+ self._kwargs = params
91
+ ## define conditions:
92
+ if hasattr(self, "conditions"):
93
+ self.set_conditions()
94
+ self._kwargs["conditions"] = self.conditions
95
+ if self._attrs:
96
+ for k, v in self._attrs.items():
97
+ if k in self.conditions:
98
+ self.conditions[k] = v
99
+ fns = f"querysource.providers.sources.{self._driver}"
100
+ self._qs = None
101
+ try:
102
+ module = importlib.import_module(fns, package=self._driver)
103
+ # cls = getattr(module, self._driver)
104
+ # self._qs = cls(**params)
105
+ except ModuleNotFoundError:
106
+ ## check if can be loaded from other place:
107
+ fns = f"querysource.plugins.sources.{self._driver}"
108
+ try:
109
+ module = importlib.import_module(fns, package=self._driver)
110
+ # cls = getattr(module, self._driver)
111
+ # self._qs = cls(**params)
112
+ except ModuleNotFoundError as err:
113
+ raise ComponentError(
114
+ f"Error importing {self._driver} module, error: {str(err)}"
115
+ ) from err
116
+ except Exception as err:
117
+ raise ComponentError(
118
+ f"Error: Unknown Error on {self._driver} module, error: {str(err)}"
119
+ ) from err
120
+ ### returning the Component:
121
+ class_name = getattr(module, self._driver)
122
+ self._qs = class_name(**self._kwargs)
123
+ self.add_metric(
124
+ "Driver", {"driver": self._driver, "model": str(self.__class__.__name__)}
125
+ )
126
+
127
+ def from_dict(self, result):
128
+ if not result:
129
+ self._variables["_numRows_"] = 0
130
+ self._variables[f"{self.StepName}_NUMROWS"] = 0
131
+ raise NoDataFound("Data Not Found")
132
+ try:
133
+ df = pd.DataFrame.from_dict(result, orient="columns")
134
+ df.infer_objects()
135
+ if hasattr(self, "infer_types"):
136
+ df = df.convert_dtypes(convert_string=self.to_string)
137
+ if self._debug:
138
+ print(df)
139
+ print("::: Printing Column Information === ")
140
+ columns = list(df.columns)
141
+ for column in columns:
142
+ t = df[column].dtype
143
+ print(column, "->", t, "->", df[column].iloc[0])
144
+ self._variables["_numRows_"] = len(df.index)
145
+ self._variables[f"{self.StepName}_NUMROWS"] = len(df.index)
146
+ return df
147
+ except Exception as err:
148
+ self._logger.error(f"{self._driver}: Error Creating Dataframe {err!s}")
149
+
150
+ async def run(self):
151
+ if hasattr(self, self.type):
152
+ fn = getattr(self, self.type)
153
+ elif hasattr(self._qs, self.type):
154
+ fn = getattr(self._qs, self.type)
155
+ else:
156
+ fn = getattr(self._qs, "query")
157
+ if callable(fn):
158
+ result = await fn()
159
+ try:
160
+ if isinstance(result, pd.DataFrame):
161
+ self._result = result
162
+ elif isinstance(result, dict):
163
+ self._result = {}
164
+ # is a list of results, several dataframes at once
165
+ for key, res in result.items():
166
+ df = await self.create_dataframe(res)
167
+ self._result[key] = df
168
+ else:
169
+ df = await self.create_dataframe(result)
170
+ if df is None or df.empty:
171
+ self._result = pd.DataFrame([])
172
+ self._result = df
173
+ except DataNotFound:
174
+ raise
175
+ except (NoDataFound, DNF) as err:
176
+ raise DataNotFound(f"QS Data not Found: {err}") from err
177
+ except Exception as err:
178
+ self._logger.exception(err)
179
+ raise ComponentError(f"{err!s}") from err
180
+ else:
181
+ raise ComponentError(
182
+ f"{self._driver}: Cannot run Method {fn!s}"
183
+ )
184
+ # Mapping:
185
+ if hasattr(self, "map"):
186
+ # transforming dataframe using a Map or auto-map:
187
+ if "auto" in self.map:
188
+ # auto-mapping:
189
+ _case = self.map.get("case", "snake")
190
+ if _case == "snake":
191
+ self._result = self._result.rename(columns=to_snake_case)
192
+ elif _case == "camel":
193
+ self._result = self._result.rename(columns=to_camel_case)
194
+ else:
195
+ self._logger.warning(f"QS Map: Unsupported Map Case {_case}")
196
+ numrows = len(self._result.index)
197
+ self.add_metric("NUMROWS", numrows)
198
+ return self._result
199
+
200
+ async def close(self):
201
+ """Closing QS Object."""