flowtask 5.8.4__cp39-cp39-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-39-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-39-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-39-x86_64-linux-gnu.so +0 -0
  377. flowtask/parsers/json.c +11968 -0
  378. flowtask/parsers/json.cpython-39-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-39-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-39-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-39-x86_64-linux-gnu.so +0 -0
  440. flowtask/utils/json.cpp +13349 -0
  441. flowtask/utils/json.cpython-39-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-39-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,650 @@
1
+ from collections.abc import Callable
2
+ import asyncio
3
+ from typing import Optional, Dict, Any, Literal
4
+ import pandas as pd
5
+ import json
6
+ from urllib.parse import urlencode
7
+ from ..exceptions import ComponentError, DataNotFound, NotSupported
8
+ from ..interfaces.http import HTTPService
9
+ from .flow import FlowComponent
10
+ from ..conf import LEADIQ_API_KEY
11
+
12
+
13
+ class LeadIQ(FlowComponent, HTTPService):
14
+ """
15
+ LeadIQ API Component
16
+
17
+ Overview:
18
+
19
+ This component interacts with the LeadIQ GraphQL API to retrieve company and employee information.
20
+ Supports different types of searches through the 'type' parameter.
21
+
22
+ .. table:: Properties
23
+ :widths: auto
24
+
25
+ +-----------------------+----------+------------------------------------------------------------------------------------------------------+
26
+ | Name | Required | Description |
27
+ +-----------------------+----------+------------------------------------------------------------------------------------------------------+
28
+ | type | Yes | Type of search to perform: 'company', 'employees' or 'flat' |
29
+ +-----------------------+----------+------------------------------------------------------------------------------------------------------+
30
+ | column | No | Name of the column containing company names (default: 'company_name') |
31
+ +-----------------------+----------+------------------------------------------------------------------------------------------------------+
32
+ | companies | No | List of company names to search (alternative to using DataFrame input) |
33
+ +-----------------------+----------+------------------------------------------------------------------------------------------------------+
34
+
35
+ Returns:
36
+ DataFrame containing the requested information based on the search type
37
+ """ # noqa: E501
38
+
39
+ accept = "application/json"
40
+ base_url = "https://api.leadiq.com"
41
+ download = None
42
+
43
+ # GraphQL Queries
44
+ COMPANY_SEARCH_QUERY = """
45
+ query SearchCompany($input: SearchCompanyInput!) {
46
+ searchCompany(input: $input) {
47
+ totalResults
48
+ hasMore
49
+ results {
50
+ source
51
+ name
52
+ alternativeNames
53
+ domain
54
+ description
55
+ emailDomains
56
+ type
57
+ phones
58
+ country
59
+ address
60
+ locationInfo {
61
+ formattedAddress
62
+ street1
63
+ street2
64
+ city
65
+ areaLevel1
66
+ country
67
+ postalCode
68
+ }
69
+ logoUrl
70
+ linkedinId
71
+ linkedinUrl
72
+ numberOfEmployees
73
+ industry
74
+ specialities
75
+ fundingInfo {
76
+ fundingRounds
77
+ fundingTotalUsd
78
+ lastFundingOn
79
+ lastFundingType
80
+ lastFundingUsd
81
+ }
82
+ technologies {
83
+ name
84
+ category
85
+ parentCategory
86
+ }
87
+ revenue
88
+ revenueRange {
89
+ start
90
+ end
91
+ description
92
+ }
93
+ sicCode {
94
+ code
95
+ description
96
+ }
97
+ naicsCode {
98
+ code
99
+ description
100
+ }
101
+ employeeRange
102
+ foundedYear
103
+ }
104
+ }
105
+ }
106
+ """
107
+
108
+ EMPLOYEE_SEARCH_QUERY = """
109
+ query GroupedAdvancedSearch($input: GroupedSearchInput!) {
110
+ groupedAdvancedSearch(input: $input) {
111
+ totalCompanies
112
+ companies {
113
+ company {
114
+ id
115
+ name
116
+ industry
117
+ companyDescription: description
118
+ linkedinId
119
+ domain
120
+ employeeCount
121
+ city
122
+ country
123
+ state
124
+ postalCode
125
+ score
126
+ companyTechnologies
127
+ companyTechnologyCategories
128
+ revenueRange {
129
+ ...RevenueRangeFragment
130
+ }
131
+ fundingInfo {
132
+ ...FundingInfoFragment
133
+ }
134
+ naicsCode {
135
+ ...NAICSCodeFragment
136
+ }
137
+ }
138
+ people {
139
+ id
140
+ companyId
141
+ name
142
+ linkedinId
143
+ linkedinUrl
144
+ title
145
+ role
146
+ state
147
+ country
148
+ seniority
149
+ workEmails
150
+ verifiedWorkEmails
151
+ verifiedLikelyWorkEmails
152
+ workPhones
153
+ personalEmails
154
+ personalPhones
155
+ score
156
+ firstName
157
+ middleName
158
+ lastName
159
+ updatedAt
160
+ currentPositionStartDate
161
+ company {
162
+ id
163
+ name
164
+ industry
165
+ companyDescription: description
166
+ linkedinId
167
+ domain
168
+ employeeCount
169
+ city
170
+ country
171
+ state
172
+ postalCode
173
+ score
174
+ companyTechnologies
175
+ companyTechnologyCategories
176
+ revenueRange {
177
+ ...RevenueRangeFragment
178
+ }
179
+ fundingInfo {
180
+ ...FundingInfoFragment
181
+ }
182
+ naicsCode {
183
+ ...NAICSCodeFragment
184
+ }
185
+ }
186
+ picture
187
+ }
188
+ totalContactsInCompany
189
+ }
190
+ }
191
+ }
192
+
193
+ fragment RevenueRangeFragment on RevenueRange {
194
+ start
195
+ end
196
+ description
197
+ }
198
+
199
+ fragment FundingInfoFragment on FundingInfo {
200
+ fundingRounds
201
+ fundingTotalUsd
202
+ lastFundingOn
203
+ lastFundingType
204
+ lastFundingUsd
205
+ }
206
+
207
+ fragment NAICSCodeFragment on NAICSCode {
208
+ code
209
+ naicsDescription: description
210
+ }
211
+ """
212
+
213
+ FLAT_SEARCH_QUERY = """
214
+ query FlatAdvancedSearch($input: FlatSearchInput!) {
215
+ flatAdvancedSearch(input: $input) {
216
+ totalPeople
217
+ people {
218
+ id
219
+ companyId
220
+ name
221
+ linkedinId
222
+ linkedinUrl
223
+ title
224
+ role
225
+ state
226
+ country
227
+ seniority
228
+ workEmails
229
+ verifiedWorkEmails
230
+ verifiedLikelyWorkEmails
231
+ workPhones
232
+ personalEmails
233
+ personalPhones
234
+ score
235
+ firstName
236
+ middleName
237
+ lastName
238
+ updatedAt
239
+ currentPositionStartDate
240
+ company {
241
+ id
242
+ name
243
+ industry
244
+ companyDescription: description
245
+ linkedinId
246
+ domain
247
+ employeeCount
248
+ city
249
+ country
250
+ state
251
+ postalCode
252
+ score
253
+ companyTechnologies
254
+ companyTechnologyCategories
255
+ revenueRange {
256
+ ...RevenueRangeFragment
257
+ }
258
+ fundingInfo {
259
+ ...FundingInfoFragment
260
+ }
261
+ naicsCode {
262
+ ...NAICSCodeFragment
263
+ }
264
+ }
265
+ picture
266
+ }
267
+ }
268
+ }
269
+
270
+ fragment RevenueRangeFragment on RevenueRange {
271
+ start
272
+ end
273
+ description
274
+ }
275
+
276
+ fragment FundingInfoFragment on FundingInfo {
277
+ fundingRounds
278
+ fundingTotalUsd
279
+ lastFundingOn
280
+ lastFundingType
281
+ lastFundingUsd
282
+ }
283
+
284
+ fragment NAICSCodeFragment on NAICSCode {
285
+ code
286
+ naicsDescription: description
287
+ }
288
+ """
289
+
290
+ def __init__(
291
+ self,
292
+ loop: asyncio.AbstractEventLoop = None,
293
+ job: Callable = None,
294
+ stat: Callable = None,
295
+ **kwargs
296
+ ):
297
+ self.column = kwargs.get('column', 'company_name')
298
+ self.companies = kwargs.get('companies', [])
299
+ self.search_type = kwargs.get('type', 'company')
300
+ self._counter = 0
301
+ self._debug = kwargs.get('debug', False)
302
+ super().__init__(loop=loop, job=job, stat=stat, **kwargs)
303
+
304
+ def get_leadiq_url(self, resource: str, args: dict = None) -> str:
305
+ """Construct LeadIQ API URL with optional query parameters."""
306
+ url = f"{self.base_url}/{resource}"
307
+ if args:
308
+ query = urlencode(args)
309
+ url = f"{url}?{query}"
310
+ return url
311
+
312
+ async def start(self, **kwargs):
313
+ """Initialize the component and validate inputs."""
314
+ if not LEADIQ_API_KEY:
315
+ raise ComponentError("LEADIQ_API_KEY not configured")
316
+
317
+ if self.search_type not in ['company', 'employees', 'flat']:
318
+ raise NotSupported(f"Search type '{self.search_type}' not supported")
319
+
320
+ # Set up headers with API key
321
+ self.headers = {
322
+ 'Authorization': f'Basic {LEADIQ_API_KEY}',
323
+ 'Content-Type': 'application/json',
324
+ 'apollo-require-preflight': 'true'
325
+ }
326
+
327
+ # Get company names from either input DataFrame or companies parameter
328
+ if self.previous:
329
+ self.data = self.input # Aquí está el cambio clave
330
+
331
+ if hasattr(self, 'data'):
332
+ if self.column not in self.data.columns:
333
+ raise ComponentError(f"Input DataFrame must contain a '{self.column}' column")
334
+ self.companies = self.data[self.column].unique().tolist()
335
+ elif not self.companies:
336
+ raise ComponentError("No company names provided")
337
+
338
+ return True
339
+
340
+ async def search_company(self, company_name: str) -> Optional[Dict[str, Any]]:
341
+ """Basic company search."""
342
+ try:
343
+ variables = {
344
+ "input": {
345
+ "name": company_name
346
+ }
347
+ }
348
+
349
+ payload = {
350
+ "query": self.COMPANY_SEARCH_QUERY,
351
+ "variables": variables
352
+ }
353
+
354
+ result = await self._execute_query(payload, company_name)
355
+
356
+ # Añadir logs detallados
357
+ if result and "data" in result:
358
+ if "searchCompany" in result["data"]:
359
+ search_data = result["data"]["searchCompany"]
360
+
361
+ if search_data.get('results'):
362
+ self._logger.info(f"First result name: {search_data['results'][0].get('name')}")
363
+
364
+ # Procesar el resultado usando _process_company_response
365
+ processed = self._process_response(result, company_name)
366
+ return processed
367
+
368
+ except Exception as e:
369
+ self._logger.error(f"Error in company search for {company_name}: {str(e)}")
370
+ return None
371
+
372
+ async def search_employees(self, company_name: str) -> Optional[Dict[str, Any]]:
373
+ """Search for employees at a company."""
374
+ try:
375
+ variables = {
376
+ "input": {
377
+ "companyFilter": {
378
+ "names": company_name
379
+ },
380
+ "limit": 100
381
+ }
382
+ }
383
+
384
+ payload = {
385
+ "query": self.EMPLOYEE_SEARCH_QUERY,
386
+ "variables": variables
387
+ }
388
+
389
+ result = await self._execute_query(payload, company_name)
390
+
391
+ return self._process_response(result, company_name)
392
+
393
+ except Exception as e:
394
+ self._logger.error(f"Error in employee search for {company_name}: {str(e)}")
395
+ return None
396
+
397
+ async def search_flat(self, company_name: str) -> Optional[Dict[str, Any]]:
398
+ """Flat search for employees at a company."""
399
+ try:
400
+ variables = {
401
+ "input": {
402
+ "companyFilter": {
403
+ "names": company_name
404
+ },
405
+ "limit": 100
406
+ }
407
+ }
408
+
409
+ payload = {
410
+ "query": self.FLAT_SEARCH_QUERY,
411
+ "variables": variables
412
+ }
413
+
414
+ result = await self._execute_query(payload, company_name)
415
+
416
+ return self._process_response(result, company_name)
417
+
418
+ except Exception as e:
419
+ self._logger.error(f"Error in flat search for {company_name}: {str(e)}")
420
+ return None
421
+
422
+ async def _execute_query(self, payload: dict, company_name: str) -> Optional[Dict[str, Any]]:
423
+ """Execute GraphQL query and process response."""
424
+ self._logger.info(f"Searching for {self.search_type} in company: {company_name}")
425
+
426
+ url = self.get_leadiq_url("graphql")
427
+ args = {
428
+ "method": "post",
429
+ "url": url,
430
+ "data": json.dumps(payload),
431
+ "headers": self.headers
432
+ }
433
+
434
+ result, error = await self.session(**args)
435
+
436
+ if error:
437
+ self._logger.error(f"Error searching for {company_name}: {error}")
438
+ return None
439
+
440
+ # Solo retornar el resultado, no procesarlo aquí
441
+ return result # Quitar el _process_response
442
+
443
+ def _process_response(self, result: dict, company_name: str) -> Optional[Dict[str, Any]]:
444
+ """Process API response based on search type."""
445
+ if self.search_type == 'company':
446
+ return self._process_company_response(result, company_name)
447
+ elif self.search_type == 'flat':
448
+ return self._process_flat_response(result, company_name)
449
+ else:
450
+ return self._process_employee_response(result, company_name)
451
+
452
+ def _process_company_response(self, result: dict, company_name: str) -> Optional[Dict[str, Any]]:
453
+ """Process company search response."""
454
+ if "data" in result and "searchCompany" in result["data"]:
455
+ search_data = result["data"]["searchCompany"]
456
+
457
+ if search_data["results"]:
458
+ company_data = search_data["results"][0] # Tomamos el primer resultado
459
+
460
+ # Crear un diccionario con los datos procesados
461
+ processed_data = {
462
+ "search_term": company_name, # Término de búsqueda original
463
+ "found": True,
464
+ "total_results": search_data["totalResults"],
465
+ "name": company_data["name"],
466
+ "domain": company_data["domain"],
467
+ "industry": company_data["industry"],
468
+ "country": company_data["country"],
469
+ "address": company_data["address"],
470
+ "linkedin_id": company_data["linkedinId"],
471
+ "linkedin_url": company_data["linkedinUrl"],
472
+ "employee_count": company_data["numberOfEmployees"],
473
+ "employee_range": company_data["employeeRange"],
474
+ "founded_year": company_data["foundedYear"],
475
+ }
476
+
477
+ # Procesar locationInfo
478
+ if loc := company_data.get("locationInfo"):
479
+ processed_data.update({
480
+ "street": loc.get("street1"),
481
+ "city": loc.get("city"),
482
+ "state": loc.get("areaLevel1"),
483
+ "postal_code": loc.get("postalCode")
484
+ })
485
+
486
+ # Procesar NAICS
487
+ if naics := company_data.get("naicsCode"):
488
+ processed_data.update({
489
+ "naics_code": naics["code"],
490
+ "naics_description": naics["description"]
491
+ })
492
+
493
+ # Procesar technologies como listas
494
+ if techs := company_data.get("technologies"):
495
+ tech_names = []
496
+ tech_categories = []
497
+ for tech in techs:
498
+ if tech.get("name"):
499
+ tech_names.append(tech["name"])
500
+ if tech.get("category"):
501
+ tech_categories.append(tech["category"])
502
+
503
+ processed_data.update({
504
+ "technologies": tech_names,
505
+ "tech_categories": list(set(tech_categories)) # Eliminar duplicados
506
+ })
507
+
508
+ # Procesar specialities si existe
509
+ if specs := company_data.get("specialities"):
510
+ processed_data["specialities"] = specs
511
+
512
+ self._counter += 1
513
+ return processed_data
514
+ else:
515
+ # Si no se encontraron resultados
516
+ return {
517
+ "search_term": company_name,
518
+ "found": False,
519
+ "total_results": 0
520
+ }
521
+
522
+ self._logger.warning(f"Unexpected response structure for {company_name}")
523
+ return None
524
+
525
+ def _process_employee_response(self, result: dict, company_name: str) -> Optional[Dict[str, Any]]:
526
+ """Process employee search response."""
527
+ if "data" in result and "groupedAdvancedSearch" in result["data"]:
528
+ search_data = result["data"]["groupedAdvancedSearch"]
529
+
530
+ if search_data["companies"]:
531
+ company_data = search_data["companies"][0]
532
+ company_info = company_data["company"]
533
+ employees = company_data["people"]
534
+
535
+ # Extraer solo la información básica de la empresa
536
+ basic_company_info = {
537
+ "company_id": company_info["id"],
538
+ "company_name": company_info["name"],
539
+ "company_industry": company_info["industry"],
540
+ "company_domain": company_info["domain"],
541
+ "company_employee_count": company_info["employeeCount"],
542
+ "company_city": company_info["city"],
543
+ "company_country": company_info["country"],
544
+ "company_state": company_info["state"]
545
+ }
546
+
547
+ # Crear una fila por cada empleado
548
+ processed_rows = []
549
+ for employee in employees:
550
+ # Remover la información duplicada de la empresa del empleado
551
+ employee_copy = employee.copy()
552
+ employee_copy.pop('company', None) # Eliminar la información duplicada de la empresa
553
+
554
+ # Combinar información básica de la empresa con datos del empleado
555
+ row = {
556
+ **basic_company_info,
557
+ **employee_copy
558
+ }
559
+ processed_rows.append(row)
560
+
561
+ self._counter += len(processed_rows)
562
+ return processed_rows
563
+
564
+ self._logger.warning(f"No company data found for {company_name}")
565
+ else:
566
+ self._logger.warning(f"Unexpected response structure for {company_name}")
567
+
568
+ return None
569
+
570
+ def _process_flat_response(self, result: dict, company_name: str) -> Optional[Dict[str, Any]]:
571
+ """Process flat search response."""
572
+ if "data" in result and "flatAdvancedSearch" in result["data"]:
573
+ search_data = result["data"]["flatAdvancedSearch"]
574
+
575
+ if search_data["people"]:
576
+ processed_rows = []
577
+ for person in search_data["people"]:
578
+ # Extraer información básica de la empresa
579
+ company_info = person.pop('company', {})
580
+ basic_company_info = {
581
+ "company_id": company_info.get("id"),
582
+ "company_name": company_info.get("name"),
583
+ "company_industry": company_info.get("industry"),
584
+ "company_domain": company_info.get("domain"),
585
+ "company_employee_count": company_info.get("employeeCount"),
586
+ "company_city": company_info.get("city"),
587
+ "company_country": company_info.get("country"),
588
+ "company_state": company_info.get("state")
589
+ }
590
+
591
+ # Combinar información de la empresa con datos del empleado
592
+ row = {
593
+ **basic_company_info,
594
+ **person
595
+ }
596
+ processed_rows.append(row)
597
+
598
+ self._counter += len(processed_rows)
599
+ return processed_rows
600
+
601
+ self._logger.warning(f"No people found for {company_name}")
602
+ else:
603
+ self._logger.warning(f"Unexpected response structure for {company_name}")
604
+
605
+ return None
606
+
607
+ async def run(self):
608
+ """Execute searches based on the specified type."""
609
+ # search_method = getattr(self, f"search_{self.search_type}", None)
610
+ search_method = {
611
+ 'company': self.search_company,
612
+ 'employees': self.search_employees,
613
+ 'flat': self.search_flat
614
+ }[self.search_type]
615
+
616
+ tasks = [search_method(company) for company in self.companies]
617
+ results = await asyncio.gather(*tasks)
618
+
619
+ # Filter out None results and flatten the list for employee/flat searches
620
+ if self.search_type in ['employees', 'flat']:
621
+ valid_results = [
622
+ row
623
+ for result in results
624
+ if result is not None
625
+ for row in result
626
+ ]
627
+ else:
628
+ valid_results = [r for r in results if r is not None]
629
+
630
+ if not valid_results:
631
+ raise DataNotFound(f"No {self.search_type} data found")
632
+
633
+ # Convert to DataFrame
634
+ df = pd.DataFrame(valid_results)
635
+
636
+ # Add metrics
637
+ self.add_metric(f"{self.search_type.upper()}_FOUND", self._counter)
638
+
639
+ if self._debug:
640
+ print(df)
641
+ print("::: Printing Column Information === ")
642
+ for column, t in df.dtypes.items():
643
+ print(column, "->", t, "->", df[column].iloc[0])
644
+
645
+ self._result = df
646
+ return self._result
647
+
648
+ async def close(self):
649
+ """Clean up resources."""
650
+ return True