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,530 @@
1
+ import os
2
+ from typing import Optional, Any, Union, ParamSpec
3
+ from abc import abstractmethod
4
+ from collections.abc import Callable
5
+ import glob
6
+ from pathlib import Path, PurePath
7
+ import orjson
8
+ from navconfig import config
9
+ from ..conf import FILE_STORAGES
10
+ from ..exceptions import (
11
+ FileNotFound
12
+ )
13
+ from ..utils import SafeDict
14
+ from ..utils.constants import (
15
+ get_constant,
16
+ get_func_value,
17
+ is_constant,
18
+ is_function
19
+ )
20
+ from ..interfaces import (
21
+ FuncSupport,
22
+ LogSupport,
23
+ ResultSupport,
24
+ StatSupport,
25
+ LocaleSupport,
26
+ MaskSupport,
27
+ SkipErrors
28
+ )
29
+ from .abstract import AbstractFlow
30
+
31
+
32
+ P = ParamSpec("P")
33
+
34
+
35
+ class FlowComponent(
36
+ FuncSupport,
37
+ MaskSupport,
38
+ LogSupport,
39
+ ResultSupport,
40
+ StatSupport,
41
+ LocaleSupport,
42
+ AbstractFlow
43
+ ):
44
+ """Abstract
45
+
46
+ Overview:
47
+
48
+ Helper for building components that consume REST APIs
49
+
50
+ .. table:: Properties
51
+ :widths: auto
52
+ +--------------+----------+-----------+--------------------------------------+
53
+ | Name | Required | Summary |
54
+ +--------------+----------+-----------+--------------------------------------+
55
+ | method | Yes | Component for Data Integrator |
56
+ +--------------+----------+-----------+--------------------------------------+
57
+ | attributes | Yes | Attribute: barcode |
58
+ +--------------+----------+-----------+--------------------------------------+
59
+
60
+
61
+ Return the list of arbitrary days
62
+
63
+ """
64
+ def __init__(
65
+ self,
66
+ job: Optional[Union[Callable, list]] = None,
67
+ *args: P.args,
68
+ **kwargs: P.kwargs
69
+ ):
70
+ # Task Related Component Name
71
+ # TODO: migration from TaskName to Component Step Name.
72
+ # self.TaskName: Optional[str] = kwargs.pop('step_name', None)
73
+ self.StepName: Optional[str] = kwargs.pop('step_name', None)
74
+ # Future Logic: trigger logic:
75
+ self.runIf: list = []
76
+ self.triggers: list = []
77
+ self._attrs: dict = {} # attributes
78
+ self._variables = {} # variables
79
+ self._params = {} # other parameters
80
+ self._args: dict = {}
81
+ self._filestore: Any = FILE_STORAGES.get('default')
82
+ self._taskstore: Any = kwargs.get('taskstorage', None)
83
+ self._started: bool = False # Avoid multiple start methods.
84
+ # Config Environment
85
+ self._environment = kwargs.pop('ENV', config)
86
+ # Object Name:
87
+ self.__name__: str = self.__class__.__name__
88
+ # program
89
+ self._program = kwargs.get('program', 'navigator')
90
+ # getting the argument parser:
91
+ self._argparser = kwargs.pop('argparser', None)
92
+ # getting the Task Pile (components pile)
93
+ self._TaskPile = kwargs.pop(
94
+ "TaskPile",
95
+ {}
96
+ )
97
+ if self._TaskPile:
98
+ setattr(self, "TaskPile", self._TaskPile)
99
+ # for changing vars (in components with "vars" feature):
100
+ self._vars = kwargs.get('vars', {}) # other vars
101
+ # attributes (root-level of component arguments):
102
+ self._attributes: dict = kwargs.pop("attributes", {})
103
+ if self._attributes:
104
+ self.add_metric("ATTRIBUTES", self._attributes)
105
+ self._args: dict = kwargs.pop("_args", {})
106
+ # conditions:
107
+ if "conditions" in kwargs:
108
+ self.conditions: dict = kwargs.pop("conditions", {})
109
+ # params:
110
+ self._params = kwargs.pop("params", {})
111
+ # parameters
112
+ self._parameters = kwargs.pop(
113
+ "parameters", []
114
+ )
115
+ # arguments list
116
+ self._arguments = kwargs.pop(
117
+ "arguments", []
118
+ )
119
+ # Calling Super:
120
+ super().__init__(*args, **kwargs)
121
+ if 'input' in kwargs:
122
+ self._input_result = kwargs.pop('input')
123
+ # processing variables
124
+ try:
125
+ variables = kwargs.pop("variables", {})
126
+ if isinstance(variables, str):
127
+ try:
128
+ variables = orjson.loads(variables)
129
+ except ValueError:
130
+ try:
131
+ variables = dict(x.split(":") for x in variables.split(","))
132
+ except (TypeError, ValueError, IndexError):
133
+ variables = {}
134
+ for arg, val in variables.items():
135
+ self._variables[arg] = val
136
+ except KeyError:
137
+ pass
138
+ # previous Job has variables, need to update from existing
139
+ self._multi: bool = False
140
+ if isinstance(job, (AbstractFlow, list, )):
141
+ self._component = job
142
+ if isinstance(job, list):
143
+ variables = {}
144
+ for j in job:
145
+ if isinstance(j, AbstractFlow):
146
+ variables = {**variables, **j.variables}
147
+ self._multi = True
148
+ try:
149
+ self._variables = {**self._variables, **variables}
150
+ except Exception as err:
151
+ print(err)
152
+ else:
153
+ try:
154
+ self._variables = {**self._variables, **job.variables}
155
+ except Exception as err:
156
+ print(err)
157
+ # call masks processing:
158
+ self._mask_processing(variables=self._variables)
159
+ # existing parameters:
160
+ try:
161
+ self._params = {**kwargs, **self._params}
162
+ except (TypeError, ValueError):
163
+ pass
164
+ for arg, val in self._params.items():
165
+ try:
166
+ if arg == "no-worker":
167
+ continue
168
+ if arg == self.StepName:
169
+ values = dict(x.split(":") for x in self._params[arg].split(","))
170
+ for key, value in values.items():
171
+ self._params[key] = value
172
+ object.__setattr__(self, key, value)
173
+ elif arg not in ["program", "TaskPile", "TaskName"]:
174
+ if self.StepName in self._attributes:
175
+ # extracting this properties from Attributes:
176
+ new_args = self._attributes.pop(self.StepName, {})
177
+ self._attributes = {**self._attributes, **new_args}
178
+ self._attrs[arg] = val
179
+ if arg in self._attributes:
180
+ val = self._attributes[arg]
181
+ try:
182
+ setattr(self, arg, val)
183
+ except Exception as err:
184
+ self._logger.warning(f"Wrong Attribute: {arg}={val}")
185
+ self._logger.exception(err)
186
+ except (AttributeError, KeyError) as err:
187
+ self._logger.error(err)
188
+ # attributes: component-based parameters (only for that component):
189
+ for key, val in self._attributes.items():
190
+ # TODO: check Attributes
191
+ if key in self._attributes:
192
+ # i need to override attibute
193
+ current_val = self._attributes[key]
194
+ if isinstance(current_val, dict):
195
+ val = {**current_val, **val}
196
+ elif isinstance(current_val, list):
197
+ current_val.append(val)
198
+ val = current_val
199
+ try:
200
+ object.__setattr__(self, key, val)
201
+ self._attrs[key] = val
202
+ except (ValueError, AttributeError) as err:
203
+ self._logger.error(err)
204
+ # processing the variables:
205
+ if hasattr(self, "vars"):
206
+ for key, val in self._vars.items():
207
+ if key in self.vars:
208
+ self.vars[key] = val
209
+ ### File Storage:
210
+ self._fileStorage = FILE_STORAGES
211
+ # SkipError:
212
+ if self.skipError == "skip":
213
+ self.skipError = SkipErrors.SKIP
214
+ elif self.skipError == "log":
215
+ self.skipError = SkipErrors.LOG
216
+ else:
217
+ self.skipError = SkipErrors.ENFORCE
218
+
219
+ def __str__(self):
220
+ return f"{type(self).__name__}"
221
+
222
+ def __repr__(self):
223
+ return f"<{type(self).__name__}>"
224
+
225
+ def set_filestore(self, store):
226
+ if not store:
227
+ raise RuntimeError(
228
+ "Unable to detect File Storage."
229
+ )
230
+ self._filestore = store
231
+
232
+ def set_taskstore(self, store):
233
+ self._taskstore = store
234
+
235
+ def SetPile(self, pile):
236
+ self._TaskPile = pile
237
+
238
+ # Abstract Context Methods:
239
+ async def __aenter__(self):
240
+ if not self._started:
241
+ await self.start()
242
+ return self
243
+
244
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
245
+ try:
246
+ await self.close()
247
+ except Exception as exc:
248
+ self._logger.warning(
249
+ f"Error Closing Component: {exc!s}"
250
+ )
251
+ return self
252
+
253
+ @abstractmethod
254
+ async def start(self, **kwargs):
255
+ """
256
+ start.
257
+
258
+ Initialize (if needed) a task
259
+ """
260
+
261
+ @abstractmethod
262
+ async def run(self):
263
+ """
264
+ run.
265
+
266
+ Run operations declared inside Component.
267
+ """
268
+
269
+ @abstractmethod
270
+ async def close(self):
271
+ """
272
+ close.
273
+
274
+ Close (if needed) component requirements.
275
+ """
276
+
277
+ def ComponentName(self):
278
+ return self.__name__
279
+
280
+ def user_params(self):
281
+ return self._params
282
+
283
+ @property
284
+ def variables(self):
285
+ return self._variables
286
+
287
+ @variables.setter
288
+ def variables(self, value):
289
+ self._variables = value
290
+
291
+ def setVar(self, name, value):
292
+ self._variables[name] = value
293
+
294
+ def setTaskVar(self, name: str, value: Any):
295
+ name = f"{self.StepName}_{name}"
296
+ self._variables[name] = value
297
+
298
+ def set_attributes(self, name: str = "pattern"):
299
+ if hasattr(self, name):
300
+ obj = getattr(self, name)
301
+ for field, val in obj.items():
302
+ if field in self._params:
303
+ # already calculated:
304
+ self._attrs[field] = self._params[field]
305
+ setattr(self, field, self._params[field])
306
+ elif field in self._attributes:
307
+ self._attrs[field] = self._attributes[field]
308
+ setattr(self, field, self._attributes[field])
309
+ elif field in self._parameters:
310
+ self._attrs[field] = self._parameters[field]
311
+ setattr(self, field, self._parameters[field])
312
+ elif field in self._variables:
313
+ self._attrs[field] = self._variables[field]
314
+ setattr(self, field, self._variables[field])
315
+ else:
316
+ value = self.getFunc(val)
317
+ self._attrs[field] = value
318
+ setattr(self, field, value)
319
+ del self._attrs["pattern"]
320
+
321
+ def get_obj(self, name, parent):
322
+ try:
323
+ if not parent:
324
+ return getattr(self, name)
325
+ else:
326
+ return parent[name]
327
+ except AttributeError:
328
+ return False
329
+
330
+ def get_pattern(self, obj):
331
+ try:
332
+ pattern = obj["pattern"]
333
+ # del obj['pattern']
334
+ return pattern, obj
335
+ except Exception:
336
+ return None, obj
337
+
338
+ def process_pattern(self, name: str = "file", parent=None):
339
+ if not (obj := self.get_obj(name, parent)):
340
+ return False
341
+ # pattern has the form {file, value}:
342
+ if not isinstance(obj, dict):
343
+ return obj
344
+
345
+ # first, I need the pattern object:
346
+ pattern, obj = self.get_pattern(obj)
347
+ if pattern is None:
348
+ return obj
349
+
350
+ # processing the rest of variables:
351
+ if self._vars and f"{name}.pattern" in self._vars:
352
+ pattern = self._vars[f"{name}.pattern"]
353
+ elif self._variables and "pattern" in self._variables:
354
+ pattern = self._variables["pattern"]
355
+ elif "value" in self._variables:
356
+ pattern = pattern.format_map(SafeDict(value=self._variables["value"]))
357
+ if self._vars and f"{name}.value" in self._vars:
358
+ result = self._vars[f"{name}.value"]
359
+ return pattern.format_map(SafeDict(value=result))
360
+ elif "value" in obj:
361
+ # simple replacement:
362
+ result = self.getFunc(obj["value"])
363
+ return pattern.format_map(SafeDict(value=result))
364
+ elif "values" in obj:
365
+ variables = {}
366
+ result = obj["values"]
367
+ for key, val in result.items():
368
+ variables[key] = self.getFunc(val)
369
+ return pattern.format_map(SafeDict(**variables))
370
+ else:
371
+ # multi-value replacement
372
+ variables = {}
373
+ if self._variables:
374
+ pattern = pattern.format_map(SafeDict(**self._variables))
375
+ for key, val in obj.items():
376
+ if key in self._variables:
377
+ variables[key] = self._variables[key]
378
+ else:
379
+ variables[key] = self.getFunc(val)
380
+ # Return the entire object with the formatted pattern
381
+ return pattern.format_map(SafeDict(**variables))
382
+
383
+ def process_mask(self, name):
384
+ if hasattr(self, name):
385
+ obj = getattr(self, name)
386
+ for key, value in obj.items():
387
+ if key in self._vars:
388
+ obj[key] = self._vars[key]
389
+ elif self._vars and f"{name}.{key}" in self._vars:
390
+ obj[key] = self._vars[f"{name}.{key}"]
391
+ elif key in self._variables:
392
+ obj[key] = self._variables[key]
393
+ else:
394
+ # processing mask
395
+ for mask, replace in self._mask.items():
396
+ if mask in value:
397
+ obj[key] = value.replace(mask, str(replace))
398
+ return obj
399
+ else:
400
+ return {}
401
+
402
+ def var_replacement(self, obj: dict):
403
+ """var_replacement.
404
+
405
+ Replacing occurrences of Variables into an String.
406
+ Args:
407
+ obj (Any): Any kind of object.
408
+
409
+ Returns:
410
+ Any: Object with replaced variables.
411
+ """
412
+ if not isinstance(obj, dict):
413
+ return obj
414
+ for var, replace in obj.items():
415
+ if var in self._mask:
416
+ value = self._mask[var]
417
+ else:
418
+ if isinstance(replace, str):
419
+ value = replace.format_map(SafeDict(**self._variables))
420
+ elif var in self._variables:
421
+ value = self._variables[var]
422
+ else:
423
+ value = replace
424
+ if isinstance(obj, PurePath):
425
+ value = Path(value).resolve()
426
+ obj[var] = value
427
+ return obj
428
+
429
+ def set_variables(self, obj):
430
+ return obj.format_map(SafeDict(**self._variables))
431
+
432
+ def set_conditions(self, name: str = "conditions"):
433
+ if hasattr(self, name):
434
+ obj = getattr(self, name)
435
+ for condition, val in obj.items():
436
+ self._logger.notice(
437
+ f":: Condition : {condition} = {val}"
438
+ )
439
+ if hasattr(self, condition):
440
+ obj[condition] = getattr(self, condition)
441
+ elif is_constant(val):
442
+ obj[condition] = get_constant(val)
443
+ elif is_function(val):
444
+ obj[condition] = get_func_value(val)
445
+ if condition in self._variables:
446
+ obj[condition] = self._variables[condition]
447
+ elif condition in self._mask:
448
+ obj[condition] = self._mask[condition]
449
+ elif condition in self.conditions:
450
+ obj[condition] = val
451
+ if "pattern" in obj:
452
+ pattern = obj["pattern"]
453
+ del obj["pattern"]
454
+ # getting conditions as patterns
455
+ for field in pattern:
456
+ if field in obj:
457
+ # already settled
458
+ continue
459
+ if field in self._params:
460
+ obj[field] = self._params[field]
461
+ else:
462
+ result = None
463
+ val = pattern[field]
464
+ if is_constant(val):
465
+ result = get_constant(val)
466
+ else:
467
+ result = self.getFunc(val)
468
+ obj[field] = result
469
+
470
+ def conditions_replacement(self, obj: str):
471
+ """conditions_replacement.
472
+
473
+ Replacing occurrences of Conditions into an String.
474
+ Args:
475
+ obj (Any): Any kind of object.
476
+
477
+ Returns:
478
+ Any: Object with replaced conditions.
479
+ """
480
+ try:
481
+ return obj.format_map(SafeDict(**self.conditions))
482
+ except (KeyError, ValueError) as err:
483
+ self._logger.error(f"Error in conditions_replacement: {err}")
484
+ return obj
485
+ except Exception as err:
486
+ self._logger.error(f"Error in conditions_replacement: {err}")
487
+ return obj
488
+
489
+ def get_filename(self):
490
+ """
491
+ get_filename.
492
+ Detect if File exists.
493
+ """
494
+ if not self.filename: # pylint: disable=E0203
495
+ if hasattr(self, "file") and self.file:
496
+ file = self.get_filepattern()
497
+ if filelist := glob.glob(os.path.join(self.directory, file)):
498
+ self.filename = filelist[0]
499
+ self._variables["__FILEPATH__"] = self.filename
500
+ self._variables["__FILENAME__"] = os.path.basename(self.filename)
501
+ else:
502
+ raise FileNotFound(f"File is empty or doesn't exists: {file}")
503
+ elif self.previous:
504
+ filenames = list(self.input.keys())
505
+ if filenames:
506
+ try:
507
+ self.filename = filenames[0]
508
+ self._variables["__FILEPATH__"] = self.filename
509
+ self._variables["__FILENAME__"] = os.path.basename(
510
+ self.filename
511
+ )
512
+ except IndexError as e:
513
+ raise FileNotFound(
514
+ f"({__name__}): File is empty or doesn't exists"
515
+ ) from e
516
+ else:
517
+ raise FileNotFound(f"({__name__}): File is empty or doesn't exists")
518
+ else:
519
+ return self.filename
520
+
521
+ def _print_data_(self, df, title: str = None) -> None:
522
+ if not title:
523
+ title = self.__class__.__name__
524
+ print(f"::: Printing {title} === ")
525
+ print("Data: ", df)
526
+ if df.empty:
527
+ print("The DataFrame is empty.")
528
+ else:
529
+ for column, t in df.dtypes.items():
530
+ print(f"{column} -> {t} -> {df[column].iloc[0]}")