flowtask 5.8.4__cp310-cp310-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-310-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-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-310-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-310-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-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-310-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,507 @@
|
|
1
|
+
import asyncio
|
2
|
+
import copy
|
3
|
+
from typing import Any, Union
|
4
|
+
from collections.abc import Callable
|
5
|
+
import pandas
|
6
|
+
import numpy as np
|
7
|
+
from datamodel.typedefs.types import AttrDict
|
8
|
+
from asyncdb.exceptions import NoDataFound
|
9
|
+
from navconfig.logging import logging
|
10
|
+
from querysource.types import strtobool
|
11
|
+
from querysource.types.dt import transforms as qsdfunctions
|
12
|
+
from . import functions as dffunctions
|
13
|
+
from ...exceptions import (
|
14
|
+
ComponentError,
|
15
|
+
DataNotFound,
|
16
|
+
ConfigError
|
17
|
+
)
|
18
|
+
from ...utils.executor import getFunction
|
19
|
+
from ...utils.functions import check_empty
|
20
|
+
from ..flow import FlowComponent
|
21
|
+
|
22
|
+
|
23
|
+
class TransformRows(FlowComponent):
|
24
|
+
"""
|
25
|
+
TransformRows
|
26
|
+
|
27
|
+
Overview
|
28
|
+
|
29
|
+
The TransformRows class is a component for transforming, adding, or modifying rows in a Pandas DataFrame based on
|
30
|
+
specified criteria. It supports single and multiple DataFrame transformations, and various operations on columns.
|
31
|
+
|
32
|
+
.. table:: Properties
|
33
|
+
:widths: auto
|
34
|
+
|
35
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
36
|
+
| Name | Required | Description |
|
37
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
38
|
+
| fields | No | A dictionary defining the fields and corresponding transformations to be applied. |
|
39
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
40
|
+
| filter_conditions | No | A dictionary defining the filter conditions for transformations. |
|
41
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
42
|
+
| clean_notnull | No | Boolean flag indicating if non-null values should be cleaned, defaults to True. |
|
43
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
44
|
+
| replace_columns | No | Boolean flag indicating if columns should be replaced, defaults to False. |
|
45
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
46
|
+
| multi | No | Boolean flag indicating if multiple DataFrame transformations should be supported, defaults to False. |
|
47
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
48
|
+
| function | No | View the list of function in the functions.py file on this directory |
|
49
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
50
|
+
| _applied | No | List to store the applied transformations. |
|
51
|
+
+--------------------+----------+-------------------------------------------------------------------------------------------------------+
|
52
|
+
|
53
|
+
Return
|
54
|
+
|
55
|
+
The methods in this class manage the transformation of DataFrames, including initialization, execution, and result handling.
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
Example:
|
60
|
+
|
61
|
+
```yaml
|
62
|
+
TransformRows:
|
63
|
+
fields:
|
64
|
+
display_name:
|
65
|
+
value:
|
66
|
+
- concat
|
67
|
+
- columns:
|
68
|
+
- first_name
|
69
|
+
- last_name
|
70
|
+
legal_address:
|
71
|
+
value:
|
72
|
+
- concat
|
73
|
+
- columns:
|
74
|
+
- legal_street_address_1
|
75
|
+
- legal_street_address_2
|
76
|
+
work_address:
|
77
|
+
value:
|
78
|
+
- concat
|
79
|
+
- columns:
|
80
|
+
- work_location_address_1
|
81
|
+
- work_location_address_2
|
82
|
+
first_name:
|
83
|
+
value:
|
84
|
+
- capitalize
|
85
|
+
last_name:
|
86
|
+
value:
|
87
|
+
- capitalize
|
88
|
+
warp_id:
|
89
|
+
value:
|
90
|
+
- nullif
|
91
|
+
- chars:
|
92
|
+
- '*'
|
93
|
+
old_warp_id:
|
94
|
+
value:
|
95
|
+
- nullif
|
96
|
+
- chars:
|
97
|
+
- '*'
|
98
|
+
worker_category_description:
|
99
|
+
value:
|
100
|
+
- case
|
101
|
+
- column: benefits_eligibility_class_code
|
102
|
+
condition: PART-TIME
|
103
|
+
match: Part Time
|
104
|
+
notmatch: Full Time
|
105
|
+
file_number:
|
106
|
+
value:
|
107
|
+
- ereplace
|
108
|
+
- columns:
|
109
|
+
- position_id
|
110
|
+
- payroll_group
|
111
|
+
newvalue: ''
|
112
|
+
original_hire_date:
|
113
|
+
value:
|
114
|
+
- convert_to_datetime
|
115
|
+
hire_date:
|
116
|
+
value:
|
117
|
+
- convert_to_datetime
|
118
|
+
start_date:
|
119
|
+
value:
|
120
|
+
- convert_to_datetime
|
121
|
+
updated:
|
122
|
+
value:
|
123
|
+
- convert_to_datetime
|
124
|
+
gender_code:
|
125
|
+
value:
|
126
|
+
- convert_to_string
|
127
|
+
payroll_id:
|
128
|
+
value:
|
129
|
+
- convert_to_string
|
130
|
+
reports_to_payroll_id:
|
131
|
+
value:
|
132
|
+
- convert_to_string
|
133
|
+
```
|
134
|
+
|
135
|
+
""" # noqa
|
136
|
+
|
137
|
+
def __init__(
|
138
|
+
self,
|
139
|
+
loop: asyncio.AbstractEventLoop = None,
|
140
|
+
job: Callable = None,
|
141
|
+
stat: Callable = None,
|
142
|
+
**kwargs,
|
143
|
+
):
|
144
|
+
self.fields: dict = {}
|
145
|
+
self.filter_conditions: dict = {}
|
146
|
+
self.clean_notnull: bool = True
|
147
|
+
self.replace_columns: bool = False
|
148
|
+
self._applied: list = []
|
149
|
+
replace_cols = kwargs.pop("replace_columns", False)
|
150
|
+
if isinstance(replace_cols, str):
|
151
|
+
self.replace_columns = strtobool(replace_cols)
|
152
|
+
else:
|
153
|
+
self.replace_columns = bool(replace_cols)
|
154
|
+
# support for multiple dataframe transformations
|
155
|
+
try:
|
156
|
+
self.multi = bool(kwargs["multi"])
|
157
|
+
del kwargs["multi"]
|
158
|
+
except KeyError:
|
159
|
+
self.multi = False
|
160
|
+
if self.multi is False:
|
161
|
+
if "fields" in kwargs:
|
162
|
+
self.fields = kwargs["fields"]
|
163
|
+
del kwargs["fields"]
|
164
|
+
else:
|
165
|
+
self.fields = {}
|
166
|
+
super(TransformRows, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
|
167
|
+
self._logger.debug(f"Using Replace Columns: {self.replace_columns}")
|
168
|
+
|
169
|
+
async def start(self, **kwargs):
|
170
|
+
"""Obtain Pandas Dataframe."""
|
171
|
+
if self.previous:
|
172
|
+
self.data = self.input
|
173
|
+
else:
|
174
|
+
raise ComponentError("a Previous Component was not found.")
|
175
|
+
if check_empty(self.data):
|
176
|
+
raise DataNotFound("No data was found")
|
177
|
+
|
178
|
+
async def run(self):
|
179
|
+
if self.data is None:
|
180
|
+
return False
|
181
|
+
if isinstance(self.data, pandas.DataFrame):
|
182
|
+
self.add_metric("started_rows", self.data.shape[0])
|
183
|
+
self.add_metric("started_columns", self.data.shape[1])
|
184
|
+
df = await self.transform(self, self.data)
|
185
|
+
self._result = df
|
186
|
+
# avoid threat the Dataframe as a Copy
|
187
|
+
self._result.is_copy = None
|
188
|
+
return self._result
|
189
|
+
elif self.multi is True:
|
190
|
+
# iteration over every Pandas DT:
|
191
|
+
try:
|
192
|
+
result = self.data.items()
|
193
|
+
except Exception as err:
|
194
|
+
raise ComponentError(
|
195
|
+
f"TransformRows: Invalid Result type for Multiple: {err}"
|
196
|
+
) from err
|
197
|
+
self._result = {}
|
198
|
+
for name, rs in result:
|
199
|
+
try:
|
200
|
+
el = getattr(self, name)
|
201
|
+
except AttributeError:
|
202
|
+
self._result[name] = rs
|
203
|
+
continue
|
204
|
+
df = await self.transform(AttrDict(el), rs)
|
205
|
+
self._result[name] = df
|
206
|
+
return self._result
|
207
|
+
else:
|
208
|
+
raise NoDataFound(
|
209
|
+
"TransformRows: Pandas Dataframe Empty or is not a Dataframe"
|
210
|
+
)
|
211
|
+
|
212
|
+
async def _scalar_column(
|
213
|
+
self,
|
214
|
+
it: pandas.DataFrame,
|
215
|
+
field: str,
|
216
|
+
val: Any
|
217
|
+
) -> None:
|
218
|
+
"""_scalar_column.
|
219
|
+
|
220
|
+
Operating the Dataframe Function Column as an Scalar Value.
|
221
|
+
"""
|
222
|
+
try:
|
223
|
+
if val.startswith('{'):
|
224
|
+
it[field] = self.mask_replacement(val)
|
225
|
+
else:
|
226
|
+
it[field] = it[val]
|
227
|
+
if self.replace_columns is True:
|
228
|
+
it.drop(val, axis="columns", inplace=True)
|
229
|
+
except KeyError:
|
230
|
+
self._logger.error(
|
231
|
+
f"Column doesn't exists: {val}"
|
232
|
+
)
|
233
|
+
except Exception as e:
|
234
|
+
self._logger.error(
|
235
|
+
f"Error dropping Column: {val}, {e}"
|
236
|
+
)
|
237
|
+
|
238
|
+
def _get_df_function(self, fn: str) -> Union[Callable, None]:
|
239
|
+
func = getattr(dffunctions, fn, None)
|
240
|
+
if func is None:
|
241
|
+
func = getattr(qsdfunctions, fn)
|
242
|
+
return func
|
243
|
+
|
244
|
+
async def _check_condition(self, df, field: str, fname: str, conditions: dict):
|
245
|
+
"""Check if a field meets the specified condition."""
|
246
|
+
# Check column existence
|
247
|
+
if conditions.get("exists") and field not in df.columns:
|
248
|
+
return False
|
249
|
+
|
250
|
+
# Check for specific criteria (e.g., column must have non-null values)
|
251
|
+
if "not_null" in conditions and conditions["not_null"]:
|
252
|
+
try:
|
253
|
+
if df[field].notnull().all():
|
254
|
+
return False
|
255
|
+
except KeyError:
|
256
|
+
return False
|
257
|
+
|
258
|
+
# TODO: add more conditions to check
|
259
|
+
return True
|
260
|
+
|
261
|
+
async def _apply_one(
|
262
|
+
self,
|
263
|
+
it: pandas.DataFrame,
|
264
|
+
field: str,
|
265
|
+
val: Any
|
266
|
+
) -> None:
|
267
|
+
"""_apply_one.
|
268
|
+
|
269
|
+
Processing "fields" attributes as a Dictionary.
|
270
|
+
Apply to one column only.
|
271
|
+
"""
|
272
|
+
conditions = {}
|
273
|
+
if "conditions" in val:
|
274
|
+
conditions = val.get('conditions')
|
275
|
+
if not isinstance(conditions, dict):
|
276
|
+
self._logger.warning(
|
277
|
+
f"TranformRows conditions need to be a dictionary, got {type(conditions)}"
|
278
|
+
)
|
279
|
+
if "value" in val:
|
280
|
+
operation = val.get('value')
|
281
|
+
else:
|
282
|
+
operation = val
|
283
|
+
args = {}
|
284
|
+
try:
|
285
|
+
fname = operation.pop(0)
|
286
|
+
except AttributeError:
|
287
|
+
fname = operation
|
288
|
+
operation = []
|
289
|
+
self._applied.append(f"Function: {fname!s} args: {operation}")
|
290
|
+
if not await self._check_condition(it, field, fname, conditions):
|
291
|
+
self._logger.warning(
|
292
|
+
f"Column {field} not met conditions {conditions}"
|
293
|
+
)
|
294
|
+
return it # Skip transformation if condition fails
|
295
|
+
# fname is a field and len > 1
|
296
|
+
if fname in it.columns and len(operation) == 0:
|
297
|
+
# simple field replacement
|
298
|
+
it[field] = it[fname]
|
299
|
+
it = it.copy()
|
300
|
+
return it
|
301
|
+
|
302
|
+
# only calls functions on TransformRows scope:
|
303
|
+
# first, check if is a Pandas-based Function
|
304
|
+
try:
|
305
|
+
args = operation[0]
|
306
|
+
except IndexError:
|
307
|
+
args = {}
|
308
|
+
try:
|
309
|
+
func = self._get_df_function(fname)
|
310
|
+
self._logger.notice(
|
311
|
+
f"Calling Function: {fname!s} with args: {operation}"
|
312
|
+
)
|
313
|
+
if fname == "fill_column":
|
314
|
+
args["variables"] = self._variables
|
315
|
+
if args:
|
316
|
+
it = func(df=it, field=field, **args)
|
317
|
+
else:
|
318
|
+
it = func(df=it, field=field)
|
319
|
+
it = it.copy()
|
320
|
+
return it
|
321
|
+
except AttributeError:
|
322
|
+
pass
|
323
|
+
# try to apply an scalar function:
|
324
|
+
func = getFunction(fname)
|
325
|
+
if callable(func):
|
326
|
+
# SCALAR FUNCTION
|
327
|
+
try:
|
328
|
+
tmp = operation[0]
|
329
|
+
for a, b in tmp.items():
|
330
|
+
if isinstance(b, list):
|
331
|
+
for idx, el in enumerate(b):
|
332
|
+
if el in self._variables:
|
333
|
+
b[idx] = el.replace(
|
334
|
+
str(el),
|
335
|
+
str(self._variables[str(el)]),
|
336
|
+
)
|
337
|
+
if b in self._variables:
|
338
|
+
args[a] = b.replace(
|
339
|
+
str(b), str(self._variables[str(b)])
|
340
|
+
)
|
341
|
+
result = func(**args)
|
342
|
+
except (KeyError, IndexError, ValueError):
|
343
|
+
result = func()
|
344
|
+
except Exception as err:
|
345
|
+
self._logger.warning(
|
346
|
+
f"Error or missing DF Function: {err!s}"
|
347
|
+
)
|
348
|
+
# using scalar functions to set value in columns
|
349
|
+
func = getFunction(fname)
|
350
|
+
if not callable(func):
|
351
|
+
return it
|
352
|
+
self._logger.debug(
|
353
|
+
f"Calling Scalar: {fname!s}: {func}"
|
354
|
+
)
|
355
|
+
try:
|
356
|
+
args = operation[0]
|
357
|
+
tmp = operation[0]
|
358
|
+
except IndexError:
|
359
|
+
args = {}
|
360
|
+
try:
|
361
|
+
for a, b in tmp.items():
|
362
|
+
if b in self._variables:
|
363
|
+
args[a] = b.replace(
|
364
|
+
str(b), str(self._variables[str(b)])
|
365
|
+
)
|
366
|
+
result = func(**args)
|
367
|
+
except (TypeError, KeyError, IndexError, ValueError):
|
368
|
+
# result doesn't need keyword arguments
|
369
|
+
result = func()
|
370
|
+
except Exception as e:
|
371
|
+
print(func, fname, field, val)
|
372
|
+
self._logger.exception(
|
373
|
+
f"Error Running an Scalar Function {fname!s} \
|
374
|
+
to set Dataframe: {e}"
|
375
|
+
)
|
376
|
+
return it
|
377
|
+
r = {field: result}
|
378
|
+
it = it.assign(**r)
|
379
|
+
it = it.copy()
|
380
|
+
return it
|
381
|
+
else:
|
382
|
+
self._logger.warning(
|
383
|
+
f"Function {func} is not callable."
|
384
|
+
)
|
385
|
+
return it
|
386
|
+
|
387
|
+
async def _apply_multiple(
|
388
|
+
self,
|
389
|
+
it: pandas.DataFrame,
|
390
|
+
field: str,
|
391
|
+
val: Any
|
392
|
+
) -> None:
|
393
|
+
"""_apply_multiple.
|
394
|
+
|
395
|
+
Apply Multiples functions to a single column.
|
396
|
+
"""
|
397
|
+
if isinstance(val, dict):
|
398
|
+
for fn, args in val.items():
|
399
|
+
try:
|
400
|
+
func = self._get_df_function(fn)
|
401
|
+
self._logger.notice(
|
402
|
+
f"Calling Function: {fn!s} with args: {args}"
|
403
|
+
)
|
404
|
+
if not args:
|
405
|
+
args = {}
|
406
|
+
it = func(df=it, field=field, **args)
|
407
|
+
it = it.copy()
|
408
|
+
except AttributeError:
|
409
|
+
pass
|
410
|
+
return it
|
411
|
+
for value in val:
|
412
|
+
# iterate over a list of possible functions:
|
413
|
+
if isinstance(value, str):
|
414
|
+
# create the column based on value
|
415
|
+
await self._scalar_column(it, field, value)
|
416
|
+
continue
|
417
|
+
if isinstance(value, dict):
|
418
|
+
# function dictionary: {'split': {'separator': ','}}
|
419
|
+
# TODO: for now, only work with dataframe functions:
|
420
|
+
for fn, args in value.items():
|
421
|
+
try:
|
422
|
+
func = self._get_df_function(fn)
|
423
|
+
self._logger.notice(
|
424
|
+
f"Calling Function: {fn!s} with args: {args}"
|
425
|
+
)
|
426
|
+
if not args:
|
427
|
+
args = {}
|
428
|
+
it = func(df=it, field=field, **args)
|
429
|
+
it = it.copy()
|
430
|
+
except AttributeError:
|
431
|
+
pass
|
432
|
+
elif isinstance(value, list):
|
433
|
+
# list of functions to be applied:
|
434
|
+
# split the list element in fn and arguments
|
435
|
+
fn, args = value if len(value) == 2 else (value[0], {})
|
436
|
+
func = self._get_df_function(fn)
|
437
|
+
if func is not None:
|
438
|
+
it = func(df=it, field=field, **args)
|
439
|
+
it = it.copy()
|
440
|
+
else:
|
441
|
+
self._logger.warning(
|
442
|
+
f"Function {fn} is not callable."
|
443
|
+
)
|
444
|
+
else:
|
445
|
+
raise ConfigError(
|
446
|
+
f"Unable to work with this Function {value}: {type(value)}"
|
447
|
+
)
|
448
|
+
return it
|
449
|
+
|
450
|
+
async def transform(self, elem, df):
|
451
|
+
try:
|
452
|
+
fields = copy.deepcopy(elem.fields)
|
453
|
+
except KeyError:
|
454
|
+
fields = {}
|
455
|
+
if not isinstance(df, pandas.DataFrame):
|
456
|
+
raise NoDataFound("Pandas Dataframe Empty or is not a Dataframe")
|
457
|
+
if hasattr(elem, "clean_dates"):
|
458
|
+
u = df.select_dtypes(include=["datetime64[ns]"])
|
459
|
+
df[u.columns] = df[u.columns].replace({np.nan: None})
|
460
|
+
it = df.copy()
|
461
|
+
for field, val in fields.items():
|
462
|
+
if isinstance(val, str):
|
463
|
+
await self._scalar_column(it, field, val)
|
464
|
+
continue
|
465
|
+
elif isinstance(val, dict) and 'value' in val:
|
466
|
+
# Function to be applied:
|
467
|
+
it = await self._apply_one(it, field, val)
|
468
|
+
continue
|
469
|
+
elif isinstance(val, (dict, list)):
|
470
|
+
# Applying multiple functions to same column:
|
471
|
+
it = await self._apply_multiple(it, field, val)
|
472
|
+
continue
|
473
|
+
# at the end
|
474
|
+
df = it
|
475
|
+
# starting changes:
|
476
|
+
if hasattr(elem, "clean_str"):
|
477
|
+
df.is_copy = None
|
478
|
+
u = df.select_dtypes(include=["object", "string"])
|
479
|
+
u = u.applymap(lambda x: x.strip() if isinstance(x, str) else x)
|
480
|
+
df[u.columns] = df[u.columns].fillna("")
|
481
|
+
if hasattr(elem, "drop_empty"):
|
482
|
+
# First filter out those rows which
|
483
|
+
# does not contain any data
|
484
|
+
df.dropna(how="all")
|
485
|
+
# removing empty cols
|
486
|
+
df.is_copy = None
|
487
|
+
df.dropna(axis=1, how="all")
|
488
|
+
df.dropna(axis=0, how="all")
|
489
|
+
if self._debug is True:
|
490
|
+
print("TRANSFORM ===")
|
491
|
+
print(df)
|
492
|
+
print("::: Printing Column Information === ")
|
493
|
+
for column, t in df.dtypes.items():
|
494
|
+
print(column, "->", t, "->", df[column].iloc[0])
|
495
|
+
# avoid threat the Dataframe as a Copy
|
496
|
+
df.is_copy = None
|
497
|
+
self._result = df
|
498
|
+
try:
|
499
|
+
self.add_metric("ended_rows", df.shape[0])
|
500
|
+
self.add_metric("ended_columns", df.shape[1])
|
501
|
+
self.add_metric("Transformations", self._applied)
|
502
|
+
except Exception as err:
|
503
|
+
logging.error(f"TransformRows: Error setting Metrics: {err}")
|
504
|
+
return self._result
|
505
|
+
|
506
|
+
def close(self):
|
507
|
+
pass
|