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,64 @@
|
|
1
|
+
from typing import Any, Union, List, Dict
|
2
|
+
import orjson
|
3
|
+
from pyecharts.charts import Pie
|
4
|
+
from borax.datasets.fetch import fetch
|
5
|
+
import pyecharts.options as opts
|
6
|
+
from .base import baseChart
|
7
|
+
|
8
|
+
|
9
|
+
class pieChart(baseChart):
|
10
|
+
rosetype: str = "radius"
|
11
|
+
formatter: str = "{b}: {c} / {d}%"
|
12
|
+
|
13
|
+
def __init__(self, title: str, data: Union[List, Dict], **kwargs):
|
14
|
+
if "rosetype" in kwargs:
|
15
|
+
self.rosetype = kwargs["rosetype"]
|
16
|
+
del kwargs["rosetype"]
|
17
|
+
super(pieChart, self).__init__(title, data, **kwargs)
|
18
|
+
|
19
|
+
def get_chart(self):
|
20
|
+
return Pie(init_opts=self.init_opts)
|
21
|
+
|
22
|
+
def set_chart(self, data: Any, title: str, **kwargs):
|
23
|
+
# x, y = Base.cast(o_data)
|
24
|
+
dst = self._encoder(data)
|
25
|
+
dst = orjson.loads(dst)
|
26
|
+
# print('DATA ', dst)
|
27
|
+
if isinstance(dst, dict):
|
28
|
+
names, values = zip(*dst.items())
|
29
|
+
else:
|
30
|
+
names, values = fetch(dst, *self._fields)
|
31
|
+
self.args["data_pair"] = [list(z) for z in zip(names, values)]
|
32
|
+
# add arguments:
|
33
|
+
self.chart.add(series_name="", **self.args).set_global_opts(
|
34
|
+
**self.get_global_opts(title, **kwargs)
|
35
|
+
).set_series_opts(**self.get_series_opts(**kwargs))
|
36
|
+
|
37
|
+
def get_basic_args(self, **kwargs):
|
38
|
+
return {
|
39
|
+
"radius": "55%",
|
40
|
+
"center": ["50%", "50%"],
|
41
|
+
# "rosetype": self.rosetype
|
42
|
+
}
|
43
|
+
|
44
|
+
def get_series_opts(self, **kwargs):
|
45
|
+
return {
|
46
|
+
"label_opts": opts.LabelOpts(
|
47
|
+
position="outside",
|
48
|
+
# formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
|
49
|
+
formatter=self.formatter,
|
50
|
+
is_show=True,
|
51
|
+
)
|
52
|
+
}
|
53
|
+
|
54
|
+
def get_global_opts(self, title: str, **kwargs):
|
55
|
+
return {
|
56
|
+
"title_opts": opts.TitleOpts(
|
57
|
+
title=title,
|
58
|
+
pos_left="center",
|
59
|
+
pos_top="0",
|
60
|
+
),
|
61
|
+
"legend_opts": opts.LegendOpts(
|
62
|
+
is_show=True, pos_left="center", pos_bottom="20"
|
63
|
+
),
|
64
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
""" Utilities and Functions."""
|
2
|
+
from aiohttp import TCPConnector, ClientSession
|
3
|
+
|
4
|
+
|
5
|
+
async def get_json_data(url: str) -> dict:
|
6
|
+
"""Get a JSON data from a remote Source."""
|
7
|
+
async with ClientSession(connector=TCPConnector(ssl=False)) as session:
|
8
|
+
async with session.get(url=url) as response:
|
9
|
+
return await response.json()
|
@@ -0,0 +1,196 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
import asyncio
|
3
|
+
from typing import Any
|
4
|
+
# Bot Infraestructure:
|
5
|
+
from parrot.bots.basic import BasicBot
|
6
|
+
from .flow import FlowComponent
|
7
|
+
from ..exceptions import ComponentError, ConfigError
|
8
|
+
from ..conf import TASK_STORAGES
|
9
|
+
|
10
|
+
class CustomerSatisfaction(FlowComponent):
|
11
|
+
"""
|
12
|
+
CustomerSatisfaction
|
13
|
+
|
14
|
+
Overview
|
15
|
+
|
16
|
+
The CustomerSatisfaction class is a component for interacting with an IA Agent for making Customer Satisfaction Analysis.
|
17
|
+
It extends the FlowComponent class.
|
18
|
+
|
19
|
+
.. table:: Properties
|
20
|
+
:widths: auto
|
21
|
+
|
22
|
+
+------------------+----------+--------------------------------------------------------------------------------------------------+
|
23
|
+
| Name | Required | Description |
|
24
|
+
+------------------+----------+--------------------------------------------------------------------------------------------------+
|
25
|
+
| output_column | Yes | Column for saving the Customer Satisfaction information. |
|
26
|
+
+------------------+----------+--------------------------------------------------------------------------------------------------+
|
27
|
+
Return
|
28
|
+
|
29
|
+
A Pandas Dataframe with the Customer Satisfaction statistics.
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
Example:
|
34
|
+
|
35
|
+
```yaml
|
36
|
+
CustomerSatisfaction:
|
37
|
+
llm:
|
38
|
+
name: VertexLLM
|
39
|
+
model_name: gemini-1.5-pro
|
40
|
+
temperature: 0.4
|
41
|
+
review_column: review
|
42
|
+
product_column: product_name
|
43
|
+
columns:
|
44
|
+
- product_id
|
45
|
+
- product_name
|
46
|
+
- product_model
|
47
|
+
- product_type
|
48
|
+
- product_variant
|
49
|
+
- account_name
|
50
|
+
- picture_url
|
51
|
+
- url
|
52
|
+
output_column: customer_satisfaction
|
53
|
+
```
|
54
|
+
|
55
|
+
""" # noqa
|
56
|
+
|
57
|
+
def __init__(
|
58
|
+
self,
|
59
|
+
loop: asyncio.AbstractEventLoop = None,
|
60
|
+
job: Callable = None,
|
61
|
+
stat: Callable = None,
|
62
|
+
**kwargs,
|
63
|
+
):
|
64
|
+
super().__init__(
|
65
|
+
loop=loop, job=job, stat=stat, **kwargs
|
66
|
+
)
|
67
|
+
# System Prompt:
|
68
|
+
self.system_prompt = "Customer Satisfaction: "
|
69
|
+
self._bot_name = kwargs.get('bot_name', 'CustomerBot')
|
70
|
+
# TaskStorage
|
71
|
+
# Find in the taskstorage, the "prompts" directory.
|
72
|
+
prompt_path = self._taskstore.path.joinpath(self._program, 'prompts')
|
73
|
+
if not prompt_path.exists():
|
74
|
+
raise ConfigError(
|
75
|
+
f"{self.system_prompt} Prompts Path Not Found: {prompt_path}"
|
76
|
+
)
|
77
|
+
self.prompt_path = prompt_path
|
78
|
+
# is hardcoded to this particular Bot.
|
79
|
+
self.system_prompt_file = 'reviewbot.txt'
|
80
|
+
# Bot Object:
|
81
|
+
self._bot: Any = None
|
82
|
+
|
83
|
+
async def start(self, **kwargs):
|
84
|
+
"""
|
85
|
+
start
|
86
|
+
|
87
|
+
Overview
|
88
|
+
|
89
|
+
The start method is a method for starting the CustomerSatisfaction component.
|
90
|
+
|
91
|
+
Parameters
|
92
|
+
|
93
|
+
kwargs: dict
|
94
|
+
A dictionary containing the parameters for the CustomerSatisfaction component.
|
95
|
+
|
96
|
+
Return
|
97
|
+
|
98
|
+
True if the CustomerSatisfaction component started successfully.
|
99
|
+
|
100
|
+
"""
|
101
|
+
if self.previous:
|
102
|
+
self.data = self.input
|
103
|
+
else:
|
104
|
+
raise ComponentError(
|
105
|
+
"CustomerBot: Data Was Not Found"
|
106
|
+
)
|
107
|
+
if not self.output_column:
|
108
|
+
raise ConfigError(
|
109
|
+
"Customer Satisfaction: output_column is required"
|
110
|
+
)
|
111
|
+
# check if Prompt File exists
|
112
|
+
prompt_file = self.prompt_path.joinpath(self.system_prompt_file)
|
113
|
+
if not prompt_file.exists():
|
114
|
+
raise ConfigError(
|
115
|
+
f"{self.system_prompt} Prompt File Not Found: {prompt_file}"
|
116
|
+
)
|
117
|
+
self.system_prompt_file = prompt_file.name
|
118
|
+
# read the prompt file as text:
|
119
|
+
with open(prompt_file, 'r') as f:
|
120
|
+
self.system_prompt = f.read()
|
121
|
+
# Set the Bot:
|
122
|
+
try:
|
123
|
+
self._bot = BasicBot(
|
124
|
+
name=self._bot_name,
|
125
|
+
system_prompt=self.system_prompt,
|
126
|
+
goal="Customer Satisfaction Analysis using Reviews",
|
127
|
+
use_llm=self.llm.get('name', 'name'),
|
128
|
+
model_name=self.llm.get('model_name', "gemini-2.0-flash-001"),
|
129
|
+
)
|
130
|
+
# configure the bot:
|
131
|
+
await self._bot.configure()
|
132
|
+
except Exception as err:
|
133
|
+
raise ComponentError(
|
134
|
+
f"{self.system_prompt} Error Configuring Bot: {err}"
|
135
|
+
) from err
|
136
|
+
return True
|
137
|
+
|
138
|
+
def format_question(self, product_name, reviews):
|
139
|
+
question = f"""
|
140
|
+
Product: {product_name}
|
141
|
+
|
142
|
+
Question:
|
143
|
+
"What is the overall customer sentiment, likes and dislikes,
|
144
|
+
and what insights can be derived from these product reviews for product: {product_name}?"
|
145
|
+
|
146
|
+
Customer Reviews:
|
147
|
+
|
148
|
+
"""
|
149
|
+
for review in reviews:
|
150
|
+
question += f"* {review}\n"
|
151
|
+
return question
|
152
|
+
|
153
|
+
async def run(self):
|
154
|
+
"""
|
155
|
+
run
|
156
|
+
|
157
|
+
Overview
|
158
|
+
|
159
|
+
The run method is a method for running the CustomerSatisfaction component.
|
160
|
+
|
161
|
+
Return
|
162
|
+
|
163
|
+
A Pandas Dataframe with the Customer Satisfaction statistics.
|
164
|
+
|
165
|
+
"""
|
166
|
+
# Group reviews by product_name and aggregate them into a list
|
167
|
+
grouped = self.data.groupby(self.product_column)[self.review_column].apply(list).reset_index()
|
168
|
+
products_evaluation = {}
|
169
|
+
for _, row in grouped.iterrows():
|
170
|
+
product_name = row[self.product_column]
|
171
|
+
reviews = row[self.review_column]
|
172
|
+
formatted_question = self.format_question(product_name, reviews)
|
173
|
+
result = await self._bot.question(
|
174
|
+
question=formatted_question,
|
175
|
+
return_docs=False
|
176
|
+
)
|
177
|
+
products_evaluation[product_name] = {
|
178
|
+
"answer": result.answer
|
179
|
+
}
|
180
|
+
# Then, create a dataframe only with the columns in "self.columns" grouped.
|
181
|
+
grouped_df = self.data.groupby(self.columns).agg(
|
182
|
+
num_reviews=(self.review_column, "count"),
|
183
|
+
avg_rating=("rating", "mean")
|
184
|
+
).reset_index()
|
185
|
+
# Add the Customer Satisfaction column, using the dictionary and match per product_name column
|
186
|
+
grouped_df[self.output_column] = grouped_df[self.product_column].map(
|
187
|
+
lambda x: products_evaluation[x]['answer']
|
188
|
+
)
|
189
|
+
# Remove the starting ```json and ending ``` using a regex
|
190
|
+
grouped_df[self.output_column] = grouped_df[self.output_column].str.replace(r'^```json\s*|\s*```$', '', regex=True)
|
191
|
+
# return the grouped dataframe
|
192
|
+
self._result = grouped_df
|
193
|
+
return self._result
|
194
|
+
|
195
|
+
async def close(self):
|
196
|
+
pass
|
@@ -0,0 +1,200 @@
|
|
1
|
+
import asyncio
|
2
|
+
from typing import Dict, List
|
3
|
+
from collections.abc import Callable
|
4
|
+
from navconfig.logging import logging
|
5
|
+
from asyncdb.exceptions import ProviderError
|
6
|
+
from ..exceptions import DataNotFound, ComponentError
|
7
|
+
from ..conf import TASK_PATH
|
8
|
+
from .flow import FlowComponent
|
9
|
+
from .DbClient import DbClient
|
10
|
+
from ..interfaces import TemplateSupport
|
11
|
+
|
12
|
+
|
13
|
+
class DataInput(DbClient, FlowComponent, TemplateSupport):
|
14
|
+
"""
|
15
|
+
DataInput
|
16
|
+
|
17
|
+
Class to execute queries against a database and retrieve results using asyncDB.
|
18
|
+
|
19
|
+
Inherits from both `DbClient` (for database connection management) and
|
20
|
+
`FlowComponent` (for component lifecycle management).
|
21
|
+
|
22
|
+
.. table:: Properties
|
23
|
+
:widths: auto
|
24
|
+
|
25
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
26
|
+
| Name | Required | Description |
|
27
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
28
|
+
| driver | Yes | asyncDB driver to use (defaults to "pg" for PostgreSQL). |
|
29
|
+
| | | Can be overridden by a "driver" key in the "credentials" dictionary. |
|
30
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
31
|
+
| credentials | Yes | Dictionary containing database connection credentials (user, password, etc.).|
|
32
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
33
|
+
| query | Yes | SQL query or queries to be executed. Can be provided in different formats: |
|
34
|
+
| | | * String (single query) |
|
35
|
+
| | | * List (multiple queries) |
|
36
|
+
| | | * Dictionary (named queries) - key-value pairs where key is the query name |
|
37
|
+
| | | and value is the query string. |
|
38
|
+
| | | If not provided, no queries will be executed. |
|
39
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
40
|
+
| file | Yes | Path to a file containing a single or multiple SQL queries (alternative to |
|
41
|
+
| | | `query`). |
|
42
|
+
| | | If provided along with `query`, `file` takes precedence. |
|
43
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
44
|
+
| as_dataframe | No | Boolean flag indicating whether to convert query results to DataFrames. |
|
45
|
+
| | | Defaults to False (returns raw results). |
|
46
|
+
+---------------+----------+------------------------------------------------------------------------------+
|
47
|
+
|
48
|
+
.. returns::
|
49
|
+
The return value depends on the number of queries executed and the `as_dataframe` property:
|
50
|
+
* **Single Query:**
|
51
|
+
* DataFrame (if `as_dataframe` is True): Pandas DataFrame containing the query results.
|
52
|
+
* raw result object (default): Raw result object specific to the database driver.
|
53
|
+
* **Multiple Queries:**
|
54
|
+
* List[DataFrame] (if `as_dataframe` is True): List of DataFrames, each corresponding to a query result.
|
55
|
+
* List[raw result object] (default): List of raw result objects, each representing a query result.
|
56
|
+
Returns None if no queries are provided.
|
57
|
+
|
58
|
+
|
59
|
+
Example:
|
60
|
+
|
61
|
+
```yaml
|
62
|
+
DataInput:
|
63
|
+
query: SELECT * FROM xfinity.product_types
|
64
|
+
as_string: true
|
65
|
+
```
|
66
|
+
|
67
|
+
""" # noqa
|
68
|
+
_credentials: dict = {
|
69
|
+
"host": str,
|
70
|
+
"port": int,
|
71
|
+
"user": str,
|
72
|
+
"password": str,
|
73
|
+
"database": str,
|
74
|
+
}
|
75
|
+
|
76
|
+
def __init__(
|
77
|
+
self,
|
78
|
+
loop: asyncio.AbstractEventLoop = None,
|
79
|
+
job: Callable = None,
|
80
|
+
stat: Callable = None,
|
81
|
+
**kwargs,
|
82
|
+
):
|
83
|
+
self.queries: List = []
|
84
|
+
self.driver = kwargs.pop('driver', "pg") # default driver
|
85
|
+
kwargs['driver'] = self.driver
|
86
|
+
# Extract tablename and schema from arguments:
|
87
|
+
self._tablename: str = kwargs.pop('tablename', None)
|
88
|
+
self._schema: str = kwargs.pop('schema', None)
|
89
|
+
# MongoDB related:
|
90
|
+
self._dbtype: str = kwargs.pop('dbtype', 'mongodb')
|
91
|
+
super().__init__(
|
92
|
+
loop=loop,
|
93
|
+
job=job,
|
94
|
+
stat=stat,
|
95
|
+
**kwargs
|
96
|
+
)
|
97
|
+
if self.credentials and "driver" in self.credentials:
|
98
|
+
self.driver = self.credentials.pop('driver')
|
99
|
+
|
100
|
+
async def start(self, **kwargs) -> bool:
|
101
|
+
await super(DataInput, self).start(**kwargs)
|
102
|
+
self.queries = []
|
103
|
+
if hasattr(self, "query"):
|
104
|
+
if isinstance(self.query, str): # sigle query # pylint: disable=E0203
|
105
|
+
self.query = self.mask_replacement(self.query)
|
106
|
+
self.queries.append(self.query)
|
107
|
+
elif isinstance(self.query, list): # multiple queries:
|
108
|
+
for query in self.query:
|
109
|
+
query = self.mask_replacement(query)
|
110
|
+
self.queries.append(query)
|
111
|
+
elif isinstance(self.query, dict): # named queries:
|
112
|
+
for name, query in self.query.items():
|
113
|
+
qs = {}
|
114
|
+
query = self.mask_replacement(query)
|
115
|
+
qs[name] = query
|
116
|
+
self.queries.append(qs)
|
117
|
+
elif hasattr(self, "file"): # query from a File
|
118
|
+
if isinstance(self.file, str): # sigle query
|
119
|
+
self._logger.debug(f"Execute SQL File: {self.file!s}")
|
120
|
+
file_path = TASK_PATH.joinpath(self._program, "sql", self.file)
|
121
|
+
qs = await self.open_sqlfile(file_path)
|
122
|
+
self.queries.append(qs)
|
123
|
+
elif isinstance(self.file, list): # multiple queries:
|
124
|
+
for file in self.file:
|
125
|
+
query = await self.open_sqlfile(file)
|
126
|
+
self.queries.append(qs)
|
127
|
+
else:
|
128
|
+
# are queries based on conditions over direct tables:
|
129
|
+
if self.driver == 'mongo':
|
130
|
+
self.queries.append(
|
131
|
+
{
|
132
|
+
"collection": self._tablename,
|
133
|
+
"database": self._schema,
|
134
|
+
}
|
135
|
+
)
|
136
|
+
return True
|
137
|
+
|
138
|
+
async def close(self):
|
139
|
+
self.connection = None
|
140
|
+
|
141
|
+
async def run(self):
|
142
|
+
try:
|
143
|
+
print(self.driver, self.credentials)
|
144
|
+
db = await self.connection(
|
145
|
+
driver=self.driver, credentials=self.credentials
|
146
|
+
)
|
147
|
+
print('DB > ', db)
|
148
|
+
except Exception as e:
|
149
|
+
logging.error(e)
|
150
|
+
raise
|
151
|
+
try:
|
152
|
+
async with await db.connection() as conn:
|
153
|
+
if conn.is_connected() is not True:
|
154
|
+
raise ComponentError(
|
155
|
+
f"DB Error: driver {self.driver} is not connected."
|
156
|
+
)
|
157
|
+
results = []
|
158
|
+
for query in self.queries:
|
159
|
+
print('QUERY > ', query, type(query))
|
160
|
+
if isinstance(query, str):
|
161
|
+
result = await self._query(query, conn)
|
162
|
+
rst = len(result)
|
163
|
+
st = {"query": query, "result": rst}
|
164
|
+
self.add_metric(f"Query: {query}", st)
|
165
|
+
if self.as_dataframe is True:
|
166
|
+
# converting to a dataframe
|
167
|
+
df = await self.get_dataframe(result)
|
168
|
+
results.append(df)
|
169
|
+
else:
|
170
|
+
results.append(result)
|
171
|
+
elif isinstance(query, dict):
|
172
|
+
result = await self._query(query, conn)
|
173
|
+
if self.as_dataframe is True:
|
174
|
+
df = await self.get_dataframe(result)
|
175
|
+
results.append(df)
|
176
|
+
else:
|
177
|
+
results.append(result)
|
178
|
+
# qs = {}
|
179
|
+
# [(key, value)] = query.items()
|
180
|
+
# result = await self._query(value, conn)
|
181
|
+
# rst = len(result)
|
182
|
+
# st = {"query": query, "result": rst}
|
183
|
+
# self.add_metric(f"Query: {key}", st)
|
184
|
+
# if self.as_dataframe is True:
|
185
|
+
# df = await self.get_dataframe(result)
|
186
|
+
# qs[key] = df
|
187
|
+
# else:
|
188
|
+
# qs[key] = result
|
189
|
+
if len(results) == 1:
|
190
|
+
self._result = results[0]
|
191
|
+
else:
|
192
|
+
self._result = results
|
193
|
+
return self._result
|
194
|
+
except DataNotFound:
|
195
|
+
raise
|
196
|
+
except ProviderError as e:
|
197
|
+
raise ComponentError(f"Error connecting to database: {e}") from e
|
198
|
+
except Exception as e:
|
199
|
+
logging.error(e)
|
200
|
+
raise
|