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
@@ -0,0 +1,191 @@
|
|
1
|
+
from jira import JIRA, JIRAError
|
2
|
+
import requests
|
3
|
+
|
4
|
+
class JiraActions():
|
5
|
+
def __init__(self, server: str, email: str, token: str):
|
6
|
+
"""
|
7
|
+
Init class JiraActions.
|
8
|
+
|
9
|
+
:param server: Server URL.
|
10
|
+
:param email: User Email.
|
11
|
+
:param token: API token of Jira.
|
12
|
+
"""
|
13
|
+
try:
|
14
|
+
self.server = server
|
15
|
+
self.jira = JIRA(server=server, basic_auth=(email, token))
|
16
|
+
except JIRAError as e:
|
17
|
+
self.handle_jira_error(e, "Authenticating in Jira")
|
18
|
+
|
19
|
+
def create_issue(self, project_key: str, summary: str, description: str, issue_type: str = 'Bug'):
|
20
|
+
"""
|
21
|
+
Creates a new Jira issue in the specified project.
|
22
|
+
|
23
|
+
:param project_key: Key of the project in which the ticket is to be created.
|
24
|
+
:param summary: Summary or title of the ticket.
|
25
|
+
:param description: Description of the ticket.
|
26
|
+
:param issue_type: Type of ticket (default 'Task').
|
27
|
+
:return: Returns the ticket created.
|
28
|
+
"""
|
29
|
+
try:
|
30
|
+
issue_data = {
|
31
|
+
'project': {'key': project_key},
|
32
|
+
'summary': summary,
|
33
|
+
'description': description,
|
34
|
+
'issuetype': {'name': issue_type}
|
35
|
+
}
|
36
|
+
issue = self.jira.create_issue(fields=issue_data)
|
37
|
+
return issue
|
38
|
+
except JIRAError as e:
|
39
|
+
self.handle_jira_error(e, "Creating an issue")
|
40
|
+
|
41
|
+
def add_comment(self, issue_key: str, comment: str):
|
42
|
+
"""
|
43
|
+
Adds a comment to a Jira issue.
|
44
|
+
|
45
|
+
:param issue_key: Key of the issue to add the comment to.
|
46
|
+
:param comment: The comment to be added.
|
47
|
+
:return: Returns the added comment or raises an exception in case of error.
|
48
|
+
"""
|
49
|
+
try:
|
50
|
+
issue = self.jira.issue(issue_key)
|
51
|
+
return self.jira.add_comment(issue, comment)
|
52
|
+
except JIRAError as e:
|
53
|
+
self.handle_jira_error(e, "Adding a comment")
|
54
|
+
|
55
|
+
def transition_issue(self, issue_key: str, transition_name: str, comment: str = None):
|
56
|
+
"""
|
57
|
+
Transitions a Jira issue to a new status based on the transition name.
|
58
|
+
If the transition name is invalid, provides a list of valid transitions for the issue.
|
59
|
+
|
60
|
+
:param issue_key: Key of the issue to transition.
|
61
|
+
:param transition_name: Name of the transition to perform (e.g., 'Start Progress', 'Close Issue').
|
62
|
+
:param comment: Optional comment to add during the transition.
|
63
|
+
:return: Returns the issue after the transition or raises an exception in case of error.
|
64
|
+
"""
|
65
|
+
try:
|
66
|
+
# Get all possible transitions for the issue
|
67
|
+
transitions = self.jira.transitions(issue_key)
|
68
|
+
|
69
|
+
# Find the transition ID corresponding to the provided transition name
|
70
|
+
valid_transitions = [t['name'] for t in transitions]
|
71
|
+
transition_id = next((t['id'] for t in transitions if t['name'].lower() == transition_name.lower()), None)
|
72
|
+
|
73
|
+
if not transition_id:
|
74
|
+
valid_transitions_str = ', '.join(valid_transitions)
|
75
|
+
raise ValueError(
|
76
|
+
f"Transition '{transition_name}' not found for issue {issue_key}. "
|
77
|
+
f"Valid transitions are: {valid_transitions_str}"
|
78
|
+
)
|
79
|
+
|
80
|
+
# Perform the transition
|
81
|
+
self.jira.transition_issue(issue_key, transition_id, comment=comment)
|
82
|
+
return self.jira.issue(issue_key)
|
83
|
+
|
84
|
+
except JIRAError as e:
|
85
|
+
self.handle_jira_error(e, "transitioning an issue")
|
86
|
+
|
87
|
+
def assign_issue(self, issue_key: str, assignee: str):
|
88
|
+
"""
|
89
|
+
Assigns a Jira issue to a specified user.
|
90
|
+
|
91
|
+
:param issue_key: Key of the issue to be assigned (e.g., 'PROJ-123').
|
92
|
+
:param assignee: Username or email of the user to whom the issue will be assigned.
|
93
|
+
:return: The updated issue after the assignment.
|
94
|
+
"""
|
95
|
+
try:
|
96
|
+
# Assign the issue to the specified user
|
97
|
+
issue = self.jira.issue(issue_key)
|
98
|
+
self.jira.assign_issue(issue, assignee)
|
99
|
+
return issue
|
100
|
+
except JIRAError as e:
|
101
|
+
self.handle_jira_error(e, f"assigning the issue {issue_key} to {assignee}")
|
102
|
+
|
103
|
+
def add_worklog(self, issue_key: str, time_spent: str, comment: str = None, started: str = None):
|
104
|
+
"""
|
105
|
+
Adds a worklog entry to a Jira issue.
|
106
|
+
|
107
|
+
:param issue_key: Key of the issue to which the worklog will be added.
|
108
|
+
:param time_spent: Time spent on the issue (e.g., '2h', '3d', '1w').
|
109
|
+
:param comment: Optional comment to add with the worklog.
|
110
|
+
:param started: Date and time the work started (optional, format: 'YYYY-MM-DDTHH:MM:SS.000+0000').
|
111
|
+
:return: The worklog entry that was added, or raises an exception in case of error.
|
112
|
+
"""
|
113
|
+
try:
|
114
|
+
valid_units = ['h', 'd', 'w']
|
115
|
+
if not any(time_spent.endswith(unit) for unit in valid_units):
|
116
|
+
raise ValueError(f"Invalid time format: {time_spent}. Must end with one of {valid_units}.")
|
117
|
+
# Add the worklog to the issue
|
118
|
+
worklog = self.jira.add_worklog(
|
119
|
+
issue=issue_key,
|
120
|
+
timeSpent=time_spent,
|
121
|
+
comment=comment,
|
122
|
+
started=started
|
123
|
+
)
|
124
|
+
return worklog
|
125
|
+
except JIRAError as e:
|
126
|
+
self.handle_jira_error(e, "Adding a worklog")
|
127
|
+
|
128
|
+
def list_issues(self):
|
129
|
+
"""
|
130
|
+
Return a list of Jira issues.
|
131
|
+
|
132
|
+
:return: The list of closed issues assigned to user.
|
133
|
+
"""
|
134
|
+
try:
|
135
|
+
qry = 'assignee = currentUser() and status != Closed and status != CANCELLED and status != Done order by created asc' # noqa
|
136
|
+
issues = self.jira.search_issues(qry)
|
137
|
+
return issues
|
138
|
+
except JIRAError as e:
|
139
|
+
self.handle_jira_error(e, "listing the issues")
|
140
|
+
|
141
|
+
def list_transitions(self, issue_key: str):
|
142
|
+
"""
|
143
|
+
Return a list of a valid transitions of a issue.
|
144
|
+
|
145
|
+
:param issue_key: Key of the issue to transition.
|
146
|
+
:return: Returns the list of a valid transitions of a issue.
|
147
|
+
"""
|
148
|
+
try:
|
149
|
+
transitions = self.jira.transitions(issue_key)
|
150
|
+
valid_transitions = [t['name'] for t in transitions]
|
151
|
+
return valid_transitions
|
152
|
+
except JIRAError as e:
|
153
|
+
self.handle_jira_error(e, "listing the transitions")
|
154
|
+
|
155
|
+
@staticmethod
|
156
|
+
def handle_jira_error(e: Exception, action: str):
|
157
|
+
"""
|
158
|
+
Handles errors and exceptions that occur during interactions with Jira.
|
159
|
+
|
160
|
+
This function captures exceptions thrown during Jira operations and raises appropriate
|
161
|
+
errors with relevant messages based on the type of exception (e.g., JIRAError, connection issues).
|
162
|
+
|
163
|
+
:param e: Exception object. This can be a JIRAError or other types of exceptions (e.g., connection errors).
|
164
|
+
:param action: A string describing the action that was being attempted when the error occurred
|
165
|
+
(e.g., 'creating an issue', 'adding a comment').
|
166
|
+
|
167
|
+
:raises ValueError: If there is a validation error (e.g., incorrect data in Jira fields).
|
168
|
+
:raises PermissionError: If the user does not have sufficient permissions for the Jira operation.
|
169
|
+
:raises ConnectionError: If there is a problem connecting to the Jira server or if the requested resource was not found.
|
170
|
+
:raises TimeoutError: If the operation timed out while connecting to the Jira server.
|
171
|
+
:raises Exception: For any other unexpected errors that occur during the Jira operation.
|
172
|
+
""" # noqa
|
173
|
+
if isinstance(e, JIRAError):
|
174
|
+
if e.status_code == 400:
|
175
|
+
raise ValueError(f"Validation error while {action}, please, check the provided values.")
|
176
|
+
elif e.status_code == 403:
|
177
|
+
raise PermissionError(f"Insufficient permissions while {action}.")
|
178
|
+
elif e.status_code == 404:
|
179
|
+
raise ConnectionError(f"Resource not found while {action}.")
|
180
|
+
elif e.status_code in (500, 502):
|
181
|
+
raise Exception(f"Server error while {action}. The Jira server might be down.")
|
182
|
+
else:
|
183
|
+
raise Exception(f"Jira error while {action}: {e.text}")
|
184
|
+
elif isinstance(e, requests.ConnectionError):
|
185
|
+
raise ConnectionError(
|
186
|
+
f"Connection error: Unable to connect to the Jira server: {e}"
|
187
|
+
)
|
188
|
+
elif isinstance(e, requests.Timeout):
|
189
|
+
raise TimeoutError("Request timed out.")
|
190
|
+
else:
|
191
|
+
raise Exception(f"An unexpected error occurred while {action}: {str(e)}")
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"""
|
2
|
+
Tasks.
|
3
|
+
|
4
|
+
Task-based management, creation and execution of tasks.
|
5
|
+
"""
|
6
|
+
from .service import TaskService
|
7
|
+
from .launcher import TaskLauncher
|
8
|
+
from .manager import TaskManager
|
9
|
+
from .tasks import launch_task
|
10
|
+
|
11
|
+
__all__ = (
|
12
|
+
"TaskManager", "TaskService", "TaskLauncher", "launch_task",
|
13
|
+
)
|
@@ -0,0 +1,213 @@
|
|
1
|
+
"""
|
2
|
+
TaskService.
|
3
|
+
|
4
|
+
Work with managing tasks, creation, deleting, listing, etc.
|
5
|
+
"""
|
6
|
+
import uuid
|
7
|
+
from navigator_session import get_session
|
8
|
+
from navigator.views import BaseView
|
9
|
+
from navigator.responses import JSONResponse
|
10
|
+
from navigator.conf import AUTH_SESSION_OBJECT
|
11
|
+
from querysource.types import strtobool
|
12
|
+
from ...exceptions import (
|
13
|
+
TaskNotFound,
|
14
|
+
DataNotFound,
|
15
|
+
TaskFailed,
|
16
|
+
FileError,
|
17
|
+
FileNotFound,
|
18
|
+
)
|
19
|
+
from .tasks import launch_task
|
20
|
+
|
21
|
+
|
22
|
+
def is_boolean(value: str) -> bool:
|
23
|
+
if isinstance(value, bool):
|
24
|
+
return value
|
25
|
+
try:
|
26
|
+
return strtobool(value)
|
27
|
+
except ValueError:
|
28
|
+
return False
|
29
|
+
|
30
|
+
|
31
|
+
class TaskLauncher(BaseView):
|
32
|
+
_logger_name = "TaskLauncher"
|
33
|
+
|
34
|
+
def get_user(self, session, idx: str = "user_id") -> int:
|
35
|
+
if not session:
|
36
|
+
self.error(response={"error": "Unauthorized"}, status=403)
|
37
|
+
try:
|
38
|
+
if AUTH_SESSION_OBJECT in session:
|
39
|
+
return session[AUTH_SESSION_OBJECT][idx]
|
40
|
+
else:
|
41
|
+
return session[idx]
|
42
|
+
except KeyError:
|
43
|
+
self.error(
|
44
|
+
response={
|
45
|
+
"error": "Unauthorized",
|
46
|
+
"message": "Hint: maybe you need to pass an Authorization token.",
|
47
|
+
},
|
48
|
+
status=403,
|
49
|
+
)
|
50
|
+
|
51
|
+
async def post(self):
|
52
|
+
"""
|
53
|
+
POST Method.
|
54
|
+
description: Executing a Task
|
55
|
+
tags:
|
56
|
+
- tasks
|
57
|
+
- DataIntegration
|
58
|
+
consumes:
|
59
|
+
- application/json
|
60
|
+
produces:
|
61
|
+
- application/json
|
62
|
+
responses:
|
63
|
+
"200":
|
64
|
+
description: Existing Task was updated or executed.
|
65
|
+
"201":
|
66
|
+
description: New Task was inserted
|
67
|
+
"202":
|
68
|
+
description: Task was accepted to run
|
69
|
+
"400":
|
70
|
+
description: Task Failed to execute
|
71
|
+
"403":
|
72
|
+
description: Forbidden Call
|
73
|
+
"404":
|
74
|
+
description: No Data was found
|
75
|
+
"406":
|
76
|
+
description: Query Error
|
77
|
+
"409":
|
78
|
+
description: Conflict, a constraint was violated
|
79
|
+
"""
|
80
|
+
# get the URL parameters
|
81
|
+
params = self.get_args()
|
82
|
+
# get post Data
|
83
|
+
data = await self.post_data()
|
84
|
+
# Default launch a task on Queue
|
85
|
+
longrunner = True
|
86
|
+
## Getting User Information:
|
87
|
+
try:
|
88
|
+
usr = await get_session(self.request)
|
89
|
+
user = self.get_user(usr)
|
90
|
+
except (TypeError, ValueError):
|
91
|
+
user = None
|
92
|
+
self.logger.notice(f"Task User: {user}")
|
93
|
+
try:
|
94
|
+
program = params["program"]
|
95
|
+
del params["program"]
|
96
|
+
except KeyError:
|
97
|
+
# we need a program
|
98
|
+
try:
|
99
|
+
program = data["program"]
|
100
|
+
except KeyError:
|
101
|
+
headers = {
|
102
|
+
"X-STATUS": "Error",
|
103
|
+
"X-MESSAGE": "Resource Error: We need a Program Name",
|
104
|
+
}
|
105
|
+
msg = {
|
106
|
+
"state": "Failed",
|
107
|
+
"message": "Error: we need a program name",
|
108
|
+
"status": 400,
|
109
|
+
}
|
110
|
+
return self.error(response=msg, headers=headers, status=400)
|
111
|
+
try:
|
112
|
+
task_id = params["task_id"]
|
113
|
+
del params["task_id"]
|
114
|
+
except KeyError:
|
115
|
+
# we need a Task ID
|
116
|
+
try:
|
117
|
+
task_id = data["task_id"]
|
118
|
+
except KeyError:
|
119
|
+
headers = {
|
120
|
+
"X-STATUS": "Error",
|
121
|
+
"X-MESSAGE": "Resource Error: We need a Task Name",
|
122
|
+
}
|
123
|
+
msg = {
|
124
|
+
"state": "Failed",
|
125
|
+
"message": "Error: we need a Task ID",
|
126
|
+
"status": 400,
|
127
|
+
}
|
128
|
+
return self.error(response=msg, headers=headers, status=400)
|
129
|
+
try:
|
130
|
+
try:
|
131
|
+
longrunner = is_boolean(data["long_running"])
|
132
|
+
del data["long_running"]
|
133
|
+
except KeyError:
|
134
|
+
pass
|
135
|
+
try:
|
136
|
+
longrunner = is_boolean(params["long_running"])
|
137
|
+
del params["long_running"]
|
138
|
+
except KeyError:
|
139
|
+
pass
|
140
|
+
try:
|
141
|
+
no_worker = is_boolean(data["no_worker"])
|
142
|
+
del data["no_worker"]
|
143
|
+
except KeyError:
|
144
|
+
no_worker = False
|
145
|
+
self.logger.debug(
|
146
|
+
f"Long Runner: {longrunner}, No Using Workers: {no_worker}"
|
147
|
+
)
|
148
|
+
try:
|
149
|
+
priority = data["priority"]
|
150
|
+
del data["priority"]
|
151
|
+
except KeyError:
|
152
|
+
priority = "low"
|
153
|
+
# cannot update or insert a Task, we need to Run that task
|
154
|
+
result = {}
|
155
|
+
args = {}
|
156
|
+
if isinstance(params, dict):
|
157
|
+
args = params
|
158
|
+
if data:
|
159
|
+
args = {**args, **data}
|
160
|
+
task_uuid = uuid.uuid4()
|
161
|
+
uid, action, result = await launch_task(
|
162
|
+
program_slug=program,
|
163
|
+
task_id=task_id,
|
164
|
+
loop=self._loop,
|
165
|
+
task_uuid=task_uuid,
|
166
|
+
queued=longrunner,
|
167
|
+
no_worker=no_worker,
|
168
|
+
priority=priority,
|
169
|
+
userid=user,
|
170
|
+
**args,
|
171
|
+
)
|
172
|
+
if isinstance(result, BaseException):
|
173
|
+
state = 400
|
174
|
+
result = f"{result!s}"
|
175
|
+
elif action == "Queued":
|
176
|
+
state = 202
|
177
|
+
else:
|
178
|
+
state = 200
|
179
|
+
response = {
|
180
|
+
"message": f"Task {program}.{task_id} was {action}",
|
181
|
+
"task": f"{program}.{task_id}",
|
182
|
+
"task_execution": task_uuid,
|
183
|
+
"result": result,
|
184
|
+
"task_uuid": uid,
|
185
|
+
}
|
186
|
+
headers = {
|
187
|
+
"X-STATUS": "Task OK",
|
188
|
+
"X-MESSAGE": f"Execution of Task {program}.{task_id} on {action}",
|
189
|
+
}
|
190
|
+
try:
|
191
|
+
return JSONResponse(response, status=state, headers=headers)
|
192
|
+
except Exception as e:
|
193
|
+
print("ERROR: ", e)
|
194
|
+
except DataNotFound as err:
|
195
|
+
error = f"Error: Data not found {program}.{task_id}"
|
196
|
+
msg = {"message": error, "error": 404}
|
197
|
+
return self.error(response=msg, exception=err, status=404)
|
198
|
+
except TaskNotFound as err:
|
199
|
+
error = f"Error: Task not found {program}.{task_id}"
|
200
|
+
msg = {"message": error}
|
201
|
+
return self.error(response=msg, exception=err, status=401)
|
202
|
+
except TaskFailed as err:
|
203
|
+
error = f"Error on Task {program}.{task_id} Failed"
|
204
|
+
msg = {"message": error}
|
205
|
+
return self.error(response=msg, exception=err, status=406)
|
206
|
+
except (FileNotFound, FileError) as err:
|
207
|
+
error = f"Error on Task {program}.{task_id} File Not Found: {err}"
|
208
|
+
msg = {"message": error}
|
209
|
+
return self.error(response=msg, exception=err, status=404)
|
210
|
+
except Exception as err:
|
211
|
+
error = f"Uncaught exception on Task {program}.{task_id}"
|
212
|
+
msg = {"message": error}
|
213
|
+
return self.critical(reason=msg, exception=err, status=500)
|