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,177 @@
|
|
1
|
+
import os
|
2
|
+
from collections.abc import Callable
|
3
|
+
from abc import abstractmethod
|
4
|
+
import asyncio
|
5
|
+
from decimal import Decimal
|
6
|
+
import numpy as np
|
7
|
+
import pandas as pd
|
8
|
+
import datetime
|
9
|
+
from ..utils import SafeDict
|
10
|
+
from .flow import FlowComponent
|
11
|
+
from ..exceptions import (
|
12
|
+
ComponentError,
|
13
|
+
DataNotFound,
|
14
|
+
)
|
15
|
+
from ..interfaces.qs import QSSupport
|
16
|
+
|
17
|
+
|
18
|
+
dtypes = {
|
19
|
+
"varchar": str,
|
20
|
+
"character varying": str,
|
21
|
+
"string": str,
|
22
|
+
"object": str,
|
23
|
+
"int": int,
|
24
|
+
"int4": int,
|
25
|
+
"integer": int,
|
26
|
+
"bigint": np.int64,
|
27
|
+
"int64": np.int64,
|
28
|
+
"uint64": np.int64,
|
29
|
+
"Int8": int,
|
30
|
+
"float64": Decimal,
|
31
|
+
"float": Decimal,
|
32
|
+
"boolean": bool,
|
33
|
+
"bool": bool,
|
34
|
+
"datetime64[ns]": datetime.datetime,
|
35
|
+
"date": datetime.date,
|
36
|
+
}
|
37
|
+
|
38
|
+
class CopyTo(QSSupport, FlowComponent):
|
39
|
+
"""CopyTo.
|
40
|
+
|
41
|
+
Abstract Class for Copying (saving) a Pandas Dataframe onto a Resource
|
42
|
+
(example: Copy to PostgreSQL).
|
43
|
+
"""
|
44
|
+
def __init__(
|
45
|
+
self,
|
46
|
+
loop: asyncio.AbstractEventLoop = None,
|
47
|
+
job: Callable = None,
|
48
|
+
stat: Callable = None,
|
49
|
+
**kwargs,
|
50
|
+
):
|
51
|
+
self.pk = []
|
52
|
+
self.truncate: bool = False
|
53
|
+
self.data = None
|
54
|
+
self._engine = None
|
55
|
+
self.tablename: str = ""
|
56
|
+
self.schema: str = ""
|
57
|
+
self.use_chunks = False
|
58
|
+
self.chunksize = None
|
59
|
+
self._connection: Callable = None
|
60
|
+
self._driver: str = kwargs.pop('driver', 'pg')
|
61
|
+
self.multi = bool(kwargs.pop('multi', False))
|
62
|
+
self._naive_columns: list = kwargs.pop('naive_tz', [])
|
63
|
+
self._json_columns: list = kwargs.pop('json_columns', [])
|
64
|
+
self._vector_columns: list = kwargs.pop('vector_columns', [])
|
65
|
+
self._array_columns: list = kwargs.pop('array_columns', [])
|
66
|
+
self._binary_columns: list = kwargs.pop('binary_columns', [])
|
67
|
+
self._atomic: bool = kwargs.pop('atomic', False)
|
68
|
+
super(CopyTo, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
|
69
|
+
|
70
|
+
async def start(self, **kwargs):
|
71
|
+
"""Obtain Pandas Dataframe."""
|
72
|
+
if hasattr(self, 'credentials'):
|
73
|
+
self.processing_credentials()
|
74
|
+
if self.previous:
|
75
|
+
self.data = self.input
|
76
|
+
else:
|
77
|
+
raise ComponentError(
|
78
|
+
"CopyTo: Data Was Not Found"
|
79
|
+
)
|
80
|
+
for attr, value in self.__dict__.items():
|
81
|
+
if isinstance(value, str):
|
82
|
+
val = value.format_map(SafeDict(**self._variables))
|
83
|
+
object.__setattr__(self, attr, val)
|
84
|
+
if not self.schema:
|
85
|
+
try:
|
86
|
+
self.schema = self._program
|
87
|
+
except (ValueError, AttributeError, TypeError) as ex:
|
88
|
+
raise ComponentError(
|
89
|
+
"CopyTo: Schema name not defined."
|
90
|
+
) from ex
|
91
|
+
# Getting the connection, DSN or credentials:
|
92
|
+
self._connection = await self.create_connection(
|
93
|
+
driver=self._driver
|
94
|
+
)
|
95
|
+
|
96
|
+
async def close(self):
|
97
|
+
"""Close the connection to Database."""
|
98
|
+
try:
|
99
|
+
if self._connection:
|
100
|
+
await self._connection.close()
|
101
|
+
self._logger.info(
|
102
|
+
"CopyTo: Connection closed."
|
103
|
+
)
|
104
|
+
except Exception as err:
|
105
|
+
self._logger.error(
|
106
|
+
f"CopyTo: Error closing connection: {err}"
|
107
|
+
)
|
108
|
+
|
109
|
+
@abstractmethod
|
110
|
+
async def _create_table(self):
|
111
|
+
pass
|
112
|
+
|
113
|
+
@abstractmethod
|
114
|
+
async def _truncate_table(self):
|
115
|
+
pass
|
116
|
+
|
117
|
+
@abstractmethod
|
118
|
+
async def _copy_dataframe(self):
|
119
|
+
pass
|
120
|
+
|
121
|
+
@abstractmethod
|
122
|
+
async def _copy_iterable(self):
|
123
|
+
pass
|
124
|
+
|
125
|
+
async def run(self):
|
126
|
+
"""Run Copy into table functionality."""
|
127
|
+
self._result = None
|
128
|
+
if self.data is None:
|
129
|
+
raise DataNotFound(
|
130
|
+
f"{self.__name__} Error: No data in Dataframe"
|
131
|
+
)
|
132
|
+
if isinstance(self.data, pd.DataFrame) and self.data.empty:
|
133
|
+
raise DataNotFound(
|
134
|
+
f"{self.__name__} Error: No data in Dataframe"
|
135
|
+
)
|
136
|
+
# Pass through data to next component.
|
137
|
+
self._result = self.data
|
138
|
+
if isinstance(self.data, pd.DataFrame):
|
139
|
+
columns = list(self.data.columns)
|
140
|
+
self.add_metric("NUM_ROWS", self.data.shape[0])
|
141
|
+
self.add_metric("NUM_COLUMNS", self.data.shape[1])
|
142
|
+
if self._debug:
|
143
|
+
print(f"Debugging: {self.__name__} ===")
|
144
|
+
for column in columns:
|
145
|
+
t = self.data[column].dtype
|
146
|
+
print(column, "->", t, "->", self.data[column].iloc[0])
|
147
|
+
elif isinstance(self.data, list):
|
148
|
+
columns = list(self.data[0].keys())
|
149
|
+
self.add_metric("NUM_ROWS", len(self.data))
|
150
|
+
self.add_metric("NUM_COLUMNS", len(columns))
|
151
|
+
else:
|
152
|
+
self.add_metric("DATA_SIZE", len(self.data))
|
153
|
+
if hasattr(self, "create_table"):
|
154
|
+
# Create a Table using Model
|
155
|
+
self._logger.debug(
|
156
|
+
f":: Creating table: {self.schema}.{self.tablename}"
|
157
|
+
)
|
158
|
+
await self._create_table()
|
159
|
+
if self.truncate is True:
|
160
|
+
if self._debug:
|
161
|
+
self._logger.debug(
|
162
|
+
f"Truncating table: {self.schema}.{self.tablename}"
|
163
|
+
)
|
164
|
+
await self._truncate_table()
|
165
|
+
if isinstance(self.data, pd.DataFrame):
|
166
|
+
# insert data directly into table
|
167
|
+
columns = list(self.data.columns)
|
168
|
+
await self._copy_dataframe()
|
169
|
+
else:
|
170
|
+
# insert data using iterable
|
171
|
+
await self._copy_iterable()
|
172
|
+
self._logger.debug(
|
173
|
+
f"{self.__name__}: Saving results into: {self.schema}.{self.tablename}"
|
174
|
+
)
|
175
|
+
# returning this
|
176
|
+
# passing through
|
177
|
+
return self._result
|
@@ -0,0 +1,243 @@
|
|
1
|
+
import asyncio
|
2
|
+
from collections.abc import Callable
|
3
|
+
import math
|
4
|
+
import pandas as pd
|
5
|
+
from asyncdb import AsyncDB
|
6
|
+
from asyncdb.exceptions import (
|
7
|
+
StatementError,
|
8
|
+
DataError
|
9
|
+
)
|
10
|
+
from .CopyTo import CopyTo
|
11
|
+
from ..interfaces.dataframes import PandasDataframe
|
12
|
+
from ..exceptions import (
|
13
|
+
ComponentError,
|
14
|
+
DataNotFound
|
15
|
+
)
|
16
|
+
from querysource.conf import (
|
17
|
+
BIGQUERY_CREDENTIALS,
|
18
|
+
BIGQUERY_PROJECT_ID
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
class CopyToBigQuery(CopyTo, PandasDataframe):
|
23
|
+
"""
|
24
|
+
CopyToBigQuery.
|
25
|
+
|
26
|
+
Overview
|
27
|
+
|
28
|
+
This component allows copying data into a BigQuery table,
|
29
|
+
using write functionality from AsyncDB BigQuery driver.
|
30
|
+
|
31
|
+
.. table:: Properties
|
32
|
+
:widths: auto
|
33
|
+
|
34
|
+
+--------------+----------+-----------+--------------------------------------------+
|
35
|
+
| Name | Required | Summary |
|
36
|
+
+--------------+----------+-----------+--------------------------------------------+
|
37
|
+
| tablename | Yes | Name of the table in |
|
38
|
+
| | | BigQuery |
|
39
|
+
+--------------+----------+-----------+--------------------------------------------+
|
40
|
+
| schema | Yes | Name of the dataset |
|
41
|
+
| | | where the table is located |
|
42
|
+
+--------------+----------+-----------+--------------------------------------------+
|
43
|
+
| truncate | Yes | This option indicates if the component should empty |
|
44
|
+
| | | before copying the new data to the table. If set to |
|
45
|
+
| | | true, the table will be truncated before saving data. |
|
46
|
+
+--------------+----------+-----------+--------------------------------------------+
|
47
|
+
| use_buffer | No | When activated, this option allows optimizing the |
|
48
|
+
| | | performance of the task when dealing with large |
|
49
|
+
| | | volumes of data. |
|
50
|
+
+--------------+----------+-----------+--------------------------------------------+
|
51
|
+
| credentials | No | Path to BigQuery credentials JSON file |
|
52
|
+
| | | |
|
53
|
+
+--------------+----------+-----------+--------------------------------------------+
|
54
|
+
| project_id | No | Google Cloud Project ID |
|
55
|
+
| | | |
|
56
|
+
+--------------+----------+-----------+--------------------------------------------+
|
57
|
+
|
58
|
+
|
59
|
+
Example:
|
60
|
+
|
61
|
+
```yaml
|
62
|
+
CopyToBigQuery:
|
63
|
+
schema: hisense
|
64
|
+
tablename: product_availability_all
|
65
|
+
```
|
66
|
+
|
67
|
+
"""
|
68
|
+
def __init__(
|
69
|
+
self,
|
70
|
+
loop: asyncio.AbstractEventLoop = None,
|
71
|
+
job: Callable = None,
|
72
|
+
stat: Callable = None,
|
73
|
+
**kwargs,
|
74
|
+
):
|
75
|
+
self.pk = []
|
76
|
+
self.truncate: bool = False
|
77
|
+
self.data = None
|
78
|
+
self._engine = None
|
79
|
+
self.tablename: str = ""
|
80
|
+
self.schema: str = "" # dataset in BigQuery terminology
|
81
|
+
self.use_chunks = False
|
82
|
+
self._chunksize: int = kwargs.pop('chunksize', 10000)
|
83
|
+
self._connection: Callable = None
|
84
|
+
self._project_id: str = kwargs.pop('project_id', None)
|
85
|
+
try:
|
86
|
+
self.multi = bool(kwargs["multi"])
|
87
|
+
del kwargs["multi"]
|
88
|
+
except KeyError:
|
89
|
+
self.multi = False
|
90
|
+
super().__init__(
|
91
|
+
loop=loop,
|
92
|
+
job=job,
|
93
|
+
stat=stat,
|
94
|
+
**kwargs
|
95
|
+
)
|
96
|
+
self._driver: str = 'bigquery'
|
97
|
+
|
98
|
+
def default_connection(self):
|
99
|
+
"""default_connection.
|
100
|
+
|
101
|
+
Default Connection to BigQuery.
|
102
|
+
"""
|
103
|
+
try:
|
104
|
+
kwargs: dict = {
|
105
|
+
"credentials": BIGQUERY_CREDENTIALS,
|
106
|
+
"project_id": self._project_id or BIGQUERY_PROJECT_ID
|
107
|
+
}
|
108
|
+
self._connection = AsyncDB(
|
109
|
+
'bigquery',
|
110
|
+
params=kwargs,
|
111
|
+
loop=self._loop,
|
112
|
+
**kwargs
|
113
|
+
)
|
114
|
+
return self._connection
|
115
|
+
except Exception as err:
|
116
|
+
raise ComponentError(
|
117
|
+
f"Error configuring BigQuery Connection: {err!s}"
|
118
|
+
) from err
|
119
|
+
|
120
|
+
# Function to clean invalid float values
|
121
|
+
def clean_floats(self, data):
|
122
|
+
def sanitize_value(value):
|
123
|
+
if isinstance(value, float) and (math.isnan(value) or math.isinf(value)):
|
124
|
+
return None
|
125
|
+
return value
|
126
|
+
|
127
|
+
if isinstance(data, dict):
|
128
|
+
return {k: sanitize_value(v) for k, v in data.items()}
|
129
|
+
elif isinstance(data, list):
|
130
|
+
return [self.clean_floats(item) for item in data]
|
131
|
+
return data
|
132
|
+
|
133
|
+
async def _create_table(self):
|
134
|
+
"""Create a Table in BigQuery if it doesn't exist."""
|
135
|
+
try:
|
136
|
+
async with await self._connection.connection() as conn:
|
137
|
+
# First ensure dataset exists
|
138
|
+
await conn.create_dataset(self.schema)
|
139
|
+
|
140
|
+
# Infer schema from DataFrame
|
141
|
+
bq_schema = []
|
142
|
+
type_mapping = {
|
143
|
+
'object': 'STRING',
|
144
|
+
'string': 'STRING',
|
145
|
+
'int64': 'INTEGER',
|
146
|
+
'float64': 'FLOAT',
|
147
|
+
'bool': 'BOOLEAN',
|
148
|
+
'datetime64[ns]': 'TIMESTAMP',
|
149
|
+
'date': 'DATE'
|
150
|
+
}
|
151
|
+
|
152
|
+
for column, dtype in self.data.dtypes.items():
|
153
|
+
bq_type = type_mapping.get(str(dtype), 'STRING')
|
154
|
+
bq_schema.append({
|
155
|
+
"name": column,
|
156
|
+
"type": bq_type,
|
157
|
+
"mode": "NULLABLE"
|
158
|
+
})
|
159
|
+
|
160
|
+
# If create_table has clustering fields, add them to the config
|
161
|
+
table_config = {}
|
162
|
+
if hasattr(self, 'create_table'):
|
163
|
+
if isinstance(self.create_table, dict) and 'pk' in self.create_table:
|
164
|
+
table_config['clustering_fields'] = self.create_table['pk']
|
165
|
+
|
166
|
+
# Create the table with the inferred schema
|
167
|
+
await conn.create_table(
|
168
|
+
table_id=self.tablename,
|
169
|
+
dataset_id=self.schema,
|
170
|
+
schema=bq_schema,
|
171
|
+
**table_config
|
172
|
+
)
|
173
|
+
|
174
|
+
except Exception as err:
|
175
|
+
raise ComponentError(
|
176
|
+
f"Error creating BigQuery table: {err}"
|
177
|
+
) from err
|
178
|
+
|
179
|
+
async def _truncate_table(self):
|
180
|
+
"""Truncate the BigQuery table using the driver's built-in method."""
|
181
|
+
async with await self._connection.connection() as conn:
|
182
|
+
await self._connection.truncate_table(
|
183
|
+
table_id=self.tablename,
|
184
|
+
dataset_id=self.schema
|
185
|
+
)
|
186
|
+
|
187
|
+
async def _copy_dataframe(self):
|
188
|
+
"""Copy a pandas DataFrame to BigQuery."""
|
189
|
+
try:
|
190
|
+
# Clean NA/NaT values from string fields
|
191
|
+
str_cols = self.data.select_dtypes(include=["string"])
|
192
|
+
if not str_cols.empty:
|
193
|
+
self.data[str_cols.columns] = str_cols.astype(object).where(
|
194
|
+
pd.notnull(str_cols), None
|
195
|
+
)
|
196
|
+
|
197
|
+
# Clean datetime fields - convert to ISO format strings
|
198
|
+
datetime_types = ["datetime64", "datetime64[ns]"]
|
199
|
+
datetime_cols = self.data.select_dtypes(include=datetime_types)
|
200
|
+
if not datetime_cols.empty:
|
201
|
+
for col in datetime_cols.columns:
|
202
|
+
# self.data[col] = self.data[col].apply(
|
203
|
+
# lambda x: x.isoformat() if pd.notnull(x) else None
|
204
|
+
# )
|
205
|
+
self.data[col] = self.data[col].dt.tz_localize(None)
|
206
|
+
async with await self._connection.connection() as conn:
|
207
|
+
result = await conn.write(
|
208
|
+
data=self.data,
|
209
|
+
table_id=self.tablename,
|
210
|
+
dataset_id=self.schema,
|
211
|
+
use_pandas=True,
|
212
|
+
if_exists="append"
|
213
|
+
)
|
214
|
+
print('CopyTo: ', result)
|
215
|
+
except StatementError as err:
|
216
|
+
raise ComponentError(
|
217
|
+
f"Statement error: {err}"
|
218
|
+
) from err
|
219
|
+
except DataError as err:
|
220
|
+
raise ComponentError(
|
221
|
+
f"Data error: {err}"
|
222
|
+
) from err
|
223
|
+
except Exception as err:
|
224
|
+
raise ComponentError(
|
225
|
+
f"{self.StepName} Error: {err!s}"
|
226
|
+
) from err
|
227
|
+
|
228
|
+
async def _copy_iterable(self):
|
229
|
+
"""Copy an iterable to BigQuery."""
|
230
|
+
try:
|
231
|
+
async with await self._connection.connection() as conn:
|
232
|
+
await conn.write(
|
233
|
+
data=self.data,
|
234
|
+
table_id=self.tablename,
|
235
|
+
dataset_id=self.schema,
|
236
|
+
use_pandas=False,
|
237
|
+
if_exists="append",
|
238
|
+
batch_size=self._chunksize
|
239
|
+
)
|
240
|
+
except Exception as err:
|
241
|
+
raise ComponentError(
|
242
|
+
f"Error copying iterable to BigQuery: {err}"
|
243
|
+
) from err
|