flowtask 5.8.4__cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flowtask/__init__.py +93 -0
- flowtask/__main__.py +38 -0
- flowtask/bots/__init__.py +6 -0
- flowtask/bots/check.py +93 -0
- flowtask/bots/codebot.py +51 -0
- flowtask/components/ASPX.py +148 -0
- flowtask/components/AddDataset.py +352 -0
- flowtask/components/Amazon.py +523 -0
- flowtask/components/AutoTask.py +314 -0
- flowtask/components/Azure.py +80 -0
- flowtask/components/AzureUsers.py +106 -0
- flowtask/components/BaseAction.py +91 -0
- flowtask/components/BaseLoop.py +198 -0
- flowtask/components/BestBuy.py +800 -0
- flowtask/components/CSVToGCS.py +120 -0
- flowtask/components/CompanyScraper/__init__.py +1 -0
- flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
- flowtask/components/CompanyScraper/parsers/base.py +102 -0
- flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
- flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
- flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
- flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
- flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
- flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
- flowtask/components/CompanyScraper/scrapper.py +1054 -0
- flowtask/components/CopyTo.py +177 -0
- flowtask/components/CopyToBigQuery.py +243 -0
- flowtask/components/CopyToMongoDB.py +291 -0
- flowtask/components/CopyToPg.py +609 -0
- flowtask/components/CopyToRethink.py +207 -0
- flowtask/components/CreateGCSBucket.py +102 -0
- flowtask/components/CreateReport/CreateReport.py +228 -0
- flowtask/components/CreateReport/__init__.py +9 -0
- flowtask/components/CreateReport/charts/__init__.py +15 -0
- flowtask/components/CreateReport/charts/bar.py +51 -0
- flowtask/components/CreateReport/charts/base.py +66 -0
- flowtask/components/CreateReport/charts/pie.py +64 -0
- flowtask/components/CreateReport/utils.py +9 -0
- flowtask/components/CustomerSatisfaction.py +196 -0
- flowtask/components/DataInput.py +200 -0
- flowtask/components/DateList.py +255 -0
- flowtask/components/DbClient.py +163 -0
- flowtask/components/DialPad.py +146 -0
- flowtask/components/DocumentDBQuery.py +200 -0
- flowtask/components/DownloadFrom.py +371 -0
- flowtask/components/DownloadFromD2L.py +113 -0
- flowtask/components/DownloadFromFTP.py +181 -0
- flowtask/components/DownloadFromIMAP.py +315 -0
- flowtask/components/DownloadFromS3.py +198 -0
- flowtask/components/DownloadFromSFTP.py +265 -0
- flowtask/components/DownloadFromSharepoint.py +110 -0
- flowtask/components/DownloadFromSmartSheet.py +114 -0
- flowtask/components/DownloadS3File.py +229 -0
- flowtask/components/Dummy.py +59 -0
- flowtask/components/DuplicatePhoto.py +411 -0
- flowtask/components/EmployeeEvaluation.py +237 -0
- flowtask/components/ExecuteSQL.py +323 -0
- flowtask/components/ExtractHTML.py +178 -0
- flowtask/components/FileBase.py +178 -0
- flowtask/components/FileCopy.py +181 -0
- flowtask/components/FileDelete.py +82 -0
- flowtask/components/FileExists.py +146 -0
- flowtask/components/FileIteratorDelete.py +112 -0
- flowtask/components/FileList.py +194 -0
- flowtask/components/FileOpen.py +75 -0
- flowtask/components/FileRead.py +120 -0
- flowtask/components/FileRename.py +106 -0
- flowtask/components/FilterIf.py +284 -0
- flowtask/components/FilterRows/FilterRows.py +200 -0
- flowtask/components/FilterRows/__init__.py +10 -0
- flowtask/components/FilterRows/functions.py +4 -0
- flowtask/components/GCSToBigQuery.py +103 -0
- flowtask/components/GoogleA4.py +150 -0
- flowtask/components/GoogleGeoCoding.py +344 -0
- flowtask/components/GooglePlaces.py +315 -0
- flowtask/components/GoogleSearch.py +539 -0
- flowtask/components/HTTPClient.py +268 -0
- flowtask/components/ICIMS.py +146 -0
- flowtask/components/IF.py +179 -0
- flowtask/components/IcimsFolderCopy.py +173 -0
- flowtask/components/ImageFeatures/__init__.py +5 -0
- flowtask/components/ImageFeatures/process.py +233 -0
- flowtask/components/IteratorBase.py +251 -0
- flowtask/components/LangchainLoader/__init__.py +5 -0
- flowtask/components/LangchainLoader/loader.py +194 -0
- flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
- flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
- flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
- flowtask/components/LangchainLoader/loaders/docx.py +91 -0
- flowtask/components/LangchainLoader/loaders/html.py +119 -0
- flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
- flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
- flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
- flowtask/components/LangchainLoader/loaders/qa.py +67 -0
- flowtask/components/LangchainLoader/loaders/txt.py +55 -0
- flowtask/components/LeadIQ.py +650 -0
- flowtask/components/Loop.py +253 -0
- flowtask/components/Lowes.py +334 -0
- flowtask/components/MS365Usage.py +156 -0
- flowtask/components/MSTeamsMessages.py +320 -0
- flowtask/components/MarketClustering.py +1051 -0
- flowtask/components/MergeFiles.py +362 -0
- flowtask/components/MilvusOutput.py +87 -0
- flowtask/components/NearByStores.py +175 -0
- flowtask/components/NetworkNinja/__init__.py +6 -0
- flowtask/components/NetworkNinja/models/__init__.py +52 -0
- flowtask/components/NetworkNinja/models/abstract.py +177 -0
- flowtask/components/NetworkNinja/models/account.py +39 -0
- flowtask/components/NetworkNinja/models/client.py +19 -0
- flowtask/components/NetworkNinja/models/district.py +14 -0
- flowtask/components/NetworkNinja/models/events.py +101 -0
- flowtask/components/NetworkNinja/models/forms.py +499 -0
- flowtask/components/NetworkNinja/models/market.py +16 -0
- flowtask/components/NetworkNinja/models/organization.py +34 -0
- flowtask/components/NetworkNinja/models/photos.py +125 -0
- flowtask/components/NetworkNinja/models/project.py +44 -0
- flowtask/components/NetworkNinja/models/region.py +28 -0
- flowtask/components/NetworkNinja/models/store.py +203 -0
- flowtask/components/NetworkNinja/models/user.py +151 -0
- flowtask/components/NetworkNinja/router.py +854 -0
- flowtask/components/Odoo.py +175 -0
- flowtask/components/OdooInjector.py +192 -0
- flowtask/components/OpenFromXML.py +126 -0
- flowtask/components/OpenWeather.py +41 -0
- flowtask/components/OpenWithBase.py +616 -0
- flowtask/components/OpenWithPandas.py +715 -0
- flowtask/components/PGPDecrypt.py +199 -0
- flowtask/components/PandasIterator.py +187 -0
- flowtask/components/PandasToFile.py +189 -0
- flowtask/components/Paradox.py +339 -0
- flowtask/components/ParamIterator.py +117 -0
- flowtask/components/ParseHTML.py +84 -0
- flowtask/components/PlacerStores.py +249 -0
- flowtask/components/Pokemon.py +507 -0
- flowtask/components/PositiveBot.py +62 -0
- flowtask/components/PowerPointSlide.py +400 -0
- flowtask/components/PrintMessage.py +127 -0
- flowtask/components/ProductCompetitors/__init__.py +5 -0
- flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
- flowtask/components/ProductCompetitors/parsers/base.py +72 -0
- flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
- flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
- flowtask/components/ProductCompetitors/scrapper.py +155 -0
- flowtask/components/ProductCompliant.py +169 -0
- flowtask/components/ProductInfo/__init__.py +1 -0
- flowtask/components/ProductInfo/parsers/__init__.py +5 -0
- flowtask/components/ProductInfo/parsers/base.py +83 -0
- flowtask/components/ProductInfo/parsers/brother.py +97 -0
- flowtask/components/ProductInfo/parsers/canon.py +167 -0
- flowtask/components/ProductInfo/parsers/epson.py +118 -0
- flowtask/components/ProductInfo/parsers/hp.py +131 -0
- flowtask/components/ProductInfo/parsers/samsung.py +97 -0
- flowtask/components/ProductInfo/scraper.py +319 -0
- flowtask/components/ProductPricing.py +118 -0
- flowtask/components/QS.py +261 -0
- flowtask/components/QSBase.py +201 -0
- flowtask/components/QueryIterator.py +273 -0
- flowtask/components/QueryToInsert.py +327 -0
- flowtask/components/QueryToPandas.py +432 -0
- flowtask/components/RESTClient.py +195 -0
- flowtask/components/RethinkDBQuery.py +189 -0
- flowtask/components/Rsync.py +74 -0
- flowtask/components/RunSSH.py +59 -0
- flowtask/components/RunShell.py +71 -0
- flowtask/components/SalesForce.py +20 -0
- flowtask/components/SaveImageBank/__init__.py +257 -0
- flowtask/components/SchedulingVisits.py +592 -0
- flowtask/components/ScrapPage.py +216 -0
- flowtask/components/ScrapSearch.py +79 -0
- flowtask/components/SendNotify.py +257 -0
- flowtask/components/SentimentAnalysis.py +694 -0
- flowtask/components/ServiceScrapper/__init__.py +5 -0
- flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
- flowtask/components/ServiceScrapper/parsers/base.py +94 -0
- flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
- flowtask/components/ServiceScrapper/scrapper.py +199 -0
- flowtask/components/SetVariables.py +156 -0
- flowtask/components/SubTask.py +182 -0
- flowtask/components/SuiteCRM.py +48 -0
- flowtask/components/Switch.py +175 -0
- flowtask/components/TableBase.py +148 -0
- flowtask/components/TableDelete.py +312 -0
- flowtask/components/TableInput.py +143 -0
- flowtask/components/TableOutput/TableOutput.py +384 -0
- flowtask/components/TableOutput/__init__.py +3 -0
- flowtask/components/TableSchema.py +534 -0
- flowtask/components/Target.py +223 -0
- flowtask/components/ThumbnailGenerator.py +156 -0
- flowtask/components/ToPandas.py +67 -0
- flowtask/components/TransformRows/TransformRows.py +507 -0
- flowtask/components/TransformRows/__init__.py +9 -0
- flowtask/components/TransformRows/functions.py +559 -0
- flowtask/components/TransposeRows.py +176 -0
- flowtask/components/UPCDatabase.py +86 -0
- flowtask/components/UnGzip.py +171 -0
- flowtask/components/Uncompress.py +172 -0
- flowtask/components/UniqueRows.py +126 -0
- flowtask/components/Unzip.py +107 -0
- flowtask/components/UpdateOperationalVars.py +147 -0
- flowtask/components/UploadTo.py +299 -0
- flowtask/components/UploadToS3.py +136 -0
- flowtask/components/UploadToSFTP.py +160 -0
- flowtask/components/UploadToSharepoint.py +205 -0
- flowtask/components/UserFunc.py +122 -0
- flowtask/components/VivaTracker.py +140 -0
- flowtask/components/WSDLClient.py +123 -0
- flowtask/components/Wait.py +18 -0
- flowtask/components/Walmart.py +199 -0
- flowtask/components/Workplace.py +134 -0
- flowtask/components/XMLToPandas.py +267 -0
- flowtask/components/Zammad/__init__.py +41 -0
- flowtask/components/Zammad/models.py +0 -0
- flowtask/components/ZoomInfoScraper.py +409 -0
- flowtask/components/__init__.py +104 -0
- flowtask/components/abstract.py +18 -0
- flowtask/components/flow.py +530 -0
- flowtask/components/google.py +335 -0
- flowtask/components/group.py +221 -0
- flowtask/components/py.typed +0 -0
- flowtask/components/reviewscrap.py +132 -0
- flowtask/components/tAutoincrement.py +117 -0
- flowtask/components/tConcat.py +109 -0
- flowtask/components/tExplode.py +119 -0
- flowtask/components/tFilter.py +184 -0
- flowtask/components/tGroup.py +236 -0
- flowtask/components/tJoin.py +270 -0
- flowtask/components/tMap/__init__.py +9 -0
- flowtask/components/tMap/functions.py +54 -0
- flowtask/components/tMap/tMap.py +450 -0
- flowtask/components/tMelt.py +112 -0
- flowtask/components/tMerge.py +114 -0
- flowtask/components/tOrder.py +93 -0
- flowtask/components/tPandas.py +94 -0
- flowtask/components/tPivot.py +71 -0
- flowtask/components/tPluckCols.py +76 -0
- flowtask/components/tUnnest.py +82 -0
- flowtask/components/user.py +401 -0
- flowtask/conf.py +457 -0
- flowtask/download.py +102 -0
- flowtask/events/__init__.py +11 -0
- flowtask/events/events/__init__.py +20 -0
- flowtask/events/events/abstract.py +95 -0
- flowtask/events/events/alerts/__init__.py +362 -0
- flowtask/events/events/alerts/colfunctions.py +131 -0
- flowtask/events/events/alerts/functions.py +158 -0
- flowtask/events/events/dummy.py +12 -0
- flowtask/events/events/exec.py +124 -0
- flowtask/events/events/file/__init__.py +7 -0
- flowtask/events/events/file/base.py +51 -0
- flowtask/events/events/file/copy.py +23 -0
- flowtask/events/events/file/delete.py +16 -0
- flowtask/events/events/interfaces/__init__.py +9 -0
- flowtask/events/events/interfaces/client.py +67 -0
- flowtask/events/events/interfaces/credentials.py +28 -0
- flowtask/events/events/interfaces/notifications.py +58 -0
- flowtask/events/events/jira.py +122 -0
- flowtask/events/events/log.py +26 -0
- flowtask/events/events/logerr.py +52 -0
- flowtask/events/events/notify.py +59 -0
- flowtask/events/events/notify_event.py +160 -0
- flowtask/events/events/publish.py +54 -0
- flowtask/events/events/sendfile.py +104 -0
- flowtask/events/events/task.py +97 -0
- flowtask/events/events/teams.py +98 -0
- flowtask/events/events/webhook.py +58 -0
- flowtask/events/manager.py +287 -0
- flowtask/exceptions.c +39393 -0
- flowtask/exceptions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/extensions/__init__.py +3 -0
- flowtask/extensions/abstract.py +82 -0
- flowtask/extensions/logging/__init__.py +65 -0
- flowtask/hooks/__init__.py +9 -0
- flowtask/hooks/actions/__init__.py +22 -0
- flowtask/hooks/actions/abstract.py +66 -0
- flowtask/hooks/actions/dummy.py +23 -0
- flowtask/hooks/actions/jira.py +74 -0
- flowtask/hooks/actions/rest.py +320 -0
- flowtask/hooks/actions/sampledata.py +37 -0
- flowtask/hooks/actions/sensor.py +23 -0
- flowtask/hooks/actions/task.py +9 -0
- flowtask/hooks/actions/ticket.py +37 -0
- flowtask/hooks/actions/zammad.py +55 -0
- flowtask/hooks/hook.py +62 -0
- flowtask/hooks/models.py +17 -0
- flowtask/hooks/service.py +187 -0
- flowtask/hooks/step.py +91 -0
- flowtask/hooks/types/__init__.py +23 -0
- flowtask/hooks/types/base.py +129 -0
- flowtask/hooks/types/brokers/__init__.py +11 -0
- flowtask/hooks/types/brokers/base.py +54 -0
- flowtask/hooks/types/brokers/mqtt.py +35 -0
- flowtask/hooks/types/brokers/rabbitmq.py +82 -0
- flowtask/hooks/types/brokers/redis.py +83 -0
- flowtask/hooks/types/brokers/sqs.py +44 -0
- flowtask/hooks/types/fs.py +232 -0
- flowtask/hooks/types/http.py +49 -0
- flowtask/hooks/types/imap.py +200 -0
- flowtask/hooks/types/jira.py +279 -0
- flowtask/hooks/types/mail.py +205 -0
- flowtask/hooks/types/postgres.py +98 -0
- flowtask/hooks/types/responses/__init__.py +8 -0
- flowtask/hooks/types/responses/base.py +5 -0
- flowtask/hooks/types/sharepoint.py +288 -0
- flowtask/hooks/types/ssh.py +141 -0
- flowtask/hooks/types/tagged.py +59 -0
- flowtask/hooks/types/upload.py +85 -0
- flowtask/hooks/types/watch.py +71 -0
- flowtask/hooks/types/web.py +36 -0
- flowtask/interfaces/AzureClient.py +137 -0
- flowtask/interfaces/AzureGraph.py +839 -0
- flowtask/interfaces/Boto3Client.py +326 -0
- flowtask/interfaces/DropboxClient.py +173 -0
- flowtask/interfaces/ExcelHandler.py +94 -0
- flowtask/interfaces/FTPClient.py +131 -0
- flowtask/interfaces/GoogleCalendar.py +201 -0
- flowtask/interfaces/GoogleClient.py +133 -0
- flowtask/interfaces/GoogleDrive.py +127 -0
- flowtask/interfaces/GoogleGCS.py +89 -0
- flowtask/interfaces/GoogleGeocoding.py +93 -0
- flowtask/interfaces/GoogleLang.py +114 -0
- flowtask/interfaces/GooglePub.py +61 -0
- flowtask/interfaces/GoogleSheet.py +68 -0
- flowtask/interfaces/IMAPClient.py +137 -0
- flowtask/interfaces/O365Calendar.py +113 -0
- flowtask/interfaces/O365Client.py +220 -0
- flowtask/interfaces/OneDrive.py +284 -0
- flowtask/interfaces/Outlook.py +155 -0
- flowtask/interfaces/ParrotBot.py +130 -0
- flowtask/interfaces/SSHClient.py +378 -0
- flowtask/interfaces/Sharepoint.py +496 -0
- flowtask/interfaces/__init__.py +36 -0
- flowtask/interfaces/azureauth.py +119 -0
- flowtask/interfaces/cache.py +201 -0
- flowtask/interfaces/client.py +82 -0
- flowtask/interfaces/compress.py +525 -0
- flowtask/interfaces/credentials.py +124 -0
- flowtask/interfaces/d2l.py +239 -0
- flowtask/interfaces/databases/__init__.py +5 -0
- flowtask/interfaces/databases/db.py +223 -0
- flowtask/interfaces/databases/documentdb.py +55 -0
- flowtask/interfaces/databases/rethink.py +39 -0
- flowtask/interfaces/dataframes/__init__.py +11 -0
- flowtask/interfaces/dataframes/abstract.py +21 -0
- flowtask/interfaces/dataframes/arrow.py +71 -0
- flowtask/interfaces/dataframes/dt.py +69 -0
- flowtask/interfaces/dataframes/pandas.py +167 -0
- flowtask/interfaces/dataframes/polars.py +60 -0
- flowtask/interfaces/db.py +263 -0
- flowtask/interfaces/env.py +46 -0
- flowtask/interfaces/func.py +137 -0
- flowtask/interfaces/http.py +1780 -0
- flowtask/interfaces/locale.py +40 -0
- flowtask/interfaces/log.py +75 -0
- flowtask/interfaces/mask.py +143 -0
- flowtask/interfaces/notification.py +154 -0
- flowtask/interfaces/playwright.py +339 -0
- flowtask/interfaces/powerpoint.py +368 -0
- flowtask/interfaces/py.typed +0 -0
- flowtask/interfaces/qs.py +376 -0
- flowtask/interfaces/result.py +87 -0
- flowtask/interfaces/selenium_service.py +779 -0
- flowtask/interfaces/smartsheet.py +154 -0
- flowtask/interfaces/stat.py +39 -0
- flowtask/interfaces/task.py +96 -0
- flowtask/interfaces/template.py +118 -0
- flowtask/interfaces/vectorstores/__init__.py +1 -0
- flowtask/interfaces/vectorstores/abstract.py +133 -0
- flowtask/interfaces/vectorstores/milvus.py +669 -0
- flowtask/interfaces/zammad.py +107 -0
- flowtask/models.py +193 -0
- flowtask/parsers/__init__.py +15 -0
- flowtask/parsers/_yaml.c +11978 -0
- flowtask/parsers/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/plugins/__init__.py +16 -0
- flowtask/plugins/components/__init__.py +0 -0
- flowtask/plugins/handler/__init__.py +45 -0
- flowtask/plugins/importer.py +31 -0
- flowtask/plugins/sources/__init__.py +0 -0
- flowtask/runner.py +283 -0
- flowtask/scheduler/__init__.py +9 -0
- flowtask/scheduler/functions.py +493 -0
- flowtask/scheduler/handlers/__init__.py +8 -0
- flowtask/scheduler/handlers/manager.py +504 -0
- flowtask/scheduler/handlers/models.py +58 -0
- flowtask/scheduler/handlers/service.py +72 -0
- flowtask/scheduler/notifications.py +65 -0
- flowtask/scheduler/scheduler.py +993 -0
- flowtask/services/__init__.py +0 -0
- flowtask/services/bots/__init__.py +0 -0
- flowtask/services/bots/telegram.py +264 -0
- flowtask/services/files/__init__.py +11 -0
- flowtask/services/files/manager.py +522 -0
- flowtask/services/files/model.py +37 -0
- flowtask/services/files/service.py +767 -0
- flowtask/services/jira/__init__.py +3 -0
- flowtask/services/jira/jira_actions.py +191 -0
- flowtask/services/tasks/__init__.py +13 -0
- flowtask/services/tasks/launcher.py +213 -0
- flowtask/services/tasks/manager.py +323 -0
- flowtask/services/tasks/service.py +275 -0
- flowtask/services/tasks/task_manager.py +376 -0
- flowtask/services/tasks/tasks.py +155 -0
- flowtask/storages/__init__.py +16 -0
- flowtask/storages/exceptions.py +12 -0
- flowtask/storages/files/__init__.py +8 -0
- flowtask/storages/files/abstract.py +29 -0
- flowtask/storages/files/filesystem.py +66 -0
- flowtask/storages/tasks/__init__.py +19 -0
- flowtask/storages/tasks/abstract.py +26 -0
- flowtask/storages/tasks/database.py +33 -0
- flowtask/storages/tasks/filesystem.py +108 -0
- flowtask/storages/tasks/github.py +119 -0
- flowtask/storages/tasks/memory.py +45 -0
- flowtask/storages/tasks/row.py +25 -0
- flowtask/tasks/__init__.py +0 -0
- flowtask/tasks/abstract.py +526 -0
- flowtask/tasks/command.py +118 -0
- flowtask/tasks/pile.py +486 -0
- flowtask/tasks/py.typed +0 -0
- flowtask/tasks/task.py +778 -0
- flowtask/template/__init__.py +161 -0
- flowtask/tests.py +257 -0
- flowtask/types/__init__.py +8 -0
- flowtask/types/typedefs.c +11347 -0
- flowtask/types/typedefs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/__init__.py +24 -0
- flowtask/utils/constants.py +117 -0
- flowtask/utils/encoders.py +21 -0
- flowtask/utils/executor.py +112 -0
- flowtask/utils/functions.cpp +14280 -0
- flowtask/utils/functions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/stats.py +308 -0
- flowtask/utils/transformations.py +74 -0
- flowtask/utils/uv.py +12 -0
- flowtask/utils/validators.py +97 -0
- flowtask/version.py +11 -0
- flowtask-5.8.4.dist-info/LICENSE +201 -0
- flowtask-5.8.4.dist-info/METADATA +209 -0
- flowtask-5.8.4.dist-info/RECORD +470 -0
- flowtask-5.8.4.dist-info/WHEEL +6 -0
- flowtask-5.8.4.dist-info/entry_points.txt +3 -0
- flowtask-5.8.4.dist-info/top_level.txt +2 -0
- plugins/components/CreateQR.py +39 -0
- plugins/components/TestComponent.py +28 -0
- plugins/components/Use1.py +13 -0
- plugins/components/Workplace.py +117 -0
- plugins/components/__init__.py +3 -0
- plugins/sources/__init__.py +0 -0
- plugins/sources/get_populartimes.py +78 -0
- plugins/sources/google.py +150 -0
- plugins/sources/hubspot.py +679 -0
- plugins/sources/icims.py +679 -0
- plugins/sources/mobileinsight.py +501 -0
- plugins/sources/newrelic.py +262 -0
- plugins/sources/uap.py +268 -0
- plugins/sources/venu.py +244 -0
- plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,352 @@
|
|
1
|
+
import asyncio
|
2
|
+
from collections.abc import Callable
|
3
|
+
from pathlib import Path
|
4
|
+
import numpy as np
|
5
|
+
import pandas as pd
|
6
|
+
from asyncdb.exceptions import NoDataFound
|
7
|
+
from ..exceptions import ComponentError, DataNotFound, TaskError
|
8
|
+
from ..utils import cPrint
|
9
|
+
from .flow import FlowComponent
|
10
|
+
from ..conf import TASK_PATH
|
11
|
+
from ..interfaces import DBSupport, TemplateSupport
|
12
|
+
|
13
|
+
|
14
|
+
class AddDataset(DBSupport, FlowComponent, TemplateSupport):
|
15
|
+
"""
|
16
|
+
AddDataset Component
|
17
|
+
|
18
|
+
Overview
|
19
|
+
|
20
|
+
This component joins two pandas DataFrames based on specified criteria.
|
21
|
+
It supports various join types and handles cases where one of the DataFrames might be empty.
|
22
|
+
|
23
|
+
.. table:: Properties
|
24
|
+
:widths: auto
|
25
|
+
|
26
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
27
|
+
| Name | Required | Summary |
|
28
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
29
|
+
| fields | Yes | List of field names to retrieve from the second dataset |
|
30
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
31
|
+
| dataset | Yes | Name of the second dataset to retrieve |
|
32
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
33
|
+
| datasource | No | Source of the second dataset ("datasets" or "vision") (default: "datasets") |
|
34
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
35
|
+
| join | No | List of columns to use for joining the DataFrames |
|
36
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
37
|
+
| type | No | Type of join to perform (left, inner) (default: left) |
|
38
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
39
|
+
| no_copy | No | If True, modifies original DataFrames instead of creating a copy (default: False) |
|
40
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
41
|
+
| distinct | No | If True, retrieves distinct rows based on join columns (default: False) |
|
42
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
43
|
+
| operator | No | Operator to use for joining rows (currently only "and" supported) |
|
44
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
45
|
+
| join_with | No | List of columns for a series of left joins (if main DataFrame has unmatched rows) |
|
46
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
47
|
+
| datatypes | No | Dictionary specifying data types for columns in the second dataset |
|
48
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
49
|
+
| infer_types | No | If True, attempts to infer better data types for object columns (default: False) |
|
50
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
51
|
+
| to_string | No | If True, attempts to convert object columns to strings during data type conversion (default: True) |
|
52
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
53
|
+
| as_objects | No | If True, creates resulting DataFrame with all columns as objects (default: False) |
|
54
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
55
|
+
| drop_empty | No | If True, drops columns with only missing values after join (default: False) |
|
56
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
57
|
+
| dropna | No | List of columns to remove rows with missing values after join |
|
58
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
59
|
+
| clean_strings | No | If True, replaces missing values in object/string columns with empty strings (default: False) |
|
60
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
61
|
+
| Group | No | usually used FormData |
|
62
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
63
|
+
| skipError | No | spected = skip - Log Errors - Enforce |
|
64
|
+
+---------------------------+----------+-----------+------------------------------------------------------------------------------------------+
|
65
|
+
|
66
|
+
Returns the joined DataFrame and a metric ("JOINED_ROWS")
|
67
|
+
representing the number of rows in the result.
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
Example:
|
72
|
+
|
73
|
+
```yaml
|
74
|
+
AddDataset:
|
75
|
+
datasource: banco_chile
|
76
|
+
dataset: vw_form_metadata
|
77
|
+
distinct: true
|
78
|
+
type: left
|
79
|
+
fields:
|
80
|
+
- formid
|
81
|
+
- form_name
|
82
|
+
- column_name
|
83
|
+
- description as question
|
84
|
+
join:
|
85
|
+
- formid
|
86
|
+
- column_name
|
87
|
+
```
|
88
|
+
|
89
|
+
""" # noqa
|
90
|
+
def __init__(
|
91
|
+
self,
|
92
|
+
loop: asyncio.AbstractEventLoop = None,
|
93
|
+
job: Callable = None,
|
94
|
+
stat: Callable = None,
|
95
|
+
**kwargs,
|
96
|
+
) -> None:
|
97
|
+
"""Init Method."""
|
98
|
+
self.df1: pd.DataFrame = None
|
99
|
+
self.df2: pd.DataFrame = None
|
100
|
+
self.type: str = "left"
|
101
|
+
self._dtypes: dict = {}
|
102
|
+
self.infer_types: bool = False
|
103
|
+
self.to_string: bool = True
|
104
|
+
self.as_objects: bool = False
|
105
|
+
self.use_dataframe: bool = kwargs.pop("use_dataframe", False)
|
106
|
+
self.datasource: str = kwargs.pop("datasource", "datasets")
|
107
|
+
super().__init__(loop=loop, job=job, stat=stat, **kwargs)
|
108
|
+
self._no_warnings = True
|
109
|
+
|
110
|
+
async def start(self, **kwargs):
|
111
|
+
"""Obtain Pandas Dataframe."""
|
112
|
+
if self.previous:
|
113
|
+
self.data = self.input
|
114
|
+
try:
|
115
|
+
if self._multi:
|
116
|
+
self.df1 = self.previous[0].output()
|
117
|
+
else:
|
118
|
+
self.df1 = self.previous.output()
|
119
|
+
except IndexError as ex:
|
120
|
+
raise ComponentError("Missing LEFT Dataframe") from ex
|
121
|
+
### check info for creating the second dataset:
|
122
|
+
self.df2 = None
|
123
|
+
# check if "file_sql" exists:
|
124
|
+
if hasattr(self, "file_sql"):
|
125
|
+
file_path = Path(TASK_PATH).joinpath(self._program, "sql", self.file_sql)
|
126
|
+
if file_path.exists() and file_path.is_file():
|
127
|
+
self.query = await self.open_tmpfile(file_path)
|
128
|
+
else:
|
129
|
+
raise TaskError(
|
130
|
+
f"Missing SQL File: {file_path}"
|
131
|
+
)
|
132
|
+
elif hasattr(self, "query") and self.query:
|
133
|
+
# Check-in if query:
|
134
|
+
self.query = self.mask_replacement(
|
135
|
+
self.query
|
136
|
+
)
|
137
|
+
else:
|
138
|
+
if not hasattr(self, "fields"):
|
139
|
+
raise TaskError("Wrong Task configuration: AddDataset needs *fields* declaration.")
|
140
|
+
if not hasattr(self, "dataset"):
|
141
|
+
raise TaskError(
|
142
|
+
"Wrong Task configuration: need *dataset* name declaration."
|
143
|
+
)
|
144
|
+
if not hasattr(self, "datasource"):
|
145
|
+
self.datasource = "datasets"
|
146
|
+
await super().start(**kwargs)
|
147
|
+
self.processing_credentials()
|
148
|
+
return True
|
149
|
+
|
150
|
+
async def run(self):
|
151
|
+
args = {}
|
152
|
+
if self.df1.empty:
|
153
|
+
raise DataNotFound("Data Was Not Found on Dataframe 1")
|
154
|
+
if self.datasource in ("datasets", "vision"):
|
155
|
+
# using current datasets on pg database
|
156
|
+
connection = self.pg_connection()
|
157
|
+
else:
|
158
|
+
# TODO: add datasource logic for discovering external data.
|
159
|
+
connection = self.pg_connection()
|
160
|
+
try:
|
161
|
+
### TODO: instrumentation for getting dataset from different sources
|
162
|
+
async with await connection.connection() as conn:
|
163
|
+
if self.use_dataframe is True:
|
164
|
+
# from list self.join (list of columns), extract the unique list from self.data
|
165
|
+
# extract a list of unique from self.data:
|
166
|
+
result = []
|
167
|
+
_filter = self.data[self.join].drop_duplicates().to_dict(orient="records")
|
168
|
+
for element in _filter:
|
169
|
+
query = self.query.format(**element)
|
170
|
+
r, error = await conn.query(query)
|
171
|
+
result.extend(r)
|
172
|
+
if not result:
|
173
|
+
raise DataNotFound(
|
174
|
+
"Empty Dataset: No data was found on query"
|
175
|
+
)
|
176
|
+
else:
|
177
|
+
fields = ", ".join(self.fields)
|
178
|
+
if hasattr(self, 'query'):
|
179
|
+
query = self.query
|
180
|
+
elif hasattr(self, "distinct"):
|
181
|
+
join = ", ".join(self.join)
|
182
|
+
query = f"SELECT DISTINCT ON ({join}) {fields} FROM {self.datasource}.{self.dataset}"
|
183
|
+
else:
|
184
|
+
query = f"SELECT {fields} FROM {self.datasource}.{self.dataset}"
|
185
|
+
self._logger.info(
|
186
|
+
f"DATASET QUERY: {query}"
|
187
|
+
)
|
188
|
+
result, error = await conn.query(query)
|
189
|
+
if error or not result:
|
190
|
+
raise DataNotFound(
|
191
|
+
f"Empty Dataset: {error}"
|
192
|
+
)
|
193
|
+
## converting on Dataframe:
|
194
|
+
self.df2 = await self.get_dataframe(result, infer_types=True)
|
195
|
+
except (DataNotFound, NoDataFound) as exc:
|
196
|
+
self._result = self.data
|
197
|
+
raise DataNotFound(str(exc)) from exc
|
198
|
+
if self.type == "left" and (self.df2 is None or self.df2.empty):
|
199
|
+
self._logger.warning(
|
200
|
+
"No data was found on right Dataframe, returned first dataframe."
|
201
|
+
)
|
202
|
+
self._result = self.df1
|
203
|
+
return self._result
|
204
|
+
elif self.df2 is None or self.df2.empty:
|
205
|
+
raise DataNotFound("Data Was Not Found on Dataset")
|
206
|
+
if hasattr(self, "no_copy"):
|
207
|
+
args["copy"] = self.no_copy
|
208
|
+
if not self.type:
|
209
|
+
self.type = "left"
|
210
|
+
if self.type == "inner":
|
211
|
+
args["left_index"] = True
|
212
|
+
if hasattr(self, "args") and isinstance(self.args, dict):
|
213
|
+
args = {**args, **self.args}
|
214
|
+
if hasattr(self, "operator"):
|
215
|
+
operator = self.operator
|
216
|
+
else:
|
217
|
+
operator = "and"
|
218
|
+
if hasattr(self, "join"):
|
219
|
+
args["on"] = self.join
|
220
|
+
else:
|
221
|
+
args["left_index"] = True
|
222
|
+
# making a Join between 2 dataframes
|
223
|
+
try:
|
224
|
+
if operator == "and":
|
225
|
+
df = pd.merge(
|
226
|
+
self.df1,
|
227
|
+
self.df2,
|
228
|
+
how=self.type,
|
229
|
+
suffixes=("_left", "_right"),
|
230
|
+
**args,
|
231
|
+
)
|
232
|
+
else:
|
233
|
+
if hasattr(self, "join"):
|
234
|
+
args["left_on"] = self.join
|
235
|
+
else:
|
236
|
+
args["left_index"] = True
|
237
|
+
ndf = self.df1
|
238
|
+
sdf = self.df2.copy()
|
239
|
+
merge = []
|
240
|
+
for key in self.join_with:
|
241
|
+
d = pd.merge(
|
242
|
+
ndf,
|
243
|
+
sdf,
|
244
|
+
right_on=key,
|
245
|
+
how=self.type,
|
246
|
+
suffixes=("_left", None),
|
247
|
+
**args,
|
248
|
+
)
|
249
|
+
ndf = d[d[key].isnull()]
|
250
|
+
ndf.drop(
|
251
|
+
ndf.columns[ndf.columns.str.contains("_left")],
|
252
|
+
axis=1,
|
253
|
+
inplace=True,
|
254
|
+
)
|
255
|
+
ddf = d[d[key].notnull()]
|
256
|
+
ddf.drop(
|
257
|
+
ddf.columns[ddf.columns.str.contains("_left")],
|
258
|
+
axis=1,
|
259
|
+
inplace=True,
|
260
|
+
)
|
261
|
+
merge.append(ddf)
|
262
|
+
# merge the last (not matched) rows
|
263
|
+
merge.append(ndf)
|
264
|
+
df = pd.concat(merge, axis=0)
|
265
|
+
df.reset_index(drop=True)
|
266
|
+
df.is_copy = None
|
267
|
+
except (ValueError, KeyError) as err:
|
268
|
+
raise ComponentError(f"Cannot Join with missing Column: {err!s}") from err
|
269
|
+
except Exception as err:
|
270
|
+
raise ComponentError(f"Unknown JOIN error {err!s}") from err
|
271
|
+
numrows = len(df.index)
|
272
|
+
if numrows == 0:
|
273
|
+
raise DataNotFound("Cannot make any JOIN, returns zero coincidences")
|
274
|
+
self._variables[f"{self.StepName}_NUMROWS"] = numrows
|
275
|
+
print("ON END> ", numrows)
|
276
|
+
self.add_metric("JOINED_ROWS", numrows)
|
277
|
+
if self._debug is True:
|
278
|
+
print("::: Printing Column Information === ")
|
279
|
+
for column, t in df.dtypes.items():
|
280
|
+
print(column, "->", t, "->", df[column].iloc[0])
|
281
|
+
# helping some transformations
|
282
|
+
df.is_copy = None
|
283
|
+
self._result = df
|
284
|
+
return self._result
|
285
|
+
|
286
|
+
async def close(self):
|
287
|
+
pass
|
288
|
+
|
289
|
+
async def get_dataframe(self, result, infer_types: bool = False):
|
290
|
+
self.set_datatypes()
|
291
|
+
print(self._dtypes)
|
292
|
+
### TODO: using QS iterables instead
|
293
|
+
result = [dict(row) for row in result]
|
294
|
+
try:
|
295
|
+
if self.as_objects is True:
|
296
|
+
df = pd.DataFrame(result, dtype=object)
|
297
|
+
else:
|
298
|
+
df = pd.DataFrame(result, **self._dtypes)
|
299
|
+
except Exception as err: # pylint: disable=W0718
|
300
|
+
self._logger.exception(
|
301
|
+
err,
|
302
|
+
stack_info=True
|
303
|
+
)
|
304
|
+
# Attempt to infer better dtypes for object columns.
|
305
|
+
if hasattr(self, "infer_types") or infer_types is True:
|
306
|
+
df.infer_objects()
|
307
|
+
df = df.convert_dtypes(convert_string=self.to_string)
|
308
|
+
if self._debug is True:
|
309
|
+
cPrint("Data Types:")
|
310
|
+
print(df.dtypes)
|
311
|
+
if hasattr(self, "drop_empty"):
|
312
|
+
df.dropna(axis=1, how="all", inplace=True)
|
313
|
+
df.dropna(axis=0, how="all", inplace=True)
|
314
|
+
if hasattr(self, "dropna"):
|
315
|
+
df.dropna(subset=self.dropna, how="all", inplace=True)
|
316
|
+
if (
|
317
|
+
getattr(self, "clean_strings", False) is True
|
318
|
+
):
|
319
|
+
u = df.select_dtypes(include=["object", "string"])
|
320
|
+
df[u.columns] = u.fillna("")
|
321
|
+
return df
|
322
|
+
|
323
|
+
def set_datatypes(self):
|
324
|
+
if hasattr(self, "datatypes"):
|
325
|
+
dtypes = {}
|
326
|
+
for field, dtype in self.datatypes.items():
|
327
|
+
if dtype == "uint8":
|
328
|
+
dtypes[field] = np.uint8
|
329
|
+
elif dtype == "uint16":
|
330
|
+
dtypes[field] = np.uint16
|
331
|
+
elif dtype == "uint32":
|
332
|
+
dtypes[field] = np.uint32
|
333
|
+
elif dtype == "int8":
|
334
|
+
dtypes[field] = np.int8
|
335
|
+
elif dtype == "int16":
|
336
|
+
dtypes[field] = np.int16
|
337
|
+
elif dtype == "int32":
|
338
|
+
dtypes[field] = np.int32
|
339
|
+
elif dtype == "float":
|
340
|
+
dtypes[field] = float
|
341
|
+
elif dtype == "float32":
|
342
|
+
dtypes[field] = float
|
343
|
+
elif dtype in ("string", "varchar", "str"):
|
344
|
+
dtypes[field] = str
|
345
|
+
else:
|
346
|
+
# invalid datatype
|
347
|
+
self._logger.warning(
|
348
|
+
f"Invalid DataType value: {field} for field {dtype}"
|
349
|
+
)
|
350
|
+
continue
|
351
|
+
if dtypes:
|
352
|
+
self._dtypes["dtype"] = dtypes
|