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,261 @@
|
|
1
|
+
"""
|
2
|
+
QuerySource.
|
3
|
+
QS is a new kind of component supporting the new sources for
|
4
|
+
QuerySource and making transformations of data, returning a transformed
|
5
|
+
Pandas DataFrame.
|
6
|
+
|
7
|
+
|
8
|
+
Example:
|
9
|
+
|
10
|
+
```yaml
|
11
|
+
QS:
|
12
|
+
query: troc_mileage.tpl
|
13
|
+
from_templates_dir: true
|
14
|
+
conditions:
|
15
|
+
tenant: bose
|
16
|
+
firstdate: '{first}'
|
17
|
+
lastdate: '{last}'
|
18
|
+
forms:
|
19
|
+
- 4184
|
20
|
+
- 4149
|
21
|
+
- 4177
|
22
|
+
- 4152
|
23
|
+
- 3900
|
24
|
+
- 3931
|
25
|
+
- 3959
|
26
|
+
masks:
|
27
|
+
first:
|
28
|
+
- date_diff_dow
|
29
|
+
- day_of_week: monday
|
30
|
+
diff: 8
|
31
|
+
mask: '%Y-%m-%d'
|
32
|
+
last:
|
33
|
+
- date_diff_dow
|
34
|
+
- day_of_week: monday
|
35
|
+
diff: 2
|
36
|
+
mask: '%Y-%m-%d'
|
37
|
+
```
|
38
|
+
|
39
|
+
"""
|
40
|
+
import asyncio
|
41
|
+
from collections.abc import Callable
|
42
|
+
import pandas as pd
|
43
|
+
from asyncdb.exceptions import NoDataFound
|
44
|
+
from querysource.queries import MultiQS
|
45
|
+
from querysource.exceptions import DataNotFound as DNF
|
46
|
+
from querysource.exceptions import (
|
47
|
+
ParserError,
|
48
|
+
DriverError,
|
49
|
+
QueryException,
|
50
|
+
SlugNotFound,
|
51
|
+
)
|
52
|
+
from querysource.libs.encoders import DefaultEncoder
|
53
|
+
from querysource.types.validators import is_empty
|
54
|
+
from ..exceptions import ComponentError, DataNotFound, ConfigError
|
55
|
+
from .flow import FlowComponent
|
56
|
+
from ..interfaces.dataframes import PandasDataframe
|
57
|
+
from ..interfaces import TemplateSupport
|
58
|
+
from ..utils import SafeDict
|
59
|
+
from ..utils.transformations import to_camel_case, to_snake_case
|
60
|
+
|
61
|
+
|
62
|
+
class QS(FlowComponent, TemplateSupport, PandasDataframe):
|
63
|
+
"""
|
64
|
+
QS.
|
65
|
+
|
66
|
+
Overview
|
67
|
+
|
68
|
+
Calling Complex QuerySource operations from Flowtask.
|
69
|
+
This component supports QuerySource,
|
70
|
+
making transformations of data and returning a transformed Pandas DataFrame.
|
71
|
+
|
72
|
+
Component Syntax:
|
73
|
+
"QS": {
|
74
|
+
"query": "path to file",
|
75
|
+
"conditions": {
|
76
|
+
"firstdate": "",
|
77
|
+
"lastdate": "",
|
78
|
+
forms: [1, 2, 3, 4]
|
79
|
+
}
|
80
|
+
}
|
81
|
+
or
|
82
|
+
"QS": {
|
83
|
+
"slug": "troc_mileage"
|
84
|
+
}
|
85
|
+
|
86
|
+
.. table:: Properties
|
87
|
+
:widths: auto
|
88
|
+
|
89
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
90
|
+
| Name | Required | Summary |
|
91
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
92
|
+
| slug | Yes | The slug identifier for the query. |
|
93
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
94
|
+
| query | No | The query template file to use. |
|
95
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
96
|
+
| conditions | No | Conditions to apply to the query. |
|
97
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
98
|
+
| map | No | Dictionary for mapping or transforming the resulting DataFrame. |
|
99
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
100
|
+
| infer_types | No | If True, converts DataFrame columns to appropriate dtypes. Default is False. |
|
101
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
102
|
+
| to_string | No | If True, converts DataFrame columns to string dtype. Default is True. |
|
103
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
104
|
+
| use_template | No | If True, use a query template for the query. Default is True. |
|
105
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
106
|
+
|
107
|
+
Returns
|
108
|
+
|
109
|
+
This component returns a pandas DataFrame containing the queried and transformed data.
|
110
|
+
|
111
|
+
""" # noqa
|
112
|
+
use_template: bool = True
|
113
|
+
|
114
|
+
def __init__(
|
115
|
+
self,
|
116
|
+
loop: asyncio.AbstractEventLoop = None,
|
117
|
+
job: Callable = None,
|
118
|
+
stat: Callable = None,
|
119
|
+
**kwargs,
|
120
|
+
):
|
121
|
+
"""Init Method."""
|
122
|
+
self.slug: str = None
|
123
|
+
self._kwargs: dict = {}
|
124
|
+
self.to_string: bool = True
|
125
|
+
self._queries: dict = {}
|
126
|
+
self._files: dict = {}
|
127
|
+
self._options: dict = {}
|
128
|
+
self.conditions: dict = {}
|
129
|
+
super().__init__(loop=loop, job=job, stat=stat, **kwargs)
|
130
|
+
self._program_tpl = kwargs.get('program', self._program)
|
131
|
+
self._encoder = DefaultEncoder()
|
132
|
+
|
133
|
+
async def start(self, **kwargs):
|
134
|
+
if self.previous:
|
135
|
+
self.data = self.input
|
136
|
+
## define conditions:
|
137
|
+
if self.conditions:
|
138
|
+
self.set_conditions()
|
139
|
+
# Processing Masks
|
140
|
+
if hasattr(self, "masks"):
|
141
|
+
for key, val in self.conditions.items():
|
142
|
+
print('QS KEY :', key, ' Value :', val, ' Masks: ', self._mask)
|
143
|
+
if key in self._variables:
|
144
|
+
self.conditions[key] = self._variables[key]
|
145
|
+
elif key in self._mask:
|
146
|
+
self.conditions[key] = self.mask_replacement(val)
|
147
|
+
elif isinstance(val, str):
|
148
|
+
if val in self._mask:
|
149
|
+
self.conditions[key] = self.mask_replacement(val)
|
150
|
+
else:
|
151
|
+
value = val.format_map(
|
152
|
+
SafeDict(**self._mask)
|
153
|
+
)
|
154
|
+
self.conditions[key] = value
|
155
|
+
if 'program' in self.conditions:
|
156
|
+
del self.conditions['program']
|
157
|
+
if hasattr(self, "query"):
|
158
|
+
query = await self.open_templatefile(
|
159
|
+
self.query,
|
160
|
+
program=self._program_tpl,
|
161
|
+
from_templates_dir=self.from_templates_dir,
|
162
|
+
**self.conditions
|
163
|
+
)
|
164
|
+
if not query:
|
165
|
+
raise ComponentError(
|
166
|
+
f"Empty Query on Template {self.query}"
|
167
|
+
)
|
168
|
+
try:
|
169
|
+
slug_data = self._encoder.load(query)
|
170
|
+
self._logger.notice(
|
171
|
+
f" :: Query :: {slug_data}"
|
172
|
+
)
|
173
|
+
self._options = slug_data
|
174
|
+
self._queries = slug_data.get('queries', {})
|
175
|
+
self._files = slug_data.get('files', {})
|
176
|
+
except Exception as exc:
|
177
|
+
raise ComponentError(
|
178
|
+
f"Unable to decode JSON from Query {query}: {exc}"
|
179
|
+
) from exc
|
180
|
+
|
181
|
+
def from_dict(self, result):
|
182
|
+
if not result:
|
183
|
+
self._variables["_numRows_"] = 0
|
184
|
+
self._variables[f"{self.StepName}_NUMROWS"] = 0
|
185
|
+
raise NoDataFound("Data Not Found")
|
186
|
+
try:
|
187
|
+
df = pd.DataFrame.from_dict(result, orient="columns")
|
188
|
+
df.infer_objects()
|
189
|
+
if hasattr(self, "infer_types"):
|
190
|
+
df = df.convert_dtypes(convert_string=self.to_string)
|
191
|
+
if self._debug:
|
192
|
+
print(df)
|
193
|
+
print("::: Printing Column Information === ")
|
194
|
+
columns = list(df.columns)
|
195
|
+
for column in columns:
|
196
|
+
t = df[column].dtype
|
197
|
+
print(column, "->", t, "->", df[column].iloc[0])
|
198
|
+
self._variables["_numRows_"] = len(df.index)
|
199
|
+
self._variables[f"{self.StepName}_NUMROWS"] = len(df.index)
|
200
|
+
return df
|
201
|
+
except Exception as err:
|
202
|
+
self._logger.error(f"{self._driver}: Error Creating Dataframe {err!s}")
|
203
|
+
|
204
|
+
async def run(self):
|
205
|
+
try:
|
206
|
+
qs = MultiQS(
|
207
|
+
slug=self.slug,
|
208
|
+
queries=self._queries,
|
209
|
+
files=self._files,
|
210
|
+
query=self._options
|
211
|
+
)
|
212
|
+
result, _ = await qs.query()
|
213
|
+
if is_empty(result):
|
214
|
+
raise DataNotFound(
|
215
|
+
"Data Not Found"
|
216
|
+
)
|
217
|
+
self._result = result
|
218
|
+
except DNF as dnf:
|
219
|
+
raise DataNotFound(
|
220
|
+
f"Data Not Found in QS: {dnf}",
|
221
|
+
)
|
222
|
+
except SlugNotFound as snf:
|
223
|
+
raise ConfigError(
|
224
|
+
f"Slug Not Found: {snf}",
|
225
|
+
)
|
226
|
+
except ParserError as pe:
|
227
|
+
raise ConfigError(
|
228
|
+
f"Error parsing Query Slug: {pe}"
|
229
|
+
)
|
230
|
+
except (QueryException, DriverError) as qe:
|
231
|
+
raise ComponentError(
|
232
|
+
f"Query Error: {qe}"
|
233
|
+
)
|
234
|
+
# Mapping:
|
235
|
+
if hasattr(self, "map"):
|
236
|
+
# transforming dataframe using a Map or auto-map:
|
237
|
+
if "auto" in self.map:
|
238
|
+
# auto-mapping:
|
239
|
+
_case = self.map.get("case", "snake")
|
240
|
+
if _case == "snake":
|
241
|
+
self._result = self._result.rename(columns=to_snake_case)
|
242
|
+
elif _case == "camel":
|
243
|
+
self._result = self._result.rename(columns=to_camel_case)
|
244
|
+
else:
|
245
|
+
self._logger.warning(f"QS Map: Unsupported Map Case {_case}")
|
246
|
+
else:
|
247
|
+
raise NotImplementedError(
|
248
|
+
"QS Map: Not Implemented Yet."
|
249
|
+
)
|
250
|
+
numrows = len(self._result.index)
|
251
|
+
self.add_metric("NUMROWS", numrows)
|
252
|
+
self.add_metric('COLUMNS', self._result.columns.tolist())
|
253
|
+
self.add_metric('ROWS', numrows)
|
254
|
+
if self._debug is True:
|
255
|
+
print("::: Printing Column Information === ")
|
256
|
+
for column, t in self._result.dtypes.items():
|
257
|
+
print(column, "->", t, "->", self._result[column].iloc[0])
|
258
|
+
return self._result
|
259
|
+
|
260
|
+
async def close(self):
|
261
|
+
"""Closing QS Object."""
|
@@ -0,0 +1,201 @@
|
|
1
|
+
"""
|
2
|
+
QuerySource.
|
3
|
+
QSBase is a new kind of component supporting the new sources for
|
4
|
+
QuerySource and making transformations of data, returning a transformed
|
5
|
+
Pandas DataFrame.
|
6
|
+
"""
|
7
|
+
import asyncio
|
8
|
+
import re
|
9
|
+
import importlib
|
10
|
+
from collections.abc import Callable
|
11
|
+
import pandas as pd
|
12
|
+
from querysource.exceptions import DataNotFound as DNF
|
13
|
+
from querysource import conf
|
14
|
+
from asyncdb.exceptions import NoDataFound
|
15
|
+
from ..exceptions import ComponentError, DataNotFound
|
16
|
+
from .flow import FlowComponent
|
17
|
+
from ..interfaces.dataframes import PandasDataframe
|
18
|
+
from ..utils.transformations import to_camel_case, to_snake_case
|
19
|
+
|
20
|
+
|
21
|
+
class QSBase(FlowComponent, PandasDataframe):
|
22
|
+
"""
|
23
|
+
QSBase
|
24
|
+
|
25
|
+
Overview
|
26
|
+
|
27
|
+
This component is a helper to build components extending from QuerySource,
|
28
|
+
providing functionality to query data sources and
|
29
|
+
convert the results into pandas DataFrames.
|
30
|
+
|
31
|
+
.. table:: Properties
|
32
|
+
:widths: auto
|
33
|
+
|
34
|
+
|
35
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
36
|
+
| Name | Required | Summary |
|
37
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
38
|
+
| type | Yes | The type of query or operation to perform. |
|
39
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
40
|
+
| pattern | No | The pattern to use for setting attributes. |
|
41
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
42
|
+
| conditions | No | Conditions to apply to the query. |
|
43
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
44
|
+
| map | No | Dictionary for mapping or transforming the resulting DataFrame. |
|
45
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
46
|
+
| infer_types | No | If True, converts DataFrame columns to appropriate dtypes. Default is False. |
|
47
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
48
|
+
| to_string | No | If True, converts DataFrame columns to string dtype. Default is True. |
|
49
|
+
+------------------------+----------+-----------+------------------------------------------------------------------+
|
50
|
+
|
51
|
+
Returns
|
52
|
+
|
53
|
+
This component returns a pandas DataFrame containing the queried data. If multiple data sets are retrieved,
|
54
|
+
it returns a dictionary of DataFrames.
|
55
|
+
""" # noqa
|
56
|
+
|
57
|
+
type: str = "None"
|
58
|
+
_driver: str = "QSBase"
|
59
|
+
|
60
|
+
def __init__(
|
61
|
+
self,
|
62
|
+
loop: asyncio.AbstractEventLoop = None,
|
63
|
+
job: Callable = None,
|
64
|
+
stat: Callable = None,
|
65
|
+
**kwargs,
|
66
|
+
):
|
67
|
+
"""Init Method."""
|
68
|
+
self._qs: Callable = None
|
69
|
+
self._kwargs: dict = {}
|
70
|
+
self.to_string: bool = True
|
71
|
+
self.type = kwargs.pop('type', None)
|
72
|
+
super().__init__(loop=loop, job=job, stat=stat, **kwargs)
|
73
|
+
|
74
|
+
async def start(self, **kwargs):
|
75
|
+
try:
|
76
|
+
self.data = self.input
|
77
|
+
except Exception:
|
78
|
+
pass
|
79
|
+
params = {"type": self.type}
|
80
|
+
if hasattr(self, "masks"):
|
81
|
+
for key, val in self._attrs.items():
|
82
|
+
if key in self._variables:
|
83
|
+
self._attrs[key] = self._variables[key]
|
84
|
+
else:
|
85
|
+
self._attrs[key] = self.mask_replacement(val)
|
86
|
+
if hasattr(self, "pattern"):
|
87
|
+
self.set_attributes("pattern")
|
88
|
+
if self._attrs:
|
89
|
+
params = {**params, **self._attrs}
|
90
|
+
self._kwargs = params
|
91
|
+
## define conditions:
|
92
|
+
if hasattr(self, "conditions"):
|
93
|
+
self.set_conditions()
|
94
|
+
self._kwargs["conditions"] = self.conditions
|
95
|
+
if self._attrs:
|
96
|
+
for k, v in self._attrs.items():
|
97
|
+
if k in self.conditions:
|
98
|
+
self.conditions[k] = v
|
99
|
+
fns = f"querysource.providers.sources.{self._driver}"
|
100
|
+
self._qs = None
|
101
|
+
try:
|
102
|
+
module = importlib.import_module(fns, package=self._driver)
|
103
|
+
# cls = getattr(module, self._driver)
|
104
|
+
# self._qs = cls(**params)
|
105
|
+
except ModuleNotFoundError:
|
106
|
+
## check if can be loaded from other place:
|
107
|
+
fns = f"querysource.plugins.sources.{self._driver}"
|
108
|
+
try:
|
109
|
+
module = importlib.import_module(fns, package=self._driver)
|
110
|
+
# cls = getattr(module, self._driver)
|
111
|
+
# self._qs = cls(**params)
|
112
|
+
except ModuleNotFoundError as err:
|
113
|
+
raise ComponentError(
|
114
|
+
f"Error importing {self._driver} module, error: {str(err)}"
|
115
|
+
) from err
|
116
|
+
except Exception as err:
|
117
|
+
raise ComponentError(
|
118
|
+
f"Error: Unknown Error on {self._driver} module, error: {str(err)}"
|
119
|
+
) from err
|
120
|
+
### returning the Component:
|
121
|
+
class_name = getattr(module, self._driver)
|
122
|
+
self._qs = class_name(**self._kwargs)
|
123
|
+
self.add_metric(
|
124
|
+
"Driver", {"driver": self._driver, "model": str(self.__class__.__name__)}
|
125
|
+
)
|
126
|
+
|
127
|
+
def from_dict(self, result):
|
128
|
+
if not result:
|
129
|
+
self._variables["_numRows_"] = 0
|
130
|
+
self._variables[f"{self.StepName}_NUMROWS"] = 0
|
131
|
+
raise NoDataFound("Data Not Found")
|
132
|
+
try:
|
133
|
+
df = pd.DataFrame.from_dict(result, orient="columns")
|
134
|
+
df.infer_objects()
|
135
|
+
if hasattr(self, "infer_types"):
|
136
|
+
df = df.convert_dtypes(convert_string=self.to_string)
|
137
|
+
if self._debug:
|
138
|
+
print(df)
|
139
|
+
print("::: Printing Column Information === ")
|
140
|
+
columns = list(df.columns)
|
141
|
+
for column in columns:
|
142
|
+
t = df[column].dtype
|
143
|
+
print(column, "->", t, "->", df[column].iloc[0])
|
144
|
+
self._variables["_numRows_"] = len(df.index)
|
145
|
+
self._variables[f"{self.StepName}_NUMROWS"] = len(df.index)
|
146
|
+
return df
|
147
|
+
except Exception as err:
|
148
|
+
self._logger.error(f"{self._driver}: Error Creating Dataframe {err!s}")
|
149
|
+
|
150
|
+
async def run(self):
|
151
|
+
if hasattr(self, self.type):
|
152
|
+
fn = getattr(self, self.type)
|
153
|
+
elif hasattr(self._qs, self.type):
|
154
|
+
fn = getattr(self._qs, self.type)
|
155
|
+
else:
|
156
|
+
fn = getattr(self._qs, "query")
|
157
|
+
if callable(fn):
|
158
|
+
result = await fn()
|
159
|
+
try:
|
160
|
+
if isinstance(result, pd.DataFrame):
|
161
|
+
self._result = result
|
162
|
+
elif isinstance(result, dict):
|
163
|
+
self._result = {}
|
164
|
+
# is a list of results, several dataframes at once
|
165
|
+
for key, res in result.items():
|
166
|
+
df = await self.create_dataframe(res)
|
167
|
+
self._result[key] = df
|
168
|
+
else:
|
169
|
+
df = await self.create_dataframe(result)
|
170
|
+
if df is None or df.empty:
|
171
|
+
self._result = pd.DataFrame([])
|
172
|
+
self._result = df
|
173
|
+
except DataNotFound:
|
174
|
+
raise
|
175
|
+
except (NoDataFound, DNF) as err:
|
176
|
+
raise DataNotFound(f"QS Data not Found: {err}") from err
|
177
|
+
except Exception as err:
|
178
|
+
self._logger.exception(err)
|
179
|
+
raise ComponentError(f"{err!s}") from err
|
180
|
+
else:
|
181
|
+
raise ComponentError(
|
182
|
+
f"{self._driver}: Cannot run Method {fn!s}"
|
183
|
+
)
|
184
|
+
# Mapping:
|
185
|
+
if hasattr(self, "map"):
|
186
|
+
# transforming dataframe using a Map or auto-map:
|
187
|
+
if "auto" in self.map:
|
188
|
+
# auto-mapping:
|
189
|
+
_case = self.map.get("case", "snake")
|
190
|
+
if _case == "snake":
|
191
|
+
self._result = self._result.rename(columns=to_snake_case)
|
192
|
+
elif _case == "camel":
|
193
|
+
self._result = self._result.rename(columns=to_camel_case)
|
194
|
+
else:
|
195
|
+
self._logger.warning(f"QS Map: Unsupported Map Case {_case}")
|
196
|
+
numrows = len(self._result.index)
|
197
|
+
self.add_metric("NUMROWS", numrows)
|
198
|
+
return self._result
|
199
|
+
|
200
|
+
async def close(self):
|
201
|
+
"""Closing QS Object."""
|