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,312 @@
|
|
1
|
+
import asyncio
|
2
|
+
|
3
|
+
# logging system
|
4
|
+
import logging
|
5
|
+
import datetime
|
6
|
+
from decimal import Decimal
|
7
|
+
from typing import Any
|
8
|
+
from collections.abc import Callable
|
9
|
+
import pandas as pd
|
10
|
+
import numpy as np
|
11
|
+
from asyncdb.exceptions import NoDataFound
|
12
|
+
from asyncdb.models import Model
|
13
|
+
from asyncdb.drivers.pg import pg
|
14
|
+
|
15
|
+
# for database
|
16
|
+
from querysource.conf import (
|
17
|
+
sqlalchemy_url,
|
18
|
+
default_dsn,
|
19
|
+
DB_STATEMENT_TIMEOUT,
|
20
|
+
DB_SESSION_TIMEOUT,
|
21
|
+
DB_KEEPALIVE_IDLE,
|
22
|
+
)
|
23
|
+
from sqlalchemy.orm import Session
|
24
|
+
from sqlalchemy import create_engine, text
|
25
|
+
from sqlalchemy.pool import NullPool
|
26
|
+
from ..exceptions import ComponentError, DataNotFound
|
27
|
+
from ..utils import AttrDict
|
28
|
+
from .flow import FlowComponent
|
29
|
+
from ..interfaces.qs import QSSupport
|
30
|
+
|
31
|
+
|
32
|
+
dtypes = {
|
33
|
+
"varchar": str,
|
34
|
+
"string": str,
|
35
|
+
"object": str,
|
36
|
+
"int": int,
|
37
|
+
"int4": int,
|
38
|
+
"int64": int,
|
39
|
+
"uint64": int,
|
40
|
+
"Int64Dtype": np.int64,
|
41
|
+
"Int64": int,
|
42
|
+
"Int32": int,
|
43
|
+
"Int16": int,
|
44
|
+
"Int8": int,
|
45
|
+
"float64": Decimal,
|
46
|
+
"float": Decimal,
|
47
|
+
"bool": bool,
|
48
|
+
"datetime64[ns]": datetime.datetime,
|
49
|
+
"datetime64[ns, UTC]": datetime.datetime,
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
class TableDelete(QSSupport, FlowComponent):
|
54
|
+
"""
|
55
|
+
TableDelete
|
56
|
+
|
57
|
+
Overview
|
58
|
+
|
59
|
+
The TableDelete class is a component for deleting rows from a SQL table based on specified primary keys. It uses
|
60
|
+
Pandas DataFrames to identify rows to delete and performs the deletion using SQLAlchemy and asyncpg.
|
61
|
+
|
62
|
+
.. table:: Properties
|
63
|
+
:widths: auto
|
64
|
+
|
65
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
66
|
+
| Name | Required | Description |
|
67
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
68
|
+
| flavor | No | The database flavor, defaults to "postgresql". |
|
69
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
70
|
+
| pk | Yes | A list of primary key columns to identify rows for deletion. |
|
71
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
72
|
+
| data | Yes | The data containing rows to be deleted, can be a Pandas DataFrame or other supported format. |
|
73
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
74
|
+
| _engine | No | The SQLAlchemy engine for database connections. |
|
75
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
76
|
+
| tablename | Yes | The name of the table from which rows will be deleted. |
|
77
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
78
|
+
| schema | No | The schema name, defaults to an empty string. |
|
79
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
80
|
+
| _dsn | No | The Data Source Name for the database connection. |
|
81
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
82
|
+
| multi | No | A flag indicating if multiple DataFrame deletions are supported, defaults to False. |
|
83
|
+
+------------------+----------+-----------+--------------------------------------------------------------------------------------+
|
84
|
+
|
85
|
+
Return
|
86
|
+
|
87
|
+
The methods in this class manage the deletion of rows from a SQL table based on primary keys, including initialization,
|
88
|
+
execution, and result handling. It ensures proper handling of database connections and provides metrics on the deleted rows.
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
Example:
|
93
|
+
|
94
|
+
```yaml
|
95
|
+
TableDelete:
|
96
|
+
tablename: totem_heartbeats
|
97
|
+
flavor: postgres
|
98
|
+
schema: banco_chile
|
99
|
+
pk:
|
100
|
+
- hearbeat_id
|
101
|
+
```
|
102
|
+
|
103
|
+
""" # noqa
|
104
|
+
|
105
|
+
flavor: str = "postgresql"
|
106
|
+
|
107
|
+
def __init__(
|
108
|
+
self,
|
109
|
+
loop: asyncio.AbstractEventLoop = None,
|
110
|
+
job: Callable = None,
|
111
|
+
stat: Callable = None,
|
112
|
+
**kwargs,
|
113
|
+
):
|
114
|
+
self.pk = []
|
115
|
+
self.data: Any = None
|
116
|
+
self._engine = None
|
117
|
+
self.tablename = ""
|
118
|
+
self.schema = ""
|
119
|
+
dsn = kwargs.get('dsn', '')
|
120
|
+
if dsn and dsn.startswith('postgres:'):
|
121
|
+
dsn = dsn.replace('postgres:', 'postgresql:')
|
122
|
+
self._dsn = self.get_config_value(dsn, dsn)
|
123
|
+
self.multi = bool(kwargs.pop('multi', False))
|
124
|
+
self._driver: str = kwargs.pop('driver', 'pg')
|
125
|
+
super(TableDelete, self).__init__(
|
126
|
+
loop=loop,
|
127
|
+
job=job,
|
128
|
+
stat=stat,
|
129
|
+
**kwargs
|
130
|
+
)
|
131
|
+
|
132
|
+
def get_engine(self, dsn: str = None):
|
133
|
+
if not dsn:
|
134
|
+
dsn = sqlalchemy_url
|
135
|
+
try:
|
136
|
+
self._engine = create_engine(dsn, echo=False, poolclass=NullPool)
|
137
|
+
self._session = Session(bind=self._engine)
|
138
|
+
except Exception as err:
|
139
|
+
logging.exception(err)
|
140
|
+
|
141
|
+
async def start(self, **kwargs):
|
142
|
+
"""Get Pandas Dataframe."""
|
143
|
+
self.data = None
|
144
|
+
if self.previous:
|
145
|
+
self.data = self.input
|
146
|
+
else:
|
147
|
+
raise NoDataFound("TableDelete: Data missing")
|
148
|
+
await super().start(**kwargs)
|
149
|
+
try:
|
150
|
+
# getting sqlAlchemy engine
|
151
|
+
self.get_engine(dsn=self._dsn)
|
152
|
+
except Exception as err:
|
153
|
+
raise ComponentError(f"Connection Error: {err}") from err
|
154
|
+
if self.data is None:
|
155
|
+
raise NoDataFound("TableDelete: Data missing")
|
156
|
+
elif isinstance(self.data, pd.DataFrame):
|
157
|
+
# detect data type for colums
|
158
|
+
columns = list(self.data.columns)
|
159
|
+
for column in columns:
|
160
|
+
t = self.data[column].dtype
|
161
|
+
if isinstance(t, pd.core.dtypes.dtypes.DatetimeTZDtype):
|
162
|
+
self.data[column] = pd.to_datetime(
|
163
|
+
self.data[column],
|
164
|
+
format="%Y-%m-%dT%H:%M:%S.%f%z",
|
165
|
+
cache=True,
|
166
|
+
utc=True,
|
167
|
+
)
|
168
|
+
self.data[column].dt.tz_convert("UTC")
|
169
|
+
elif str(t) == "datetime64[ns]":
|
170
|
+
tmp_data = self.data.copy()
|
171
|
+
tmp_data[column] = pd.to_datetime(
|
172
|
+
self.data[column],
|
173
|
+
format="%Y-%m-%dT%H:%M:%S.%f%z",
|
174
|
+
cache=True,
|
175
|
+
utc=True,
|
176
|
+
)
|
177
|
+
self.data = tmp_data.copy()
|
178
|
+
elif self.multi is True:
|
179
|
+
# iteration over every Pandas DT:
|
180
|
+
try:
|
181
|
+
result = self.data.items()
|
182
|
+
except Exception as err:
|
183
|
+
raise ComponentError(
|
184
|
+
"Invalid Result type for Attribute Multiple: {err}"
|
185
|
+
) from err
|
186
|
+
for name, rs in result:
|
187
|
+
el = getattr(self, name)
|
188
|
+
if not isinstance(rs, pd.DataFrame):
|
189
|
+
raise ComponentError("Invalid Resultset: not a Dataframe")
|
190
|
+
else:
|
191
|
+
# incompatible datasource:
|
192
|
+
raise DataNotFound("TableDelete: Incompatible Data Source")
|
193
|
+
|
194
|
+
async def close(self):
|
195
|
+
"""Closing Operations."""
|
196
|
+
if self._engine:
|
197
|
+
try:
|
198
|
+
self._engine.dispose()
|
199
|
+
except Exception:
|
200
|
+
pass
|
201
|
+
|
202
|
+
async def table_delete(self, elem, df):
|
203
|
+
"""Running the process of Upsert-delete."""
|
204
|
+
pk = elem.pk
|
205
|
+
options = {
|
206
|
+
"if_exists": "append",
|
207
|
+
"index_label": pk,
|
208
|
+
"index": False,
|
209
|
+
"method": "multi",
|
210
|
+
}
|
211
|
+
if hasattr(elem, "sql_options"):
|
212
|
+
options = {**options, **elem.sql_options}
|
213
|
+
tablename = elem.tablename
|
214
|
+
try:
|
215
|
+
schema_name = elem.schema
|
216
|
+
except AttributeError:
|
217
|
+
schema_name = "public"
|
218
|
+
options["schema"] = schema_name
|
219
|
+
cols = []
|
220
|
+
for field in pk:
|
221
|
+
datatype = df.dtypes[field]
|
222
|
+
|
223
|
+
t = dtypes[f"{datatype!s}"]
|
224
|
+
f = (field, t)
|
225
|
+
cols.append(f)
|
226
|
+
# make a intermediate model:
|
227
|
+
try:
|
228
|
+
cls = Model.make_model(
|
229
|
+
name=f"{tablename!s}_deleted", schema=schema_name, fields=cols
|
230
|
+
)
|
231
|
+
except Exception as err:
|
232
|
+
logging.exception(
|
233
|
+
f"TableDelete: Error creating DB Model for {tablename}: {err}"
|
234
|
+
)
|
235
|
+
return False
|
236
|
+
result = None
|
237
|
+
if sql := cls.model(dialect="sql"):
|
238
|
+
print("SQL is: ", sql)
|
239
|
+
deltable = text(
|
240
|
+
f"DROP TABLE IF EXISTS {schema_name}.{tablename!s}_deleted;"
|
241
|
+
)
|
242
|
+
qry = text(sql)
|
243
|
+
try:
|
244
|
+
with self._engine.begin() as connection:
|
245
|
+
connection.execute(deltable)
|
246
|
+
result = connection.execute(qry)
|
247
|
+
logging.debug(f"Created Temp Table: {cls!s}")
|
248
|
+
except Exception as error:
|
249
|
+
raise ComponentError(f"Error on Table creation: {error}") from error
|
250
|
+
else:
|
251
|
+
raise ComponentError("Cannot Create TEMP Table")
|
252
|
+
|
253
|
+
# table exists: copy data into table:
|
254
|
+
new = df[pk].copy()
|
255
|
+
with self._engine.begin() as connection:
|
256
|
+
new.to_sql(f"{tablename!s}_deleted", con=connection, **options)
|
257
|
+
# data is on temp Table, deleted
|
258
|
+
columns = ", ".join(pk)
|
259
|
+
# TODO: using an EXISTS instead IN to speed-up delete
|
260
|
+
delete = f"""DELETE FROM {schema_name!s}.{tablename!s} WHERE ({columns})
|
261
|
+
IN (SELECT {columns} FROM {schema_name}.{tablename!s}_deleted)"""
|
262
|
+
print(delete)
|
263
|
+
connection = await self.create_connection()
|
264
|
+
try:
|
265
|
+
async with await connection.connection() as conn:
|
266
|
+
try:
|
267
|
+
result, error = await conn.execute(sentence=delete)
|
268
|
+
print("TableDelete: ", result)
|
269
|
+
self.add_metric("TABLE_DELETED", result)
|
270
|
+
if error:
|
271
|
+
raise ComponentError(
|
272
|
+
f"Error Deleting Data: {error}"
|
273
|
+
)
|
274
|
+
if error:
|
275
|
+
raise ComponentError(
|
276
|
+
f"Error on TableDelete: {error}"
|
277
|
+
)
|
278
|
+
except Exception as err:
|
279
|
+
logging.error(err)
|
280
|
+
finally:
|
281
|
+
# at now, delete the table:
|
282
|
+
drop = f"DROP TABLE IF EXISTS {schema_name}.{tablename!s}_deleted"
|
283
|
+
result, error = await conn.execute(sentence=drop)
|
284
|
+
finally:
|
285
|
+
await connection.close()
|
286
|
+
|
287
|
+
async def run(self):
|
288
|
+
"""Run TableDelete."""
|
289
|
+
if self.multi is False:
|
290
|
+
# set the number of rows:
|
291
|
+
numrows = len(self.data.index)
|
292
|
+
self._variables[f"{self.StepName}_NUMROWS"] = numrows
|
293
|
+
await self.table_delete(self, self.data)
|
294
|
+
self._result = self.data
|
295
|
+
return True
|
296
|
+
else:
|
297
|
+
# running in multi Mode
|
298
|
+
try:
|
299
|
+
result = self.data.items()
|
300
|
+
except Exception as err:
|
301
|
+
raise ComponentError(
|
302
|
+
"Invalid Result type for Attribute Multiple: {err}"
|
303
|
+
) from err
|
304
|
+
for name, rs in result:
|
305
|
+
try:
|
306
|
+
el = getattr(self, name)
|
307
|
+
except AttributeError:
|
308
|
+
continue
|
309
|
+
await self.table_delete(AttrDict(el), rs)
|
310
|
+
# return the same dataframe
|
311
|
+
self._result = self.data
|
312
|
+
return True
|
@@ -0,0 +1,143 @@
|
|
1
|
+
from decimal import Decimal
|
2
|
+
import datetime
|
3
|
+
import dask.dataframe as dd
|
4
|
+
import pandas
|
5
|
+
import numpy as np
|
6
|
+
from ..exceptions import DataNotFound
|
7
|
+
from .TableBase import TableBase
|
8
|
+
|
9
|
+
dtypes = {
|
10
|
+
"varchar": str,
|
11
|
+
"string": str,
|
12
|
+
"object": str,
|
13
|
+
"int": int,
|
14
|
+
"int4": int,
|
15
|
+
"int64": np.int64,
|
16
|
+
"uint64": np.int64,
|
17
|
+
"Int64Dtype": np.int64,
|
18
|
+
"Int64": np.int64,
|
19
|
+
"Int8": int,
|
20
|
+
"float64": Decimal,
|
21
|
+
"float": Decimal,
|
22
|
+
"bool": bool,
|
23
|
+
"datetime64[ns]": datetime.datetime,
|
24
|
+
"datetime64[ns, UTC]": datetime.datetime,
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
class TableInput(TableBase):
|
29
|
+
"""
|
30
|
+
TableInput
|
31
|
+
|
32
|
+
Overview
|
33
|
+
|
34
|
+
The TableInput class is a component for loading data from a SQL table or custom SQL query into a Pandas DataFrame.
|
35
|
+
It supports large tables by utilizing Dask for partitioned loading, along with options for column trimming,
|
36
|
+
primary key setting, and removal of empty rows or columns.
|
37
|
+
|
38
|
+
.. table:: Properties
|
39
|
+
:widths: auto
|
40
|
+
|
41
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
42
|
+
| Name | Required | Summary |
|
43
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
44
|
+
| tablename | Yes | The name of the SQL table to load into a DataFrame. |
|
45
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
46
|
+
| schema | No | Database schema where the table is located, if applicable. |
|
47
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
48
|
+
| query | No | SQL query string to load data if `tablename` is not used. |
|
49
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
50
|
+
| chunksize | No | Number of rows per chunk when reading data in chunks. |
|
51
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
52
|
+
| bigfile | No | Boolean indicating if Dask should be used for large tables. |
|
53
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
54
|
+
| drop_empty | No | Boolean to drop columns and rows with only null values. |
|
55
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
56
|
+
| trim | No | Boolean to trim whitespace from string columns. |
|
57
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
58
|
+
| pk | No | Dictionary specifying primary key columns and settings for DataFrame indexing.|
|
59
|
+
+----------------+----------+-----------+-------------------------------------------------------------------+
|
60
|
+
|
61
|
+
Returns
|
62
|
+
|
63
|
+
This component returns a DataFrame populated with data from the specified SQL table or query. If `drop_empty` is set,
|
64
|
+
columns and rows with only null values are removed. Metrics such as row and column counts are recorded, along with
|
65
|
+
information on the table or query used for data extraction. If no data is found, a `DataNotFound` exception is raised.
|
66
|
+
|
67
|
+
|
68
|
+
Example:
|
69
|
+
|
70
|
+
```yaml
|
71
|
+
TableInput:
|
72
|
+
tablename: sales_raw
|
73
|
+
schema: epson
|
74
|
+
chunksize: 1000
|
75
|
+
pk:
|
76
|
+
columns:
|
77
|
+
- sales_id
|
78
|
+
```
|
79
|
+
|
80
|
+
"""
|
81
|
+
|
82
|
+
|
83
|
+
async def run(self):
|
84
|
+
df = None
|
85
|
+
if hasattr(self, "tablename"): # getting a direct Table
|
86
|
+
# run table to pandas
|
87
|
+
if hasattr(self, "bigfile"):
|
88
|
+
dk = dd.read_sql_table(
|
89
|
+
self.tablename,
|
90
|
+
self._engine,
|
91
|
+
npartitions=10,
|
92
|
+
head_rows=100,
|
93
|
+
**self.params,
|
94
|
+
)
|
95
|
+
df = dk.compute()
|
96
|
+
else:
|
97
|
+
tp = pandas.read_sql_table(
|
98
|
+
self.tablename,
|
99
|
+
self._engine,
|
100
|
+
schema=self.schema,
|
101
|
+
chunksize=self.chunksize,
|
102
|
+
**self.params,
|
103
|
+
)
|
104
|
+
df = pandas.concat(tp, ignore_index=True)
|
105
|
+
elif self.query:
|
106
|
+
# run the query to pandas
|
107
|
+
tp = pandas.read_sql_query(
|
108
|
+
self.query, self._engine, chunksize=self.chunksize, **self.params
|
109
|
+
)
|
110
|
+
df = pandas.concat(tp, ignore_index=True)
|
111
|
+
else:
|
112
|
+
return False
|
113
|
+
if df is None or df.empty:
|
114
|
+
raise DataNotFound("TableInput: Empty Dataframe")
|
115
|
+
# removing empty cols
|
116
|
+
if hasattr(self, "drop_empty"):
|
117
|
+
df.dropna(axis=1, how="all", inplace=True)
|
118
|
+
df.dropna(axis=0, how="all", inplace=True)
|
119
|
+
if hasattr(self, "trim"):
|
120
|
+
u = df.select_dtypes(include=["object", "string"])
|
121
|
+
df[u.columns] = df[u.columns].astype(str).str.strip()
|
122
|
+
# define the primary keys for DataFrame
|
123
|
+
if hasattr(self, "pk"):
|
124
|
+
try:
|
125
|
+
columns = self.pk["columns"]
|
126
|
+
del self.pk["columns"]
|
127
|
+
df.reset_index().set_index(columns, inplace=True, drop=False, **self.pk)
|
128
|
+
except Exception as err: # pylint: disable=W0703
|
129
|
+
self._logger.exception(f"TableInput: {err}")
|
130
|
+
self._result = df
|
131
|
+
numrows = len(df.index)
|
132
|
+
self._variables["_numRows_"] = numrows
|
133
|
+
self._variables[f"{self.StepName}_NUMROWS"] = numrows
|
134
|
+
self.add_metric("NUM_ROWS", df.shape[0])
|
135
|
+
self.add_metric("NUM_COLUMNS", df.shape[1])
|
136
|
+
if hasattr(self, "tablename"):
|
137
|
+
self.add_metric("Table", self.tablename)
|
138
|
+
self.add_metric("Schema", self.schema)
|
139
|
+
else:
|
140
|
+
self.add_metric("Query", self.query)
|
141
|
+
## result
|
142
|
+
self._result = df
|
143
|
+
return self._result
|