flowtask 5.8.4__cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flowtask/__init__.py +93 -0
- flowtask/__main__.py +38 -0
- flowtask/bots/__init__.py +6 -0
- flowtask/bots/check.py +93 -0
- flowtask/bots/codebot.py +51 -0
- flowtask/components/ASPX.py +148 -0
- flowtask/components/AddDataset.py +352 -0
- flowtask/components/Amazon.py +523 -0
- flowtask/components/AutoTask.py +314 -0
- flowtask/components/Azure.py +80 -0
- flowtask/components/AzureUsers.py +106 -0
- flowtask/components/BaseAction.py +91 -0
- flowtask/components/BaseLoop.py +198 -0
- flowtask/components/BestBuy.py +800 -0
- flowtask/components/CSVToGCS.py +120 -0
- flowtask/components/CompanyScraper/__init__.py +1 -0
- flowtask/components/CompanyScraper/parsers/__init__.py +6 -0
- flowtask/components/CompanyScraper/parsers/base.py +102 -0
- flowtask/components/CompanyScraper/parsers/explorium.py +192 -0
- flowtask/components/CompanyScraper/parsers/leadiq.py +206 -0
- flowtask/components/CompanyScraper/parsers/rocket.py +133 -0
- flowtask/components/CompanyScraper/parsers/siccode.py +109 -0
- flowtask/components/CompanyScraper/parsers/visualvisitor.py +130 -0
- flowtask/components/CompanyScraper/parsers/zoominfo.py +118 -0
- flowtask/components/CompanyScraper/scrapper.py +1054 -0
- flowtask/components/CopyTo.py +177 -0
- flowtask/components/CopyToBigQuery.py +243 -0
- flowtask/components/CopyToMongoDB.py +291 -0
- flowtask/components/CopyToPg.py +609 -0
- flowtask/components/CopyToRethink.py +207 -0
- flowtask/components/CreateGCSBucket.py +102 -0
- flowtask/components/CreateReport/CreateReport.py +228 -0
- flowtask/components/CreateReport/__init__.py +9 -0
- flowtask/components/CreateReport/charts/__init__.py +15 -0
- flowtask/components/CreateReport/charts/bar.py +51 -0
- flowtask/components/CreateReport/charts/base.py +66 -0
- flowtask/components/CreateReport/charts/pie.py +64 -0
- flowtask/components/CreateReport/utils.py +9 -0
- flowtask/components/CustomerSatisfaction.py +196 -0
- flowtask/components/DataInput.py +200 -0
- flowtask/components/DateList.py +255 -0
- flowtask/components/DbClient.py +163 -0
- flowtask/components/DialPad.py +146 -0
- flowtask/components/DocumentDBQuery.py +200 -0
- flowtask/components/DownloadFrom.py +371 -0
- flowtask/components/DownloadFromD2L.py +113 -0
- flowtask/components/DownloadFromFTP.py +181 -0
- flowtask/components/DownloadFromIMAP.py +315 -0
- flowtask/components/DownloadFromS3.py +198 -0
- flowtask/components/DownloadFromSFTP.py +265 -0
- flowtask/components/DownloadFromSharepoint.py +110 -0
- flowtask/components/DownloadFromSmartSheet.py +114 -0
- flowtask/components/DownloadS3File.py +229 -0
- flowtask/components/Dummy.py +59 -0
- flowtask/components/DuplicatePhoto.py +411 -0
- flowtask/components/EmployeeEvaluation.py +237 -0
- flowtask/components/ExecuteSQL.py +323 -0
- flowtask/components/ExtractHTML.py +178 -0
- flowtask/components/FileBase.py +178 -0
- flowtask/components/FileCopy.py +181 -0
- flowtask/components/FileDelete.py +82 -0
- flowtask/components/FileExists.py +146 -0
- flowtask/components/FileIteratorDelete.py +112 -0
- flowtask/components/FileList.py +194 -0
- flowtask/components/FileOpen.py +75 -0
- flowtask/components/FileRead.py +120 -0
- flowtask/components/FileRename.py +106 -0
- flowtask/components/FilterIf.py +284 -0
- flowtask/components/FilterRows/FilterRows.py +200 -0
- flowtask/components/FilterRows/__init__.py +10 -0
- flowtask/components/FilterRows/functions.py +4 -0
- flowtask/components/GCSToBigQuery.py +103 -0
- flowtask/components/GoogleA4.py +150 -0
- flowtask/components/GoogleGeoCoding.py +344 -0
- flowtask/components/GooglePlaces.py +315 -0
- flowtask/components/GoogleSearch.py +539 -0
- flowtask/components/HTTPClient.py +268 -0
- flowtask/components/ICIMS.py +146 -0
- flowtask/components/IF.py +179 -0
- flowtask/components/IcimsFolderCopy.py +173 -0
- flowtask/components/ImageFeatures/__init__.py +5 -0
- flowtask/components/ImageFeatures/process.py +233 -0
- flowtask/components/IteratorBase.py +251 -0
- flowtask/components/LangchainLoader/__init__.py +5 -0
- flowtask/components/LangchainLoader/loader.py +194 -0
- flowtask/components/LangchainLoader/loaders/__init__.py +22 -0
- flowtask/components/LangchainLoader/loaders/abstract.py +362 -0
- flowtask/components/LangchainLoader/loaders/basepdf.py +50 -0
- flowtask/components/LangchainLoader/loaders/docx.py +91 -0
- flowtask/components/LangchainLoader/loaders/html.py +119 -0
- flowtask/components/LangchainLoader/loaders/pdfblocks.py +146 -0
- flowtask/components/LangchainLoader/loaders/pdfmark.py +79 -0
- flowtask/components/LangchainLoader/loaders/pdftables.py +135 -0
- flowtask/components/LangchainLoader/loaders/qa.py +67 -0
- flowtask/components/LangchainLoader/loaders/txt.py +55 -0
- flowtask/components/LeadIQ.py +650 -0
- flowtask/components/Loop.py +253 -0
- flowtask/components/Lowes.py +334 -0
- flowtask/components/MS365Usage.py +156 -0
- flowtask/components/MSTeamsMessages.py +320 -0
- flowtask/components/MarketClustering.py +1051 -0
- flowtask/components/MergeFiles.py +362 -0
- flowtask/components/MilvusOutput.py +87 -0
- flowtask/components/NearByStores.py +175 -0
- flowtask/components/NetworkNinja/__init__.py +6 -0
- flowtask/components/NetworkNinja/models/__init__.py +52 -0
- flowtask/components/NetworkNinja/models/abstract.py +177 -0
- flowtask/components/NetworkNinja/models/account.py +39 -0
- flowtask/components/NetworkNinja/models/client.py +19 -0
- flowtask/components/NetworkNinja/models/district.py +14 -0
- flowtask/components/NetworkNinja/models/events.py +101 -0
- flowtask/components/NetworkNinja/models/forms.py +499 -0
- flowtask/components/NetworkNinja/models/market.py +16 -0
- flowtask/components/NetworkNinja/models/organization.py +34 -0
- flowtask/components/NetworkNinja/models/photos.py +125 -0
- flowtask/components/NetworkNinja/models/project.py +44 -0
- flowtask/components/NetworkNinja/models/region.py +28 -0
- flowtask/components/NetworkNinja/models/store.py +203 -0
- flowtask/components/NetworkNinja/models/user.py +151 -0
- flowtask/components/NetworkNinja/router.py +854 -0
- flowtask/components/Odoo.py +175 -0
- flowtask/components/OdooInjector.py +192 -0
- flowtask/components/OpenFromXML.py +126 -0
- flowtask/components/OpenWeather.py +41 -0
- flowtask/components/OpenWithBase.py +616 -0
- flowtask/components/OpenWithPandas.py +715 -0
- flowtask/components/PGPDecrypt.py +199 -0
- flowtask/components/PandasIterator.py +187 -0
- flowtask/components/PandasToFile.py +189 -0
- flowtask/components/Paradox.py +339 -0
- flowtask/components/ParamIterator.py +117 -0
- flowtask/components/ParseHTML.py +84 -0
- flowtask/components/PlacerStores.py +249 -0
- flowtask/components/Pokemon.py +507 -0
- flowtask/components/PositiveBot.py +62 -0
- flowtask/components/PowerPointSlide.py +400 -0
- flowtask/components/PrintMessage.py +127 -0
- flowtask/components/ProductCompetitors/__init__.py +5 -0
- flowtask/components/ProductCompetitors/parsers/__init__.py +7 -0
- flowtask/components/ProductCompetitors/parsers/base.py +72 -0
- flowtask/components/ProductCompetitors/parsers/bestbuy.py +86 -0
- flowtask/components/ProductCompetitors/parsers/lowes.py +103 -0
- flowtask/components/ProductCompetitors/scrapper.py +155 -0
- flowtask/components/ProductCompliant.py +169 -0
- flowtask/components/ProductInfo/__init__.py +1 -0
- flowtask/components/ProductInfo/parsers/__init__.py +5 -0
- flowtask/components/ProductInfo/parsers/base.py +83 -0
- flowtask/components/ProductInfo/parsers/brother.py +97 -0
- flowtask/components/ProductInfo/parsers/canon.py +167 -0
- flowtask/components/ProductInfo/parsers/epson.py +118 -0
- flowtask/components/ProductInfo/parsers/hp.py +131 -0
- flowtask/components/ProductInfo/parsers/samsung.py +97 -0
- flowtask/components/ProductInfo/scraper.py +319 -0
- flowtask/components/ProductPricing.py +118 -0
- flowtask/components/QS.py +261 -0
- flowtask/components/QSBase.py +201 -0
- flowtask/components/QueryIterator.py +273 -0
- flowtask/components/QueryToInsert.py +327 -0
- flowtask/components/QueryToPandas.py +432 -0
- flowtask/components/RESTClient.py +195 -0
- flowtask/components/RethinkDBQuery.py +189 -0
- flowtask/components/Rsync.py +74 -0
- flowtask/components/RunSSH.py +59 -0
- flowtask/components/RunShell.py +71 -0
- flowtask/components/SalesForce.py +20 -0
- flowtask/components/SaveImageBank/__init__.py +257 -0
- flowtask/components/SchedulingVisits.py +592 -0
- flowtask/components/ScrapPage.py +216 -0
- flowtask/components/ScrapSearch.py +79 -0
- flowtask/components/SendNotify.py +257 -0
- flowtask/components/SentimentAnalysis.py +694 -0
- flowtask/components/ServiceScrapper/__init__.py +5 -0
- flowtask/components/ServiceScrapper/parsers/__init__.py +1 -0
- flowtask/components/ServiceScrapper/parsers/base.py +94 -0
- flowtask/components/ServiceScrapper/parsers/costco.py +93 -0
- flowtask/components/ServiceScrapper/scrapper.py +199 -0
- flowtask/components/SetVariables.py +156 -0
- flowtask/components/SubTask.py +182 -0
- flowtask/components/SuiteCRM.py +48 -0
- flowtask/components/Switch.py +175 -0
- flowtask/components/TableBase.py +148 -0
- flowtask/components/TableDelete.py +312 -0
- flowtask/components/TableInput.py +143 -0
- flowtask/components/TableOutput/TableOutput.py +384 -0
- flowtask/components/TableOutput/__init__.py +3 -0
- flowtask/components/TableSchema.py +534 -0
- flowtask/components/Target.py +223 -0
- flowtask/components/ThumbnailGenerator.py +156 -0
- flowtask/components/ToPandas.py +67 -0
- flowtask/components/TransformRows/TransformRows.py +507 -0
- flowtask/components/TransformRows/__init__.py +9 -0
- flowtask/components/TransformRows/functions.py +559 -0
- flowtask/components/TransposeRows.py +176 -0
- flowtask/components/UPCDatabase.py +86 -0
- flowtask/components/UnGzip.py +171 -0
- flowtask/components/Uncompress.py +172 -0
- flowtask/components/UniqueRows.py +126 -0
- flowtask/components/Unzip.py +107 -0
- flowtask/components/UpdateOperationalVars.py +147 -0
- flowtask/components/UploadTo.py +299 -0
- flowtask/components/UploadToS3.py +136 -0
- flowtask/components/UploadToSFTP.py +160 -0
- flowtask/components/UploadToSharepoint.py +205 -0
- flowtask/components/UserFunc.py +122 -0
- flowtask/components/VivaTracker.py +140 -0
- flowtask/components/WSDLClient.py +123 -0
- flowtask/components/Wait.py +18 -0
- flowtask/components/Walmart.py +199 -0
- flowtask/components/Workplace.py +134 -0
- flowtask/components/XMLToPandas.py +267 -0
- flowtask/components/Zammad/__init__.py +41 -0
- flowtask/components/Zammad/models.py +0 -0
- flowtask/components/ZoomInfoScraper.py +409 -0
- flowtask/components/__init__.py +104 -0
- flowtask/components/abstract.py +18 -0
- flowtask/components/flow.py +530 -0
- flowtask/components/google.py +335 -0
- flowtask/components/group.py +221 -0
- flowtask/components/py.typed +0 -0
- flowtask/components/reviewscrap.py +132 -0
- flowtask/components/tAutoincrement.py +117 -0
- flowtask/components/tConcat.py +109 -0
- flowtask/components/tExplode.py +119 -0
- flowtask/components/tFilter.py +184 -0
- flowtask/components/tGroup.py +236 -0
- flowtask/components/tJoin.py +270 -0
- flowtask/components/tMap/__init__.py +9 -0
- flowtask/components/tMap/functions.py +54 -0
- flowtask/components/tMap/tMap.py +450 -0
- flowtask/components/tMelt.py +112 -0
- flowtask/components/tMerge.py +114 -0
- flowtask/components/tOrder.py +93 -0
- flowtask/components/tPandas.py +94 -0
- flowtask/components/tPivot.py +71 -0
- flowtask/components/tPluckCols.py +76 -0
- flowtask/components/tUnnest.py +82 -0
- flowtask/components/user.py +401 -0
- flowtask/conf.py +457 -0
- flowtask/download.py +102 -0
- flowtask/events/__init__.py +11 -0
- flowtask/events/events/__init__.py +20 -0
- flowtask/events/events/abstract.py +95 -0
- flowtask/events/events/alerts/__init__.py +362 -0
- flowtask/events/events/alerts/colfunctions.py +131 -0
- flowtask/events/events/alerts/functions.py +158 -0
- flowtask/events/events/dummy.py +12 -0
- flowtask/events/events/exec.py +124 -0
- flowtask/events/events/file/__init__.py +7 -0
- flowtask/events/events/file/base.py +51 -0
- flowtask/events/events/file/copy.py +23 -0
- flowtask/events/events/file/delete.py +16 -0
- flowtask/events/events/interfaces/__init__.py +9 -0
- flowtask/events/events/interfaces/client.py +67 -0
- flowtask/events/events/interfaces/credentials.py +28 -0
- flowtask/events/events/interfaces/notifications.py +58 -0
- flowtask/events/events/jira.py +122 -0
- flowtask/events/events/log.py +26 -0
- flowtask/events/events/logerr.py +52 -0
- flowtask/events/events/notify.py +59 -0
- flowtask/events/events/notify_event.py +160 -0
- flowtask/events/events/publish.py +54 -0
- flowtask/events/events/sendfile.py +104 -0
- flowtask/events/events/task.py +97 -0
- flowtask/events/events/teams.py +98 -0
- flowtask/events/events/webhook.py +58 -0
- flowtask/events/manager.py +287 -0
- flowtask/exceptions.c +39393 -0
- flowtask/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/extensions/__init__.py +3 -0
- flowtask/extensions/abstract.py +82 -0
- flowtask/extensions/logging/__init__.py +65 -0
- flowtask/hooks/__init__.py +9 -0
- flowtask/hooks/actions/__init__.py +22 -0
- flowtask/hooks/actions/abstract.py +66 -0
- flowtask/hooks/actions/dummy.py +23 -0
- flowtask/hooks/actions/jira.py +74 -0
- flowtask/hooks/actions/rest.py +320 -0
- flowtask/hooks/actions/sampledata.py +37 -0
- flowtask/hooks/actions/sensor.py +23 -0
- flowtask/hooks/actions/task.py +9 -0
- flowtask/hooks/actions/ticket.py +37 -0
- flowtask/hooks/actions/zammad.py +55 -0
- flowtask/hooks/hook.py +62 -0
- flowtask/hooks/models.py +17 -0
- flowtask/hooks/service.py +187 -0
- flowtask/hooks/step.py +91 -0
- flowtask/hooks/types/__init__.py +23 -0
- flowtask/hooks/types/base.py +129 -0
- flowtask/hooks/types/brokers/__init__.py +11 -0
- flowtask/hooks/types/brokers/base.py +54 -0
- flowtask/hooks/types/brokers/mqtt.py +35 -0
- flowtask/hooks/types/brokers/rabbitmq.py +82 -0
- flowtask/hooks/types/brokers/redis.py +83 -0
- flowtask/hooks/types/brokers/sqs.py +44 -0
- flowtask/hooks/types/fs.py +232 -0
- flowtask/hooks/types/http.py +49 -0
- flowtask/hooks/types/imap.py +200 -0
- flowtask/hooks/types/jira.py +279 -0
- flowtask/hooks/types/mail.py +205 -0
- flowtask/hooks/types/postgres.py +98 -0
- flowtask/hooks/types/responses/__init__.py +8 -0
- flowtask/hooks/types/responses/base.py +5 -0
- flowtask/hooks/types/sharepoint.py +288 -0
- flowtask/hooks/types/ssh.py +141 -0
- flowtask/hooks/types/tagged.py +59 -0
- flowtask/hooks/types/upload.py +85 -0
- flowtask/hooks/types/watch.py +71 -0
- flowtask/hooks/types/web.py +36 -0
- flowtask/interfaces/AzureClient.py +137 -0
- flowtask/interfaces/AzureGraph.py +839 -0
- flowtask/interfaces/Boto3Client.py +326 -0
- flowtask/interfaces/DropboxClient.py +173 -0
- flowtask/interfaces/ExcelHandler.py +94 -0
- flowtask/interfaces/FTPClient.py +131 -0
- flowtask/interfaces/GoogleCalendar.py +201 -0
- flowtask/interfaces/GoogleClient.py +133 -0
- flowtask/interfaces/GoogleDrive.py +127 -0
- flowtask/interfaces/GoogleGCS.py +89 -0
- flowtask/interfaces/GoogleGeocoding.py +93 -0
- flowtask/interfaces/GoogleLang.py +114 -0
- flowtask/interfaces/GooglePub.py +61 -0
- flowtask/interfaces/GoogleSheet.py +68 -0
- flowtask/interfaces/IMAPClient.py +137 -0
- flowtask/interfaces/O365Calendar.py +113 -0
- flowtask/interfaces/O365Client.py +220 -0
- flowtask/interfaces/OneDrive.py +284 -0
- flowtask/interfaces/Outlook.py +155 -0
- flowtask/interfaces/ParrotBot.py +130 -0
- flowtask/interfaces/SSHClient.py +378 -0
- flowtask/interfaces/Sharepoint.py +496 -0
- flowtask/interfaces/__init__.py +36 -0
- flowtask/interfaces/azureauth.py +119 -0
- flowtask/interfaces/cache.py +201 -0
- flowtask/interfaces/client.py +82 -0
- flowtask/interfaces/compress.py +525 -0
- flowtask/interfaces/credentials.py +124 -0
- flowtask/interfaces/d2l.py +239 -0
- flowtask/interfaces/databases/__init__.py +5 -0
- flowtask/interfaces/databases/db.py +223 -0
- flowtask/interfaces/databases/documentdb.py +55 -0
- flowtask/interfaces/databases/rethink.py +39 -0
- flowtask/interfaces/dataframes/__init__.py +11 -0
- flowtask/interfaces/dataframes/abstract.py +21 -0
- flowtask/interfaces/dataframes/arrow.py +71 -0
- flowtask/interfaces/dataframes/dt.py +69 -0
- flowtask/interfaces/dataframes/pandas.py +167 -0
- flowtask/interfaces/dataframes/polars.py +60 -0
- flowtask/interfaces/db.py +263 -0
- flowtask/interfaces/env.py +46 -0
- flowtask/interfaces/func.py +137 -0
- flowtask/interfaces/http.py +1780 -0
- flowtask/interfaces/locale.py +40 -0
- flowtask/interfaces/log.py +75 -0
- flowtask/interfaces/mask.py +143 -0
- flowtask/interfaces/notification.py +154 -0
- flowtask/interfaces/playwright.py +339 -0
- flowtask/interfaces/powerpoint.py +368 -0
- flowtask/interfaces/py.typed +0 -0
- flowtask/interfaces/qs.py +376 -0
- flowtask/interfaces/result.py +87 -0
- flowtask/interfaces/selenium_service.py +779 -0
- flowtask/interfaces/smartsheet.py +154 -0
- flowtask/interfaces/stat.py +39 -0
- flowtask/interfaces/task.py +96 -0
- flowtask/interfaces/template.py +118 -0
- flowtask/interfaces/vectorstores/__init__.py +1 -0
- flowtask/interfaces/vectorstores/abstract.py +133 -0
- flowtask/interfaces/vectorstores/milvus.py +669 -0
- flowtask/interfaces/zammad.py +107 -0
- flowtask/models.py +193 -0
- flowtask/parsers/__init__.py +15 -0
- flowtask/parsers/_yaml.c +11978 -0
- flowtask/parsers/_yaml.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/argparser.py +235 -0
- flowtask/parsers/base.c +15155 -0
- flowtask/parsers/base.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/json.c +11968 -0
- flowtask/parsers/json.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/parsers/maps.py +49 -0
- flowtask/parsers/toml.c +11968 -0
- flowtask/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/plugins/__init__.py +16 -0
- flowtask/plugins/components/__init__.py +0 -0
- flowtask/plugins/handler/__init__.py +45 -0
- flowtask/plugins/importer.py +31 -0
- flowtask/plugins/sources/__init__.py +0 -0
- flowtask/runner.py +283 -0
- flowtask/scheduler/__init__.py +9 -0
- flowtask/scheduler/functions.py +493 -0
- flowtask/scheduler/handlers/__init__.py +8 -0
- flowtask/scheduler/handlers/manager.py +504 -0
- flowtask/scheduler/handlers/models.py +58 -0
- flowtask/scheduler/handlers/service.py +72 -0
- flowtask/scheduler/notifications.py +65 -0
- flowtask/scheduler/scheduler.py +993 -0
- flowtask/services/__init__.py +0 -0
- flowtask/services/bots/__init__.py +0 -0
- flowtask/services/bots/telegram.py +264 -0
- flowtask/services/files/__init__.py +11 -0
- flowtask/services/files/manager.py +522 -0
- flowtask/services/files/model.py +37 -0
- flowtask/services/files/service.py +767 -0
- flowtask/services/jira/__init__.py +3 -0
- flowtask/services/jira/jira_actions.py +191 -0
- flowtask/services/tasks/__init__.py +13 -0
- flowtask/services/tasks/launcher.py +213 -0
- flowtask/services/tasks/manager.py +323 -0
- flowtask/services/tasks/service.py +275 -0
- flowtask/services/tasks/task_manager.py +376 -0
- flowtask/services/tasks/tasks.py +155 -0
- flowtask/storages/__init__.py +16 -0
- flowtask/storages/exceptions.py +12 -0
- flowtask/storages/files/__init__.py +8 -0
- flowtask/storages/files/abstract.py +29 -0
- flowtask/storages/files/filesystem.py +66 -0
- flowtask/storages/tasks/__init__.py +19 -0
- flowtask/storages/tasks/abstract.py +26 -0
- flowtask/storages/tasks/database.py +33 -0
- flowtask/storages/tasks/filesystem.py +108 -0
- flowtask/storages/tasks/github.py +119 -0
- flowtask/storages/tasks/memory.py +45 -0
- flowtask/storages/tasks/row.py +25 -0
- flowtask/tasks/__init__.py +0 -0
- flowtask/tasks/abstract.py +526 -0
- flowtask/tasks/command.py +118 -0
- flowtask/tasks/pile.py +486 -0
- flowtask/tasks/py.typed +0 -0
- flowtask/tasks/task.py +778 -0
- flowtask/template/__init__.py +161 -0
- flowtask/tests.py +257 -0
- flowtask/types/__init__.py +8 -0
- flowtask/types/typedefs.c +11347 -0
- flowtask/types/typedefs.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/__init__.py +24 -0
- flowtask/utils/constants.py +117 -0
- flowtask/utils/encoders.py +21 -0
- flowtask/utils/executor.py +112 -0
- flowtask/utils/functions.cpp +14280 -0
- flowtask/utils/functions.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/json.cpp +13349 -0
- flowtask/utils/json.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/mail.py +63 -0
- flowtask/utils/parseqs.c +13324 -0
- flowtask/utils/parserqs.cpython-310-x86_64-linux-gnu.so +0 -0
- flowtask/utils/stats.py +308 -0
- flowtask/utils/transformations.py +74 -0
- flowtask/utils/uv.py +12 -0
- flowtask/utils/validators.py +97 -0
- flowtask/version.py +11 -0
- flowtask-5.8.4.dist-info/LICENSE +201 -0
- flowtask-5.8.4.dist-info/METADATA +209 -0
- flowtask-5.8.4.dist-info/RECORD +470 -0
- flowtask-5.8.4.dist-info/WHEEL +6 -0
- flowtask-5.8.4.dist-info/entry_points.txt +3 -0
- flowtask-5.8.4.dist-info/top_level.txt +2 -0
- plugins/components/CreateQR.py +39 -0
- plugins/components/TestComponent.py +28 -0
- plugins/components/Use1.py +13 -0
- plugins/components/Workplace.py +117 -0
- plugins/components/__init__.py +3 -0
- plugins/sources/__init__.py +0 -0
- plugins/sources/get_populartimes.py +78 -0
- plugins/sources/google.py +150 -0
- plugins/sources/hubspot.py +679 -0
- plugins/sources/icims.py +679 -0
- plugins/sources/mobileinsight.py +501 -0
- plugins/sources/newrelic.py +262 -0
- plugins/sources/uap.py +268 -0
- plugins/sources/venu.py +244 -0
- plugins/sources/vocinity.py +314 -0
@@ -0,0 +1,268 @@
|
|
1
|
+
"""Basic HTTP Connection Request.
|
2
|
+
|
3
|
+
Example:
|
4
|
+
|
5
|
+
```yaml
|
6
|
+
HTTPClient:
|
7
|
+
Group: ICIMSDownload
|
8
|
+
url: https://api.icims.com/customers/{customer_id}/forms/{form_data_id}.txt
|
9
|
+
customer_id: '5674'
|
10
|
+
form_data_id: '1731'
|
11
|
+
form_id: '1823'
|
12
|
+
associate_id: '518491'
|
13
|
+
auth_type: basic
|
14
|
+
use_proxy: false
|
15
|
+
use_async: true
|
16
|
+
credentials:
|
17
|
+
username: ICIMS_API_USERNAME
|
18
|
+
password: ICIMS_API_PASSWORD
|
19
|
+
as_dataframe: false
|
20
|
+
download: true
|
21
|
+
timeout: 360
|
22
|
+
destination:
|
23
|
+
directory: /home/ubuntu/symbits/icims/files/forms/{associate_id}/
|
24
|
+
filename: '{form_id}_{filename}.html'
|
25
|
+
overwrite: false
|
26
|
+
no_errors:
|
27
|
+
'403':
|
28
|
+
errorMessage: This form has been disabled
|
29
|
+
errorCode: 3
|
30
|
+
```
|
31
|
+
|
32
|
+
"""
|
33
|
+
import asyncio
|
34
|
+
# configuration and settings
|
35
|
+
from pathlib import PurePath
|
36
|
+
from typing import Union
|
37
|
+
from collections.abc import Callable
|
38
|
+
from urllib.parse import urlencode
|
39
|
+
from navconfig import config
|
40
|
+
from querysource.types import strtobool
|
41
|
+
from ..exceptions import DataNotFound, ComponentError, FileNotFound
|
42
|
+
from .DownloadFrom import DownloadFromBase
|
43
|
+
from ..interfaces.http import HTTPService
|
44
|
+
|
45
|
+
|
46
|
+
class HTTPClient(DownloadFromBase, HTTPService):
|
47
|
+
"""
|
48
|
+
HTTPClient.
|
49
|
+
|
50
|
+
Overview
|
51
|
+
|
52
|
+
UserComponent: (abstract) ->
|
53
|
+
|
54
|
+
.. table:: Properties
|
55
|
+
:widths: auto
|
56
|
+
|
57
|
+
+-----------+----------+-----------+----------------------------------------------+
|
58
|
+
| Name | Required | Summary |
|
59
|
+
+-----------+----------+-----------+----------------------------------------------+
|
60
|
+
| start | Yes | It is executed when the component is "initialized", |
|
61
|
+
| | | it MUST return TRUE if it does not fail |
|
62
|
+
+-----------+----------+-----------+----------------------------------------------+
|
63
|
+
| run | Yes | Is the code that will execute the component ,must return TRUE or |
|
64
|
+
| | | a content if it does not fail, but fails is declared |
|
65
|
+
+-----------+----------+-----------+-----------------------------------------------+
|
66
|
+
| close | Yes | It is used for any cleaning operation |
|
67
|
+
+-----------+----------+-----------+-----------------------------------------------+
|
68
|
+
|
69
|
+
|
70
|
+
Return the list of arbitrary days
|
71
|
+
|
72
|
+
"""
|
73
|
+
accept: str = "application/xhtml+xml"
|
74
|
+
port: int = 80
|
75
|
+
|
76
|
+
def __init__(
|
77
|
+
self,
|
78
|
+
loop: asyncio.AbstractEventLoop = None,
|
79
|
+
job: Callable = None,
|
80
|
+
stat: Callable = None,
|
81
|
+
**kwargs,
|
82
|
+
):
|
83
|
+
# Credentials
|
84
|
+
self._user: str = None
|
85
|
+
self._pwd: str = None
|
86
|
+
# beautiful soup and html parser:
|
87
|
+
self._bs: Callable = None
|
88
|
+
self._parser: Callable = None
|
89
|
+
self._environment = config
|
90
|
+
# Return a Dataframe:
|
91
|
+
self.as_dataframe: bool = kwargs.pop('as_dataframe', True)
|
92
|
+
if isinstance(self.as_dataframe, str):
|
93
|
+
self.as_dataframe = strtobool(self.as_dataframe)
|
94
|
+
# Data:
|
95
|
+
self._data: dict = kwargs.pop("data", {})
|
96
|
+
# Credentials:
|
97
|
+
self.credentials: dict = kwargs.pop("credentials", {})
|
98
|
+
self.method: str = kwargs.pop("method", "get")
|
99
|
+
# calling parents
|
100
|
+
DownloadFromBase.__init__(
|
101
|
+
self,
|
102
|
+
loop=loop,
|
103
|
+
job=job,
|
104
|
+
stat=stat,
|
105
|
+
**kwargs
|
106
|
+
)
|
107
|
+
HTTPService.__init__(
|
108
|
+
self,
|
109
|
+
**kwargs
|
110
|
+
)
|
111
|
+
|
112
|
+
async def evaluate_error(
|
113
|
+
self, response: Union[str, list], message: Union[str, list, dict]
|
114
|
+
) -> tuple:
|
115
|
+
"""evaluate_response.
|
116
|
+
|
117
|
+
Check Response status and available payloads.
|
118
|
+
Args:
|
119
|
+
response (_type_): _description_
|
120
|
+
url (str): _description_
|
121
|
+
|
122
|
+
Returns:
|
123
|
+
tuple: _description_
|
124
|
+
"""
|
125
|
+
if isinstance(response, list):
|
126
|
+
# a list of potential errors:
|
127
|
+
for msg in response:
|
128
|
+
if message in msg:
|
129
|
+
return True
|
130
|
+
if isinstance(response, dict) and "errors" in response:
|
131
|
+
errors = response["errors"]
|
132
|
+
if isinstance(errors, list):
|
133
|
+
for error in errors:
|
134
|
+
try:
|
135
|
+
if message in error:
|
136
|
+
return True
|
137
|
+
except TypeError:
|
138
|
+
if message == error:
|
139
|
+
return True
|
140
|
+
else:
|
141
|
+
if message == errors:
|
142
|
+
return True
|
143
|
+
else:
|
144
|
+
if message in response:
|
145
|
+
return True
|
146
|
+
return False
|
147
|
+
|
148
|
+
def var_replacement(self):
|
149
|
+
"""
|
150
|
+
Replaces variables in the arguments with their corresponding values.
|
151
|
+
"""
|
152
|
+
for key, _ in self.arguments.items():
|
153
|
+
if key in self._variables:
|
154
|
+
self.arguments[key] = self._variables[key]
|
155
|
+
|
156
|
+
async def start(self, **kwargs):
|
157
|
+
"""
|
158
|
+
Initializes the HTTPClient component, including fetching proxies if necessary.
|
159
|
+
|
160
|
+
:param kwargs: Additional keyword arguments.
|
161
|
+
:return: True if initialization is successful.
|
162
|
+
"""
|
163
|
+
if self.use_proxy is True:
|
164
|
+
self._proxies = await self.get_proxies()
|
165
|
+
self.var_replacement()
|
166
|
+
await super(HTTPClient, self).start()
|
167
|
+
return True
|
168
|
+
|
169
|
+
async def close(self):
|
170
|
+
pass
|
171
|
+
|
172
|
+
async def run(self):
|
173
|
+
"""
|
174
|
+
Executes the HTTPClient component, handling multiple URLs if provided.
|
175
|
+
|
176
|
+
:return: The result of the HTTP request(s).
|
177
|
+
"""
|
178
|
+
if isinstance(self.url, list):
|
179
|
+
## iterate over a list of URLs:
|
180
|
+
results = {}
|
181
|
+
for url in self.url:
|
182
|
+
uri = self.build_url(
|
183
|
+
url, args=self.arguments, queryparams=urlencode(self.parameters)
|
184
|
+
)
|
185
|
+
try:
|
186
|
+
if self.use_async is True:
|
187
|
+
result, err = await self.async_request(uri, self.method, data=self._data)
|
188
|
+
else:
|
189
|
+
result, error = await self.request(uri, self.method, data=self._data)
|
190
|
+
if not result:
|
191
|
+
raise DataNotFound(
|
192
|
+
f"Data was not found on: {uri}"
|
193
|
+
)
|
194
|
+
if error is not None:
|
195
|
+
if isinstance(error, BaseException):
|
196
|
+
raise error
|
197
|
+
else:
|
198
|
+
raise ComponentError(f"HTTPClient Error: {error}")
|
199
|
+
## processing results:
|
200
|
+
if hasattr(self, "download"):
|
201
|
+
## add result to resultset
|
202
|
+
results[result] = True
|
203
|
+
if self._debug:
|
204
|
+
self._logger.debug(f"File Exists > {result}")
|
205
|
+
else:
|
206
|
+
results[result] = result
|
207
|
+
except Exception as err:
|
208
|
+
self._logger.exception(err, stack_info=True)
|
209
|
+
raise ComponentError(f"HTTPClient Error: {err}") from err
|
210
|
+
##
|
211
|
+
self.add_metric("FILENAME", results)
|
212
|
+
self._result = results
|
213
|
+
return self._result
|
214
|
+
else:
|
215
|
+
self.url = self.build_url(
|
216
|
+
self.url, args=self.arguments, queryparams=urlencode(self.parameters)
|
217
|
+
)
|
218
|
+
try:
|
219
|
+
if self.use_async is True:
|
220
|
+
result, error = await self.async_request(
|
221
|
+
self.url, self.method, data=self._data
|
222
|
+
)
|
223
|
+
else:
|
224
|
+
result, error = await self.request(self.url, self.method, data=self._data)
|
225
|
+
if not result:
|
226
|
+
raise DataNotFound(
|
227
|
+
f"Data was not found on: {self.url}"
|
228
|
+
)
|
229
|
+
elif error is not None:
|
230
|
+
if hasattr(self, "no_errors"):
|
231
|
+
# check if error is in no_errors
|
232
|
+
return False
|
233
|
+
if isinstance(error, BaseException):
|
234
|
+
raise error
|
235
|
+
else:
|
236
|
+
raise ComponentError(f"HTTPClient Error: {error}")
|
237
|
+
# at here, processing Result
|
238
|
+
if self.as_dataframe is True:
|
239
|
+
try:
|
240
|
+
result = await self.create_dataframe(result)
|
241
|
+
except Exception as err:
|
242
|
+
raise ComponentError(f"RESTClient Error: {err}") from err
|
243
|
+
elif hasattr(self, "download"):
|
244
|
+
# File downloaded, return same as FileExists
|
245
|
+
# TODO: error if result is a BytesIO
|
246
|
+
if isinstance(result, bytes):
|
247
|
+
self._result = result
|
248
|
+
elif isinstance(result, PurePath):
|
249
|
+
file = result
|
250
|
+
self._logger.debug(f" ::: Checking for File: {file}")
|
251
|
+
result = {}
|
252
|
+
if file.exists() and file.is_file():
|
253
|
+
result[file] = True
|
254
|
+
self.setTaskVar("DIRECTORY", file.parent)
|
255
|
+
self.setTaskVar("FILENAME", str(file.name))
|
256
|
+
self.setTaskVar("FILEPATH", file)
|
257
|
+
self.add_metric("FILENAME", file)
|
258
|
+
else:
|
259
|
+
raise FileNotFound(
|
260
|
+
f"FileExists: File Doesn't exists: {file}"
|
261
|
+
)
|
262
|
+
self._result = result
|
263
|
+
return self._result
|
264
|
+
except DataNotFound:
|
265
|
+
raise
|
266
|
+
except Exception as err:
|
267
|
+
self._logger.exception(err, stack_info=True)
|
268
|
+
raise ComponentError(f"HTTPClient: {err}") from err
|
@@ -0,0 +1,146 @@
|
|
1
|
+
from navconfig.logging import logging
|
2
|
+
from querysource.exceptions import DataNotFound as QSNotFound
|
3
|
+
from ..exceptions import ComponentError, DataNotFound
|
4
|
+
from .QSBase import QSBase
|
5
|
+
|
6
|
+
|
7
|
+
class ICIMS(QSBase):
|
8
|
+
"""
|
9
|
+
ICIMS
|
10
|
+
|
11
|
+
Overview
|
12
|
+
|
13
|
+
The ICIMS class is a specialized component for handling form data interactions within the ICIMS system.
|
14
|
+
It extends the QSBase class and provides methods for retrieving people data, individual person data,
|
15
|
+
lists of forms, and form data with specific metrics mappings.
|
16
|
+
|
17
|
+
.. table:: Properties
|
18
|
+
:widths: auto
|
19
|
+
|
20
|
+
+------------------+----------+--------------------------------------------------------------------------------------+
|
21
|
+
| Name | Required | Description |
|
22
|
+
+------------------+----------+--------------------------------------------------------------------------------------+
|
23
|
+
| type | Yes | Defines the type of data handled by the component. |
|
24
|
+
+------------------+----------+--------------------------------------------------------------------------------------+
|
25
|
+
| conditions | No | If any condition is required to do the work. |
|
26
|
+
+------------------+----------+--------------------------------------------------------------------------------------+
|
27
|
+
|
28
|
+
Methods
|
29
|
+
|
30
|
+
people
|
31
|
+
|
32
|
+
Retrieves a list of people data from the ICIMS system.
|
33
|
+
|
34
|
+
Raises:
|
35
|
+
DataNotFound: If no data is found.
|
36
|
+
ComponentError: If any other error occurs during execution.
|
37
|
+
|
38
|
+
person
|
39
|
+
|
40
|
+
Retrieves individual person data from the ICIMS system and adds a person_id to the data.
|
41
|
+
|
42
|
+
Raises:
|
43
|
+
DataNotFound: If no data is found.
|
44
|
+
ComponentError: If any other error occurs during execution.
|
45
|
+
|
46
|
+
forms_list
|
47
|
+
|
48
|
+
Retrieves a list of forms from the ICIMS system.
|
49
|
+
|
50
|
+
Raises:
|
51
|
+
DataNotFound: If no data is found.
|
52
|
+
ComponentError: If any other error occurs during execution.
|
53
|
+
|
54
|
+
form_data
|
55
|
+
|
56
|
+
Retrieves form data from the ICIMS system and maps internal metrics to output names.
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
DataNotFound: If no data is found.
|
60
|
+
ComponentError: If any other error occurs during execution.
|
61
|
+
|
62
|
+
Return
|
63
|
+
|
64
|
+
The methods in this class return the requested data from the ICIMS system, formatted according to the
|
65
|
+
specific requirements of each method.
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
Example:
|
70
|
+
|
71
|
+
```yaml
|
72
|
+
ICIMS:
|
73
|
+
type: people
|
74
|
+
```
|
75
|
+
|
76
|
+
"""
|
77
|
+
|
78
|
+
type = "form_data"
|
79
|
+
_driver = "icims"
|
80
|
+
_metrics: dict = {
|
81
|
+
"requestedby": "requested_by",
|
82
|
+
"updatedby": "updated_by",
|
83
|
+
"formname": "form_name",
|
84
|
+
"updateddate": "updated_date",
|
85
|
+
"completeddate": "completed_date",
|
86
|
+
"completedby": "completed_by",
|
87
|
+
}
|
88
|
+
|
89
|
+
async def people(self):
|
90
|
+
try:
|
91
|
+
row = await self._qs.people()
|
92
|
+
if row:
|
93
|
+
return row
|
94
|
+
else:
|
95
|
+
return []
|
96
|
+
except QSNotFound as err:
|
97
|
+
raise DataNotFound(f"ICIMS Not Found: {err}") from err
|
98
|
+
except Exception as err:
|
99
|
+
logging.exception(err)
|
100
|
+
raise ComponentError(f"ICIMS ERROR: {err!s}") from err
|
101
|
+
|
102
|
+
async def person(self):
|
103
|
+
try:
|
104
|
+
row = await self._qs.person()
|
105
|
+
if row:
|
106
|
+
row["person_id"] = self._variables["person_id"]
|
107
|
+
return [row]
|
108
|
+
else:
|
109
|
+
return []
|
110
|
+
except QSNotFound as err:
|
111
|
+
raise DataNotFound(f"ICIMS Not Found: {err}") from err
|
112
|
+
except Exception as err:
|
113
|
+
logging.exception(err)
|
114
|
+
raise ComponentError(f"ICIMS ERROR: {err!s}") from err
|
115
|
+
|
116
|
+
async def forms_list(self):
|
117
|
+
try:
|
118
|
+
row = await self._qs.forms_list()
|
119
|
+
if row:
|
120
|
+
return row["forms"]
|
121
|
+
else:
|
122
|
+
return []
|
123
|
+
except QSNotFound as err:
|
124
|
+
raise DataNotFound(f"ICIMS Not Found: {err}") from err
|
125
|
+
except Exception as err:
|
126
|
+
logging.exception(err)
|
127
|
+
raise ComponentError(f"ICIMS ERROR: {err!s}") from err
|
128
|
+
|
129
|
+
async def form_data(self):
|
130
|
+
try:
|
131
|
+
row = await self._qs.form_data()
|
132
|
+
if row:
|
133
|
+
for key, name in self._metrics.items():
|
134
|
+
try:
|
135
|
+
row[name] = row[key]
|
136
|
+
del row[key]
|
137
|
+
except (TypeError, KeyError):
|
138
|
+
pass
|
139
|
+
return [row]
|
140
|
+
else:
|
141
|
+
return []
|
142
|
+
except QSNotFound as err:
|
143
|
+
raise DataNotFound(f"ICIMS Not Found: {err}") from err
|
144
|
+
except Exception as err:
|
145
|
+
logging.exception(err)
|
146
|
+
raise ComponentError(f"ICIMS ERROR: {err!s}") from err
|
@@ -0,0 +1,179 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
from jsonpath_ng import parse
|
3
|
+
import asyncio
|
4
|
+
import pandas as pd
|
5
|
+
from ..exceptions import ComponentError
|
6
|
+
from .BaseLoop import BaseLoop
|
7
|
+
|
8
|
+
|
9
|
+
class IF(BaseLoop):
|
10
|
+
"""
|
11
|
+
IF Component
|
12
|
+
|
13
|
+
Executes one of two components based on a condition.
|
14
|
+
|
15
|
+
true_component: The component to execute if the condition evaluates to True.
|
16
|
+
false_component: The component to execute if the condition evaluates to False.
|
17
|
+
"""
|
18
|
+
|
19
|
+
def __init__(
|
20
|
+
self,
|
21
|
+
loop: asyncio.AbstractEventLoop = None,
|
22
|
+
job: Callable = None,
|
23
|
+
stat: Callable = None,
|
24
|
+
**kwargs,
|
25
|
+
):
|
26
|
+
self._condition = kwargs.get("condition", None)
|
27
|
+
self._true_component = kwargs.get("true_component", None)
|
28
|
+
self._false_component = kwargs.get("false_component", None)
|
29
|
+
super(IF, self).__init__(loop=loop, job=job, stat=stat, **kwargs)
|
30
|
+
|
31
|
+
async def start(self, **kwargs):
|
32
|
+
"""
|
33
|
+
Initialize the component.
|
34
|
+
"""
|
35
|
+
await super(IF, self).start(**kwargs)
|
36
|
+
# Ensure the condition and components are defined
|
37
|
+
if not self._condition:
|
38
|
+
raise ComponentError(
|
39
|
+
"The 'condition' argument must be provided."
|
40
|
+
)
|
41
|
+
if not self._true_component or not self._false_component:
|
42
|
+
raise ComponentError(
|
43
|
+
"Both 'true_component' and 'false_component' must be specified."
|
44
|
+
)
|
45
|
+
return True
|
46
|
+
|
47
|
+
def _evaluate_condition(self, condition: str) -> bool:
|
48
|
+
"""
|
49
|
+
Evaluate a condition based on the type of self.data.
|
50
|
+
|
51
|
+
Args:
|
52
|
+
condition (str): A condition in the format "<jsonpath> <operator> <value>".
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
bool: True if the condition is satisfied, else False.
|
56
|
+
"""
|
57
|
+
if isinstance(self.data, dict):
|
58
|
+
try:
|
59
|
+
jsonpath_expr, operator, expected_value = self._parse_condition(condition)
|
60
|
+
jsonpath = parse(jsonpath_expr)
|
61
|
+
matches = jsonpath.find(self.data)
|
62
|
+
actual_value = matches[0].value if matches else None
|
63
|
+
return self._evaluate_operator(
|
64
|
+
actual_value,
|
65
|
+
operator,
|
66
|
+
expected_value
|
67
|
+
)
|
68
|
+
except Exception as err:
|
69
|
+
raise ComponentError(
|
70
|
+
f"Error evaluating condition '{condition}': {err}"
|
71
|
+
)
|
72
|
+
|
73
|
+
elif isinstance(self.data, pd.DataFrame):
|
74
|
+
try:
|
75
|
+
filtered = self.data.query(condition)
|
76
|
+
return not filtered.empty
|
77
|
+
except Exception as err:
|
78
|
+
raise ComponentError(
|
79
|
+
f"Error evaluating DataFrame condition '{condition}': {err}"
|
80
|
+
)
|
81
|
+
|
82
|
+
elif isinstance(self.data, str):
|
83
|
+
return condition in self.data
|
84
|
+
|
85
|
+
else:
|
86
|
+
raise ComponentError(
|
87
|
+
f"Unsupported data type for condition evaluation: {type(self.data)}"
|
88
|
+
)
|
89
|
+
|
90
|
+
def _parse_condition(self, condition: str):
|
91
|
+
"""
|
92
|
+
Parse the condition into JSONPath, operator, and expected value.
|
93
|
+
|
94
|
+
Args:
|
95
|
+
condition (str): A condition string, e.g., "$.metadata.type == 'recapDefinition'".
|
96
|
+
|
97
|
+
Returns:
|
98
|
+
tuple: (jsonpath_expr, operator, expected_value)
|
99
|
+
"""
|
100
|
+
operators = ["==", "!=", ">", "<", ">=", "<="]
|
101
|
+
for op in operators:
|
102
|
+
if op in condition:
|
103
|
+
parts = condition.split(op)
|
104
|
+
if len(parts) != 2:
|
105
|
+
raise ValueError(
|
106
|
+
f"Invalid condition format: {condition}"
|
107
|
+
)
|
108
|
+
jsonpath_expr, expected_value = parts
|
109
|
+
expected_value = expected_value.strip().strip("'\"") # Remove quotes
|
110
|
+
return jsonpath_expr.strip(), op, expected_value
|
111
|
+
raise ValueError(
|
112
|
+
f"No valid operator found in condition: {condition}"
|
113
|
+
)
|
114
|
+
|
115
|
+
def _evaluate_operator(self, actual_value, operator, expected_value):
|
116
|
+
"""
|
117
|
+
Evaluate the comparison operator.
|
118
|
+
|
119
|
+
Args:
|
120
|
+
actual_value: The value extracted from JSONPath.
|
121
|
+
operator: The comparison operator as a string.
|
122
|
+
expected_value: The value to compare against.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
bool: True if the comparison is satisfied, else False.
|
126
|
+
"""
|
127
|
+
if operator == "==":
|
128
|
+
return actual_value == expected_value
|
129
|
+
elif operator == "!=":
|
130
|
+
return actual_value != expected_value
|
131
|
+
elif operator == ">":
|
132
|
+
return actual_value > expected_value
|
133
|
+
elif operator == "<":
|
134
|
+
return actual_value < expected_value
|
135
|
+
elif operator == ">=":
|
136
|
+
return actual_value >= expected_value
|
137
|
+
elif operator == "<=":
|
138
|
+
return actual_value <= expected_value
|
139
|
+
else:
|
140
|
+
raise ValueError(
|
141
|
+
f"Unsupported operator: {operator}"
|
142
|
+
)
|
143
|
+
|
144
|
+
async def run(self):
|
145
|
+
"""
|
146
|
+
Executes the appropriate component based on the condition.
|
147
|
+
"""
|
148
|
+
try:
|
149
|
+
condition_result = self._evaluate_condition(self._condition)
|
150
|
+
except ComponentError as e:
|
151
|
+
raise ComponentError(
|
152
|
+
f"Error evaluating condition '{self._condition}': {e}"
|
153
|
+
)
|
154
|
+
|
155
|
+
selected_component = (
|
156
|
+
self._true_component if condition_result else self._false_component
|
157
|
+
)
|
158
|
+
|
159
|
+
step, idx = self._TaskPile.getStepByName(selected_component)
|
160
|
+
if step is None:
|
161
|
+
raise ComponentError(
|
162
|
+
f"Component '{selected_component}' not found in Task Definition."
|
163
|
+
)
|
164
|
+
|
165
|
+
target, params, stat = self.get_component(step)
|
166
|
+
component_instance = self.create_component(
|
167
|
+
target,
|
168
|
+
value=self.data,
|
169
|
+
stat=stat,
|
170
|
+
**params
|
171
|
+
)
|
172
|
+
self._result = await self.exec_component(
|
173
|
+
component_instance,
|
174
|
+
step.name
|
175
|
+
)
|
176
|
+
# Remove executed components
|
177
|
+
self._TaskPile.delStepByName(self._true_component)
|
178
|
+
self._TaskPile.delStepByName(self._false_component)
|
179
|
+
return self._result
|