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
flowtask/tasks/pile.py
ADDED
@@ -0,0 +1,486 @@
|
|
1
|
+
"""
|
2
|
+
TaskPîle.
|
3
|
+
"""
|
4
|
+
from numbers import Number
|
5
|
+
from typing import Any
|
6
|
+
from collections.abc import Callable
|
7
|
+
from functools import partial
|
8
|
+
from navconfig.logging import logging
|
9
|
+
from ..components import getComponent, GroupComponent
|
10
|
+
from ..exceptions import TaskDefinition, ComponentError
|
11
|
+
|
12
|
+
logging.getLogger("matplotlib").setLevel(logging.CRITICAL)
|
13
|
+
logging.getLogger("PIL").setLevel(logging.CRITICAL)
|
14
|
+
|
15
|
+
import networkx as nx # pylint: disable=C0411,C0413
|
16
|
+
import matplotlib.pyplot as plt # pylint: disable=C0411,C0413
|
17
|
+
|
18
|
+
|
19
|
+
class Step:
|
20
|
+
"""Step.
|
21
|
+
|
22
|
+
Step is the basic component of a Task.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def __init__(
|
26
|
+
self, step_name: str, step_id: int, params: dict, program: str = None
|
27
|
+
) -> None:
|
28
|
+
try:
|
29
|
+
self._component = getComponent(step_name, program=program)
|
30
|
+
except Exception as e:
|
31
|
+
logging.exception(e, stack_info=False)
|
32
|
+
raise ComponentError(
|
33
|
+
f"Step Error: Unable to load Component {step_name}: {e}"
|
34
|
+
) from e
|
35
|
+
self.step_id = f"{step_name}_{step_id}"
|
36
|
+
self.step_name = step_name
|
37
|
+
self.params = params
|
38
|
+
self.job: Callable = None
|
39
|
+
self.depends: list = params.get('depends', [])
|
40
|
+
self.branch: dict = params.get("branch", {})
|
41
|
+
|
42
|
+
def get_depends(self, previous) -> Any:
|
43
|
+
if not self.depends:
|
44
|
+
return previous
|
45
|
+
else:
|
46
|
+
return self.depends
|
47
|
+
|
48
|
+
def __str__(self) -> str:
|
49
|
+
return f"<{self.step_id}>: {self.params!r}"
|
50
|
+
|
51
|
+
def __repr__(self) -> str:
|
52
|
+
return f"<{self.step_id}>: {self.params!r}"
|
53
|
+
|
54
|
+
@property
|
55
|
+
def name(self):
|
56
|
+
return self.step_id
|
57
|
+
|
58
|
+
@property
|
59
|
+
def component(self):
|
60
|
+
return self._component
|
61
|
+
|
62
|
+
|
63
|
+
class GroupStep(Step):
|
64
|
+
def __init__(
|
65
|
+
self, step_name: str, step_id: int, params: dict, program: str = None
|
66
|
+
) -> None:
|
67
|
+
try:
|
68
|
+
self._component = GroupComponent
|
69
|
+
except Exception as e:
|
70
|
+
logging.exception(e, stack_info=False)
|
71
|
+
raise ComponentError(
|
72
|
+
f"Step Error: Unable to load Group Component {step_name}: {e}"
|
73
|
+
) from e
|
74
|
+
self.step_idx = step_id
|
75
|
+
self.step_id = f"{step_name}_{step_id}"
|
76
|
+
self.step_name = step_name
|
77
|
+
self.params = params
|
78
|
+
self.job: Callable = None
|
79
|
+
self.depends: list = []
|
80
|
+
self._steps: list = []
|
81
|
+
try:
|
82
|
+
self.depends = params["depends"]
|
83
|
+
except KeyError:
|
84
|
+
pass
|
85
|
+
|
86
|
+
def add_step(self, step) -> None:
|
87
|
+
self._steps.append(step)
|
88
|
+
|
89
|
+
@property
|
90
|
+
def component(self):
|
91
|
+
return partial(self._component, component_list=self._steps)
|
92
|
+
|
93
|
+
@property
|
94
|
+
def steps(self):
|
95
|
+
return self._steps
|
96
|
+
|
97
|
+
|
98
|
+
class TaskPile:
|
99
|
+
"""
|
100
|
+
TaskPile is responsible for parsing a task definition (in JSON/YAML/TOML format)
|
101
|
+
and converting it into a sequence of components, constructing a dependency graph
|
102
|
+
for orderly execution.
|
103
|
+
|
104
|
+
This class manages the following:
|
105
|
+
|
106
|
+
- Parsing a task, which consists of multiple steps, each step representing a component
|
107
|
+
that performs a specific action (e.g., data transformation, database query).
|
108
|
+
- Creating a directed acyclic graph (DAG) to represent the dependencies between the
|
109
|
+
components, ensuring that each component is executed in the correct order.
|
110
|
+
- Handling grouping of components, where a group can contain multiple steps, providing
|
111
|
+
a way to organize related tasks.
|
112
|
+
- Verifying the task's structure to ensure that it forms a valid DAG, raising an error
|
113
|
+
if any circular dependencies are detected.
|
114
|
+
|
115
|
+
Attributes:
|
116
|
+
----------
|
117
|
+
task : dict
|
118
|
+
The task definition containing details of all steps.
|
119
|
+
program : str, optional
|
120
|
+
The name of the program associated with the task, used to define context.
|
121
|
+
_size : int
|
122
|
+
The total number of steps in the task.
|
123
|
+
_graph : networkx.DiGraph
|
124
|
+
A directed graph representing the dependencies between task steps.
|
125
|
+
_task : list
|
126
|
+
A list storing components of the task in the order of execution.
|
127
|
+
_groups : dict
|
128
|
+
A dictionary to manage groups of steps, allowing for easier organization and reuse.
|
129
|
+
|
130
|
+
Methods:
|
131
|
+
-------
|
132
|
+
build():
|
133
|
+
Compiles the task steps into a sequence of components and creates the dependency graph.
|
134
|
+
"""
|
135
|
+
|
136
|
+
def __init__(self, task: dict, program: str = None):
|
137
|
+
self._size: int = 0
|
138
|
+
self._n = 0
|
139
|
+
self.task: dict = task
|
140
|
+
self._task: list = [] # List of Steps components
|
141
|
+
self.__name__ = self.task["name"]
|
142
|
+
self._program: str = program
|
143
|
+
self._groups: dict = {}
|
144
|
+
try:
|
145
|
+
self._steps: list = task["steps"]
|
146
|
+
except KeyError as e:
|
147
|
+
raise TaskDefinition("Task Error: This task has no Steps.") from e
|
148
|
+
self._step = None
|
149
|
+
self._graph = nx.DiGraph(task=self.__name__) # creates an empty Graph
|
150
|
+
self.build()
|
151
|
+
|
152
|
+
def _build_group(self, group: GroupStep, group_name: str, counter: int, params: dict):
|
153
|
+
"""Builds the group of steps.
|
154
|
+
|
155
|
+
"""
|
156
|
+
# Iterate through self._steps to find all steps with the matching "Group" name
|
157
|
+
new_count = 1
|
158
|
+
for j, inner_step in enumerate(self._steps):
|
159
|
+
if j in self._added_to_group:
|
160
|
+
continue # Skip if this step is already added to another group
|
161
|
+
for step_name, step_params in inner_step.items():
|
162
|
+
if step_params.get("Group") == group_name:
|
163
|
+
# create the step:
|
164
|
+
sp = Step(
|
165
|
+
step_name,
|
166
|
+
f"{counter}_{new_count}",
|
167
|
+
step_params,
|
168
|
+
program=self._program
|
169
|
+
)
|
170
|
+
# add the step to the group:
|
171
|
+
group.add_step(sp)
|
172
|
+
# Mark this step as processed
|
173
|
+
self._added_to_group.add(j)
|
174
|
+
new_count += 1
|
175
|
+
# When group is filled, added to the task:
|
176
|
+
if not group.steps: # Check if no steps were added to the group
|
177
|
+
raise ValueError(
|
178
|
+
f"Task Error: Group '{group_name}' was defined but has no matching steps."
|
179
|
+
)
|
180
|
+
self._groups[group_name] = group
|
181
|
+
s = {"task_id": f"{group_name}_{counter}", "step": group}
|
182
|
+
self._graph.add_node(group.name, attrs=params)
|
183
|
+
self._task.append(s)
|
184
|
+
|
185
|
+
def build(self):
|
186
|
+
counter = 1
|
187
|
+
# Set to keep track of steps already processed in a group
|
188
|
+
self._added_to_group = set()
|
189
|
+
next_component = None
|
190
|
+
|
191
|
+
for i, step in enumerate(self._steps):
|
192
|
+
for step_name, params in step.items():
|
193
|
+
# Skip if this step has already been added to a group
|
194
|
+
if i in self._added_to_group:
|
195
|
+
continue
|
196
|
+
|
197
|
+
# Handle branching if the previous component provided a branch
|
198
|
+
if next_component and step_name != next_component:
|
199
|
+
continue
|
200
|
+
|
201
|
+
# Reset branching after processing the step
|
202
|
+
next_component = None
|
203
|
+
|
204
|
+
# Check if this step is a Parent Group:
|
205
|
+
if "to_group" in params:
|
206
|
+
# Create the Group:
|
207
|
+
group_name = params["to_group"]
|
208
|
+
|
209
|
+
# Step 1: Add the parent component (like PandasIterator) to the task
|
210
|
+
try:
|
211
|
+
cp = Step(step_name, counter, params, program=self._program)
|
212
|
+
s = {"task_id": f"{step_name}_{counter}", "step": cp}
|
213
|
+
self._graph.add_node(cp.name, attrs=params)
|
214
|
+
self._task.append(s)
|
215
|
+
counter += 1
|
216
|
+
except Exception as e:
|
217
|
+
raise ComponentError(
|
218
|
+
f"Task Error: Error loading Component: {e}"
|
219
|
+
) from e
|
220
|
+
|
221
|
+
# Step 2: Check if Group Task already exists
|
222
|
+
if group_name in self._groups: # already exists:
|
223
|
+
raise ValueError(
|
224
|
+
f"Task Error: Group '{group_name}' defined in step '{step_name}' already exists."
|
225
|
+
)
|
226
|
+
# Step 3: Creating the Group
|
227
|
+
gs = GroupStep(
|
228
|
+
group_name, counter, params={}, program=self._program
|
229
|
+
)
|
230
|
+
# Step 4: Build the Group
|
231
|
+
self._build_group(gs, group_name, counter, params)
|
232
|
+
# Move to the next step after processing the group
|
233
|
+
counter += 1
|
234
|
+
continue
|
235
|
+
try:
|
236
|
+
cp = Step(
|
237
|
+
step_name,
|
238
|
+
counter,
|
239
|
+
params,
|
240
|
+
program=self._program
|
241
|
+
)
|
242
|
+
s = {"task_id": f"{step_name}_{counter}", "step": cp}
|
243
|
+
except Exception as e:
|
244
|
+
raise ComponentError(
|
245
|
+
f"Task Error: Error loading Component: {e}"
|
246
|
+
) from e
|
247
|
+
counter += 1
|
248
|
+
prev = None
|
249
|
+
try:
|
250
|
+
prev = self._task[-1]
|
251
|
+
except IndexError:
|
252
|
+
pass
|
253
|
+
self._graph.add_node(cp.name, attrs=params)
|
254
|
+
self._task.append(s)
|
255
|
+
# calculate dependencies:
|
256
|
+
depends = cp.get_depends(prev)
|
257
|
+
if isinstance(depends, dict):
|
258
|
+
self._graph.add_edge(depends["task_id"], cp.name)
|
259
|
+
elif isinstance(depends, list):
|
260
|
+
# TODO: making calculation of edges.
|
261
|
+
pass
|
262
|
+
# size of the Pile of Components
|
263
|
+
self._size = len(self._task)
|
264
|
+
# check if Task is a DAG:
|
265
|
+
if nx.is_directed_acyclic_graph(self._graph) is False:
|
266
|
+
raise TaskDefinition(
|
267
|
+
"Task Error: This task is not an Acyclic Graph."
|
268
|
+
)
|
269
|
+
|
270
|
+
def __len__(self):
|
271
|
+
return len(self._steps)
|
272
|
+
|
273
|
+
def __del__(self):
|
274
|
+
del self._steps
|
275
|
+
|
276
|
+
# Iterators:
|
277
|
+
def __iter__(self):
|
278
|
+
self._n = 0
|
279
|
+
self._step = self._task[0]["step"]
|
280
|
+
return self
|
281
|
+
|
282
|
+
def __next__(self):
|
283
|
+
if self._n < self._size:
|
284
|
+
try:
|
285
|
+
result = self._task[self._n]["step"]
|
286
|
+
except IndexError as e:
|
287
|
+
raise StopIteration from e
|
288
|
+
self._step = result
|
289
|
+
self._n += 1
|
290
|
+
return self
|
291
|
+
else:
|
292
|
+
self._step = None
|
293
|
+
raise StopIteration
|
294
|
+
|
295
|
+
# Get properties of the Step
|
296
|
+
@property
|
297
|
+
def name(self):
|
298
|
+
return self._step.name
|
299
|
+
|
300
|
+
@property
|
301
|
+
def component(self):
|
302
|
+
return self._step.component
|
303
|
+
|
304
|
+
@property
|
305
|
+
def step(self):
|
306
|
+
return self._step.step_name
|
307
|
+
|
308
|
+
def params(self):
|
309
|
+
return self._step.params
|
310
|
+
|
311
|
+
## Component Properties
|
312
|
+
def getStepByID(self, task_id):
|
313
|
+
return self._task[task_id]
|
314
|
+
|
315
|
+
def delStep(self, task_id):
|
316
|
+
del self._task[task_id]
|
317
|
+
|
318
|
+
def delStepByName(self, name):
|
319
|
+
for i, obj in enumerate(self._task):
|
320
|
+
if obj.get("task_id") == name:
|
321
|
+
del self._task[i]
|
322
|
+
break
|
323
|
+
|
324
|
+
def getStep(self, name):
|
325
|
+
obj = next((item for item in self._task if item["task_id"] == name), None)
|
326
|
+
if obj:
|
327
|
+
self._step = obj
|
328
|
+
return self
|
329
|
+
|
330
|
+
def getStepByName(self, name):
|
331
|
+
idx = next(
|
332
|
+
(i for i, item in enumerate(self._task) if item["task_id"] == name), None
|
333
|
+
)
|
334
|
+
if idx != -1:
|
335
|
+
self._step = self._task[idx]["step"]
|
336
|
+
return [self, idx]
|
337
|
+
|
338
|
+
def nextStep(self, name):
|
339
|
+
idx = next(
|
340
|
+
(i for i, item in enumerate(self._task) if item["task_id"] == name), None
|
341
|
+
)
|
342
|
+
if idx != -1:
|
343
|
+
i = idx + 1
|
344
|
+
self._step = self._task[i]["step"]
|
345
|
+
return [self, i]
|
346
|
+
|
347
|
+
def popStep(self, name, n: int = 1):
|
348
|
+
idx = next(
|
349
|
+
(i for i, item in enumerate(self._task) if item["task_id"] == name), None
|
350
|
+
)
|
351
|
+
if idx is not None and idx + (1 + n) < len(self._task):
|
352
|
+
i = idx + (1 + n)
|
353
|
+
removed_element = self._task.pop(i)
|
354
|
+
return [removed_element["step"], i]
|
355
|
+
return None
|
356
|
+
|
357
|
+
def setStep(self, step):
|
358
|
+
self._step.job = step
|
359
|
+
|
360
|
+
def getDepends(self, previous=None):
|
361
|
+
depends = self._step.depends
|
362
|
+
if not depends:
|
363
|
+
return previous
|
364
|
+
else:
|
365
|
+
if isinstance(depends, Number):
|
366
|
+
try:
|
367
|
+
obj = self._task[depends]
|
368
|
+
return obj["job"]
|
369
|
+
except (KeyError, IndexError):
|
370
|
+
task = self._step["task"]
|
371
|
+
logging.error(
|
372
|
+
f"Task Error: invalid Step index {depends} on task name {task}"
|
373
|
+
)
|
374
|
+
return None
|
375
|
+
elif isinstance(depends, list):
|
376
|
+
# list of depends
|
377
|
+
obj = []
|
378
|
+
for d in depends:
|
379
|
+
o = next(
|
380
|
+
(item for item in self._task if item["task_id"] == d), None
|
381
|
+
)
|
382
|
+
if o:
|
383
|
+
component = o["step"]
|
384
|
+
obj.append(component.job)
|
385
|
+
return obj
|
386
|
+
else:
|
387
|
+
# is a string, this is the task id
|
388
|
+
obj = next(
|
389
|
+
(item for item in self._task if item["task_id"] == depends), None
|
390
|
+
)
|
391
|
+
if obj:
|
392
|
+
component = obj["step"]
|
393
|
+
return component.job
|
394
|
+
|
395
|
+
def plot_task(self, filename: str = None):
|
396
|
+
plt.figure(figsize=(24, 16))
|
397
|
+
|
398
|
+
# Use the spring layout with modified parameters for better distribution
|
399
|
+
pos = nx.spring_layout(
|
400
|
+
self._graph,
|
401
|
+
k=1.2,
|
402
|
+
iterations=100
|
403
|
+
)
|
404
|
+
|
405
|
+
first_node = self._task[0]["task_id"]
|
406
|
+
|
407
|
+
# Draw the first node (starting point) with special attributes
|
408
|
+
nx.draw_networkx_nodes(
|
409
|
+
self._graph,
|
410
|
+
pos,
|
411
|
+
nodelist=[first_node],
|
412
|
+
node_color='blue',
|
413
|
+
node_size=1200, # Increase the size of the first node
|
414
|
+
edgecolors='black',
|
415
|
+
linewidths=2
|
416
|
+
)
|
417
|
+
|
418
|
+
# Draw the rest of the nodes (other steps)
|
419
|
+
other_nodes = [n for n in self._graph.nodes() if n != first_node]
|
420
|
+
nx.draw_networkx_nodes(
|
421
|
+
self._graph,
|
422
|
+
pos,
|
423
|
+
nodelist=other_nodes,
|
424
|
+
node_color='lightblue',
|
425
|
+
node_size=800,
|
426
|
+
edgecolors='black',
|
427
|
+
linewidths=1.5
|
428
|
+
)
|
429
|
+
|
430
|
+
# Draw the edges between the nodes with improved thickness and arrow size
|
431
|
+
nx.draw_networkx_edges(
|
432
|
+
self._graph,
|
433
|
+
pos,
|
434
|
+
edgelist=self._graph.edges(),
|
435
|
+
width=2, # Make the edges thicker
|
436
|
+
arrowstyle='-|>', # Change arrow style
|
437
|
+
arrowsize=25, # Increase the size of arrows
|
438
|
+
edge_color='gray'
|
439
|
+
)
|
440
|
+
|
441
|
+
# Draw labels for the nodes
|
442
|
+
nx.draw_networkx_labels(
|
443
|
+
self._graph,
|
444
|
+
pos,
|
445
|
+
labels={n: n for n in self._graph.nodes()},
|
446
|
+
font_size=12, # Slightly increase font size
|
447
|
+
font_color='black'
|
448
|
+
)
|
449
|
+
|
450
|
+
# Add title for the task graph
|
451
|
+
plt.title(
|
452
|
+
f"Task Workflow: {self.__name__}",
|
453
|
+
fontsize=18
|
454
|
+
)
|
455
|
+
|
456
|
+
# Save the graph to a file
|
457
|
+
if not filename:
|
458
|
+
filename = f"task_{self.__name__}.png"
|
459
|
+
plt.savefig(filename, format="PNG", dpi=300)
|
460
|
+
plt.clf()
|
461
|
+
|
462
|
+
@staticmethod
|
463
|
+
def from_task_pile(
|
464
|
+
task_pile: list,
|
465
|
+
name: str = "Generated TaskPile",
|
466
|
+
program: str = None
|
467
|
+
) -> "TaskPile":
|
468
|
+
"""
|
469
|
+
Creates a TaskPile instance from a pre-defined task_pile list.
|
470
|
+
|
471
|
+
Args:
|
472
|
+
task_pile (list): A list of dictionaries, each representing a task with `task_id` and `step`.
|
473
|
+
name (str): Name for the generated task pile. Defaults to "Generated TaskPile".
|
474
|
+
program (str): Optional program context for the task pile.
|
475
|
+
|
476
|
+
Returns:
|
477
|
+
TaskPile: An instance of the TaskPile class.
|
478
|
+
"""
|
479
|
+
task = {
|
480
|
+
"name": name,
|
481
|
+
"steps": [
|
482
|
+
{step["step"]: {"task_id": step["task_id"]}}
|
483
|
+
for step in task_pile
|
484
|
+
]
|
485
|
+
}
|
486
|
+
return TaskPile(task, program=program)
|
flowtask/tasks/py.typed
ADDED
File without changes
|