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,114 @@
|
|
1
|
+
"""
|
2
|
+
DownloadFromSmartSheet
|
3
|
+
Download an Excel file from SmartSheet.
|
4
|
+
|
5
|
+
|
6
|
+
Example:
|
7
|
+
|
8
|
+
```yaml
|
9
|
+
DownloadFromSmartSheet:
|
10
|
+
comments: Download an SmartSheet Tab into an Excel file.
|
11
|
+
file_id: '373896609326980'
|
12
|
+
file_format: application/vnd.ms-excel
|
13
|
+
destination:
|
14
|
+
filename: WORP MPL 2022.xlsx
|
15
|
+
directory: /home/ubuntu/symbits/worp/files/stores/
|
16
|
+
```
|
17
|
+
|
18
|
+
"""
|
19
|
+
import asyncio
|
20
|
+
from collections.abc import Callable
|
21
|
+
from pathlib import Path
|
22
|
+
from ..exceptions import ComponentError, FileNotFound
|
23
|
+
from .DownloadFrom import DownloadFromBase
|
24
|
+
from ..interfaces.smartsheet import SmartSheetClient
|
25
|
+
|
26
|
+
class DownloadFromSmartSheet(SmartSheetClient, DownloadFromBase):
|
27
|
+
"""
|
28
|
+
DownloadFromSmartSheet
|
29
|
+
|
30
|
+
Overview
|
31
|
+
|
32
|
+
Download an Excel file or CSV file from SmartSheet.
|
33
|
+
|
34
|
+
Properties (inherited from DownloadFromBase)
|
35
|
+
|
36
|
+
.. table:: Properties
|
37
|
+
:widths: auto
|
38
|
+
|
39
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
40
|
+
| Name | Required | Summary |
|
41
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
42
|
+
| credentials | Yes | Credentials to establish connection with SharePoint site (username and password) |
|
43
|
+
| | | get credentials from environment if null. |
|
44
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
45
|
+
| create_destination | No | Boolean flag indicating whether to create the destination directory if it |
|
46
|
+
| | | doesn't exist (default: True). |
|
47
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
48
|
+
| api_key | No | The SmartSheet API key (can be provided as an environment variable or directly |
|
49
|
+
| | | set as a property). If not provided, tries to use the `SMARTSHEET_API_KEY` |
|
50
|
+
| | | environment variable. |
|
51
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
52
|
+
| url | No | Base URL for the SmartSheet Sheets API (default: |
|
53
|
+
| | | https://api.smartsheet.com/2.0/sheets/). |
|
54
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
55
|
+
| file_id | Yes | The ID of the SmartSheet file to download. |
|
56
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
57
|
+
| file_format | No | The desired file format for the downloaded data (default: |
|
58
|
+
| | | "application/vnd.ms-excel"). Supported formats are: |
|
59
|
+
| | | * "application/vnd.ms-excel" (Excel) |
|
60
|
+
| | | * "text/csv" (CSV) |
|
61
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
62
|
+
| filename | Yes | The filename to use for the downloaded file. |
|
63
|
+
+--------------------+----------+-----------+----------------------------------------------------------------------+
|
64
|
+
|
65
|
+
Save the downloaded files on the new destination.
|
66
|
+
|
67
|
+
""" # noqa
|
68
|
+
def __init__(
|
69
|
+
self,
|
70
|
+
loop: asyncio.AbstractEventLoop = None,
|
71
|
+
job: Callable = None,
|
72
|
+
stat: Callable = None,
|
73
|
+
**kwargs,
|
74
|
+
):
|
75
|
+
super().__init__(loop=loop, job=job, stat=stat, **kwargs)
|
76
|
+
|
77
|
+
async def start(self, **kwargs):
|
78
|
+
if self.file_format not in ["application/vnd.ms-excel", "text/csv"]:
|
79
|
+
# only supported
|
80
|
+
raise ComponentError(
|
81
|
+
f"SmartSheet: Format {self.file_format} is not suported"
|
82
|
+
)
|
83
|
+
try:
|
84
|
+
self.accept = (
|
85
|
+
"text/csv" if self.file_format == "dataframe" else self.file_format
|
86
|
+
)
|
87
|
+
except Exception as err:
|
88
|
+
print(err)
|
89
|
+
await super(DownloadFromSmartSheet, self).start(**kwargs)
|
90
|
+
return True
|
91
|
+
|
92
|
+
async def close(self):
|
93
|
+
pass
|
94
|
+
|
95
|
+
async def run(self):
|
96
|
+
self._result = None
|
97
|
+
try:
|
98
|
+
self._logger.info(f"Downloading SmartSheet file: {self.file_id}")
|
99
|
+
# check if self.filename is a relative path:
|
100
|
+
if isinstance(self.filename, str):
|
101
|
+
self.filename = Path(self.filename)
|
102
|
+
if not self.filename.is_absolute():
|
103
|
+
self.filename = self.directory.joinpath(self.filename)
|
104
|
+
if await self.download_file(file_id=self.file_id, destination=self.filename):
|
105
|
+
self._filenames = [str(self.filename)]
|
106
|
+
self._result = self._filenames
|
107
|
+
self.add_metric("SMARTSHEET_FILE", self.filename)
|
108
|
+
return self._result
|
109
|
+
except ComponentError as err:
|
110
|
+
raise FileNotFound(f"DownloadFromSmartSheet Error: {err}") from err
|
111
|
+
except Exception as err:
|
112
|
+
raise ComponentError(
|
113
|
+
f"DownloadFromSmartSheet: Unknown Error: {err}"
|
114
|
+
) from err
|
@@ -0,0 +1,229 @@
|
|
1
|
+
from typing import Optional, Callable
|
2
|
+
import os
|
3
|
+
import mimetypes
|
4
|
+
|
5
|
+
import asyncio
|
6
|
+
from io import BytesIO
|
7
|
+
import aiofiles
|
8
|
+
from botocore.exceptions import ClientError
|
9
|
+
from urllib.parse import urlparse
|
10
|
+
from PIL import Image
|
11
|
+
from PIL.ExifTags import TAGS, GPSTAGS
|
12
|
+
from ..interfaces.Boto3Client import Boto3Client
|
13
|
+
from ..interfaces.dataframes.pandas import PandasDataframe
|
14
|
+
from .flow import FlowComponent
|
15
|
+
from ..exceptions import FileNotFound, ComponentError
|
16
|
+
|
17
|
+
_EXTENSION_MAP = {
|
18
|
+
# fall‑backs when `mimetypes` lacks something you need
|
19
|
+
'image/heic': '.heic',
|
20
|
+
'image/webp': '.webp',
|
21
|
+
}
|
22
|
+
|
23
|
+
class DownloadS3File(Boto3Client, FlowComponent, PandasDataframe):
|
24
|
+
"""
|
25
|
+
Download a file from an S3 bucket.
|
26
|
+
"""
|
27
|
+
def __init__(
|
28
|
+
self,
|
29
|
+
loop: asyncio.AbstractEventLoop = None,
|
30
|
+
job: Callable = None,
|
31
|
+
stat: Callable = None,
|
32
|
+
**kwargs,
|
33
|
+
):
|
34
|
+
"""
|
35
|
+
Initialize the DownloadS3File component.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
loop (asyncio.AbstractEventLoop): The event loop to use.
|
39
|
+
job (Callable): The job to run.
|
40
|
+
stat (Callable): The statistics to collect.
|
41
|
+
**kwargs: Additional arguments.
|
42
|
+
"""
|
43
|
+
self.path_column = kwargs.pop('path_column', 'file_path')
|
44
|
+
self.content_type = kwargs.pop('content_type', 'application/octet-stream')
|
45
|
+
self.filename_column: Optional[str] = kwargs.pop('filename_column', None)
|
46
|
+
self.download_dir: str = kwargs.pop('directory', '/tmp')
|
47
|
+
self.as_bytes: bool = kwargs.pop('as_bytes', False)
|
48
|
+
self.chunk_size: int = kwargs.get('chunk_size', 100)
|
49
|
+
self.task_parts: int = kwargs.get('task_parts', 10)
|
50
|
+
self.extract_exif: bool = kwargs.pop('extract_exif', False)
|
51
|
+
super().__init__(loop=loop, job=job, stat=stat, **kwargs)
|
52
|
+
self.files_dict = {} # Dictionary to store downloaded files
|
53
|
+
|
54
|
+
async def start(self, **kwargs):
|
55
|
+
"""
|
56
|
+
start.
|
57
|
+
|
58
|
+
Initialize Task.
|
59
|
+
"""
|
60
|
+
self.processing_credentials()
|
61
|
+
await super().start(**kwargs)
|
62
|
+
if self.previous:
|
63
|
+
self.data = self.input
|
64
|
+
# check if self.filename_column and self.path_column are in self.data dataframe:
|
65
|
+
if self.filename_column not in self.data.columns:
|
66
|
+
raise ValueError(f'Filename column {self.filename_column} not found in data.')
|
67
|
+
if self.path_column not in self.data.columns:
|
68
|
+
raise ValueError(f'Path column {self.path_column} not found in data.')
|
69
|
+
# check if self.data is empty:
|
70
|
+
if self.data.empty:
|
71
|
+
raise ValueError('Dataframe is empty.')
|
72
|
+
# evaluate the download_dir:
|
73
|
+
if self.download_dir:
|
74
|
+
self.download_dir = self.download_dir.strip()
|
75
|
+
self.download_dir = self.mask_replacement(self.download_dir)
|
76
|
+
return True
|
77
|
+
|
78
|
+
def parse_s3_url(self, url: str) -> tuple:
|
79
|
+
"""
|
80
|
+
Parse an S3 URL into bucket and key.
|
81
|
+
|
82
|
+
Args:
|
83
|
+
url (str): The S3 URL to parse.
|
84
|
+
|
85
|
+
Returns:
|
86
|
+
tuple: A tuple containing the bucket name and the key.
|
87
|
+
"""
|
88
|
+
parsed_url = urlparse(url)
|
89
|
+
if parsed_url.scheme == 's3':
|
90
|
+
# s3://bucket-name/key
|
91
|
+
bucket_name = parsed_url.netloc
|
92
|
+
object_key = parsed_url.path.lstrip('/')
|
93
|
+
elif parsed_url.netloc.endswith('.s3.amazonaws.com'):
|
94
|
+
# https://bucket-name.s3.amazonaws.com/key
|
95
|
+
bucket_name = parsed_url.netloc.split('.s3.amazonaws.com')[0]
|
96
|
+
object_key = parsed_url.path.lstrip('/')
|
97
|
+
elif '.s3.' in parsed_url.netloc:
|
98
|
+
# https://s3.region.amazonaws.com/bucket-name/key or
|
99
|
+
# https://bucket-name.s3.region.amazonaws.com/key
|
100
|
+
if parsed_url.netloc.startswith('s3.'):
|
101
|
+
# https://s3.region.amazonaws.com/bucket-name/key
|
102
|
+
path_parts = parsed_url.path.lstrip('/').split('/', 1)
|
103
|
+
bucket_name = path_parts[0]
|
104
|
+
object_key = path_parts[1] if len(path_parts) > 1 else ''
|
105
|
+
else:
|
106
|
+
# https://bucket-name.s3.region.amazonaws.com/key
|
107
|
+
bucket_name = parsed_url.netloc.split('.s3.')[0]
|
108
|
+
object_key = parsed_url.path.lstrip('/')
|
109
|
+
elif self.prefix:
|
110
|
+
# Custom domain pointing to S3
|
111
|
+
# Use provided bucket or extract from path
|
112
|
+
bucket_name = self.bucket
|
113
|
+
object_key = self.prefix + parsed_url.path.lstrip('/')
|
114
|
+
else:
|
115
|
+
# Custom domain pointing to S3
|
116
|
+
# Use provided bucket or extract from path
|
117
|
+
bucket_name = self.bucket
|
118
|
+
object_key = parsed_url.path.lstrip('/')
|
119
|
+
return bucket_name, object_key
|
120
|
+
|
121
|
+
def _filename_from_key(
|
122
|
+
self,
|
123
|
+
object_key: str,
|
124
|
+
content_type: str | None = None
|
125
|
+
) -> str:
|
126
|
+
"""
|
127
|
+
Return a filename with an extension derived from either the key
|
128
|
+
or the S3 object's Content‑Type.
|
129
|
+
"""
|
130
|
+
# 1) basename from the key
|
131
|
+
fname = os.path.basename(object_key)
|
132
|
+
root, ext = os.path.splitext(fname)
|
133
|
+
|
134
|
+
if ext: # key already has an extension
|
135
|
+
return fname
|
136
|
+
|
137
|
+
# 2) derive from Content‑Type
|
138
|
+
if content_type:
|
139
|
+
ext = mimetypes.guess_extension(content_type.split(';')[0].strip()) \
|
140
|
+
or _EXTENSION_MAP.get(content_type)
|
141
|
+
|
142
|
+
# 3) final fall‑back
|
143
|
+
ext = ext or '.jpg'
|
144
|
+
return f"{root}{ext}"
|
145
|
+
|
146
|
+
async def download_file(self, row, idx, client, as_bytes: bool = False):
|
147
|
+
path = row[self.path_column]
|
148
|
+
filename = row[self.filename_column]
|
149
|
+
if not path or not filename:
|
150
|
+
raise ValueError(f'Path or filename is empty for row {idx}.')
|
151
|
+
bucket_name, object_key = self.parse_s3_url(path)
|
152
|
+
if bucket_name != self.bucket:
|
153
|
+
raise ValueError(f'Bucket name {bucket_name} does not match {self.bucket}.')
|
154
|
+
try:
|
155
|
+
obj = await client.get_s3_object(
|
156
|
+
bucket=bucket_name,
|
157
|
+
filename=object_key,
|
158
|
+
)
|
159
|
+
content_type = obj.get("ContentType", self.content_type)
|
160
|
+
filename = self._filename_from_key(object_key, content_type)
|
161
|
+
|
162
|
+
self.data.at[idx, 'file_obj'] = obj
|
163
|
+
file_data = None
|
164
|
+
with obj["Body"] as stream:
|
165
|
+
file_data = stream.read()
|
166
|
+
if as_bytes:
|
167
|
+
# Read the file into BytesIO
|
168
|
+
output = BytesIO()
|
169
|
+
output.write(file_data)
|
170
|
+
output.seek(0)
|
171
|
+
self.data.at[idx, 'file_data'] = output
|
172
|
+
if self.download_dir:
|
173
|
+
# save file in download_dir:
|
174
|
+
output_path = f"{self.download_dir}/{filename}"
|
175
|
+
async with aiofiles.open(output_path, 'wb') as f:
|
176
|
+
await f.write(file_data)
|
177
|
+
self.data.at[idx, 'file_path'] = output_path
|
178
|
+
return row
|
179
|
+
except ClientError as e:
|
180
|
+
if e.response['Error']['Code'] == 'NoSuchKey':
|
181
|
+
raise FileNotFound(
|
182
|
+
f"File '{object_key}' not found in bucket '{bucket_name}'."
|
183
|
+
) from e
|
184
|
+
elif e.response['Error']['Code'] == 'NoSuchBucket':
|
185
|
+
raise FileNotFound(
|
186
|
+
f"Bucket '{bucket_name}' does not exist."
|
187
|
+
) from e
|
188
|
+
else:
|
189
|
+
raise ComponentError(
|
190
|
+
f"Error downloading file from S3: {str(e)}"
|
191
|
+
) from e
|
192
|
+
except Exception as e:
|
193
|
+
self._logger.error(f'Error downloading file {filename}: {e}')
|
194
|
+
raise e
|
195
|
+
|
196
|
+
async def run(self):
|
197
|
+
"""
|
198
|
+
run.
|
199
|
+
|
200
|
+
Download the file from S3.
|
201
|
+
"""
|
202
|
+
async with await self.open() as client:
|
203
|
+
if self.bucket is None:
|
204
|
+
raise ValueError('Bucket name is required.')
|
205
|
+
if self.filename_column is None:
|
206
|
+
raise ValueError('Filename column is required.')
|
207
|
+
if self.path_column is None:
|
208
|
+
raise ValueError('Path column is required.')
|
209
|
+
|
210
|
+
# Create the new columns:
|
211
|
+
self.column_exists('file_obj')
|
212
|
+
self.column_exists('file_path')
|
213
|
+
self.column_exists('file_data')
|
214
|
+
# generate tasks from dataframe:
|
215
|
+
tasks = self._create_tasks(
|
216
|
+
self.data,
|
217
|
+
self.download_file,
|
218
|
+
client=client,
|
219
|
+
as_bytes=self.as_bytes
|
220
|
+
)
|
221
|
+
# process tasks:
|
222
|
+
results = await self._processing_tasks(tasks)
|
223
|
+
# process results:
|
224
|
+
for result in results:
|
225
|
+
if isinstance(result, Exception):
|
226
|
+
raise result
|
227
|
+
self._print_data_(self.data, ' DownloadS3File ')
|
228
|
+
self._result = self.data
|
229
|
+
return self._result
|
@@ -0,0 +1,59 @@
|
|
1
|
+
from ..utils import cPrint, SafeDict
|
2
|
+
from .flow import FlowComponent
|
3
|
+
|
4
|
+
|
5
|
+
class Dummy(FlowComponent):
|
6
|
+
async def start(self, **kwargs):
|
7
|
+
"""
|
8
|
+
start.
|
9
|
+
|
10
|
+
Initialize (if needed) a task
|
11
|
+
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
```yaml
|
16
|
+
Dummy:
|
17
|
+
message: 'Dummy Date: {firstdate} and {lastdate}'
|
18
|
+
masks:
|
19
|
+
firstdate:
|
20
|
+
- date_diff_dow
|
21
|
+
- day_of_week: monday
|
22
|
+
diff: 8
|
23
|
+
mask: '%Y-%m-%d'
|
24
|
+
lastdate:
|
25
|
+
- date_diff_dow
|
26
|
+
- day_of_week: monday
|
27
|
+
diff: 2
|
28
|
+
mask: '%Y-%m-%d'
|
29
|
+
```
|
30
|
+
|
31
|
+
"""
|
32
|
+
return True
|
33
|
+
|
34
|
+
async def run(self):
|
35
|
+
"""
|
36
|
+
run.
|
37
|
+
|
38
|
+
Close (if needed) a task
|
39
|
+
"""
|
40
|
+
try:
|
41
|
+
self.message = self.message.format_map(SafeDict(**self._mask))
|
42
|
+
cPrint(f"Message IS: {self.message}")
|
43
|
+
self.add_metric("message", self.message)
|
44
|
+
except Exception:
|
45
|
+
self.save_traceback()
|
46
|
+
raise
|
47
|
+
return True
|
48
|
+
|
49
|
+
async def close(self):
|
50
|
+
"""
|
51
|
+
close.
|
52
|
+
|
53
|
+
Close (if needed) a task
|
54
|
+
"""
|
55
|
+
|
56
|
+
def save_stats(self):
|
57
|
+
"""
|
58
|
+
Extension to save stats for this component
|
59
|
+
"""
|