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
Binary file
|
flowtask/utils/stats.py
ADDED
@@ -0,0 +1,308 @@
|
|
1
|
+
"""TaskMonitor.
|
2
|
+
|
3
|
+
Collect and saves stats for execution of tasks.
|
4
|
+
"""
|
5
|
+
import os
|
6
|
+
import sys
|
7
|
+
from typing import Any, Union
|
8
|
+
import random
|
9
|
+
import contextlib
|
10
|
+
import asyncio
|
11
|
+
import logging
|
12
|
+
from datetime import datetime
|
13
|
+
import time
|
14
|
+
from statistics import mean
|
15
|
+
from contextlib import suppress
|
16
|
+
from psutil import virtual_memory, cpu_percent, Process
|
17
|
+
|
18
|
+
|
19
|
+
class StepMonitor:
|
20
|
+
def __init__(self, name, parent=None) -> None:
|
21
|
+
self.name = name
|
22
|
+
self.executed_at: datetime = datetime.now()
|
23
|
+
self.stats: dict = {}
|
24
|
+
self.traceback: str = ""
|
25
|
+
self._parent: Any = parent
|
26
|
+
|
27
|
+
def add_metric(self, key, value) -> None:
|
28
|
+
self.stats[key] = value
|
29
|
+
|
30
|
+
def stacktrace(self, trace: str) -> None:
|
31
|
+
self.traceback = trace
|
32
|
+
|
33
|
+
def parent(self):
|
34
|
+
return self._parent
|
35
|
+
|
36
|
+
def __str__(self) -> str:
|
37
|
+
trace = ""
|
38
|
+
if self.traceback:
|
39
|
+
trace = f"StackTrace: <{self.traceback!s}>\n"
|
40
|
+
stat = (
|
41
|
+
f"{self.name}:\n"
|
42
|
+
f"Executed At: {self.executed_at}:\n"
|
43
|
+
f"<{self.stats!r}>\n"
|
44
|
+
f"{trace!s}\n"
|
45
|
+
)
|
46
|
+
return stat
|
47
|
+
|
48
|
+
|
49
|
+
class TaskMonitor:
|
50
|
+
def __init__(
|
51
|
+
self, name: str, program: str, task_id: str, userid: Union[int, str] = None
|
52
|
+
) -> None:
|
53
|
+
self.task_name = name
|
54
|
+
self.task_id = task_id
|
55
|
+
self._started: bool = False
|
56
|
+
self.traceback = None
|
57
|
+
self.stats: dict = {}
|
58
|
+
self.user: Union[int, str] = None
|
59
|
+
self.steps: list[StepMonitor] = []
|
60
|
+
self.executed_at: datetime = datetime.now()
|
61
|
+
self.start_time: float = 0
|
62
|
+
self.finish_time: float = 0
|
63
|
+
self.duration: float = 0
|
64
|
+
self._sampling_task: asyncio.Task
|
65
|
+
self.program: str = program
|
66
|
+
# CPU and RAM stats:
|
67
|
+
self.baseline_cpu: float = 0
|
68
|
+
self.baseline_ram: float = 0
|
69
|
+
self._cpu_usage_data: list = []
|
70
|
+
self._ram_usage_data: list = []
|
71
|
+
self._memory_info: list = []
|
72
|
+
# returned values of Stats
|
73
|
+
self.max_cpu_used: float = 0
|
74
|
+
self.avg_cpu_used: float = 0
|
75
|
+
self.max_ram_used: float = 0
|
76
|
+
self.avg_ram_used: float = 0
|
77
|
+
self.memory_usage: float = 0
|
78
|
+
# self.cpu_percent = partial(cpu_percent, interval=0)
|
79
|
+
## Memory usage:
|
80
|
+
self._pid = os.getpid()
|
81
|
+
self._process = Process(self._pid)
|
82
|
+
self._memory_before = self._process.memory_info().rss
|
83
|
+
## TODO: passing User information:
|
84
|
+
if sys.stdin and sys.stdin.isatty():
|
85
|
+
self.exec_type = "console"
|
86
|
+
try:
|
87
|
+
self.user = os.environ.get("USER")
|
88
|
+
except Exception:
|
89
|
+
self.user = os.environ.get("USERNAME")
|
90
|
+
else:
|
91
|
+
# was dispatched from code
|
92
|
+
try:
|
93
|
+
if "qw" in sys.argv[0]:
|
94
|
+
self.exec_type = "worker"
|
95
|
+
else:
|
96
|
+
self.exec_type = "task"
|
97
|
+
except IndexError:
|
98
|
+
self.exec_type = "code"
|
99
|
+
self.user = os.getlogin()
|
100
|
+
if not self.user:
|
101
|
+
self.user = userid
|
102
|
+
print(f"Execution Mode: {self.exec_type} by User: {self.user}")
|
103
|
+
|
104
|
+
def __str__(self) -> str:
|
105
|
+
steps = "\n".join([f"{step!s}" for step in self.steps])
|
106
|
+
if steps:
|
107
|
+
steps = f"Steps: \n{steps!s}\n"
|
108
|
+
stat = (
|
109
|
+
f"Task: {self.task_name}\n"
|
110
|
+
f"ID: {self.task_id}\n"
|
111
|
+
f"< {self.stats!r} >\n"
|
112
|
+
f"{steps!s}"
|
113
|
+
)
|
114
|
+
return stat
|
115
|
+
|
116
|
+
def to_json(self) -> dict:
|
117
|
+
steps = {}
|
118
|
+
for step in self.steps:
|
119
|
+
steps[step.name] = {"executed_at": step.executed_at, **step.stats}
|
120
|
+
stat = {
|
121
|
+
"Task": self.task_name,
|
122
|
+
"program": self.program,
|
123
|
+
"task_name": f"{self.program}.{self.task_name}",
|
124
|
+
"ID": self.task_id,
|
125
|
+
**self.stats,
|
126
|
+
"steps": {**steps},
|
127
|
+
}
|
128
|
+
return stat
|
129
|
+
|
130
|
+
def add_step(self, step: StepMonitor) -> None:
|
131
|
+
self.steps.append(step)
|
132
|
+
|
133
|
+
def start_timing(self):
|
134
|
+
self.start_time = time.time()
|
135
|
+
|
136
|
+
def end_timing(self):
|
137
|
+
self.finish_time = time.time()
|
138
|
+
self.duration = self.finish_time - self.start_time
|
139
|
+
|
140
|
+
def stacktrace(self, trace: str) -> None:
|
141
|
+
self.traceback = trace
|
142
|
+
|
143
|
+
def is_started(self) -> bool:
|
144
|
+
return self._started
|
145
|
+
|
146
|
+
def _get_virtual_memory(self):
|
147
|
+
return virtual_memory().percent
|
148
|
+
|
149
|
+
async def get_virtual_memory(self):
|
150
|
+
return virtual_memory().percent
|
151
|
+
|
152
|
+
async def get_memory_info(self):
|
153
|
+
try:
|
154
|
+
# Use a context manager to ensure file handles are closed
|
155
|
+
with contextlib.suppress(OSError):
|
156
|
+
proc = Process(self._pid)
|
157
|
+
return proc.memory_info().rss / 1048576
|
158
|
+
except OSError as e:
|
159
|
+
logging.warning(f"Error getting Memory Info: {e}")
|
160
|
+
return 0
|
161
|
+
except Exception as e:
|
162
|
+
logging.warning(f"Unexpected error getting Memory Info: {e}")
|
163
|
+
return 0
|
164
|
+
|
165
|
+
# Improve the cpu_percent method to ensure handles are closed
|
166
|
+
async def cpu_percent(self, *args, **kwargs):
|
167
|
+
try:
|
168
|
+
# psutil's cpu_percent can leak file handles on Linux
|
169
|
+
# Make a quick call with a safe wrapper
|
170
|
+
return cpu_percent(*args, **kwargs)
|
171
|
+
except OSError as e:
|
172
|
+
if e.errno == 24: # Too many open files
|
173
|
+
logging.warning(f"Too many files open in cpu_percent: {e}")
|
174
|
+
return 0.0
|
175
|
+
|
176
|
+
async def _get_current_state(self, interval: float = 1.0):
|
177
|
+
"""_get_current_state.
|
178
|
+
Get the Current state of System, will be collected async every tick.
|
179
|
+
Implements backoff when errors occur.
|
180
|
+
Args:
|
181
|
+
interval (float, optional): initial interval of collecting information. Defaults to 0.3.
|
182
|
+
"""
|
183
|
+
current_interval = interval
|
184
|
+
max_interval = 5.0 # Maximum interval in seconds
|
185
|
+
consecutive_errors = 0
|
186
|
+
|
187
|
+
while True:
|
188
|
+
try:
|
189
|
+
if not self._started: # Stop if _started is False.
|
190
|
+
break
|
191
|
+
|
192
|
+
# Get resource usage metrics
|
193
|
+
try:
|
194
|
+
memory = await self.get_memory_info()
|
195
|
+
cpu = await self.cpu_percent()
|
196
|
+
ram = await self.get_virtual_memory()
|
197
|
+
|
198
|
+
# If we got here without errors, add the data and reset backoff
|
199
|
+
self._cpu_usage_data.append(cpu)
|
200
|
+
self._ram_usage_data.append(ram)
|
201
|
+
self._memory_info.append(memory)
|
202
|
+
|
203
|
+
# Reset backoff if successful
|
204
|
+
if consecutive_errors > 0:
|
205
|
+
consecutive_errors = 0
|
206
|
+
current_interval = interval # Reset to original interval
|
207
|
+
logging.info("Resource monitoring recovered, resetting interval to normal")
|
208
|
+
|
209
|
+
except OSError as e:
|
210
|
+
# Handle "too many open files" error with backoff
|
211
|
+
if e.errno == 24: # "Too many open files" error
|
212
|
+
consecutive_errors += 1
|
213
|
+
|
214
|
+
# Apply exponential backoff with jitter
|
215
|
+
backoff_factor = min(2 ** consecutive_errors, 10) # Cap the backoff factor
|
216
|
+
jitter = 0.1 * backoff_factor * (random.random() * 0.5 + 0.75) # Add 25%-75% jitter
|
217
|
+
current_interval = min(interval * backoff_factor * jitter, max_interval)
|
218
|
+
|
219
|
+
logging.warning(
|
220
|
+
f"Too many open files error, backing off. New interval: {current_interval:.2f}s "
|
221
|
+
f"(consecutive errors: {consecutive_errors})"
|
222
|
+
)
|
223
|
+
else:
|
224
|
+
# For other OSErrors, just log and continue
|
225
|
+
logging.warning(f"OS Error during monitoring: {e}")
|
226
|
+
|
227
|
+
await asyncio.sleep(current_interval)
|
228
|
+
|
229
|
+
except asyncio.CancelledError:
|
230
|
+
break # Exit cleanly on task cancellation
|
231
|
+
except Exception as err:
|
232
|
+
logging.exception(f"Can't collect CPU/RAM metrics due to error: {err}")
|
233
|
+
# Still apply backoff for other errors
|
234
|
+
consecutive_errors += 1
|
235
|
+
current_interval = min(interval * (1.5 ** consecutive_errors), max_interval)
|
236
|
+
await asyncio.sleep(current_interval)
|
237
|
+
|
238
|
+
async def start(self, interval: float = 0.5):
|
239
|
+
try:
|
240
|
+
# check if not started:
|
241
|
+
if not self._started:
|
242
|
+
self._started = True
|
243
|
+
self.start_timing()
|
244
|
+
# Start task to call func periodically:
|
245
|
+
self._sampling_task = asyncio.create_task(
|
246
|
+
self._get_current_state(interval)
|
247
|
+
)
|
248
|
+
# is started
|
249
|
+
except Exception as err:
|
250
|
+
logging.exception(
|
251
|
+
f"Task Monitor Failed to Start, error: {err}"
|
252
|
+
)
|
253
|
+
|
254
|
+
def _calculate_stats(self):
|
255
|
+
if self._cpu_usage_data:
|
256
|
+
self.max_cpu_used = max(self._cpu_usage_data)
|
257
|
+
self.avg_cpu_used = mean(self._cpu_usage_data)
|
258
|
+
self.max_ram_used = max(self._ram_usage_data)
|
259
|
+
self.avg_ram_used = mean(self._ram_usage_data)
|
260
|
+
self.memory_usage = mean(self._memory_info)
|
261
|
+
|
262
|
+
async def stop(self) -> dict:
|
263
|
+
try:
|
264
|
+
# Check is sampling is happening
|
265
|
+
if self._started:
|
266
|
+
# Stopping Monitor.
|
267
|
+
self._started = False
|
268
|
+
|
269
|
+
# Stop task and await it stopped:
|
270
|
+
if hasattr(self, '_sampling_task') and self._sampling_task:
|
271
|
+
with contextlib.suppress(asyncio.CancelledError):
|
272
|
+
self._sampling_task.cancel()
|
273
|
+
await self._sampling_task
|
274
|
+
|
275
|
+
# Stop the clock, making calculations
|
276
|
+
self.end_timing()
|
277
|
+
self._calculate_stats()
|
278
|
+
|
279
|
+
# Calculate memory usage more safely
|
280
|
+
memory_after = 0
|
281
|
+
rss_in_bytes = 0
|
282
|
+
try:
|
283
|
+
with contextlib.suppress(OSError):
|
284
|
+
proc = Process(self._pid)
|
285
|
+
memory_after = proc.memory_info().rss
|
286
|
+
rss_in_bytes = memory_after - self._memory_before
|
287
|
+
except Exception as err:
|
288
|
+
logging.exception(f"Unable to get Memory Info: {err}")
|
289
|
+
|
290
|
+
self.stats.update({
|
291
|
+
"executed_at": f"{self.executed_at:%Y-%m-%d %H:%M}",
|
292
|
+
"duration": f"{self.duration:.5f}",
|
293
|
+
"pid": self._pid,
|
294
|
+
"max_cpu": round(float(self.max_cpu_used) if self._cpu_usage_data else 0, 2),
|
295
|
+
"avg_cpu": round(float(self.avg_cpu_used) if self._cpu_usage_data else 0, 2),
|
296
|
+
"max_ram": round(float(self.max_ram_used) if self._ram_usage_data else 0, 2),
|
297
|
+
"avg_ram": round(float(self.avg_ram_used) if self._ram_usage_data else 0, 2),
|
298
|
+
"memory_usage": self.memory_usage,
|
299
|
+
"thread_memory": round(rss_in_bytes / (1024 * 1024), 4),
|
300
|
+
"exec_type": self.exec_type,
|
301
|
+
"user": self.user,
|
302
|
+
})
|
303
|
+
return self.stats
|
304
|
+
else:
|
305
|
+
return {}
|
306
|
+
except Exception as err:
|
307
|
+
logging.exception(f"Task Monitor Failed to Stop, due to: {err}")
|
308
|
+
raise
|
@@ -0,0 +1,74 @@
|
|
1
|
+
import re
|
2
|
+
|
3
|
+
WORD_PATTERN = re.compile(r'[A-Z]?[a-z]+|[A-Z]+(?![a-z])|[0-9]+')
|
4
|
+
UNWANTED_PATTERN = re.compile(r"[^a-zA-Z0-9\s]")
|
5
|
+
ILLEGAL_CHARS = re.compile(r"[^A-Za-z0-9_\s]+")
|
6
|
+
|
7
|
+
|
8
|
+
def remove_illegal_chars(value: str) -> str:
|
9
|
+
return ILLEGAL_CHARS.sub('', value)
|
10
|
+
|
11
|
+
|
12
|
+
def is_camelcase(value):
|
13
|
+
return re.match(r"^[A-Za-z0-9]+\s?(?:[A-Za-z0-9])*$", value.strip()) is not None
|
14
|
+
|
15
|
+
|
16
|
+
def to_camel_case(s: str) -> str:
|
17
|
+
"""to_camel_case.
|
18
|
+
|
19
|
+
Converts a phrase into CamelCase Format.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
s (str): The string to convert.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
The converted string in CamelCase format.
|
26
|
+
"""
|
27
|
+
# Remove unwanted characters
|
28
|
+
# s = re.sub(, "", s)
|
29
|
+
s = UNWANTED_PATTERN.sub("", s)
|
30
|
+
# Convert to CamelCase
|
31
|
+
s = "".join(word.capitalize() for word in s.split())
|
32
|
+
return s
|
33
|
+
|
34
|
+
def is_snakecase(value):
|
35
|
+
## already in snake case:
|
36
|
+
return re.match(r"^[a-zA-Z][a-zA-Z0-9_]+_[a-zA-Z0-9]*$", value.strip()) is not None
|
37
|
+
|
38
|
+
|
39
|
+
def to_snake_case(s: str) -> str:
|
40
|
+
"""to_snake_case.
|
41
|
+
|
42
|
+
Converts an string into snake_case format.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
s (str): The string to convert.
|
46
|
+
|
47
|
+
Returns:
|
48
|
+
The converted string in snake_case format.
|
49
|
+
"""
|
50
|
+
# Remove unwanted characters
|
51
|
+
s = UNWANTED_PATTERN.sub("", s)
|
52
|
+
|
53
|
+
# Find all words in the string
|
54
|
+
words = WORD_PATTERN.findall(s)
|
55
|
+
|
56
|
+
# Join the words with underscores
|
57
|
+
s = '_'.join(words)
|
58
|
+
|
59
|
+
return s.lower()
|
60
|
+
|
61
|
+
|
62
|
+
def camelcase_split(value):
|
63
|
+
"""camelcase_split.
|
64
|
+
|
65
|
+
Splits a CamelCase word in other words.
|
66
|
+
"""
|
67
|
+
if bool(re.match(r"[A-Z]+$", value)):
|
68
|
+
return re.findall(r"[A-Z]+$", value)
|
69
|
+
elif bool(re.search(r"\d", value)):
|
70
|
+
return re.findall(r"[A-Z](?:[a-z]+[1-9]?|[A-Z]*(?=[A-Z])|$)", value)
|
71
|
+
elif value[0].isupper():
|
72
|
+
return re.findall(r"[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))", value)
|
73
|
+
else:
|
74
|
+
return re.findall(r"^[a-z]+|[A-Z][^A-Z]*", value)
|
flowtask/utils/uv.py
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
import uuid
|
2
|
+
from typing import Callable
|
3
|
+
import dateutil
|
4
|
+
import builtins
|
5
|
+
|
6
|
+
|
7
|
+
### validations
|
8
|
+
def isdate(value):
|
9
|
+
try:
|
10
|
+
dateutil.parser.parse(value)
|
11
|
+
return True
|
12
|
+
except (TypeError, ValueError):
|
13
|
+
return False
|
14
|
+
|
15
|
+
|
16
|
+
is_date = isdate
|
17
|
+
|
18
|
+
|
19
|
+
def isinteger(value):
|
20
|
+
return bool(isinstance(value, int))
|
21
|
+
|
22
|
+
|
23
|
+
def isnumber(value):
|
24
|
+
return bool(isinstance(value, float) or isinstance(value, int))
|
25
|
+
|
26
|
+
|
27
|
+
def is_string(value):
|
28
|
+
if type(value) is str:
|
29
|
+
return True
|
30
|
+
else:
|
31
|
+
return False
|
32
|
+
|
33
|
+
|
34
|
+
def is_uuid(value):
|
35
|
+
try:
|
36
|
+
uuid.UUID(value)
|
37
|
+
return True
|
38
|
+
except ValueError:
|
39
|
+
return False
|
40
|
+
|
41
|
+
|
42
|
+
def validate_type_uuid(value):
|
43
|
+
try:
|
44
|
+
uuid.UUID(value)
|
45
|
+
except ValueError:
|
46
|
+
pass
|
47
|
+
|
48
|
+
|
49
|
+
def is_boolean(value):
|
50
|
+
if isinstance(value, bool):
|
51
|
+
return True
|
52
|
+
elif value == "null" or value == "NULL":
|
53
|
+
return True
|
54
|
+
elif value == "true" or value == "TRUE":
|
55
|
+
return True
|
56
|
+
else:
|
57
|
+
return False
|
58
|
+
|
59
|
+
|
60
|
+
"""
|
61
|
+
PostgreSQL utilities
|
62
|
+
"""
|
63
|
+
PG_CONSTANTS = ["CURRENT_DATE", "CURRENT_TIMESTAMP"]
|
64
|
+
|
65
|
+
|
66
|
+
def is_pgconstant(value):
|
67
|
+
return value in PG_CONSTANTS
|
68
|
+
|
69
|
+
|
70
|
+
# TODO: get the current list of supported UDF dynamic.
|
71
|
+
UDF = ["CURRENT_YEAR", "CURRENT_MONTH", "TODAY", "YESTERDAY", "FDOM", "LDOM"]
|
72
|
+
|
73
|
+
|
74
|
+
def is_an_udf(value):
|
75
|
+
return value in UDF
|
76
|
+
|
77
|
+
|
78
|
+
def is_udf(value: str, *args, **kwargs) -> Callable:
|
79
|
+
fn = None
|
80
|
+
try:
|
81
|
+
f = value.lower()
|
82
|
+
if value in UDF:
|
83
|
+
fn = globals()[f](*args, **kwargs)
|
84
|
+
else:
|
85
|
+
func = globals()[f]
|
86
|
+
if not func:
|
87
|
+
try:
|
88
|
+
func = getattr(builtins, f)
|
89
|
+
except AttributeError:
|
90
|
+
return None
|
91
|
+
if func and callable(func):
|
92
|
+
try:
|
93
|
+
fn = func(*args, **kwargs)
|
94
|
+
except Exception as err:
|
95
|
+
raise Exception(err)
|
96
|
+
finally:
|
97
|
+
return fn
|
flowtask/version.py
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
"""Flow Task Meta information."""
|
2
|
+
|
3
|
+
__title__ = "flowtask"
|
4
|
+
__description__ = (
|
5
|
+
"Framework for running Tasks and from CLI and API for orchestation. "
|
6
|
+
"Component-based Task builder/Runner for non-programmers."
|
7
|
+
)
|
8
|
+
__version__ = "5.8.4"
|
9
|
+
__author__ = "Jesus Lara"
|
10
|
+
__author_email__ = "jesuslarag@gmail.com"
|
11
|
+
__license__ = "Apache-2.0"
|