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.
- flowtask/__init__.py +93 -0
- flowtask/__main__.py +38 -0
- flowtask/bots/__init__.py +6 -0
- flowtask/bots/check.py +93 -0
- flowtask/bots/codebot.py +51 -0
- flowtask/components/ASPX.py +148 -0
- flowtask/components/AddDataset.py +352 -0
- flowtask/components/Amazon.py +523 -0
- flowtask/components/AutoTask.py +314 -0
- flowtask/components/Azure.py +80 -0
- flowtask/components/AzureUsers.py +106 -0
- flowtask/components/BaseAction.py +91 -0
- flowtask/components/BaseLoop.py +198 -0
- flowtask/components/BestBuy.py +800 -0
- flowtask/components/CSVToGCS.py +120 -0
- flowtask/components/CompanyScraper/__init__.py +1 -0
- flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
- flowtask/components/CompanyScraper/parsers/base.py +102 -0
- flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
- flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
- flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
- flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
- flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
- flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
- flowtask/components/CompanyScraper/scrapper.py +1054 -0
- flowtask/components/CopyTo.py +177 -0
- flowtask/components/CopyToBigQuery.py +243 -0
- flowtask/components/CopyToMongoDB.py +291 -0
- flowtask/components/CopyToPg.py +609 -0
- flowtask/components/CopyToRethink.py +207 -0
- flowtask/components/CreateGCSBucket.py +102 -0
- flowtask/components/CreateReport/CreateReport.py +228 -0
- flowtask/components/CreateReport/__init__.py +9 -0
- flowtask/components/CreateReport/charts/__init__.py +15 -0
- flowtask/components/CreateReport/charts/bar.py +51 -0
- flowtask/components/CreateReport/charts/base.py +66 -0
- flowtask/components/CreateReport/charts/pie.py +64 -0
- flowtask/components/CreateReport/utils.py +9 -0
- flowtask/components/CustomerSatisfaction.py +196 -0
- flowtask/components/DataInput.py +200 -0
- flowtask/components/DateList.py +255 -0
- flowtask/components/DbClient.py +163 -0
- flowtask/components/DialPad.py +146 -0
- flowtask/components/DocumentDBQuery.py +200 -0
- flowtask/components/DownloadFrom.py +371 -0
- flowtask/components/DownloadFromD2L.py +113 -0
- flowtask/components/DownloadFromFTP.py +181 -0
- flowtask/components/DownloadFromIMAP.py +315 -0
- flowtask/components/DownloadFromS3.py +198 -0
- flowtask/components/DownloadFromSFTP.py +265 -0
- flowtask/components/DownloadFromSharepoint.py +110 -0
- flowtask/components/DownloadFromSmartSheet.py +114 -0
- flowtask/components/DownloadS3File.py +229 -0
- flowtask/components/Dummy.py +59 -0
- flowtask/components/DuplicatePhoto.py +411 -0
- flowtask/components/EmployeeEvaluation.py +237 -0
- flowtask/components/ExecuteSQL.py +323 -0
- flowtask/components/ExtractHTML.py +178 -0
- flowtask/components/FileBase.py +178 -0
- flowtask/components/FileCopy.py +181 -0
- flowtask/components/FileDelete.py +82 -0
- flowtask/components/FileExists.py +146 -0
- flowtask/components/FileIteratorDelete.py +112 -0
- flowtask/components/FileList.py +194 -0
- flowtask/components/FileOpen.py +75 -0
- flowtask/components/FileRead.py +120 -0
- flowtask/components/FileRename.py +106 -0
- flowtask/components/FilterIf.py +284 -0
- flowtask/components/FilterRows/FilterRows.py +200 -0
- flowtask/components/FilterRows/__init__.py +10 -0
- flowtask/components/FilterRows/functions.py +4 -0
- flowtask/components/GCSToBigQuery.py +103 -0
- flowtask/components/GoogleA4.py +150 -0
- flowtask/components/GoogleGeoCoding.py +344 -0
- flowtask/components/GooglePlaces.py +315 -0
- flowtask/components/GoogleSearch.py +539 -0
- flowtask/components/HTTPClient.py +268 -0
- flowtask/components/ICIMS.py +146 -0
- flowtask/components/IF.py +179 -0
- flowtask/components/IcimsFolderCopy.py +173 -0
- flowtask/components/ImageFeatures/__init__.py +5 -0
- flowtask/components/ImageFeatures/process.py +233 -0
- flowtask/components/IteratorBase.py +251 -0
- flowtask/components/LangchainLoader/__init__.py +5 -0
- flowtask/components/LangchainLoader/loader.py +194 -0
- flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
- flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
- flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
- flowtask/components/LangchainLoader/loaders/docx.py +91 -0
- flowtask/components/LangchainLoader/loaders/html.py +119 -0
- flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
- flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
- flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
- flowtask/components/LangchainLoader/loaders/qa.py +67 -0
- flowtask/components/LangchainLoader/loaders/txt.py +55 -0
- flowtask/components/LeadIQ.py +650 -0
- flowtask/components/Loop.py +253 -0
- flowtask/components/Lowes.py +334 -0
- flowtask/components/MS365Usage.py +156 -0
- flowtask/components/MSTeamsMessages.py +320 -0
- flowtask/components/MarketClustering.py +1051 -0
- flowtask/components/MergeFiles.py +362 -0
- flowtask/components/MilvusOutput.py +87 -0
- flowtask/components/NearByStores.py +175 -0
- flowtask/components/NetworkNinja/__init__.py +6 -0
- flowtask/components/NetworkNinja/models/__init__.py +52 -0
- flowtask/components/NetworkNinja/models/abstract.py +177 -0
- flowtask/components/NetworkNinja/models/account.py +39 -0
- flowtask/components/NetworkNinja/models/client.py +19 -0
- flowtask/components/NetworkNinja/models/district.py +14 -0
- flowtask/components/NetworkNinja/models/events.py +101 -0
- flowtask/components/NetworkNinja/models/forms.py +499 -0
- flowtask/components/NetworkNinja/models/market.py +16 -0
- flowtask/components/NetworkNinja/models/organization.py +34 -0
- flowtask/components/NetworkNinja/models/photos.py +125 -0
- flowtask/components/NetworkNinja/models/project.py +44 -0
- flowtask/components/NetworkNinja/models/region.py +28 -0
- flowtask/components/NetworkNinja/models/store.py +203 -0
- flowtask/components/NetworkNinja/models/user.py +151 -0
- flowtask/components/NetworkNinja/router.py +854 -0
- flowtask/components/Odoo.py +175 -0
- flowtask/components/OdooInjector.py +192 -0
- flowtask/components/OpenFromXML.py +126 -0
- flowtask/components/OpenWeather.py +41 -0
- flowtask/components/OpenWithBase.py +616 -0
- flowtask/components/OpenWithPandas.py +715 -0
- flowtask/components/PGPDecrypt.py +199 -0
- flowtask/components/PandasIterator.py +187 -0
- flowtask/components/PandasToFile.py +189 -0
- flowtask/components/Paradox.py +339 -0
- flowtask/components/ParamIterator.py +117 -0
- flowtask/components/ParseHTML.py +84 -0
- flowtask/components/PlacerStores.py +249 -0
- flowtask/components/Pokemon.py +507 -0
- flowtask/components/PositiveBot.py +62 -0
- flowtask/components/PowerPointSlide.py +400 -0
- flowtask/components/PrintMessage.py +127 -0
- flowtask/components/ProductCompetitors/__init__.py +5 -0
- flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
- flowtask/components/ProductCompetitors/parsers/base.py +72 -0
- flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
- flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
- flowtask/components/ProductCompetitors/scrapper.py +155 -0
- flowtask/components/ProductCompliant.py +169 -0
- flowtask/components/ProductInfo/__init__.py +1 -0
- flowtask/components/ProductInfo/parsers/__init__.py +5 -0
- flowtask/components/ProductInfo/parsers/base.py +83 -0
- flowtask/components/ProductInfo/parsers/brother.py +97 -0
- flowtask/components/ProductInfo/parsers/canon.py +167 -0
- flowtask/components/ProductInfo/parsers/epson.py +118 -0
- flowtask/components/ProductInfo/parsers/hp.py +131 -0
- flowtask/components/ProductInfo/parsers/samsung.py +97 -0
- flowtask/components/ProductInfo/scraper.py +319 -0
- flowtask/components/ProductPricing.py +118 -0
- flowtask/components/QS.py +261 -0
- flowtask/components/QSBase.py +201 -0
- flowtask/components/QueryIterator.py +273 -0
- flowtask/components/QueryToInsert.py +327 -0
- flowtask/components/QueryToPandas.py +432 -0
- flowtask/components/RESTClient.py +195 -0
- flowtask/components/RethinkDBQuery.py +189 -0
- flowtask/components/Rsync.py +74 -0
- flowtask/components/RunSSH.py +59 -0
- flowtask/components/RunShell.py +71 -0
- flowtask/components/SalesForce.py +20 -0
- flowtask/components/SaveImageBank/__init__.py +257 -0
- flowtask/components/SchedulingVisits.py +592 -0
- flowtask/components/ScrapPage.py +216 -0
- flowtask/components/ScrapSearch.py +79 -0
- flowtask/components/SendNotify.py +257 -0
- flowtask/components/SentimentAnalysis.py +694 -0
- flowtask/components/ServiceScrapper/__init__.py +5 -0
- flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
- flowtask/components/ServiceScrapper/parsers/base.py +94 -0
- flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
- flowtask/components/ServiceScrapper/scrapper.py +199 -0
- flowtask/components/SetVariables.py +156 -0
- flowtask/components/SubTask.py +182 -0
- flowtask/components/SuiteCRM.py +48 -0
- flowtask/components/Switch.py +175 -0
- flowtask/components/TableBase.py +148 -0
- flowtask/components/TableDelete.py +312 -0
- flowtask/components/TableInput.py +143 -0
- flowtask/components/TableOutput/TableOutput.py +384 -0
- flowtask/components/TableOutput/__init__.py +3 -0
- flowtask/components/TableSchema.py +534 -0
- flowtask/components/Target.py +223 -0
- flowtask/components/ThumbnailGenerator.py +156 -0
- flowtask/components/ToPandas.py +67 -0
- flowtask/components/TransformRows/TransformRows.py +507 -0
- flowtask/components/TransformRows/__init__.py +9 -0
- flowtask/components/TransformRows/functions.py +559 -0
- flowtask/components/TransposeRows.py +176 -0
- flowtask/components/UPCDatabase.py +86 -0
- flowtask/components/UnGzip.py +171 -0
- flowtask/components/Uncompress.py +172 -0
- flowtask/components/UniqueRows.py +126 -0
- flowtask/components/Unzip.py +107 -0
- flowtask/components/UpdateOperationalVars.py +147 -0
- flowtask/components/UploadTo.py +299 -0
- flowtask/components/UploadToS3.py +136 -0
- flowtask/components/UploadToSFTP.py +160 -0
- flowtask/components/UploadToSharepoint.py +205 -0
- flowtask/components/UserFunc.py +122 -0
- flowtask/components/VivaTracker.py +140 -0
- flowtask/components/WSDLClient.py +123 -0
- flowtask/components/Wait.py +18 -0
- flowtask/components/Walmart.py +199 -0
- flowtask/components/Workplace.py +134 -0
- flowtask/components/XMLToPandas.py +267 -0
- flowtask/components/Zammad/__init__.py +41 -0
- flowtask/components/Zammad/models.py +0 -0
- flowtask/components/ZoomInfoScraper.py +409 -0
- flowtask/components/__init__.py +104 -0
- flowtask/components/abstract.py +18 -0
- flowtask/components/flow.py +530 -0
- flowtask/components/google.py +335 -0
- flowtask/components/group.py +221 -0
- flowtask/components/py.typed +0 -0
- flowtask/components/reviewscrap.py +132 -0
- flowtask/components/tAutoincrement.py +117 -0
- flowtask/components/tConcat.py +109 -0
- flowtask/components/tExplode.py +119 -0
- flowtask/components/tFilter.py +184 -0
- flowtask/components/tGroup.py +236 -0
- flowtask/components/tJoin.py +270 -0
- flowtask/components/tMap/__init__.py +9 -0
- flowtask/components/tMap/functions.py +54 -0
- flowtask/components/tMap/tMap.py +450 -0
- flowtask/components/tMelt.py +112 -0
- flowtask/components/tMerge.py +114 -0
- flowtask/components/tOrder.py +93 -0
- flowtask/components/tPandas.py +94 -0
- flowtask/components/tPivot.py +71 -0
- flowtask/components/tPluckCols.py +76 -0
- flowtask/components/tUnnest.py +82 -0
- flowtask/components/user.py +401 -0
- flowtask/conf.py +457 -0
- flowtask/download.py +102 -0
- flowtask/events/__init__.py +11 -0
- flowtask/events/events/__init__.py +20 -0
- flowtask/events/events/abstract.py +95 -0
- flowtask/events/events/alerts/__init__.py +362 -0
- flowtask/events/events/alerts/colfunctions.py +131 -0
- flowtask/events/events/alerts/functions.py +158 -0
- flowtask/events/events/dummy.py +12 -0
- flowtask/events/events/exec.py +124 -0
- flowtask/events/events/file/__init__.py +7 -0
- flowtask/events/events/file/base.py +51 -0
- flowtask/events/events/file/copy.py +23 -0
- flowtask/events/events/file/delete.py +16 -0
- flowtask/events/events/interfaces/__init__.py +9 -0
- flowtask/events/events/interfaces/client.py +67 -0
- flowtask/events/events/interfaces/credentials.py +28 -0
- flowtask/events/events/interfaces/notifications.py +58 -0
- flowtask/events/events/jira.py +122 -0
- flowtask/events/events/log.py +26 -0
- flowtask/events/events/logerr.py +52 -0
- flowtask/events/events/notify.py +59 -0
- flowtask/events/events/notify_event.py +160 -0
- flowtask/events/events/publish.py +54 -0
- flowtask/events/events/sendfile.py +104 -0
- flowtask/events/events/task.py +97 -0
- flowtask/events/events/teams.py +98 -0
- flowtask/events/events/webhook.py +58 -0
- flowtask/events/manager.py +287 -0
- flowtask/exceptions.c +39393 -0
- flowtask/exceptions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/extensions/__init__.py +3 -0
- flowtask/extensions/abstract.py +82 -0
- flowtask/extensions/logging/__init__.py +65 -0
- flowtask/hooks/__init__.py +9 -0
- flowtask/hooks/actions/__init__.py +22 -0
- flowtask/hooks/actions/abstract.py +66 -0
- flowtask/hooks/actions/dummy.py +23 -0
- flowtask/hooks/actions/jira.py +74 -0
- flowtask/hooks/actions/rest.py +320 -0
- flowtask/hooks/actions/sampledata.py +37 -0
- flowtask/hooks/actions/sensor.py +23 -0
- flowtask/hooks/actions/task.py +9 -0
- flowtask/hooks/actions/ticket.py +37 -0
- flowtask/hooks/actions/zammad.py +55 -0
- flowtask/hooks/hook.py +62 -0
- flowtask/hooks/models.py +17 -0
- flowtask/hooks/service.py +187 -0
- flowtask/hooks/step.py +91 -0
- flowtask/hooks/types/__init__.py +23 -0
- flowtask/hooks/types/base.py +129 -0
- flowtask/hooks/types/brokers/__init__.py +11 -0
- flowtask/hooks/types/brokers/base.py +54 -0
- flowtask/hooks/types/brokers/mqtt.py +35 -0
- flowtask/hooks/types/brokers/rabbitmq.py +82 -0
- flowtask/hooks/types/brokers/redis.py +83 -0
- flowtask/hooks/types/brokers/sqs.py +44 -0
- flowtask/hooks/types/fs.py +232 -0
- flowtask/hooks/types/http.py +49 -0
- flowtask/hooks/types/imap.py +200 -0
- flowtask/hooks/types/jira.py +279 -0
- flowtask/hooks/types/mail.py +205 -0
- flowtask/hooks/types/postgres.py +98 -0
- flowtask/hooks/types/responses/__init__.py +8 -0
- flowtask/hooks/types/responses/base.py +5 -0
- flowtask/hooks/types/sharepoint.py +288 -0
- flowtask/hooks/types/ssh.py +141 -0
- flowtask/hooks/types/tagged.py +59 -0
- flowtask/hooks/types/upload.py +85 -0
- flowtask/hooks/types/watch.py +71 -0
- flowtask/hooks/types/web.py +36 -0
- flowtask/interfaces/AzureClient.py +137 -0
- flowtask/interfaces/AzureGraph.py +839 -0
- flowtask/interfaces/Boto3Client.py +326 -0
- flowtask/interfaces/DropboxClient.py +173 -0
- flowtask/interfaces/ExcelHandler.py +94 -0
- flowtask/interfaces/FTPClient.py +131 -0
- flowtask/interfaces/GoogleCalendar.py +201 -0
- flowtask/interfaces/GoogleClient.py +133 -0
- flowtask/interfaces/GoogleDrive.py +127 -0
- flowtask/interfaces/GoogleGCS.py +89 -0
- flowtask/interfaces/GoogleGeocoding.py +93 -0
- flowtask/interfaces/GoogleLang.py +114 -0
- flowtask/interfaces/GooglePub.py +61 -0
- flowtask/interfaces/GoogleSheet.py +68 -0
- flowtask/interfaces/IMAPClient.py +137 -0
- flowtask/interfaces/O365Calendar.py +113 -0
- flowtask/interfaces/O365Client.py +220 -0
- flowtask/interfaces/OneDrive.py +284 -0
- flowtask/interfaces/Outlook.py +155 -0
- flowtask/interfaces/ParrotBot.py +130 -0
- flowtask/interfaces/SSHClient.py +378 -0
- flowtask/interfaces/Sharepoint.py +496 -0
- flowtask/interfaces/__init__.py +36 -0
- flowtask/interfaces/azureauth.py +119 -0
- flowtask/interfaces/cache.py +201 -0
- flowtask/interfaces/client.py +82 -0
- flowtask/interfaces/compress.py +525 -0
- flowtask/interfaces/credentials.py +124 -0
- flowtask/interfaces/d2l.py +239 -0
- flowtask/interfaces/databases/__init__.py +5 -0
- flowtask/interfaces/databases/db.py +223 -0
- flowtask/interfaces/databases/documentdb.py +55 -0
- flowtask/interfaces/databases/rethink.py +39 -0
- flowtask/interfaces/dataframes/__init__.py +11 -0
- flowtask/interfaces/dataframes/abstract.py +21 -0
- flowtask/interfaces/dataframes/arrow.py +71 -0
- flowtask/interfaces/dataframes/dt.py +69 -0
- flowtask/interfaces/dataframes/pandas.py +167 -0
- flowtask/interfaces/dataframes/polars.py +60 -0
- flowtask/interfaces/db.py +263 -0
- flowtask/interfaces/env.py +46 -0
- flowtask/interfaces/func.py +137 -0
- flowtask/interfaces/http.py +1780 -0
- flowtask/interfaces/locale.py +40 -0
- flowtask/interfaces/log.py +75 -0
- flowtask/interfaces/mask.py +143 -0
- flowtask/interfaces/notification.py +154 -0
- flowtask/interfaces/playwright.py +339 -0
- flowtask/interfaces/powerpoint.py +368 -0
- flowtask/interfaces/py.typed +0 -0
- flowtask/interfaces/qs.py +376 -0
- flowtask/interfaces/result.py +87 -0
- flowtask/interfaces/selenium_service.py +779 -0
- flowtask/interfaces/smartsheet.py +154 -0
- flowtask/interfaces/stat.py +39 -0
- flowtask/interfaces/task.py +96 -0
- flowtask/interfaces/template.py +118 -0
- flowtask/interfaces/vectorstores/__init__.py +1 -0
- flowtask/interfaces/vectorstores/abstract.py +133 -0
- flowtask/interfaces/vectorstores/milvus.py +669 -0
- flowtask/interfaces/zammad.py +107 -0
- flowtask/models.py +193 -0
- flowtask/parsers/__init__.py +15 -0
- flowtask/parsers/_yaml.c +11978 -0
- flowtask/parsers/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/plugins/__init__.py +16 -0
- flowtask/plugins/components/__init__.py +0 -0
- flowtask/plugins/handler/__init__.py +45 -0
- flowtask/plugins/importer.py +31 -0
- flowtask/plugins/sources/__init__.py +0 -0
- flowtask/runner.py +283 -0
- flowtask/scheduler/__init__.py +9 -0
- flowtask/scheduler/functions.py +493 -0
- flowtask/scheduler/handlers/__init__.py +8 -0
- flowtask/scheduler/handlers/manager.py +504 -0
- flowtask/scheduler/handlers/models.py +58 -0
- flowtask/scheduler/handlers/service.py +72 -0
- flowtask/scheduler/notifications.py +65 -0
- flowtask/scheduler/scheduler.py +993 -0
- flowtask/services/__init__.py +0 -0
- flowtask/services/bots/__init__.py +0 -0
- flowtask/services/bots/telegram.py +264 -0
- flowtask/services/files/__init__.py +11 -0
- flowtask/services/files/manager.py +522 -0
- flowtask/services/files/model.py +37 -0
- flowtask/services/files/service.py +767 -0
- flowtask/services/jira/__init__.py +3 -0
- flowtask/services/jira/jira_actions.py +191 -0
- flowtask/services/tasks/__init__.py +13 -0
- flowtask/services/tasks/launcher.py +213 -0
- flowtask/services/tasks/manager.py +323 -0
- flowtask/services/tasks/service.py +275 -0
- flowtask/services/tasks/task_manager.py +376 -0
- flowtask/services/tasks/tasks.py +155 -0
- flowtask/storages/__init__.py +16 -0
- flowtask/storages/exceptions.py +12 -0
- flowtask/storages/files/__init__.py +8 -0
- flowtask/storages/files/abstract.py +29 -0
- flowtask/storages/files/filesystem.py +66 -0
- flowtask/storages/tasks/__init__.py +19 -0
- flowtask/storages/tasks/abstract.py +26 -0
- flowtask/storages/tasks/database.py +33 -0
- flowtask/storages/tasks/filesystem.py +108 -0
- flowtask/storages/tasks/github.py +119 -0
- flowtask/storages/tasks/memory.py +45 -0
- flowtask/storages/tasks/row.py +25 -0
- flowtask/tasks/__init__.py +0 -0
- flowtask/tasks/abstract.py +526 -0
- flowtask/tasks/command.py +118 -0
- flowtask/tasks/pile.py +486 -0
- flowtask/tasks/py.typed +0 -0
- flowtask/tasks/task.py +778 -0
- flowtask/template/__init__.py +161 -0
- flowtask/tests.py +257 -0
- flowtask/types/__init__.py +8 -0
- flowtask/types/typedefs.c +11347 -0
- flowtask/types/typedefs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/__init__.py +24 -0
- flowtask/utils/constants.py +117 -0
- flowtask/utils/encoders.py +21 -0
- flowtask/utils/executor.py +112 -0
- flowtask/utils/functions.cpp +14280 -0
- flowtask/utils/functions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/stats.py +308 -0
- flowtask/utils/transformations.py +74 -0
- flowtask/utils/uv.py +12 -0
- flowtask/utils/validators.py +97 -0
- flowtask/version.py +11 -0
- flowtask-5.8.4.dist-info/LICENSE +201 -0
- flowtask-5.8.4.dist-info/METADATA +209 -0
- flowtask-5.8.4.dist-info/RECORD +470 -0
- flowtask-5.8.4.dist-info/WHEEL +6 -0
- flowtask-5.8.4.dist-info/entry_points.txt +3 -0
- flowtask-5.8.4.dist-info/top_level.txt +2 -0
- plugins/components/CreateQR.py +39 -0
- plugins/components/TestComponent.py +28 -0
- plugins/components/Use1.py +13 -0
- plugins/components/Workplace.py +117 -0
- plugins/components/__init__.py +3 -0
- plugins/sources/__init__.py +0 -0
- plugins/sources/get_populartimes.py +78 -0
- plugins/sources/google.py +150 -0
- plugins/sources/hubspot.py +679 -0
- plugins/sources/icims.py +679 -0
- plugins/sources/mobileinsight.py +501 -0
- plugins/sources/newrelic.py +262 -0
- plugins/sources/uap.py +268 -0
- plugins/sources/venu.py +244 -0
- 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 = {}
|