flowtask 5.8.4__cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flowtask/__init__.py +93 -0
- flowtask/__main__.py +38 -0
- flowtask/bots/__init__.py +6 -0
- flowtask/bots/check.py +93 -0
- flowtask/bots/codebot.py +51 -0
- flowtask/components/ASPX.py +148 -0
- flowtask/components/AddDataset.py +352 -0
- flowtask/components/Amazon.py +523 -0
- flowtask/components/AutoTask.py +314 -0
- flowtask/components/Azure.py +80 -0
- flowtask/components/AzureUsers.py +106 -0
- flowtask/components/BaseAction.py +91 -0
- flowtask/components/BaseLoop.py +198 -0
- flowtask/components/BestBuy.py +800 -0
- flowtask/components/CSVToGCS.py +120 -0
- flowtask/components/CompanyScraper/__init__.py +1 -0
- flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
- flowtask/components/CompanyScraper/parsers/base.py +102 -0
- flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
- flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
- flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
- flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
- flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
- flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
- flowtask/components/CompanyScraper/scrapper.py +1054 -0
- flowtask/components/CopyTo.py +177 -0
- flowtask/components/CopyToBigQuery.py +243 -0
- flowtask/components/CopyToMongoDB.py +291 -0
- flowtask/components/CopyToPg.py +609 -0
- flowtask/components/CopyToRethink.py +207 -0
- flowtask/components/CreateGCSBucket.py +102 -0
- flowtask/components/CreateReport/CreateReport.py +228 -0
- flowtask/components/CreateReport/__init__.py +9 -0
- flowtask/components/CreateReport/charts/__init__.py +15 -0
- flowtask/components/CreateReport/charts/bar.py +51 -0
- flowtask/components/CreateReport/charts/base.py +66 -0
- flowtask/components/CreateReport/charts/pie.py +64 -0
- flowtask/components/CreateReport/utils.py +9 -0
- flowtask/components/CustomerSatisfaction.py +196 -0
- flowtask/components/DataInput.py +200 -0
- flowtask/components/DateList.py +255 -0
- flowtask/components/DbClient.py +163 -0
- flowtask/components/DialPad.py +146 -0
- flowtask/components/DocumentDBQuery.py +200 -0
- flowtask/components/DownloadFrom.py +371 -0
- flowtask/components/DownloadFromD2L.py +113 -0
- flowtask/components/DownloadFromFTP.py +181 -0
- flowtask/components/DownloadFromIMAP.py +315 -0
- flowtask/components/DownloadFromS3.py +198 -0
- flowtask/components/DownloadFromSFTP.py +265 -0
- flowtask/components/DownloadFromSharepoint.py +110 -0
- flowtask/components/DownloadFromSmartSheet.py +114 -0
- flowtask/components/DownloadS3File.py +229 -0
- flowtask/components/Dummy.py +59 -0
- flowtask/components/DuplicatePhoto.py +411 -0
- flowtask/components/EmployeeEvaluation.py +237 -0
- flowtask/components/ExecuteSQL.py +323 -0
- flowtask/components/ExtractHTML.py +178 -0
- flowtask/components/FileBase.py +178 -0
- flowtask/components/FileCopy.py +181 -0
- flowtask/components/FileDelete.py +82 -0
- flowtask/components/FileExists.py +146 -0
- flowtask/components/FileIteratorDelete.py +112 -0
- flowtask/components/FileList.py +194 -0
- flowtask/components/FileOpen.py +75 -0
- flowtask/components/FileRead.py +120 -0
- flowtask/components/FileRename.py +106 -0
- flowtask/components/FilterIf.py +284 -0
- flowtask/components/FilterRows/FilterRows.py +200 -0
- flowtask/components/FilterRows/__init__.py +10 -0
- flowtask/components/FilterRows/functions.py +4 -0
- flowtask/components/GCSToBigQuery.py +103 -0
- flowtask/components/GoogleA4.py +150 -0
- flowtask/components/GoogleGeoCoding.py +344 -0
- flowtask/components/GooglePlaces.py +315 -0
- flowtask/components/GoogleSearch.py +539 -0
- flowtask/components/HTTPClient.py +268 -0
- flowtask/components/ICIMS.py +146 -0
- flowtask/components/IF.py +179 -0
- flowtask/components/IcimsFolderCopy.py +173 -0
- flowtask/components/ImageFeatures/__init__.py +5 -0
- flowtask/components/ImageFeatures/process.py +233 -0
- flowtask/components/IteratorBase.py +251 -0
- flowtask/components/LangchainLoader/__init__.py +5 -0
- flowtask/components/LangchainLoader/loader.py +194 -0
- flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
- flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
- flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
- flowtask/components/LangchainLoader/loaders/docx.py +91 -0
- flowtask/components/LangchainLoader/loaders/html.py +119 -0
- flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
- flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
- flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
- flowtask/components/LangchainLoader/loaders/qa.py +67 -0
- flowtask/components/LangchainLoader/loaders/txt.py +55 -0
- flowtask/components/LeadIQ.py +650 -0
- flowtask/components/Loop.py +253 -0
- flowtask/components/Lowes.py +334 -0
- flowtask/components/MS365Usage.py +156 -0
- flowtask/components/MSTeamsMessages.py +320 -0
- flowtask/components/MarketClustering.py +1051 -0
- flowtask/components/MergeFiles.py +362 -0
- flowtask/components/MilvusOutput.py +87 -0
- flowtask/components/NearByStores.py +175 -0
- flowtask/components/NetworkNinja/__init__.py +6 -0
- flowtask/components/NetworkNinja/models/__init__.py +52 -0
- flowtask/components/NetworkNinja/models/abstract.py +177 -0
- flowtask/components/NetworkNinja/models/account.py +39 -0
- flowtask/components/NetworkNinja/models/client.py +19 -0
- flowtask/components/NetworkNinja/models/district.py +14 -0
- flowtask/components/NetworkNinja/models/events.py +101 -0
- flowtask/components/NetworkNinja/models/forms.py +499 -0
- flowtask/components/NetworkNinja/models/market.py +16 -0
- flowtask/components/NetworkNinja/models/organization.py +34 -0
- flowtask/components/NetworkNinja/models/photos.py +125 -0
- flowtask/components/NetworkNinja/models/project.py +44 -0
- flowtask/components/NetworkNinja/models/region.py +28 -0
- flowtask/components/NetworkNinja/models/store.py +203 -0
- flowtask/components/NetworkNinja/models/user.py +151 -0
- flowtask/components/NetworkNinja/router.py +854 -0
- flowtask/components/Odoo.py +175 -0
- flowtask/components/OdooInjector.py +192 -0
- flowtask/components/OpenFromXML.py +126 -0
- flowtask/components/OpenWeather.py +41 -0
- flowtask/components/OpenWithBase.py +616 -0
- flowtask/components/OpenWithPandas.py +715 -0
- flowtask/components/PGPDecrypt.py +199 -0
- flowtask/components/PandasIterator.py +187 -0
- flowtask/components/PandasToFile.py +189 -0
- flowtask/components/Paradox.py +339 -0
- flowtask/components/ParamIterator.py +117 -0
- flowtask/components/ParseHTML.py +84 -0
- flowtask/components/PlacerStores.py +249 -0
- flowtask/components/Pokemon.py +507 -0
- flowtask/components/PositiveBot.py +62 -0
- flowtask/components/PowerPointSlide.py +400 -0
- flowtask/components/PrintMessage.py +127 -0
- flowtask/components/ProductCompetitors/__init__.py +5 -0
- flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
- flowtask/components/ProductCompetitors/parsers/base.py +72 -0
- flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
- flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
- flowtask/components/ProductCompetitors/scrapper.py +155 -0
- flowtask/components/ProductCompliant.py +169 -0
- flowtask/components/ProductInfo/__init__.py +1 -0
- flowtask/components/ProductInfo/parsers/__init__.py +5 -0
- flowtask/components/ProductInfo/parsers/base.py +83 -0
- flowtask/components/ProductInfo/parsers/brother.py +97 -0
- flowtask/components/ProductInfo/parsers/canon.py +167 -0
- flowtask/components/ProductInfo/parsers/epson.py +118 -0
- flowtask/components/ProductInfo/parsers/hp.py +131 -0
- flowtask/components/ProductInfo/parsers/samsung.py +97 -0
- flowtask/components/ProductInfo/scraper.py +319 -0
- flowtask/components/ProductPricing.py +118 -0
- flowtask/components/QS.py +261 -0
- flowtask/components/QSBase.py +201 -0
- flowtask/components/QueryIterator.py +273 -0
- flowtask/components/QueryToInsert.py +327 -0
- flowtask/components/QueryToPandas.py +432 -0
- flowtask/components/RESTClient.py +195 -0
- flowtask/components/RethinkDBQuery.py +189 -0
- flowtask/components/Rsync.py +74 -0
- flowtask/components/RunSSH.py +59 -0
- flowtask/components/RunShell.py +71 -0
- flowtask/components/SalesForce.py +20 -0
- flowtask/components/SaveImageBank/__init__.py +257 -0
- flowtask/components/SchedulingVisits.py +592 -0
- flowtask/components/ScrapPage.py +216 -0
- flowtask/components/ScrapSearch.py +79 -0
- flowtask/components/SendNotify.py +257 -0
- flowtask/components/SentimentAnalysis.py +694 -0
- flowtask/components/ServiceScrapper/__init__.py +5 -0
- flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
- flowtask/components/ServiceScrapper/parsers/base.py +94 -0
- flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
- flowtask/components/ServiceScrapper/scrapper.py +199 -0
- flowtask/components/SetVariables.py +156 -0
- flowtask/components/SubTask.py +182 -0
- flowtask/components/SuiteCRM.py +48 -0
- flowtask/components/Switch.py +175 -0
- flowtask/components/TableBase.py +148 -0
- flowtask/components/TableDelete.py +312 -0
- flowtask/components/TableInput.py +143 -0
- flowtask/components/TableOutput/TableOutput.py +384 -0
- flowtask/components/TableOutput/__init__.py +3 -0
- flowtask/components/TableSchema.py +534 -0
- flowtask/components/Target.py +223 -0
- flowtask/components/ThumbnailGenerator.py +156 -0
- flowtask/components/ToPandas.py +67 -0
- flowtask/components/TransformRows/TransformRows.py +507 -0
- flowtask/components/TransformRows/__init__.py +9 -0
- flowtask/components/TransformRows/functions.py +559 -0
- flowtask/components/TransposeRows.py +176 -0
- flowtask/components/UPCDatabase.py +86 -0
- flowtask/components/UnGzip.py +171 -0
- flowtask/components/Uncompress.py +172 -0
- flowtask/components/UniqueRows.py +126 -0
- flowtask/components/Unzip.py +107 -0
- flowtask/components/UpdateOperationalVars.py +147 -0
- flowtask/components/UploadTo.py +299 -0
- flowtask/components/UploadToS3.py +136 -0
- flowtask/components/UploadToSFTP.py +160 -0
- flowtask/components/UploadToSharepoint.py +205 -0
- flowtask/components/UserFunc.py +122 -0
- flowtask/components/VivaTracker.py +140 -0
- flowtask/components/WSDLClient.py +123 -0
- flowtask/components/Wait.py +18 -0
- flowtask/components/Walmart.py +199 -0
- flowtask/components/Workplace.py +134 -0
- flowtask/components/XMLToPandas.py +267 -0
- flowtask/components/Zammad/__init__.py +41 -0
- flowtask/components/Zammad/models.py +0 -0
- flowtask/components/ZoomInfoScraper.py +409 -0
- flowtask/components/__init__.py +104 -0
- flowtask/components/abstract.py +18 -0
- flowtask/components/flow.py +530 -0
- flowtask/components/google.py +335 -0
- flowtask/components/group.py +221 -0
- flowtask/components/py.typed +0 -0
- flowtask/components/reviewscrap.py +132 -0
- flowtask/components/tAutoincrement.py +117 -0
- flowtask/components/tConcat.py +109 -0
- flowtask/components/tExplode.py +119 -0
- flowtask/components/tFilter.py +184 -0
- flowtask/components/tGroup.py +236 -0
- flowtask/components/tJoin.py +270 -0
- flowtask/components/tMap/__init__.py +9 -0
- flowtask/components/tMap/functions.py +54 -0
- flowtask/components/tMap/tMap.py +450 -0
- flowtask/components/tMelt.py +112 -0
- flowtask/components/tMerge.py +114 -0
- flowtask/components/tOrder.py +93 -0
- flowtask/components/tPandas.py +94 -0
- flowtask/components/tPivot.py +71 -0
- flowtask/components/tPluckCols.py +76 -0
- flowtask/components/tUnnest.py +82 -0
- flowtask/components/user.py +401 -0
- flowtask/conf.py +457 -0
- flowtask/download.py +102 -0
- flowtask/events/__init__.py +11 -0
- flowtask/events/events/__init__.py +20 -0
- flowtask/events/events/abstract.py +95 -0
- flowtask/events/events/alerts/__init__.py +362 -0
- flowtask/events/events/alerts/colfunctions.py +131 -0
- flowtask/events/events/alerts/functions.py +158 -0
- flowtask/events/events/dummy.py +12 -0
- flowtask/events/events/exec.py +124 -0
- flowtask/events/events/file/__init__.py +7 -0
- flowtask/events/events/file/base.py +51 -0
- flowtask/events/events/file/copy.py +23 -0
- flowtask/events/events/file/delete.py +16 -0
- flowtask/events/events/interfaces/__init__.py +9 -0
- flowtask/events/events/interfaces/client.py +67 -0
- flowtask/events/events/interfaces/credentials.py +28 -0
- flowtask/events/events/interfaces/notifications.py +58 -0
- flowtask/events/events/jira.py +122 -0
- flowtask/events/events/log.py +26 -0
- flowtask/events/events/logerr.py +52 -0
- flowtask/events/events/notify.py +59 -0
- flowtask/events/events/notify_event.py +160 -0
- flowtask/events/events/publish.py +54 -0
- flowtask/events/events/sendfile.py +104 -0
- flowtask/events/events/task.py +97 -0
- flowtask/events/events/teams.py +98 -0
- flowtask/events/events/webhook.py +58 -0
- flowtask/events/manager.py +287 -0
- flowtask/exceptions.c +39393 -0
- flowtask/exceptions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/extensions/__init__.py +3 -0
- flowtask/extensions/abstract.py +82 -0
- flowtask/extensions/logging/__init__.py +65 -0
- flowtask/hooks/__init__.py +9 -0
- flowtask/hooks/actions/__init__.py +22 -0
- flowtask/hooks/actions/abstract.py +66 -0
- flowtask/hooks/actions/dummy.py +23 -0
- flowtask/hooks/actions/jira.py +74 -0
- flowtask/hooks/actions/rest.py +320 -0
- flowtask/hooks/actions/sampledata.py +37 -0
- flowtask/hooks/actions/sensor.py +23 -0
- flowtask/hooks/actions/task.py +9 -0
- flowtask/hooks/actions/ticket.py +37 -0
- flowtask/hooks/actions/zammad.py +55 -0
- flowtask/hooks/hook.py +62 -0
- flowtask/hooks/models.py +17 -0
- flowtask/hooks/service.py +187 -0
- flowtask/hooks/step.py +91 -0
- flowtask/hooks/types/__init__.py +23 -0
- flowtask/hooks/types/base.py +129 -0
- flowtask/hooks/types/brokers/__init__.py +11 -0
- flowtask/hooks/types/brokers/base.py +54 -0
- flowtask/hooks/types/brokers/mqtt.py +35 -0
- flowtask/hooks/types/brokers/rabbitmq.py +82 -0
- flowtask/hooks/types/brokers/redis.py +83 -0
- flowtask/hooks/types/brokers/sqs.py +44 -0
- flowtask/hooks/types/fs.py +232 -0
- flowtask/hooks/types/http.py +49 -0
- flowtask/hooks/types/imap.py +200 -0
- flowtask/hooks/types/jira.py +279 -0
- flowtask/hooks/types/mail.py +205 -0
- flowtask/hooks/types/postgres.py +98 -0
- flowtask/hooks/types/responses/__init__.py +8 -0
- flowtask/hooks/types/responses/base.py +5 -0
- flowtask/hooks/types/sharepoint.py +288 -0
- flowtask/hooks/types/ssh.py +141 -0
- flowtask/hooks/types/tagged.py +59 -0
- flowtask/hooks/types/upload.py +85 -0
- flowtask/hooks/types/watch.py +71 -0
- flowtask/hooks/types/web.py +36 -0
- flowtask/interfaces/AzureClient.py +137 -0
- flowtask/interfaces/AzureGraph.py +839 -0
- flowtask/interfaces/Boto3Client.py +326 -0
- flowtask/interfaces/DropboxClient.py +173 -0
- flowtask/interfaces/ExcelHandler.py +94 -0
- flowtask/interfaces/FTPClient.py +131 -0
- flowtask/interfaces/GoogleCalendar.py +201 -0
- flowtask/interfaces/GoogleClient.py +133 -0
- flowtask/interfaces/GoogleDrive.py +127 -0
- flowtask/interfaces/GoogleGCS.py +89 -0
- flowtask/interfaces/GoogleGeocoding.py +93 -0
- flowtask/interfaces/GoogleLang.py +114 -0
- flowtask/interfaces/GooglePub.py +61 -0
- flowtask/interfaces/GoogleSheet.py +68 -0
- flowtask/interfaces/IMAPClient.py +137 -0
- flowtask/interfaces/O365Calendar.py +113 -0
- flowtask/interfaces/O365Client.py +220 -0
- flowtask/interfaces/OneDrive.py +284 -0
- flowtask/interfaces/Outlook.py +155 -0
- flowtask/interfaces/ParrotBot.py +130 -0
- flowtask/interfaces/SSHClient.py +378 -0
- flowtask/interfaces/Sharepoint.py +496 -0
- flowtask/interfaces/__init__.py +36 -0
- flowtask/interfaces/azureauth.py +119 -0
- flowtask/interfaces/cache.py +201 -0
- flowtask/interfaces/client.py +82 -0
- flowtask/interfaces/compress.py +525 -0
- flowtask/interfaces/credentials.py +124 -0
- flowtask/interfaces/d2l.py +239 -0
- flowtask/interfaces/databases/__init__.py +5 -0
- flowtask/interfaces/databases/db.py +223 -0
- flowtask/interfaces/databases/documentdb.py +55 -0
- flowtask/interfaces/databases/rethink.py +39 -0
- flowtask/interfaces/dataframes/__init__.py +11 -0
- flowtask/interfaces/dataframes/abstract.py +21 -0
- flowtask/interfaces/dataframes/arrow.py +71 -0
- flowtask/interfaces/dataframes/dt.py +69 -0
- flowtask/interfaces/dataframes/pandas.py +167 -0
- flowtask/interfaces/dataframes/polars.py +60 -0
- flowtask/interfaces/db.py +263 -0
- flowtask/interfaces/env.py +46 -0
- flowtask/interfaces/func.py +137 -0
- flowtask/interfaces/http.py +1780 -0
- flowtask/interfaces/locale.py +40 -0
- flowtask/interfaces/log.py +75 -0
- flowtask/interfaces/mask.py +143 -0
- flowtask/interfaces/notification.py +154 -0
- flowtask/interfaces/playwright.py +339 -0
- flowtask/interfaces/powerpoint.py +368 -0
- flowtask/interfaces/py.typed +0 -0
- flowtask/interfaces/qs.py +376 -0
- flowtask/interfaces/result.py +87 -0
- flowtask/interfaces/selenium_service.py +779 -0
- flowtask/interfaces/smartsheet.py +154 -0
- flowtask/interfaces/stat.py +39 -0
- flowtask/interfaces/task.py +96 -0
- flowtask/interfaces/template.py +118 -0
- flowtask/interfaces/vectorstores/__init__.py +1 -0
- flowtask/interfaces/vectorstores/abstract.py +133 -0
- flowtask/interfaces/vectorstores/milvus.py +669 -0
- flowtask/interfaces/zammad.py +107 -0
- flowtask/models.py +193 -0
- flowtask/parsers/__init__.py +15 -0
- flowtask/parsers/_yaml.c +11978 -0
- flowtask/parsers/_yaml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/plugins/__init__.py +16 -0
- flowtask/plugins/components/__init__.py +0 -0
- flowtask/plugins/handler/__init__.py +45 -0
- flowtask/plugins/importer.py +31 -0
- flowtask/plugins/sources/__init__.py +0 -0
- flowtask/runner.py +283 -0
- flowtask/scheduler/__init__.py +9 -0
- flowtask/scheduler/functions.py +493 -0
- flowtask/scheduler/handlers/__init__.py +8 -0
- flowtask/scheduler/handlers/manager.py +504 -0
- flowtask/scheduler/handlers/models.py +58 -0
- flowtask/scheduler/handlers/service.py +72 -0
- flowtask/scheduler/notifications.py +65 -0
- flowtask/scheduler/scheduler.py +993 -0
- flowtask/services/__init__.py +0 -0
- flowtask/services/bots/__init__.py +0 -0
- flowtask/services/bots/telegram.py +264 -0
- flowtask/services/files/__init__.py +11 -0
- flowtask/services/files/manager.py +522 -0
- flowtask/services/files/model.py +37 -0
- flowtask/services/files/service.py +767 -0
- flowtask/services/jira/__init__.py +3 -0
- flowtask/services/jira/jira_actions.py +191 -0
- flowtask/services/tasks/__init__.py +13 -0
- flowtask/services/tasks/launcher.py +213 -0
- flowtask/services/tasks/manager.py +323 -0
- flowtask/services/tasks/service.py +275 -0
- flowtask/services/tasks/task_manager.py +376 -0
- flowtask/services/tasks/tasks.py +155 -0
- flowtask/storages/__init__.py +16 -0
- flowtask/storages/exceptions.py +12 -0
- flowtask/storages/files/__init__.py +8 -0
- flowtask/storages/files/abstract.py +29 -0
- flowtask/storages/files/filesystem.py +66 -0
- flowtask/storages/tasks/__init__.py +19 -0
- flowtask/storages/tasks/abstract.py +26 -0
- flowtask/storages/tasks/database.py +33 -0
- flowtask/storages/tasks/filesystem.py +108 -0
- flowtask/storages/tasks/github.py +119 -0
- flowtask/storages/tasks/memory.py +45 -0
- flowtask/storages/tasks/row.py +25 -0
- flowtask/tasks/__init__.py +0 -0
- flowtask/tasks/abstract.py +526 -0
- flowtask/tasks/command.py +118 -0
- flowtask/tasks/pile.py +486 -0
- flowtask/tasks/py.typed +0 -0
- flowtask/tasks/task.py +778 -0
- flowtask/template/__init__.py +161 -0
- flowtask/tests.py +257 -0
- flowtask/types/__init__.py +8 -0
- flowtask/types/typedefs.c +11347 -0
- flowtask/types/typedefs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/__init__.py +24 -0
- flowtask/utils/constants.py +117 -0
- flowtask/utils/encoders.py +21 -0
- flowtask/utils/executor.py +112 -0
- flowtask/utils/functions.cpp +14280 -0
- flowtask/utils/functions.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-312-x86_64-linux-gnu.so +0 -0
- flowtask/utils/stats.py +308 -0
- flowtask/utils/transformations.py +74 -0
- flowtask/utils/uv.py +12 -0
- flowtask/utils/validators.py +97 -0
- flowtask/version.py +11 -0
- flowtask-5.8.4.dist-info/LICENSE +201 -0
- flowtask-5.8.4.dist-info/METADATA +209 -0
- flowtask-5.8.4.dist-info/RECORD +470 -0
- flowtask-5.8.4.dist-info/WHEEL +6 -0
- flowtask-5.8.4.dist-info/entry_points.txt +3 -0
- flowtask-5.8.4.dist-info/top_level.txt +2 -0
- plugins/components/CreateQR.py +39 -0
- plugins/components/TestComponent.py +28 -0
- plugins/components/Use1.py +13 -0
- plugins/components/Workplace.py +117 -0
- plugins/components/__init__.py +3 -0
- plugins/sources/__init__.py +0 -0
- plugins/sources/get_populartimes.py +78 -0
- plugins/sources/google.py +150 -0
- plugins/sources/hubspot.py +679 -0
- plugins/sources/icims.py +679 -0
- plugins/sources/mobileinsight.py +501 -0
- plugins/sources/newrelic.py +262 -0
- plugins/sources/uap.py +268 -0
- plugins/sources/venu.py +244 -0
- plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,287 @@
|
|
1
|
+
from typing import Optional, Union, Any
|
2
|
+
from collections.abc import Callable, Awaitable
|
3
|
+
import asyncio
|
4
|
+
import threading
|
5
|
+
from threading import Lock
|
6
|
+
import importlib
|
7
|
+
import inspect
|
8
|
+
from concurrent.futures import ThreadPoolExecutor
|
9
|
+
from functools import partial
|
10
|
+
from navconfig.logging import logging
|
11
|
+
from .events import (
|
12
|
+
AbstractEvent,
|
13
|
+
PublishEvent
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
class EventManager:
|
18
|
+
"""
|
19
|
+
Basic Event Manager of flowtask.
|
20
|
+
|
21
|
+
This manager allows for dynamic loading and dispatching events based on a provided payload.
|
22
|
+
Each event can have multiple actions, and actions can be loaded dynamically from modules.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def __init__(self, name: str = None):
|
26
|
+
self._handlers: list[Callable] = []
|
27
|
+
self._name = name # event name
|
28
|
+
|
29
|
+
def dispatch(self, event_name: str, *args, **kwargs):
|
30
|
+
event = getattr(self, event_name, None)
|
31
|
+
if event is None:
|
32
|
+
raise ValueError(f"No event named '{event_name}' found.")
|
33
|
+
try:
|
34
|
+
event(*args, **kwargs)
|
35
|
+
except Exception as e:
|
36
|
+
event.logger.error(f"Event Error: {e}")
|
37
|
+
|
38
|
+
class Event:
|
39
|
+
def __init__(self, functions: list[Callable], event_name: str) -> None:
|
40
|
+
if not isinstance(functions, list):
|
41
|
+
raise TypeError("Event Function Callable need to be a List")
|
42
|
+
self._name = event_name
|
43
|
+
self._handlers = functions
|
44
|
+
# Separate list for RunTask handlers
|
45
|
+
self._task_handlers: list[Callable] = []
|
46
|
+
self.logger = logging.getLogger("Flowtask.Event")
|
47
|
+
self._event = threading.Event()
|
48
|
+
self._lock = Lock()
|
49
|
+
|
50
|
+
def add(self, func: Union[Callable, Awaitable]) -> Any:
|
51
|
+
if self.is_task(func):
|
52
|
+
self._task_handlers.append(func)
|
53
|
+
else:
|
54
|
+
with self._lock:
|
55
|
+
self._handlers.append(func)
|
56
|
+
return self
|
57
|
+
|
58
|
+
def __repr__(self) -> str:
|
59
|
+
return f"<Event: {self._name}>"
|
60
|
+
|
61
|
+
def is_task(self, func):
|
62
|
+
try:
|
63
|
+
if func.name() == "RunTask":
|
64
|
+
return True
|
65
|
+
except AttributeError:
|
66
|
+
return False
|
67
|
+
|
68
|
+
def __iadd__(self, func: Union[Callable, Awaitable]) -> Any:
|
69
|
+
if self.is_task(func):
|
70
|
+
self._task_handlers.append(func)
|
71
|
+
else:
|
72
|
+
with self._lock:
|
73
|
+
self._handlers.append(func)
|
74
|
+
return self
|
75
|
+
|
76
|
+
def __isub__(self, func: Union[Callable, Awaitable]):
|
77
|
+
with self._lock:
|
78
|
+
self._handlers.remove(func)
|
79
|
+
return self
|
80
|
+
|
81
|
+
def __call__(self, *args, **kwargs):
|
82
|
+
loop = asyncio.get_event_loop() # Get the current loop
|
83
|
+
|
84
|
+
for handler in self._task_handlers:
|
85
|
+
print('HANDLER > ', handler, type(handler))
|
86
|
+
with ThreadPoolExecutor(max_workers=4) as executor:
|
87
|
+
loop.run_in_executor(
|
88
|
+
executor,
|
89
|
+
partial(self._executeTask, handler, *args, **kwargs)
|
90
|
+
)
|
91
|
+
|
92
|
+
self._event.set() # Signal to proceed with regular events
|
93
|
+
# creating the executor
|
94
|
+
fn = partial(self._executeEvent, handlers=self._handlers, *args, **kwargs)
|
95
|
+
# sending function coroutine to a thread
|
96
|
+
with ThreadPoolExecutor(max_workers=4) as executor:
|
97
|
+
executor.submit(fn)
|
98
|
+
|
99
|
+
def _executeTask(self, handler: Callable, *args, **kwargs):
|
100
|
+
_new = False
|
101
|
+
try:
|
102
|
+
loop = asyncio.get_event_loop()
|
103
|
+
if not loop.is_running():
|
104
|
+
loop = asyncio.new_event_loop()
|
105
|
+
_new = True
|
106
|
+
except RuntimeError:
|
107
|
+
loop = asyncio.new_event_loop()
|
108
|
+
_new = True
|
109
|
+
try:
|
110
|
+
loop.run_until_complete(handler(*args, **kwargs))
|
111
|
+
except Exception as e:
|
112
|
+
self.logger.error(
|
113
|
+
f"RunTask Handler Error: {e}"
|
114
|
+
)
|
115
|
+
finally:
|
116
|
+
if _new is True:
|
117
|
+
try:
|
118
|
+
loop.close()
|
119
|
+
except RuntimeError:
|
120
|
+
pass
|
121
|
+
|
122
|
+
def _executeEvent(self, handlers: list[Callable], *args, **kwargs):
|
123
|
+
"""
|
124
|
+
executeEvent.
|
125
|
+
|
126
|
+
Executing Event Functions associated with an event dispatched from Flowtask.
|
127
|
+
"""
|
128
|
+
self._event.wait()
|
129
|
+
loop = asyncio.new_event_loop()
|
130
|
+
asyncio.set_event_loop(loop)
|
131
|
+
self.logger.notice(
|
132
|
+
f"Running Event > {self._name}"
|
133
|
+
)
|
134
|
+
try:
|
135
|
+
for fn in handlers:
|
136
|
+
self.logger.notice(
|
137
|
+
f"Running Event Function > {fn!r}"
|
138
|
+
)
|
139
|
+
try:
|
140
|
+
if asyncio.iscoroutinefunction(fn) or isinstance(fn, AbstractEvent):
|
141
|
+
try:
|
142
|
+
loop.run_until_complete(
|
143
|
+
fn(*args, event_loop=loop, **kwargs)
|
144
|
+
)
|
145
|
+
except Exception as ex:
|
146
|
+
if 'Invalid JSON data' in str(ex):
|
147
|
+
# we cannot serialize the component result:
|
148
|
+
self.logger.warning(
|
149
|
+
f"{ex!s}"
|
150
|
+
)
|
151
|
+
else:
|
152
|
+
print(f"Event Error: {ex}")
|
153
|
+
self.logger.error(
|
154
|
+
f"Event Error: {ex}"
|
155
|
+
)
|
156
|
+
finally:
|
157
|
+
tasks = asyncio.all_tasks(loop)
|
158
|
+
for task in tasks:
|
159
|
+
try:
|
160
|
+
task.cancel()
|
161
|
+
# await task
|
162
|
+
except asyncio.CancelledError:
|
163
|
+
pass
|
164
|
+
elif hasattr(fn, "__call__") and inspect.iscoroutinefunction(fn.__call__):
|
165
|
+
loop.run_until_complete(
|
166
|
+
fn(*args, event_loop=loop, **kwargs)
|
167
|
+
)
|
168
|
+
else:
|
169
|
+
# loop.call_soon_threadsafe(partial(handler, *args, **kwargs))
|
170
|
+
fn(*args, **kwargs)
|
171
|
+
except Exception as err:
|
172
|
+
self.logger.exception(str(err))
|
173
|
+
raise RuntimeError(
|
174
|
+
f"Event Error: {err!s}"
|
175
|
+
) from err
|
176
|
+
finally:
|
177
|
+
# finally, end the event loop:
|
178
|
+
loop.close()
|
179
|
+
|
180
|
+
@classmethod
|
181
|
+
def addEvent(cls, **kwargs):
|
182
|
+
"""
|
183
|
+
addEvent( event1 = [f1,f2,...], event2 = [g1,g2,...], ... )
|
184
|
+
creates events using **kwargs to create any number of events.
|
185
|
+
Each event recieves a list of functions,
|
186
|
+
where every function in the list recieves the same parameters.
|
187
|
+
Example:
|
188
|
+
def hello(): print("Hello ")
|
189
|
+
def world(): print("World")
|
190
|
+
|
191
|
+
EventManager.addEvent( salute = [hello] )
|
192
|
+
EventManager.salute += world
|
193
|
+
|
194
|
+
EventManager.salute()
|
195
|
+
|
196
|
+
Output:
|
197
|
+
Hello
|
198
|
+
World
|
199
|
+
"""
|
200
|
+
evt = {}
|
201
|
+
for key, value in kwargs.items():
|
202
|
+
if not isinstance(value, list):
|
203
|
+
fn = [value]
|
204
|
+
else:
|
205
|
+
fn = value
|
206
|
+
evt[key] = cls.Event(fn, key)
|
207
|
+
setattr(cls, key, evt[key])
|
208
|
+
return evt
|
209
|
+
|
210
|
+
def validate_event_payload(self, payload: dict):
|
211
|
+
if not isinstance(payload, dict):
|
212
|
+
raise ValueError(
|
213
|
+
"Event payload should be a dictionary."
|
214
|
+
)
|
215
|
+
|
216
|
+
for event_name, event_list in payload.items():
|
217
|
+
if not isinstance(event_list, list):
|
218
|
+
raise ValueError(f"Event {event_name} should have a list of actions.")
|
219
|
+
|
220
|
+
for action in event_list:
|
221
|
+
if not isinstance(action, dict):
|
222
|
+
raise ValueError(
|
223
|
+
f"Action for event {event_name} should be a dictionary."
|
224
|
+
)
|
225
|
+
|
226
|
+
def LoadEvents(self, event_payload: Optional[dict] = None):
|
227
|
+
"""
|
228
|
+
Load all events and their associated actions based on the provided payload.
|
229
|
+
|
230
|
+
The payload should be a dictionary where each key is an event name and the associated value
|
231
|
+
is a list of action dictionaries. Each action dictionary should have a single key (the action name)
|
232
|
+
and a value that is a dictionary of parameters for that action.
|
233
|
+
|
234
|
+
Example payload:
|
235
|
+
{
|
236
|
+
"completed": [
|
237
|
+
{
|
238
|
+
"Dummy": {
|
239
|
+
"message": "Finished"
|
240
|
+
}
|
241
|
+
}
|
242
|
+
],
|
243
|
+
...
|
244
|
+
}
|
245
|
+
|
246
|
+
Args:
|
247
|
+
event_payload (dict): The event payload dictionary.
|
248
|
+
|
249
|
+
Raises:
|
250
|
+
RuntimeError: If there's an error loading an action.
|
251
|
+
"""
|
252
|
+
# finished task will be published into a pub/sub channel
|
253
|
+
if event_payload is None:
|
254
|
+
event_payload = {}
|
255
|
+
publish = event_payload.pop("publish", False)
|
256
|
+
# Add this execution to the publish channel.
|
257
|
+
if publish is True:
|
258
|
+
pub = PublishEvent()
|
259
|
+
completed = getattr(self, "completed")
|
260
|
+
if completed:
|
261
|
+
completed += pub
|
262
|
+
exception = getattr(self, "exception")
|
263
|
+
if exception:
|
264
|
+
exception += pub
|
265
|
+
self.validate_event_payload(event_payload)
|
266
|
+
for event_name, event_list in event_payload.items():
|
267
|
+
evt = getattr(self, event_name, None)
|
268
|
+
if evt:
|
269
|
+
for event_obj in event_list:
|
270
|
+
event_type = list(event_obj.keys())[0]
|
271
|
+
event_data = event_obj[event_type]
|
272
|
+
action = self.LoadEventAction(event_type, event_data)
|
273
|
+
try:
|
274
|
+
# added this event to the event list
|
275
|
+
evt += action
|
276
|
+
except Exception as e:
|
277
|
+
logging.error(f"Load Event Error: {e}")
|
278
|
+
|
279
|
+
def LoadEventAction(self, action_name: str, data):
|
280
|
+
try:
|
281
|
+
current_package = __package__
|
282
|
+
module_name = f"{current_package}.events"
|
283
|
+
mod = importlib.import_module(module_name, package=action_name)
|
284
|
+
obj = getattr(mod, action_name)
|
285
|
+
return obj(**data)
|
286
|
+
except ImportError as e:
|
287
|
+
logging.error(f"Event Action: Error getting Function: {action_name}, {e!s}")
|