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,376 @@
|
|
1
|
+
"""
|
2
|
+
QS Support.
|
3
|
+
|
4
|
+
|
5
|
+
Adding support for Querysource related functions as datasource support to components.
|
6
|
+
"""
|
7
|
+
import os
|
8
|
+
from collections.abc import Callable
|
9
|
+
from abc import ABC
|
10
|
+
import asyncio
|
11
|
+
from importlib import import_module
|
12
|
+
from typing import Any
|
13
|
+
from navconfig import config
|
14
|
+
from sqlalchemy.orm import Session
|
15
|
+
from sqlalchemy import create_engine
|
16
|
+
from sqlalchemy.pool import NullPool
|
17
|
+
from asyncdb import AsyncDB
|
18
|
+
from asyncdb.drivers.pg import pg
|
19
|
+
from asyncdb.exceptions import NoDataFound
|
20
|
+
from querysource.exceptions import DataNotFound as NoData
|
21
|
+
from querysource.queries.qs import QS
|
22
|
+
from querysource.datasources.drivers import BaseDriver
|
23
|
+
from querysource.conf import (
|
24
|
+
default_dsn,
|
25
|
+
sqlalchemy_url,
|
26
|
+
DB_TIMEOUT,
|
27
|
+
DB_STATEMENT_TIMEOUT,
|
28
|
+
DB_SESSION_TIMEOUT,
|
29
|
+
DB_KEEPALIVE_IDLE,
|
30
|
+
POSTGRES_TIMEOUT,
|
31
|
+
BIGQUERY_CREDENTIALS,
|
32
|
+
BIGQUERY_PROJECT_ID
|
33
|
+
)
|
34
|
+
import pandas as pd
|
35
|
+
import numpy as np
|
36
|
+
from ..exceptions import (
|
37
|
+
ConfigError,
|
38
|
+
ComponentError,
|
39
|
+
DataNotFound,
|
40
|
+
)
|
41
|
+
from ..utils import cPrint
|
42
|
+
|
43
|
+
class QSSupport(ABC):
|
44
|
+
"""QSSupport.
|
45
|
+
|
46
|
+
Adding Support for Querysource parameters.
|
47
|
+
"""
|
48
|
+
use_sqlalchemy: bool = False
|
49
|
+
|
50
|
+
def get_config_value(self, key_name, default: str = None):
|
51
|
+
if key_name is None:
|
52
|
+
return default
|
53
|
+
if val := os.getenv(str(key_name)):
|
54
|
+
return val
|
55
|
+
if val := config.get(str(key_name), default):
|
56
|
+
return val
|
57
|
+
else:
|
58
|
+
# TODO: get from replacing masks or memecached
|
59
|
+
return key_name
|
60
|
+
|
61
|
+
def processing_credentials(self):
|
62
|
+
if self.credentials:
|
63
|
+
for key, value in self.credentials.items():
|
64
|
+
default = getattr(self, key, value)
|
65
|
+
try:
|
66
|
+
val = self.get_config_value(
|
67
|
+
key_name=value, default=default
|
68
|
+
)
|
69
|
+
self.credentials[key] = val
|
70
|
+
except (TypeError, KeyError) as err:
|
71
|
+
raise ConfigError(
|
72
|
+
f"{__name__}: Wrong or missing Credentials"
|
73
|
+
) from err
|
74
|
+
return self.credentials
|
75
|
+
|
76
|
+
def set_datatypes(self):
|
77
|
+
if self.datatypes:
|
78
|
+
dtypes = {}
|
79
|
+
for field, dtype in self.datatypes.items():
|
80
|
+
if dtype == "uint8":
|
81
|
+
dtypes[field] = np.uint8
|
82
|
+
elif dtype == "uint16":
|
83
|
+
dtypes[field] = np.uint16
|
84
|
+
elif dtype == "uint32":
|
85
|
+
dtypes[field] = np.uint32
|
86
|
+
elif dtype == "int8":
|
87
|
+
dtypes[field] = np.int8
|
88
|
+
elif dtype == "int16":
|
89
|
+
dtypes[field] = np.int16
|
90
|
+
elif dtype == "int32":
|
91
|
+
dtypes[field] = np.int32
|
92
|
+
elif dtype == "float":
|
93
|
+
dtypes[field] = float
|
94
|
+
elif dtype == "float32":
|
95
|
+
dtypes[field] = float
|
96
|
+
elif dtype in ("varchar", "str"):
|
97
|
+
dtypes[field] = str
|
98
|
+
elif dtype == "string":
|
99
|
+
dtypes[field] = "string"
|
100
|
+
else:
|
101
|
+
# invalid datatype
|
102
|
+
self._logger.warning(
|
103
|
+
f"Invalid DataType value: {field} for field {dtype}"
|
104
|
+
)
|
105
|
+
continue
|
106
|
+
self._dtypes = dtypes
|
107
|
+
|
108
|
+
def get_connection(
|
109
|
+
self,
|
110
|
+
driver: str = 'pg',
|
111
|
+
dsn: str = None,
|
112
|
+
params: dict = None,
|
113
|
+
**kwargs
|
114
|
+
) -> Callable:
|
115
|
+
"""Useful for internal connections of QS.
|
116
|
+
"""
|
117
|
+
args = {}
|
118
|
+
try:
|
119
|
+
loop = asyncio.get_event_loop()
|
120
|
+
except RuntimeError:
|
121
|
+
loop = asyncio.get_running_loop()
|
122
|
+
if driver == 'pg':
|
123
|
+
args: dict = {
|
124
|
+
"min_size": 2,
|
125
|
+
"server_settings": {
|
126
|
+
"application_name": "FlowTask:QS",
|
127
|
+
"client_min_messages": "notice",
|
128
|
+
"jit": "off",
|
129
|
+
"statement_timeout": f"{DB_STATEMENT_TIMEOUT}",
|
130
|
+
"idle_session_timeout": f"{DB_SESSION_TIMEOUT}",
|
131
|
+
"effective_cache_size": "2147483647",
|
132
|
+
"tcp_keepalives_idle": f"{DB_KEEPALIVE_IDLE}",
|
133
|
+
},
|
134
|
+
"timeout": int(POSTGRES_TIMEOUT),
|
135
|
+
**kwargs
|
136
|
+
}
|
137
|
+
if dsn:
|
138
|
+
return AsyncDB(
|
139
|
+
driver,
|
140
|
+
dsn=dsn,
|
141
|
+
loop=loop,
|
142
|
+
**args
|
143
|
+
)
|
144
|
+
elif params:
|
145
|
+
return AsyncDB(
|
146
|
+
driver,
|
147
|
+
params=params,
|
148
|
+
loop=loop,
|
149
|
+
**args
|
150
|
+
)
|
151
|
+
if not dsn and not params:
|
152
|
+
return self.default_connection()
|
153
|
+
|
154
|
+
def default_connection(self, dsn: str = None):
|
155
|
+
try:
|
156
|
+
timeout = int(DB_TIMEOUT)
|
157
|
+
except TypeError:
|
158
|
+
timeout = 360
|
159
|
+
if not dsn:
|
160
|
+
dsn = default_dsn
|
161
|
+
try:
|
162
|
+
if self._driver == 'pg':
|
163
|
+
kwargs: dict = {
|
164
|
+
"min_size": 2,
|
165
|
+
"server_settings": {
|
166
|
+
"application_name": "FlowTask:CopyToPg",
|
167
|
+
"client_min_messages": "notice",
|
168
|
+
"jit": "off",
|
169
|
+
"statement_timeout": f"{DB_STATEMENT_TIMEOUT}",
|
170
|
+
"idle_session_timeout": f"{DB_SESSION_TIMEOUT}",
|
171
|
+
"effective_cache_size": "2147483647",
|
172
|
+
"tcp_keepalives_idle": f"{DB_KEEPALIVE_IDLE}",
|
173
|
+
},
|
174
|
+
"timeout": timeout,
|
175
|
+
}
|
176
|
+
loop = asyncio.get_event_loop()
|
177
|
+
self._connection = pg(dsn=dsn, loop=loop, **kwargs)
|
178
|
+
return self._connection
|
179
|
+
if self._driver == 'bigquery':
|
180
|
+
self.credentials: dict = {
|
181
|
+
"credentials": BIGQUERY_CREDENTIALS,
|
182
|
+
"project_id": BIGQUERY_PROJECT_ID
|
183
|
+
}
|
184
|
+
return AsyncDB(
|
185
|
+
self._driver,
|
186
|
+
dsn=dsn,
|
187
|
+
params=self.credentials
|
188
|
+
)
|
189
|
+
except Exception as err:
|
190
|
+
raise ComponentError(
|
191
|
+
f"Error configuring Pg Connection: {err!s}"
|
192
|
+
) from err
|
193
|
+
|
194
|
+
def get_driver(self, driver) -> BaseDriver:
|
195
|
+
"""Getting a Database Driver from Datasource Drivers.
|
196
|
+
"""
|
197
|
+
# load dynamically
|
198
|
+
clspath = f'querysource.datasources.drivers.{driver}'
|
199
|
+
clsname = f'{driver}Driver'
|
200
|
+
try:
|
201
|
+
self._dsmodule = import_module(clspath)
|
202
|
+
return getattr(self._dsmodule, clsname)
|
203
|
+
except (AttributeError, ImportError) as ex:
|
204
|
+
raise RuntimeError(
|
205
|
+
f"QS: There is no Driver {driver}: {ex}"
|
206
|
+
) from ex
|
207
|
+
|
208
|
+
async def get_datasource(self, name: str):
|
209
|
+
"""get_datasource.
|
210
|
+
|
211
|
+
Get the datasource from the database.
|
212
|
+
"""
|
213
|
+
try:
|
214
|
+
db = self.default_connection()
|
215
|
+
async with await db.connection() as conn:
|
216
|
+
sql = f"SELECT * FROM public.datasources WHERE name = '{name}'"
|
217
|
+
row, error = await conn.queryrow(sql)
|
218
|
+
if error:
|
219
|
+
self._logger.warning(f'DS Error: {error}')
|
220
|
+
return False
|
221
|
+
try:
|
222
|
+
driver = self.get_driver(row['driver'])
|
223
|
+
# TODO: encrypting credentials in database:
|
224
|
+
if row['dsn']:
|
225
|
+
data = {
|
226
|
+
"dsn": row['dsn']
|
227
|
+
}
|
228
|
+
else:
|
229
|
+
try:
|
230
|
+
data = {
|
231
|
+
**dict(row['params']),
|
232
|
+
}
|
233
|
+
except TypeError:
|
234
|
+
data = dict(row['params'])
|
235
|
+
for key, val in row.get('credentials', {}).items():
|
236
|
+
data[key] = self.get_config_value(
|
237
|
+
key_name=val,
|
238
|
+
default=val
|
239
|
+
)
|
240
|
+
for key, val in row.get('params', {}).items():
|
241
|
+
data[key] = self.get_config_value(
|
242
|
+
key_name=val,
|
243
|
+
default=val
|
244
|
+
)
|
245
|
+
return driver(**data)
|
246
|
+
except Exception as ex: # pylint: disable=W0703
|
247
|
+
self._logger.error(ex)
|
248
|
+
return False
|
249
|
+
except Exception as exc:
|
250
|
+
self._logger.error(exc)
|
251
|
+
return False
|
252
|
+
|
253
|
+
def get_sqlalchemy_connection(self, dsn: str = None):
|
254
|
+
# TODO: migrate to async engine
|
255
|
+
if not dsn:
|
256
|
+
dsn = sqlalchemy_url
|
257
|
+
self._engine = create_engine(dsn, echo=False, poolclass=NullPool)
|
258
|
+
self._connection = Session(self._engine)
|
259
|
+
return self._connection
|
260
|
+
|
261
|
+
async def create_connection(self, driver: str = 'pg'):
|
262
|
+
if hasattr(self, "credentials"):
|
263
|
+
return self.get_connection(
|
264
|
+
driver=driver,
|
265
|
+
params=self.credentials
|
266
|
+
)
|
267
|
+
elif hasattr(self, 'dsn'):
|
268
|
+
dsn = self.get_config_value(self.dsn, self.dsn)
|
269
|
+
if self.use_sqlalchemy is True:
|
270
|
+
if dsn.startswith('postgres:'):
|
271
|
+
dsn = dsn.replace('postgres:', 'postgresql:')
|
272
|
+
return self.get_sqlalchemy_connection(
|
273
|
+
dsn=dsn
|
274
|
+
)
|
275
|
+
return self.get_connection(
|
276
|
+
driver=self._driver,
|
277
|
+
dsn=dsn
|
278
|
+
)
|
279
|
+
elif hasattr(self, "datasource"):
|
280
|
+
datasource = await self.get_datasource(name=self.datasource)
|
281
|
+
if datasource.driver_type == 'asyncdb':
|
282
|
+
driver = datasource.driver
|
283
|
+
return AsyncDB(
|
284
|
+
driver,
|
285
|
+
dsn=datasource.dsn,
|
286
|
+
params=datasource.params()
|
287
|
+
)
|
288
|
+
else:
|
289
|
+
raise ConfigError(
|
290
|
+
f"Invalid Datasource type {datasource.driver_type} for {self.datasource}"
|
291
|
+
)
|
292
|
+
else:
|
293
|
+
return self.default_connection()
|
294
|
+
|
295
|
+
async def get_qs(self, slug, conditions: dict = None):
|
296
|
+
result: Any = []
|
297
|
+
if not conditions:
|
298
|
+
conditions = self.conditions
|
299
|
+
try:
|
300
|
+
qry = QS(
|
301
|
+
slug=slug,
|
302
|
+
conditions=conditions,
|
303
|
+
loop=asyncio.get_event_loop(),
|
304
|
+
lazy=True
|
305
|
+
)
|
306
|
+
self.add_metric("QS CONDITIONS", conditions)
|
307
|
+
await qry.build_provider()
|
308
|
+
except (NoData, NoDataFound) as err:
|
309
|
+
raise DataNotFound(f"{err!s}") from err
|
310
|
+
except Exception as err:
|
311
|
+
raise ComponentError(f"{err}") from err
|
312
|
+
try:
|
313
|
+
res, error = await qry.query()
|
314
|
+
if not res:
|
315
|
+
raise DataNotFound(f"{slug}: Data Not Found")
|
316
|
+
if error:
|
317
|
+
if isinstance(error, BaseException):
|
318
|
+
raise error
|
319
|
+
else:
|
320
|
+
raise ComponentError(f"Error on Query: {error}")
|
321
|
+
result = result + [dict(row) for row in res]
|
322
|
+
return result
|
323
|
+
except (NoData, DataNotFound, NoDataFound) as err:
|
324
|
+
raise DataNotFound(f"{err!s}") from err
|
325
|
+
except Exception as err:
|
326
|
+
raise ComponentError(f"Error on Query: {err}") from err
|
327
|
+
finally:
|
328
|
+
try:
|
329
|
+
await qry.close()
|
330
|
+
except Exception as ex: # pylint: disable=W0703
|
331
|
+
self._logger.warning(ex)
|
332
|
+
del qry
|
333
|
+
|
334
|
+
async def get_dataframe(self, result, infer_types: bool = False):
|
335
|
+
self.set_datatypes()
|
336
|
+
try:
|
337
|
+
if self.as_objects is True:
|
338
|
+
df = pd.DataFrame(result, dtype=object)
|
339
|
+
else:
|
340
|
+
df = pd.DataFrame(result, dtype=str)
|
341
|
+
except Exception as err:
|
342
|
+
self._logger.exception(err, stack_info=True)
|
343
|
+
raise ComponentError(f"Unable to create Pandas DataFrame {err}") from err
|
344
|
+
# Attempt to infer better dtypes for object columns.
|
345
|
+
if infer_types is True:
|
346
|
+
try:
|
347
|
+
self._logger.debug("Auto-inferencing of Data Types")
|
348
|
+
df.infer_objects()
|
349
|
+
df = df.convert_dtypes(convert_string=self.to_string)
|
350
|
+
except Exception as err:
|
351
|
+
self.logger.error(f"QS Error: {err}")
|
352
|
+
if self._dtypes:
|
353
|
+
for column, dtype in self._dtypes.items():
|
354
|
+
self._logger.notice(f"Set Column {column} to type {dtype}")
|
355
|
+
try:
|
356
|
+
df[column] = df[column].astype(dtype)
|
357
|
+
except (ValueError, TypeError):
|
358
|
+
self._logger.warning(
|
359
|
+
f"Failed to convert column {column} to type {dtype}"
|
360
|
+
)
|
361
|
+
if self._debug is True:
|
362
|
+
cPrint("Data Types:")
|
363
|
+
print(df.dtypes)
|
364
|
+
if hasattr(self, "drop_empty"):
|
365
|
+
df.dropna(axis=1, how="all", inplace=True)
|
366
|
+
df.dropna(axis=0, how="all", inplace=True)
|
367
|
+
if hasattr(self, "dropna"):
|
368
|
+
df.dropna(subset=self.dropna, how="all", inplace=True)
|
369
|
+
if (
|
370
|
+
hasattr(self, "clean_strings") and getattr(self, "clean_strings", False) is True
|
371
|
+
):
|
372
|
+
u = df.select_dtypes(include=["object", "string"])
|
373
|
+
df[u.columns] = u.fillna("")
|
374
|
+
numrows = len(df.index)
|
375
|
+
self.add_metric("NUMROWS", numrows)
|
376
|
+
return df
|
@@ -0,0 +1,87 @@
|
|
1
|
+
from abc import ABC
|
2
|
+
from typing import Optional, ParamSpec, Any
|
3
|
+
from collections.abc import Iterable
|
4
|
+
from asyncdb import AsyncDB
|
5
|
+
from asyncdb.drivers.base import BaseDriver
|
6
|
+
from ..conf import MEMCACHE_HOST, MEMCACHE_PORT
|
7
|
+
|
8
|
+
P = ParamSpec("P")
|
9
|
+
|
10
|
+
class ResultSupport(ABC):
|
11
|
+
"""Support for manipulating the results of Components."""
|
12
|
+
|
13
|
+
_memory: Optional[BaseDriver] = None
|
14
|
+
|
15
|
+
def __init__(
|
16
|
+
self,
|
17
|
+
*args: P.args,
|
18
|
+
**kwargs: P.kwargs
|
19
|
+
):
|
20
|
+
self.use_memory: bool = kwargs.pop('use_memory', False)
|
21
|
+
# collection of results:
|
22
|
+
self._result: Optional[Any] = None
|
23
|
+
self.data: Optional[Any] = None
|
24
|
+
# previous Component
|
25
|
+
self._component: Optional[Iterable] = None
|
26
|
+
# can pass a previous data as Argument:
|
27
|
+
self._input_result = kwargs.pop('input_result', None)
|
28
|
+
super(ResultSupport, self).__init__(*args, **kwargs)
|
29
|
+
# memcache connector
|
30
|
+
if self.use_memory is True:
|
31
|
+
self.get_memcached()
|
32
|
+
|
33
|
+
def get_memcached(self):
|
34
|
+
params = {"host": MEMCACHE_HOST, "port": MEMCACHE_PORT}
|
35
|
+
try:
|
36
|
+
self._memory = AsyncDB("memcache", params=params)
|
37
|
+
except Exception as err:
|
38
|
+
self.logger.exception(err)
|
39
|
+
|
40
|
+
def output(self):
|
41
|
+
return self._result
|
42
|
+
|
43
|
+
@property
|
44
|
+
def result(self):
|
45
|
+
return self._result
|
46
|
+
|
47
|
+
@result.setter
|
48
|
+
def result(self, value):
|
49
|
+
self._result = value
|
50
|
+
|
51
|
+
@property
|
52
|
+
def input(self):
|
53
|
+
if isinstance(self._component, list):
|
54
|
+
# TODO: get an array the results from different components
|
55
|
+
result = []
|
56
|
+
for component in self._component:
|
57
|
+
if component:
|
58
|
+
result.append(component.output())
|
59
|
+
if len(result) == 1:
|
60
|
+
return result[0]
|
61
|
+
else:
|
62
|
+
return result
|
63
|
+
elif self._component:
|
64
|
+
if self._input_result is not None:
|
65
|
+
return self._input_result
|
66
|
+
return self._component.output()
|
67
|
+
else:
|
68
|
+
return self._input_result
|
69
|
+
|
70
|
+
@input.setter
|
71
|
+
def input(self, value: Any):
|
72
|
+
self._input_result = value
|
73
|
+
|
74
|
+
@property
|
75
|
+
def previous(self):
|
76
|
+
if self._component is not None:
|
77
|
+
return self._component
|
78
|
+
elif self._input_result is not None:
|
79
|
+
return self # result data is already on component
|
80
|
+
else:
|
81
|
+
return None
|
82
|
+
|
83
|
+
async def close(self):
|
84
|
+
try:
|
85
|
+
await self._memory.close()
|
86
|
+
except Exception: # pylint: disable=W0718
|
87
|
+
pass
|