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.
- 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-39-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-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-39-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-39-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-39-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-39-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-39-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,40 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
from abc import ABC
|
3
|
+
import logging
|
4
|
+
import locale
|
5
|
+
|
6
|
+
|
7
|
+
class LocaleSupport(ABC):
|
8
|
+
"""LocaleSupport.
|
9
|
+
|
10
|
+
Adding Support for Encoding and Locale to every Component in FlowTask.
|
11
|
+
"""
|
12
|
+
|
13
|
+
encoding: str = "UTF-8"
|
14
|
+
_locale: Optional[str] = None
|
15
|
+
|
16
|
+
def __init__(self, *args, **kwargs):
|
17
|
+
self.encoding = kwargs.pop('encoding', "UTF-8")
|
18
|
+
self._locale = kwargs.pop('l18n', None)
|
19
|
+
# Localization
|
20
|
+
if self._locale is None:
|
21
|
+
newloc = (locale.getlocale())[0]
|
22
|
+
self._locale = f"{newloc}.{self.encoding}"
|
23
|
+
else:
|
24
|
+
if self.encoding not in self._locale:
|
25
|
+
self._locale = f"{self._locale}.{self.encoding}"
|
26
|
+
try:
|
27
|
+
# avoid errors on unsupported locales
|
28
|
+
locale.setlocale(locale.LC_TIME, self._locale)
|
29
|
+
except (RuntimeError, NameError, locale.Error) as err:
|
30
|
+
logging.warning(
|
31
|
+
f"Error on Locale Support: {err}"
|
32
|
+
)
|
33
|
+
newloc = (locale.getlocale())[0]
|
34
|
+
self._locale = f"{newloc}.UTF-8"
|
35
|
+
locale.setlocale(locale.LC_TIME, self._locale)
|
36
|
+
# Call super only if there’s a next class in the MRO
|
37
|
+
try:
|
38
|
+
super().__init__(*args, **kwargs)
|
39
|
+
except TypeError:
|
40
|
+
super().__init__()
|
@@ -0,0 +1,75 @@
|
|
1
|
+
from abc import ABC
|
2
|
+
from enum import Enum
|
3
|
+
import traceback
|
4
|
+
from navconfig.logging import logging
|
5
|
+
from ..utils import cPrint
|
6
|
+
from ..exceptions import ComponentError
|
7
|
+
|
8
|
+
### TODO: Adding functions for Raising Errors.
|
9
|
+
class SkipErrors(Enum):
|
10
|
+
SKIP = "skip"
|
11
|
+
LOG = "log_only"
|
12
|
+
ENFORCE = None
|
13
|
+
|
14
|
+
def __str__(self):
|
15
|
+
return {
|
16
|
+
SkipErrors.SKIP: "skip",
|
17
|
+
SkipErrors.LOG: "Log Errors",
|
18
|
+
SkipErrors.ENFORCE: "Enforce",
|
19
|
+
}[self]
|
20
|
+
|
21
|
+
class LogSupport(ABC):
|
22
|
+
"""LogSupport.
|
23
|
+
|
24
|
+
Adding Logging support to every FlowTask Component.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, *args, **kwargs):
|
28
|
+
self._name = kwargs.get('name', self.__class__.__name__)
|
29
|
+
self.skipError: SkipErrors = SkipErrors.ENFORCE
|
30
|
+
# logging object
|
31
|
+
self._logger = logging.getLogger(
|
32
|
+
f"FlowTask.Component.{self._name}"
|
33
|
+
)
|
34
|
+
# Debugging
|
35
|
+
self._debug: bool = kwargs.get('debug', False)
|
36
|
+
if self._debug:
|
37
|
+
self._logger.setLevel(logging.DEBUG)
|
38
|
+
super().__init__(*args, **kwargs)
|
39
|
+
|
40
|
+
def log(self, message) -> None:
|
41
|
+
self._logger.info(message)
|
42
|
+
if self._debug is True:
|
43
|
+
cPrint(message, level="INFO")
|
44
|
+
|
45
|
+
def debug(self, message):
|
46
|
+
self._logger.debug(message)
|
47
|
+
if self._debug is True:
|
48
|
+
cPrint(message, level="DEBUG")
|
49
|
+
|
50
|
+
def warning(self, message):
|
51
|
+
self._logger.warning(message)
|
52
|
+
if self._debug is True:
|
53
|
+
cPrint(message, level="WARN")
|
54
|
+
|
55
|
+
def exception(self, message):
|
56
|
+
self._logger.exception(message, stack_info=True)
|
57
|
+
if self._debug is True:
|
58
|
+
cPrint(message, level="CRITICAL")
|
59
|
+
|
60
|
+
def echo(self, message: str, level: str = "INFO") -> None:
|
61
|
+
cPrint(message, level=level)
|
62
|
+
|
63
|
+
def error(
|
64
|
+
self,
|
65
|
+
message: str,
|
66
|
+
exc: BaseException,
|
67
|
+
status: int = 400,
|
68
|
+
stacktrace: bool = False,
|
69
|
+
):
|
70
|
+
payload = None
|
71
|
+
if stacktrace is True:
|
72
|
+
payload = traceback.format_exc()
|
73
|
+
raise ComponentError(
|
74
|
+
f"{message}, error={exc}", status=status, stacktrace=payload
|
75
|
+
) from exc
|
@@ -0,0 +1,143 @@
|
|
1
|
+
from abc import ABC
|
2
|
+
from typing import ParamSpec, Any
|
3
|
+
from pathlib import Path, PurePath
|
4
|
+
from navconfig.logging import logging
|
5
|
+
from ..utils import SafeDict, fnExecutor
|
6
|
+
|
7
|
+
|
8
|
+
P = ParamSpec("P")
|
9
|
+
|
10
|
+
|
11
|
+
class MaskSupport(ABC):
|
12
|
+
"""MaskSupport.
|
13
|
+
|
14
|
+
Processing Masks Support.
|
15
|
+
"""
|
16
|
+
def __init__(
|
17
|
+
self,
|
18
|
+
*args: P.args,
|
19
|
+
**kwargs: P.kwargs
|
20
|
+
):
|
21
|
+
self._mask = {} # masks for function replacing
|
22
|
+
masks = kwargs.pop('_masks', {})
|
23
|
+
self.logger = logging.getLogger('Flowtask.Mask')
|
24
|
+
# filling Masks:
|
25
|
+
if "masks" in kwargs:
|
26
|
+
self._mask = kwargs.pop('masks')
|
27
|
+
object.__setattr__(self, "masks", self._mask)
|
28
|
+
for mask, replace in masks.items():
|
29
|
+
self._mask[mask] = replace # override component's masks
|
30
|
+
try:
|
31
|
+
super().__init__(*args, **kwargs)
|
32
|
+
except TypeError:
|
33
|
+
super().__init__()
|
34
|
+
|
35
|
+
def _mask_processing(self, variables: dict) -> None:
|
36
|
+
try:
|
37
|
+
for mask, replace in self._mask.items():
|
38
|
+
# first: making replacement of masks based on vars:
|
39
|
+
try:
|
40
|
+
if mask in variables:
|
41
|
+
value = variables[mask]
|
42
|
+
else:
|
43
|
+
value = replace.format(**variables)
|
44
|
+
except Exception:
|
45
|
+
value = replace
|
46
|
+
value = fnExecutor(value)
|
47
|
+
self.logger.notice(
|
48
|
+
f":: Set Mask {mask} == {value!s}"
|
49
|
+
)
|
50
|
+
self._mask[mask] = value
|
51
|
+
except Exception as err:
|
52
|
+
self.logger.warning(
|
53
|
+
f"Mask Error: {err}"
|
54
|
+
)
|
55
|
+
|
56
|
+
def mask_replacement(self, obj: Any):
|
57
|
+
"""mask_replacement.
|
58
|
+
|
59
|
+
Replacing occurrences of Masks into an String.
|
60
|
+
Args:
|
61
|
+
obj (Any): Any kind of object.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
Any: Object with replaced masks.
|
65
|
+
"""
|
66
|
+
for mask, replace in self._mask.items():
|
67
|
+
if mask in self._variables:
|
68
|
+
value = self._variables[mask]
|
69
|
+
# Using SafeDict instead direct replacement:
|
70
|
+
value = str(obj).format_map(SafeDict(**self._variables))
|
71
|
+
else:
|
72
|
+
if str(obj) == mask and mask.startswith("#"):
|
73
|
+
# full replacement of the mask
|
74
|
+
obj = replace
|
75
|
+
return obj
|
76
|
+
else:
|
77
|
+
try:
|
78
|
+
if str(obj) == mask and mask.startswith("{"):
|
79
|
+
value = str(obj).replace(mask, str(replace))
|
80
|
+
elif mask in str(obj) and mask.startswith("{"):
|
81
|
+
try:
|
82
|
+
value = str(obj).replace(mask, str(replace))
|
83
|
+
except (ValueError, TypeError) as exc:
|
84
|
+
# remove the "{" and "}" from the mask
|
85
|
+
mask = mask[1:-1]
|
86
|
+
value = str(obj).format_map(
|
87
|
+
SafeDict({mask: replace})
|
88
|
+
)
|
89
|
+
else:
|
90
|
+
value = str(obj).format_map(
|
91
|
+
SafeDict({mask: replace})
|
92
|
+
)
|
93
|
+
except (ValueError, TypeError):
|
94
|
+
value = str(obj).replace(mask, str(replace))
|
95
|
+
if isinstance(obj, PurePath):
|
96
|
+
obj = Path(value).resolve()
|
97
|
+
else:
|
98
|
+
obj = value
|
99
|
+
return obj
|
100
|
+
|
101
|
+
def mask_replacement_recursively(self, obj: Any):
|
102
|
+
"""
|
103
|
+
This function replaces all occurrences of "{key}" in the obj structure
|
104
|
+
with the corresponding value from the replacements dictionary, recursively.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
obj: an object to process.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
The modified obj structure with curly brace replacements.
|
111
|
+
"""
|
112
|
+
|
113
|
+
if isinstance(obj, dict):
|
114
|
+
# If it's a dictionary, iterate through each key-value pair
|
115
|
+
for key, value in obj.copy().items():
|
116
|
+
# Recursively replace in the key and value
|
117
|
+
obj[key] = self.mask_replacement_recursively(value)
|
118
|
+
|
119
|
+
# Check if the key itself has curly braces
|
120
|
+
if isinstance(key, str):
|
121
|
+
# Use f-string for formatted key
|
122
|
+
new_key = self.mask_replacement(key)
|
123
|
+
|
124
|
+
if new_key != key:
|
125
|
+
obj.pop(key) # Remove old key and add formatted one
|
126
|
+
obj[new_key] = value # Add key-value pair with formatted key
|
127
|
+
|
128
|
+
elif isinstance(obj, list):
|
129
|
+
# If it's a list, iterate through each element and replace recursively
|
130
|
+
for idx, value in enumerate(obj):
|
131
|
+
obj[idx] = self.mask_replacement_recursively(value)
|
132
|
+
|
133
|
+
elif isinstance(obj, str):
|
134
|
+
# If it's a string, use f-string formatting to replace
|
135
|
+
return self.mask_replacement(obj)
|
136
|
+
|
137
|
+
return obj
|
138
|
+
|
139
|
+
def mask_start(self, **kwargs):
|
140
|
+
# Usable by Hooks
|
141
|
+
self._masks: dict = kwargs.pop("masks", {})
|
142
|
+
self._variables = kwargs.pop("variables", {})
|
143
|
+
self._mask_processing(variables=self._variables)
|
@@ -0,0 +1,154 @@
|
|
1
|
+
"""
|
2
|
+
Interface for sending messages using Notify.
|
3
|
+
"""
|
4
|
+
import os
|
5
|
+
import asyncio
|
6
|
+
from pathlib import Path, PurePath
|
7
|
+
from navconfig.logging import logging
|
8
|
+
from notify import Notify
|
9
|
+
from notify.providers.email import Email
|
10
|
+
from notify.models import (
|
11
|
+
Actor,
|
12
|
+
Chat,
|
13
|
+
Channel,
|
14
|
+
TeamsChannel,
|
15
|
+
TeamsCard
|
16
|
+
)
|
17
|
+
from notify.conf import MS_TEAMS_DEFAULT_TEAMS_ID
|
18
|
+
from flowtask.conf import (
|
19
|
+
EVENT_CHAT_ID,
|
20
|
+
EVENT_CHAT_BOT,
|
21
|
+
DEFAULT_RECIPIENT,
|
22
|
+
EMAIL_USERNAME,
|
23
|
+
EMAIL_PASSWORD,
|
24
|
+
EMAIL_PORT,
|
25
|
+
EMAIL_HOST,
|
26
|
+
SLACK_DEFAULT_CHANNEL,
|
27
|
+
SLACK_DEFAULT_CHANNEL_NAME,
|
28
|
+
MS_TEAMS_NAVIGATOR_CHANNEL,
|
29
|
+
MS_TEAMS_NAVIGATOR_CHANNEL_ID,
|
30
|
+
)
|
31
|
+
from .mask import MaskSupport
|
32
|
+
|
33
|
+
|
34
|
+
class Notification(MaskSupport):
|
35
|
+
def __init__(self, *args, **kwargs):
|
36
|
+
super(Notification, self).__init__(*args, **kwargs)
|
37
|
+
self.provider: str = kwargs.pop("type", "dummy")
|
38
|
+
self.list_attachment: list = []
|
39
|
+
self.account: str = self.set_account(
|
40
|
+
kwargs.pop("account", {})
|
41
|
+
)
|
42
|
+
# recipient:
|
43
|
+
self._recipients = kwargs.pop("recipients", [])
|
44
|
+
self._channel = kwargs.pop("channel", "Navigator")
|
45
|
+
self._channel_id = kwargs.pop("channel_id", None)
|
46
|
+
self._chat_id = kwargs.pop('chat_id', EVENT_CHAT_ID)
|
47
|
+
self._bot_token = kwargs.pop('bot_token', EVENT_CHAT_BOT)
|
48
|
+
self._kwargs = kwargs
|
49
|
+
self.message = kwargs.pop("message", {})
|
50
|
+
template = self.message.pop("template", None)
|
51
|
+
self._template = kwargs.pop("template", template)
|
52
|
+
self._loop = kwargs.pop(
|
53
|
+
"event_loop",
|
54
|
+
asyncio.get_event_loop()
|
55
|
+
)
|
56
|
+
|
57
|
+
def set_account(self, account: dict):
|
58
|
+
for key, default in account.items():
|
59
|
+
val = self.get_env_value(account[key], default=default)
|
60
|
+
account[key] = val
|
61
|
+
return account
|
62
|
+
|
63
|
+
def get_env_value(self, key, default: str = None):
|
64
|
+
if key is None:
|
65
|
+
return None
|
66
|
+
if val := os.getenv(key):
|
67
|
+
return val
|
68
|
+
elif val := self._environment.get(key, default):
|
69
|
+
return val
|
70
|
+
else:
|
71
|
+
return key
|
72
|
+
|
73
|
+
def get_notify(self, **kwargs):
|
74
|
+
recipient = Actor(**DEFAULT_RECIPIENT)
|
75
|
+
if self.provider == "telegram":
|
76
|
+
recipient = Chat(**{"chat_id": self._chat_id, "chat_name": self._channel})
|
77
|
+
# send notifications to Telegram bot
|
78
|
+
args = {
|
79
|
+
"bot_token": self._bot_token,
|
80
|
+
"loop": asyncio.get_event_loop(),
|
81
|
+
**kwargs,
|
82
|
+
}
|
83
|
+
provider = Notify("telegram", **args)
|
84
|
+
elif self.provider == "outlook":
|
85
|
+
args = {"use_credentials": True, "loop": asyncio.get_event_loop(), **kwargs}
|
86
|
+
provider = Notify("outlook", **args)
|
87
|
+
elif self.provider == "slack":
|
88
|
+
_id = self._channel_id if self._channel_id else SLACK_DEFAULT_CHANNEL
|
89
|
+
name = self._channel if self._channel else SLACK_DEFAULT_CHANNEL_NAME
|
90
|
+
recipient = Channel(channel_id=_id, channel_name=name)
|
91
|
+
provider = Notify("slack", **kwargs)
|
92
|
+
elif self.provider == "email":
|
93
|
+
if not self.account:
|
94
|
+
account = {
|
95
|
+
"host": EMAIL_HOST,
|
96
|
+
"port": EMAIL_PORT,
|
97
|
+
"username": EMAIL_USERNAME,
|
98
|
+
"password": EMAIL_PASSWORD,
|
99
|
+
}
|
100
|
+
else:
|
101
|
+
account = self.account
|
102
|
+
account = {**account, **kwargs}
|
103
|
+
if not self._recipients:
|
104
|
+
recipient = Actor(**DEFAULT_RECIPIENT)
|
105
|
+
else:
|
106
|
+
recipient = [Actor(**user) for user in self._recipients]
|
107
|
+
provider = Email(debug=True, **account)
|
108
|
+
elif self.provider == "teams":
|
109
|
+
_id = (
|
110
|
+
self._channel_id if self._channel_id else MS_TEAMS_NAVIGATOR_CHANNEL_ID
|
111
|
+
)
|
112
|
+
name = self._channel if self._channel else MS_TEAMS_NAVIGATOR_CHANNEL
|
113
|
+
args = {"as_user": True, "loop": asyncio.get_event_loop(), **kwargs}
|
114
|
+
recipient = TeamsChannel(
|
115
|
+
name=name, team_id=MS_TEAMS_DEFAULT_TEAMS_ID, channel_id=_id
|
116
|
+
)
|
117
|
+
provider = Notify("teams", **args)
|
118
|
+
else:
|
119
|
+
# Any other Notify Provider:
|
120
|
+
if not self._recipient:
|
121
|
+
recipient = Actor(**DEFAULT_RECIPIENT)
|
122
|
+
else:
|
123
|
+
recipient = [Actor(**user) for user in self._recipients]
|
124
|
+
provider = Notify(self.provider, **kwargs)
|
125
|
+
logging.debug(f"Created Notify Component {provider}")
|
126
|
+
return [provider, recipient]
|
127
|
+
|
128
|
+
def get_attachment_files(self, result: list) -> list:
|
129
|
+
if result is None:
|
130
|
+
return []
|
131
|
+
elif isinstance(result, str):
|
132
|
+
result = [result]
|
133
|
+
files = []
|
134
|
+
for part in result:
|
135
|
+
if isinstance(part, str):
|
136
|
+
file = Path(part.strip("'"))
|
137
|
+
if file.exists():
|
138
|
+
files.append(file)
|
139
|
+
elif isinstance(part, PurePath):
|
140
|
+
if file.exists():
|
141
|
+
files.append(file)
|
142
|
+
return files
|
143
|
+
|
144
|
+
def get_message(self, message: str):
|
145
|
+
if self.provider in ("email", "gmail", "outlook"):
|
146
|
+
args = {"subject": message, **self.message}
|
147
|
+
elif self.provider == "teams":
|
148
|
+
msg = TeamsCard(text=message, summary="Task Summary")
|
149
|
+
args = {"message": msg, **self.message}
|
150
|
+
elif self.provider in ("slack", "telegram"):
|
151
|
+
args = {"message": message, **self.message}
|
152
|
+
else:
|
153
|
+
args = {"message": message, **self.message}
|
154
|
+
return args
|