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
Binary file
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import sys
|
2
|
+
from ..conf import PLUGINS_FOLDER
|
3
|
+
from .importer import PluginImporter
|
4
|
+
|
5
|
+
|
6
|
+
### add plugins directory to sys.path
|
7
|
+
sys.path.insert(0, str(PLUGINS_FOLDER))
|
8
|
+
|
9
|
+
|
10
|
+
### Components Loader.
|
11
|
+
components_dir = PLUGINS_FOLDER.joinpath("components")
|
12
|
+
package_name = "flowtask.plugins.components"
|
13
|
+
try:
|
14
|
+
sys.meta_path.append(PluginImporter(package_name, str(components_dir)))
|
15
|
+
except ImportError as exc:
|
16
|
+
print(exc)
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from navigator.views import BaseView
|
2
|
+
from navigator.responses import FileResponse
|
3
|
+
from ...conf import MARKETPLACE_DIR
|
4
|
+
|
5
|
+
|
6
|
+
class PluginHandler(BaseView):
|
7
|
+
async def put(self):
|
8
|
+
"""put.
|
9
|
+
|
10
|
+
Upload a Component into Marketplace, sign-in component and register into Metadata database.
|
11
|
+
"""
|
12
|
+
|
13
|
+
async def get(self):
|
14
|
+
"""
|
15
|
+
List all Components or getting one component (metadata or download).
|
16
|
+
"""
|
17
|
+
params = self.match_parameters()
|
18
|
+
try:
|
19
|
+
option = params["option"]
|
20
|
+
except KeyError:
|
21
|
+
option = "component"
|
22
|
+
try:
|
23
|
+
component = params["component"]
|
24
|
+
except KeyError:
|
25
|
+
component = None
|
26
|
+
if component:
|
27
|
+
### First Step, try to look out if "component" exists on Plugins.components directory
|
28
|
+
component_file = MARKETPLACE_DIR.joinpath(f"{component}.py")
|
29
|
+
signature_file = MARKETPLACE_DIR.joinpath(f"{component}.py.sign")
|
30
|
+
checksum_file = MARKETPLACE_DIR.joinpath(f"{component}.py.checksum")
|
31
|
+
if component_file.exists():
|
32
|
+
### TODO: add validations if able to see this component:
|
33
|
+
file_list = [component_file, signature_file, checksum_file]
|
34
|
+
return await FileResponse(
|
35
|
+
file=file_list, request=self.request, status=200
|
36
|
+
)
|
37
|
+
else:
|
38
|
+
return self.error(
|
39
|
+
response="Component {component} doesn't exists on Marketplace.",
|
40
|
+
status=404,
|
41
|
+
)
|
42
|
+
|
43
|
+
else:
|
44
|
+
### getting a list of components:
|
45
|
+
return self.no_content()
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import types
|
2
|
+
import importlib
|
3
|
+
from importlib.machinery import SourceFileLoader
|
4
|
+
import os
|
5
|
+
|
6
|
+
|
7
|
+
class PluginImporter(importlib.abc.MetaPathFinder, importlib.abc.Loader):
|
8
|
+
def __init__(self, package_name, plugins_path):
|
9
|
+
self.package_name = package_name
|
10
|
+
self.plugins_path = plugins_path
|
11
|
+
|
12
|
+
def find_spec(self, fullname, path, target=None):
|
13
|
+
if fullname.startswith(self.package_name + "."):
|
14
|
+
component_name = fullname.split(".")[-1]
|
15
|
+
component_path = os.path.join(self.plugins_path, f"{component_name}.py")
|
16
|
+
|
17
|
+
if os.path.exists(component_path):
|
18
|
+
return importlib.util.spec_from_loader(fullname, self)
|
19
|
+
return None
|
20
|
+
|
21
|
+
def create_module(self, spec):
|
22
|
+
return None
|
23
|
+
|
24
|
+
def exec_module(self, module):
|
25
|
+
component_name = module.__name__.split(".")[-1]
|
26
|
+
component_path = os.path.join(self.plugins_path, f"{component_name}.py")
|
27
|
+
loader = SourceFileLoader(component_name, component_path)
|
28
|
+
loaded = types.ModuleType(loader.name)
|
29
|
+
loader.exec_module(loaded)
|
30
|
+
# Update the module's namespace with the loaded module's namespace
|
31
|
+
module.__dict__.update(loaded.__dict__)
|
File without changes
|
flowtask/runner.py
ADDED
@@ -0,0 +1,283 @@
|
|
1
|
+
"""DataIntegration Task Runner.
|
2
|
+
|
3
|
+
This Module can run data-integration tasks, HTTP/RESTful calls
|
4
|
+
(or even any arbitrary python function),
|
5
|
+
received parametriced tasks and return the results.
|
6
|
+
|
7
|
+
Task Runner receives different command-line arguments:
|
8
|
+
|
9
|
+
--variables: override variables passed between components/processes.
|
10
|
+
--attributes: override root-level attributes of components.
|
11
|
+
--conditions: override values in components with conditions.
|
12
|
+
--params: any value in params ins passed as kwargs
|
13
|
+
--args: list of arguments to be used by some functions (like replacement of values)
|
14
|
+
|
15
|
+
* For Calling a task:
|
16
|
+
--program=program_name --task=task_name --params
|
17
|
+
* For calling Python Functions:
|
18
|
+
--function=path.to.python.import --params
|
19
|
+
* System Command:
|
20
|
+
--command=path.to.command --params
|
21
|
+
* or even Calling a URL:
|
22
|
+
--url=URI --params
|
23
|
+
"""
|
24
|
+
from typing import Any
|
25
|
+
import uuid
|
26
|
+
import random
|
27
|
+
import asyncio
|
28
|
+
import signal
|
29
|
+
from navconfig.logging import logging
|
30
|
+
|
31
|
+
# Worker:
|
32
|
+
from qw.wrappers import TaskWrapper
|
33
|
+
from qw.client import QClient
|
34
|
+
|
35
|
+
# FlowTask
|
36
|
+
from .utils.stats import TaskMonitor
|
37
|
+
from .parsers.argparser import ConfigParser
|
38
|
+
from .exceptions import (
|
39
|
+
TaskError,
|
40
|
+
TaskException,
|
41
|
+
NotSupported,
|
42
|
+
TaskParseError,
|
43
|
+
ConfigError
|
44
|
+
)
|
45
|
+
from .tasks.task import Task
|
46
|
+
from .tasks.command import Command
|
47
|
+
|
48
|
+
|
49
|
+
def my_handler():
|
50
|
+
# TODO: Copying Signal-handler from Notify Worker.
|
51
|
+
print("Stopping")
|
52
|
+
for task in asyncio.all_tasks():
|
53
|
+
task.cancel()
|
54
|
+
|
55
|
+
class TaskRunner:
|
56
|
+
"""
|
57
|
+
TaskRunner.
|
58
|
+
|
59
|
+
Execution of DataIntegration Tasks.
|
60
|
+
"""
|
61
|
+
|
62
|
+
logger: logging.Logger = None
|
63
|
+
|
64
|
+
def __init__(self, loop: asyncio.AbstractEventLoop = None, worker=None, **kwargs):
|
65
|
+
"""Init Method for Task Runner."""
|
66
|
+
self._task = None
|
67
|
+
self._command: str = None
|
68
|
+
self._fn: str = None
|
69
|
+
self._url: str = None
|
70
|
+
self._taskname = ""
|
71
|
+
self.task_type: str = "task"
|
72
|
+
self.stat: TaskMonitor = None
|
73
|
+
# arguments passed by command line:
|
74
|
+
self._conditions = {}
|
75
|
+
self._attrs = {}
|
76
|
+
self.ignore_steps = []
|
77
|
+
self.run_only = []
|
78
|
+
self._stepattrs = {}
|
79
|
+
self._kwargs = {}
|
80
|
+
self._variables = {}
|
81
|
+
self._result: Any = None
|
82
|
+
if loop:
|
83
|
+
self._loop = loop
|
84
|
+
self.inner_evt = False
|
85
|
+
else:
|
86
|
+
self._loop = asyncio.new_event_loop()
|
87
|
+
asyncio.set_event_loop(self._loop)
|
88
|
+
self.inner_evt = True
|
89
|
+
self._loop.add_signal_handler(signal.SIGINT, my_handler)
|
90
|
+
# Task ID:
|
91
|
+
self.task_id = uuid.uuid1(node=random.getrandbits(48) | 0x010000000000)
|
92
|
+
# argument Parser
|
93
|
+
if "new_args" in kwargs:
|
94
|
+
new_args = kwargs["new_args"]
|
95
|
+
del kwargs["new_args"]
|
96
|
+
else:
|
97
|
+
new_args = []
|
98
|
+
parser = ConfigParser()
|
99
|
+
parser.parse(new_args)
|
100
|
+
self._argparser = parser
|
101
|
+
self._options = parser.options
|
102
|
+
# program definition
|
103
|
+
self._program = self._options.program
|
104
|
+
try:
|
105
|
+
self._program = kwargs["program"]
|
106
|
+
del kwargs["program"]
|
107
|
+
except KeyError:
|
108
|
+
pass
|
109
|
+
if not self._program:
|
110
|
+
self._program = "navigator"
|
111
|
+
# DEBUG
|
112
|
+
try:
|
113
|
+
self._debug = kwargs["debug"]
|
114
|
+
del kwargs["debug"]
|
115
|
+
except KeyError:
|
116
|
+
self._debug = self._options.debug
|
117
|
+
# logger
|
118
|
+
self.logger = logging.getLogger("FlowTask.Runner")
|
119
|
+
if self._debug:
|
120
|
+
self.logger.setLevel(logging.DEBUG)
|
121
|
+
self.logger.notice(f"Program is: > {self._program}")
|
122
|
+
# about Worker Information:
|
123
|
+
self.worker = worker
|
124
|
+
## Task Storage:
|
125
|
+
self._taskstorage = self._options.storage
|
126
|
+
try:
|
127
|
+
self.no_worker = self._options.no_worker
|
128
|
+
except (ValueError, TypeError):
|
129
|
+
self.no_worker = False
|
130
|
+
try:
|
131
|
+
self.no_events = self._options.no_events
|
132
|
+
except (ValueError, TypeError):
|
133
|
+
self.no_events = False
|
134
|
+
try:
|
135
|
+
self.no_notify = self._options.no_notify
|
136
|
+
except (ValueError, TypeError):
|
137
|
+
self.no_notify = False
|
138
|
+
if kwargs:
|
139
|
+
# remain args go to kwargs:
|
140
|
+
self._kwargs = {**kwargs}
|
141
|
+
# Queue Worker:
|
142
|
+
self._qw = QClient()
|
143
|
+
|
144
|
+
@property
|
145
|
+
def stats(self) -> TaskMonitor:
|
146
|
+
"""stats.
|
147
|
+
Return a TaskMonitor object with all collected stats.
|
148
|
+
Returns:
|
149
|
+
TaskMonitor: stat object.
|
150
|
+
"""
|
151
|
+
return self.stat
|
152
|
+
|
153
|
+
def options(self) -> dict:
|
154
|
+
return self._options
|
155
|
+
|
156
|
+
async def __aenter__(self) -> "TaskRunner":
|
157
|
+
"""Magic Context Methods"""
|
158
|
+
return self
|
159
|
+
|
160
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
|
161
|
+
"""Magic Context Methods"""
|
162
|
+
# clean up anything you need to clean up
|
163
|
+
await self.close()
|
164
|
+
|
165
|
+
@property
|
166
|
+
def result(self):
|
167
|
+
return self._result
|
168
|
+
|
169
|
+
async def start(self):
|
170
|
+
# define the type of task:
|
171
|
+
if self._options.command:
|
172
|
+
self._command = self._options.command
|
173
|
+
self.task_type = "command"
|
174
|
+
self._taskname = f"{self._command!s}"
|
175
|
+
elif self._options.function:
|
176
|
+
self._fn = self._options.function
|
177
|
+
self.task_type = "function"
|
178
|
+
self._taskname = f"{self._fn!s}"
|
179
|
+
elif self._options.task:
|
180
|
+
self._taskname = self._options.task
|
181
|
+
self.task_type = "task"
|
182
|
+
else:
|
183
|
+
raise NotSupported("Task Runner: Unknown or missing Task type.")
|
184
|
+
# initialize the Task Monitor
|
185
|
+
try:
|
186
|
+
self.stat = TaskMonitor(
|
187
|
+
name=self._taskname, program=self._program, task_id=self.task_id
|
188
|
+
)
|
189
|
+
await self.stat.start()
|
190
|
+
except Exception as err:
|
191
|
+
raise TaskError(f"Task Runner: Error on TaskMonitor: {err}") from err
|
192
|
+
# create the task object:
|
193
|
+
if self.task_type == "command":
|
194
|
+
try:
|
195
|
+
self._task = Command(
|
196
|
+
task_id=self.task_id,
|
197
|
+
task=self._command,
|
198
|
+
program=self._program,
|
199
|
+
loop=self._loop,
|
200
|
+
parser=self._argparser,
|
201
|
+
**self._kwargs,
|
202
|
+
)
|
203
|
+
except Exception as err:
|
204
|
+
raise TaskException(f"{err!s}") from err
|
205
|
+
elif self.task_type == "task":
|
206
|
+
try:
|
207
|
+
self._task = Task(
|
208
|
+
task_id=self.task_id,
|
209
|
+
task=self._taskname,
|
210
|
+
program=self._program,
|
211
|
+
loop=self._loop,
|
212
|
+
parser=self._argparser,
|
213
|
+
storage=self._taskstorage,
|
214
|
+
disable_notifications=self.no_notify,
|
215
|
+
no_events=self.no_events,
|
216
|
+
**self._kwargs,
|
217
|
+
)
|
218
|
+
except Exception as err:
|
219
|
+
raise TaskException(f"{err!s}") from err
|
220
|
+
# then, try to "start" the task:
|
221
|
+
logging.debug(
|
222
|
+
f"::: FlowTask: Running {self.task_type}: {self._task!r} with id: {self.task_id}"
|
223
|
+
)
|
224
|
+
try:
|
225
|
+
self._task.setStat(self.stat)
|
226
|
+
await self._task.start()
|
227
|
+
except (ConfigError, TaskParseError, TaskError):
|
228
|
+
raise
|
229
|
+
except Exception as err:
|
230
|
+
logging.error(err)
|
231
|
+
raise TaskException(f"{err!s}") from err
|
232
|
+
return True
|
233
|
+
|
234
|
+
async def run(self):
|
235
|
+
try:
|
236
|
+
if self.no_worker:
|
237
|
+
try:
|
238
|
+
self._result = await self._task.run()
|
239
|
+
finally:
|
240
|
+
await self._task.close()
|
241
|
+
else:
|
242
|
+
# sent task to Worker
|
243
|
+
task = TaskWrapper(
|
244
|
+
program=self._program,
|
245
|
+
task_id=self.task_id,
|
246
|
+
task=self._taskname,
|
247
|
+
debug=self._debug,
|
248
|
+
parser=self._argparser,
|
249
|
+
no_events=self.no_events,
|
250
|
+
**self._kwargs,
|
251
|
+
)
|
252
|
+
if self._options.queued is True:
|
253
|
+
task.queued = True
|
254
|
+
result = await self._qw.queue(task)
|
255
|
+
else:
|
256
|
+
task.queued = False
|
257
|
+
result = await self._qw.run(task)
|
258
|
+
if isinstance(result, BaseException):
|
259
|
+
raise result
|
260
|
+
elif isinstance(result, dict):
|
261
|
+
if "exception" in result:
|
262
|
+
ex = result["exception"]
|
263
|
+
msg = result["error"]
|
264
|
+
raise ex(f"{msg!s}")
|
265
|
+
else:
|
266
|
+
self._result = result
|
267
|
+
else:
|
268
|
+
self._result = result
|
269
|
+
except Exception as err:
|
270
|
+
logging.error(err)
|
271
|
+
raise
|
272
|
+
return True
|
273
|
+
|
274
|
+
async def close(self):
|
275
|
+
if self._debug:
|
276
|
+
logging.debug(f"ENDING TASK {self._taskname}")
|
277
|
+
try:
|
278
|
+
await self.stat.stop()
|
279
|
+
except Exception as err: # pylint: disable=W0718
|
280
|
+
logging.exception(err)
|
281
|
+
finally:
|
282
|
+
if self.inner_evt is True:
|
283
|
+
self._loop.close()
|