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,525 @@
1
+ import os
2
+ from pathlib import Path, PosixPath
3
+ from typing import Optional, Union
4
+ from abc import ABC
5
+ from io import BytesIO
6
+ from zipfile import (
7
+ ZipFile,
8
+ ZIP_DEFLATED,
9
+ ZIP_BZIP2,
10
+ ZIP_LZMA,
11
+ BadZipFile
12
+ )
13
+ import tarfile
14
+ import py7zr
15
+ import rarfile
16
+ import gzip
17
+
18
+ ## TODO: Simplify Interface.
19
+
20
+ class CompressSupport(ABC):
21
+ """
22
+ CompressSupport.
23
+
24
+ Overview:
25
+ This component handles compressing and uncompressing files and folders
26
+ into various formats.
27
+ Supported formats:
28
+ - ZIP (.zip and .jar)
29
+ - TAR (.tar)
30
+ - GZ (.gz)
31
+ - BZIP2 (.bz2)
32
+ - XZ (.xz)
33
+ - 7z (.7z)
34
+ - RAR (.rar)
35
+
36
+ Methods:
37
+ - compress: Compress files/folders into various formats.
38
+ - uncompress: Uncompress files/folders from various formats.
39
+ - zip_file: Compress a single file into a zip file.
40
+ - unzip_file: Uncompress a single file from a zip archive.
41
+ - zip_folder: Compress a folder into a zip file.
42
+ - unzip_folder: Uncompress files from a zip archive to a folder.
43
+
44
+ Parameters:
45
+ - source: Path to the file or folder to be compressed or uncompressed.
46
+ - destination: Path where the compressed/uncompressed file should be saved.
47
+ - remove_source: Boolean to remove the source file/folder after operation.
48
+ """
49
+
50
+ def __init__(self, *args, **kwargs):
51
+ self.source_dir = None
52
+ self.destination_dir = None
53
+ self.remove_source: bool = kwargs.get('remove_source', False)
54
+ try:
55
+ super().__init__(*args, **kwargs)
56
+ except TypeError:
57
+ super().__init__()
58
+
59
+ async def compress(
60
+ self,
61
+ source: str,
62
+ destination: str,
63
+ format: str = 'zip',
64
+ remove_source: bool = False,
65
+ **kwargs
66
+ ):
67
+ """
68
+ Compress the given source into the destination file in the specified format.
69
+ """
70
+ self.source_dir = Path(source).resolve()
71
+ self.destination_dir = Path(destination).resolve()
72
+ self.remove_source = remove_source
73
+
74
+ if format == 'zip':
75
+ await self.compress_zip(
76
+ self.source_dir,
77
+ self.destination_dir,
78
+ remove_source=self.remove_source,
79
+ **kwargs
80
+ )
81
+ elif format == 'tar':
82
+ await self.compress_tar(
83
+ self.source_dir,
84
+ self.destination_dir,
85
+ remove_source=self.remove_source,
86
+ **kwargs
87
+ )
88
+ elif format == '7z':
89
+ await self.compress_7z(
90
+ self.source_dir,
91
+ self.destination_dir,
92
+ remove_source=self.remove_source,
93
+ **kwargs
94
+ )
95
+ elif format == 'rar':
96
+ await self.compress_rar(
97
+ self.source_dir,
98
+ self.destination_dir,
99
+ remove_source=self.remove_source,
100
+ **kwargs
101
+ )
102
+ else:
103
+ raise ValueError(
104
+ f"Unsupported compression format: {format}"
105
+ )
106
+
107
+ async def uncompress(
108
+ self,
109
+ source: str,
110
+ destination: str,
111
+ format: str = 'zip',
112
+ remove_source: bool = False,
113
+ ):
114
+ """
115
+ Uncompress the given source file into the destination folder.
116
+ """
117
+ self.source_dir = Path(source).resolve()
118
+ self.destination_dir = Path(destination).resolve()
119
+
120
+ if format == 'zip':
121
+ await self.uncompress_zip(
122
+ self.source_dir,
123
+ self.destination_dir
124
+ )
125
+ elif format == 'tar':
126
+ await self.uncompress_tar(
127
+ self.source_dir,
128
+ self.destination_dir,
129
+ remove_source=remove_source
130
+ )
131
+ elif format == '7z':
132
+ await self.uncompress_7z(
133
+ self.source_dir,
134
+ self.destination_dir,
135
+ remove_source=remove_source
136
+ )
137
+ elif format == 'rar':
138
+ await self.uncompress_rar(
139
+ self.source_dir,
140
+ self.destination_dir,
141
+ remove_source=remove_source
142
+ )
143
+ else:
144
+ raise ValueError(
145
+ f"Unsupported uncompression format: {format}"
146
+ )
147
+
148
+ async def zip_file(
149
+ self,
150
+ source: str,
151
+ destination: str,
152
+ remove_source: bool = False
153
+ ):
154
+ """
155
+ Compress a single file into a zip file.
156
+ """
157
+ self.source_dir = Path(source).resolve()
158
+ self.destination_dir = Path(destination).resolve()
159
+ self.remove_source = remove_source
160
+ await self.compress_zip()
161
+
162
+ async def unzip_file(
163
+ self,
164
+ source: str,
165
+ destination: str
166
+ ):
167
+ """
168
+ Uncompress a single file from a zip archive.
169
+ """
170
+ self.source_dir = Path(source).resolve()
171
+ self.destination_dir = Path(destination).resolve()
172
+ await self.uncompress_zip()
173
+
174
+ async def zip_folder(
175
+ self,
176
+ source: str,
177
+ destination: str,
178
+ remove_source: bool = False,
179
+ **kwargs
180
+ ):
181
+ """
182
+ Compress a folder into a zip file.
183
+ """
184
+ self.source_dir = Path(source).resolve()
185
+ self.destination_dir = Path(destination).resolve()
186
+ await self.compress_zip(
187
+ source=self.source_dir,
188
+ destination=self.destination_dir,
189
+ remove_source=remove_source,
190
+ **kwargs
191
+ )
192
+
193
+ async def unzip_folder(
194
+ self,
195
+ source: str,
196
+ destination: str,
197
+ remove_source: bool = False
198
+ ):
199
+ """
200
+ Uncompress files from a zip archive into a folder.
201
+ """
202
+ self.source_dir = Path(source).resolve()
203
+ self.destination_dir = Path(destination).resolve()
204
+ await self.uncompress_zip(
205
+ source=self.source_dir,
206
+ destination=self.destination_dir,
207
+ remove_source=remove_source
208
+ )
209
+
210
+ def _remove_source(self, source: PosixPath):
211
+ """Remove the source file or folder after compression, if required."""
212
+ if isinstance(source, str):
213
+ source = Path(source)
214
+ if source.is_dir():
215
+ source.rmdir()
216
+ else:
217
+ source.unlink(missing_ok=True)
218
+
219
+ async def compress_gzip(
220
+ self,
221
+ source: Union[str, PosixPath],
222
+ destination: Union[str, PosixPath],
223
+ extension: str = '.gz',
224
+ remove_source: bool = False
225
+ ) -> str:
226
+ """
227
+ Compress a file or folder into a gzip file.
228
+ If the extension indicates a tarball format
229
+ (e.g., .tar.gz, .tar.bz2, .tar.xz), compress as a tarball;
230
+ otherwise, compress as a simple .gz file.
231
+
232
+ Args:
233
+ source: The file or folder to compress.
234
+ destination: The destination path for the compressed file.
235
+ extension: The desired extension (e.g., .gz, .tar.gz, .tar.bz2, .tar.xz).
236
+ remove_source: Whether to remove the source file/folder after compression.
237
+
238
+ Returns:
239
+ The path of the compressed file.
240
+ """
241
+ if isinstance(destination, str):
242
+ destination = Path(destination).resolve()
243
+ if isinstance(source, str):
244
+ source = Path(source).resolve()
245
+
246
+ # Determine if the extension is for a tarball
247
+ tarball_extensions = {'.tar.gz', '.tar.bz2', '.tar.xz'}
248
+ compressed_file = destination.with_suffix(extension)
249
+
250
+ try:
251
+ if extension in tarball_extensions:
252
+ # Compress the source into a tarball with the appropriate compression
253
+ mode = {
254
+ '.tar.gz': 'w:gz',
255
+ '.tar.bz2': 'w:bz2',
256
+ '.tar.xz': 'w:xz'
257
+ }[extension]
258
+ with tarfile.open(compressed_file, mode) as tarf:
259
+ tarf.add(source, arcname=os.path.basename(source))
260
+ else:
261
+ # Compress a single file using gzip
262
+ if source.is_dir():
263
+ raise ValueError(
264
+ "Cannot compress a directory into a simple .gz file."
265
+ " Use a tarball format for directories."
266
+ )
267
+ with open(source, 'rb') as f_in:
268
+ with gzip.open(compressed_file, 'wb') as f_out:
269
+ f_out.writelines(f_in)
270
+
271
+ if remove_source:
272
+ self._remove_source(source)
273
+
274
+ return str(compressed_file)
275
+
276
+ except Exception as err:
277
+ raise RuntimeError(
278
+ f"Gzip compression failed: {err}"
279
+ )
280
+
281
+ async def compress_zip(
282
+ self,
283
+ source: Union[str, PosixPath],
284
+ destination: Union[str, PosixPath],
285
+ compress_type: int = ZIP_DEFLATED,
286
+ compress_level: int = 9,
287
+ remove_source: bool = False
288
+ ):
289
+ """Compress files/folders into a zip archive."""
290
+ if isinstance(destination, str):
291
+ destination = Path(destination).resolve()
292
+ if isinstance(source, str):
293
+ source = Path(source).resolve()
294
+ with ZipFile(destination, 'w', compress_type) as zipf:
295
+ if source.is_dir():
296
+ for root, dirs, files in os.walk(str(source)):
297
+ for file in files:
298
+ zipf.write(
299
+ os.path.join(root, file),
300
+ os.path.relpath(os.path.join(root, file), source),
301
+ compress_type=compress_type,
302
+ compresslevel=compress_level
303
+ )
304
+ else:
305
+ zipf.write(
306
+ source,
307
+ arcname=source.name,
308
+ compress_type=compress_type,
309
+ compresslevel=compress_level
310
+ )
311
+ if remove_source is True:
312
+ self._remove_source(source)
313
+
314
+ async def uncompress_zip(
315
+ self,
316
+ source: Union[str, PosixPath],
317
+ destination: Union[str, PosixPath],
318
+ source_files: Optional[list] = None,
319
+ password: Optional[str] = None,
320
+ remove_source: bool = False
321
+ ) -> list:
322
+ """Uncompress files from a zip archive."""
323
+ if isinstance(destination, str):
324
+ destination = Path(destination).resolve()
325
+ if destination.exists() and not destination.is_dir():
326
+ raise ValueError(
327
+ f"Destination path {destination} exists and is not a directory."
328
+ )
329
+ elif not destination.exists():
330
+ destination.mkdir(parents=True, exist_ok=True)
331
+ if isinstance(source, str):
332
+ source = Path(source).resolve()
333
+ with ZipFile(source, 'r') as zipf:
334
+ status = zipf.testzip()
335
+ if status: # Si no hay status
336
+ raise RuntimeError(
337
+ f"Zip File {status} is corrupted"
338
+ )
339
+ try:
340
+ members = source_files if source_files else None
341
+ # Check if a password is provided
342
+ if password:
343
+ # The password should be bytes, so we encode it
344
+ zipf.extractall(
345
+ path=destination,
346
+ members=members,
347
+ pwd=password.encode('utf-8')
348
+ )
349
+ else:
350
+ zipf.extractall(
351
+ path=destination,
352
+ members=members,
353
+ )
354
+ # getting the list of files:
355
+ return source_files if source_files else zipf.namelist()
356
+ except BadZipFile as err:
357
+ # The error raised for bad ZIP files.
358
+ raise RuntimeError(
359
+ f"Bad Zip File: {err}"
360
+ ) from err
361
+ except Exception as err:
362
+ # Undefined error
363
+ raise RuntimeError(
364
+ f"ZIP Error: {err}"
365
+ ) from err
366
+ if remove_source is True:
367
+ self._remove_source(source)
368
+
369
+ async def compress_tar(
370
+ self,
371
+ source: Union[str, PosixPath],
372
+ destination: Union[str, PosixPath],
373
+ compress_type: str = 'w:gz', # You can specify 'w:gz', 'w:bz2', 'w:xz', etc.
374
+ remove_source: bool = False
375
+ ):
376
+ """Compress files/folders into a tar archive."""
377
+ if isinstance(destination, str):
378
+ destination = Path(destination).resolve()
379
+ if isinstance(source, str):
380
+ source = Path(source).resolve()
381
+
382
+ with tarfile.open(destination, compress_type) as tarf:
383
+ tarf.add(source, arcname=os.path.basename(source))
384
+
385
+ if remove_source:
386
+ self._remove_source(source)
387
+
388
+ async def uncompress_tar(
389
+ self,
390
+ source: Union[str, PosixPath],
391
+ destination: Union[str, PosixPath],
392
+ remove_source: bool = False
393
+ ):
394
+ """Uncompress files from a tar archive."""
395
+ if isinstance(destination, str):
396
+ destination = Path(destination).resolve()
397
+
398
+ with tarfile.open(source, 'r') as tarf:
399
+ tarf.extractall(destination)
400
+
401
+ if remove_source:
402
+ self._remove_source(source)
403
+
404
+ async def compress_7z(
405
+ self,
406
+ source: Union[str, PosixPath],
407
+ destination: Union[str, PosixPath],
408
+ remove_source: bool = False
409
+ ):
410
+ """Compress files/folders into a 7z archive."""
411
+ if isinstance(destination, str):
412
+ destination = Path(destination).resolve()
413
+ if isinstance(source, str):
414
+ source = Path(source).resolve()
415
+
416
+ with py7zr.SevenZipFile(destination, 'w') as archive:
417
+ if source.is_dir():
418
+ archive.writeall(source, arcname=os.path.basename(source))
419
+ else:
420
+ archive.write(source, arcname=os.path.basename(source))
421
+
422
+ if remove_source:
423
+ self._remove_source(source)
424
+
425
+ async def uncompress_7z(
426
+ self,
427
+ source: Union[str, PosixPath],
428
+ destination: Union[str, PosixPath],
429
+ remove_source: bool = False
430
+ ):
431
+ """Uncompress files from a 7z archive."""
432
+ if isinstance(destination, str):
433
+ destination = Path(destination).resolve()
434
+
435
+ with py7zr.SevenZipFile(source, 'r') as archive:
436
+ archive.extractall(path=destination)
437
+
438
+ if remove_source:
439
+ self._remove_source(source)
440
+
441
+ async def compress_rar(
442
+ self,
443
+ source: Union[str, PosixPath],
444
+ destination: Union[str, PosixPath],
445
+ remove_source: bool = False,
446
+ **kwargs
447
+ ):
448
+ """Compress files/folders into a rar archive."""
449
+ if isinstance(destination, str):
450
+ destination = Path(destination).resolve()
451
+ if isinstance(source, str):
452
+ source = Path(source).resolve()
453
+
454
+ with rarfile.RarFile(destination, 'w', **kwargs) as rarf:
455
+ if source.is_dir():
456
+ for root, dirs, files in os.walk(str(source)):
457
+ for file in files:
458
+ rarf.write(os.path.join(root, file),
459
+ os.path.relpath(os.path.join(root, file), source))
460
+ else:
461
+ rarf.write(source, arcname=source.name)
462
+
463
+ if remove_source:
464
+ self._remove_source(source)
465
+
466
+ async def uncompress_rar(
467
+ self,
468
+ source: Union[str, PosixPath],
469
+ destination: Union[str, PosixPath],
470
+ remove_source: bool = False
471
+ ):
472
+ """Uncompress files from a rar archive."""
473
+ if isinstance(destination, str):
474
+ destination = Path(destination).resolve()
475
+
476
+ with rarfile.RarFile(source, 'r') as rarf:
477
+ rarf.extractall(path=destination)
478
+
479
+ if remove_source:
480
+ self._remove_source(source)
481
+
482
+ async def uncompress_gzip(
483
+ self,
484
+ source: Union[str, bytes, PosixPath],
485
+ destination: Union[str, PosixPath],
486
+ remove_source: bool = False
487
+ ) -> list:
488
+ """Uncompress a Gzip file or tarball and return the list of uncompressed files."""
489
+ if isinstance(source, (bytes, BytesIO)):
490
+ with gzip.GzipFile(fileobj=source, mode='rb') as gz:
491
+ uncompressed_file = gz.read()
492
+ decompresed_file = BytesIO(uncompressed_file)
493
+ decompresed_file.seek(0)
494
+ return decompresed_file
495
+ if isinstance(destination, str):
496
+ destination = Path(destination).resolve()
497
+ if isinstance(source, str):
498
+ source = Path(source).resolve()
499
+
500
+ uncompressed_files = [] # To keep track of the uncompressed files
501
+
502
+ try:
503
+ # Check if it's a tarball (e.g., .tar.gz, .tar.bz2, .tar.xz)
504
+ if tarfile.is_tarfile(source):
505
+ print('Is a tarfile')
506
+ with tarfile.open(source, "r:*") as tar:
507
+ tar.extractall(path=destination)
508
+ # Get list of uncompressed files from the tarball
509
+ uncompressed_files = [
510
+ destination / member.name for member in tar.getmembers()
511
+ ]
512
+ else:
513
+ # Handle simple .gz files (non-tarball)
514
+ output_file = destination / source.stem # Remove .gz suffix
515
+ with gzip.open(source, 'rb') as gz_f:
516
+ with open(output_file, 'wb') as out_f:
517
+ out_f.write(gz_f.read())
518
+ uncompressed_files.append(output_file)
519
+ if remove_source:
520
+ self._remove_source(source)
521
+ return uncompressed_files
522
+
523
+ except Exception as err:
524
+ print(err)
525
+ raise RuntimeError(f"Gzip extraction failed: {err}")
@@ -0,0 +1,124 @@
1
+ from abc import ABC
2
+ from typing import TypeVar
3
+ from typing_extensions import ParamSpec
4
+ import os
5
+ from navconfig import config
6
+ from ..exceptions import ConfigError
7
+
8
+
9
+ P = ParamSpec("P")
10
+ T = TypeVar("T")
11
+
12
+
13
+ valid_types = {
14
+ "<class 'str'>": str,
15
+ "<class 'int'>": int,
16
+ "<class 'float'>": float,
17
+ "<class 'list'>": list,
18
+ "<class 'tuple'>": tuple,
19
+ "<class 'dict'>": dict
20
+ }
21
+
22
+
23
+ class CredentialsInterface(ABC):
24
+ _credentials: dict = {"username": str, "password": str}
25
+
26
+ def __init__(self, *args, **kwargs) -> None:
27
+ # if credentials:
28
+ self.credentials: dict = kwargs.pop('credentials', None)
29
+ self._no_warnings = kwargs.get("no_warnings", False)
30
+ expected = kwargs.pop("expected_credentials", None)
31
+ if expected:
32
+ self._credentials = expected
33
+ self._environment = config
34
+ try:
35
+ super().__init__(*args, **kwargs)
36
+ except TypeError:
37
+ super().__init__()
38
+ # Interface not started:
39
+ self._started: bool = False
40
+
41
+ def get_env_value(self, key, default: str = None, expected_type: object = None):
42
+ """
43
+ Retrieves a value from the environment variables or the configuration.
44
+
45
+ :param key: The key for the environment variable.
46
+ :param default: The default value to return if the key is not found.
47
+ :return: The value of the environment variable or the default value.
48
+ """
49
+ if key is None:
50
+ return default
51
+ if expected_type is not None:
52
+ try:
53
+ if expected_type in (int, float):
54
+ if val := self._environment.getint(key):
55
+ return val
56
+ else:
57
+ return key
58
+ elif expected_type == bool:
59
+ if val := self._environment.getboolean(key):
60
+ return val
61
+ else:
62
+ return key
63
+ else:
64
+ if val := self._environment.get(key):
65
+ return val
66
+ else:
67
+ return key
68
+ except TypeError:
69
+ pass
70
+ return default
71
+ if val := os.getenv(str(key), default):
72
+ return val
73
+ if val := self._environment.get(key, default):
74
+ return val
75
+ else:
76
+ if hasattr(self, "masks") and hasattr(self, "_mask"):
77
+ if key in self._mask.keys():
78
+ return self._mask[key]
79
+ return key
80
+
81
+ def processing_credentials(self):
82
+ if self.credentials:
83
+ for key, expected_type in self._credentials.items():
84
+ try:
85
+ value = self.credentials.get(key, None)
86
+ default = getattr(self, key, value)
87
+ # print('KEY ', key, 'VAL ', value, 'DEF ', default)
88
+ if type(value) == expected_type or isinstance(value, valid_types[str(expected_type)]): # pylint: disable=E1136 # noqa
89
+ # can process the credentials, extracted from environment or variables:
90
+ val = self.get_env_value(
91
+ value, default=default, expected_type=expected_type
92
+ )
93
+ # print('VAL > ', val, 'DEFAULT > ', default, expected_type)
94
+ self.credentials[key] = val
95
+ # print('KEY: ', key, self.credentials[key])
96
+ elif isinstance(value, str):
97
+ # Use os.getenv to get the value from environment variables
98
+ env_value = self.get_env_value(
99
+ value, default=default, expected_type=expected_type
100
+ )
101
+ self.credentials[key] = env_value
102
+ else:
103
+ self.credentials[key] = default
104
+ except KeyError as exc:
105
+ print(f'Failed credential {key} with value {value}: {exc}')
106
+ continue
107
+ except (TypeError, ValueError) as ex:
108
+ self._logger.error(f"{__name__}: Wrong or missing Credentials")
109
+ raise ConfigError(
110
+ f"{__name__}: Wrong or missing Credentials"
111
+ ) from ex
112
+ except Exception as ex:
113
+ self._logger.exception(
114
+ f"Error Processing Credentials: {ex}"
115
+ )
116
+ raise ConfigError(
117
+ f"Error Processing Credentials: {ex}"
118
+ ) from ex
119
+ if self.credentials is None:
120
+ if self._no_warnings is False:
121
+ self._logger.warning(
122
+ "No credentials where Found."
123
+ )
124
+ self.credentials = {}