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,161 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
import datetime
|
3
|
+
from pathlib import Path
|
4
|
+
from navconfig import config
|
5
|
+
from jinja2 import (
|
6
|
+
BaseLoader,
|
7
|
+
Environment,
|
8
|
+
FileSystemLoader,
|
9
|
+
FileSystemBytecodeCache,
|
10
|
+
TemplateError,
|
11
|
+
TemplateNotFound,
|
12
|
+
StrictUndefined
|
13
|
+
)
|
14
|
+
from ..utils.json import json_encoder
|
15
|
+
from ..conf import TEMPLATE_DIR
|
16
|
+
|
17
|
+
jinja_config = {
|
18
|
+
"enable_async": True,
|
19
|
+
"autoescape": True,
|
20
|
+
"extensions": [
|
21
|
+
"jinja2.ext.i18n",
|
22
|
+
"jinja2.ext.loopcontrols",
|
23
|
+
"jinja2_time.TimeExtension",
|
24
|
+
"jinja2_iso8601.ISO8601Extension",
|
25
|
+
"jinja2.ext.do",
|
26
|
+
"jinja2_humanize_extension.HumanizeExtension"
|
27
|
+
],
|
28
|
+
}
|
29
|
+
|
30
|
+
string_config = {
|
31
|
+
"autoescape": True,
|
32
|
+
"extensions": [
|
33
|
+
"jinja2.ext.i18n",
|
34
|
+
"jinja2.ext.loopcontrols",
|
35
|
+
"jinja2_time.TimeExtension",
|
36
|
+
"jinja2_iso8601.ISO8601Extension",
|
37
|
+
"jinja2.ext.do",
|
38
|
+
"jinja2_humanize_extension.HumanizeExtension"
|
39
|
+
],
|
40
|
+
}
|
41
|
+
|
42
|
+
DEFAULT_TEMPLATE_HANDLER = None
|
43
|
+
|
44
|
+
|
45
|
+
def getTemplateHandler(newdir: str = None):
|
46
|
+
global DEFAULT_TEMPLATE_HANDLER
|
47
|
+
if newdir:
|
48
|
+
return TemplateHandler(directory=newdir)
|
49
|
+
else:
|
50
|
+
if DEFAULT_TEMPLATE_HANDLER is None:
|
51
|
+
DEFAULT_TEMPLATE_HANDLER = TemplateHandler(directory=TEMPLATE_DIR)
|
52
|
+
return DEFAULT_TEMPLATE_HANDLER
|
53
|
+
|
54
|
+
|
55
|
+
class TemplateHandler(object):
|
56
|
+
"""
|
57
|
+
TemplateHandler.
|
58
|
+
|
59
|
+
This is a wrapper for the Jinja2 template engine.
|
60
|
+
"""
|
61
|
+
|
62
|
+
_prefix: str = "dataintegration"
|
63
|
+
|
64
|
+
def __init__(self, directory: Path, **kwargs):
|
65
|
+
self.path = directory.resolve()
|
66
|
+
if not self.path.exists():
|
67
|
+
raise RuntimeError(
|
68
|
+
f"Flowtask: template directory {directory} does not exist"
|
69
|
+
)
|
70
|
+
if "config" in kwargs:
|
71
|
+
self.config = {**jinja_config, **kwargs["config"]}
|
72
|
+
else:
|
73
|
+
self.config = jinja_config
|
74
|
+
template_debug = config.getboolean("TEMPLATE_DEBUG", fallback=False)
|
75
|
+
if template_debug is True:
|
76
|
+
self.config["extensions"].append("jinja2.ext.debug")
|
77
|
+
# creating loader:
|
78
|
+
templateLoader = FileSystemLoader(searchpath=[str(self.path)])
|
79
|
+
# Bytecode Cache that saves to filesystem
|
80
|
+
bcache = FileSystemBytecodeCache(str(self.path), "%s.cache")
|
81
|
+
# initialize the environment
|
82
|
+
try:
|
83
|
+
self.env = Environment(
|
84
|
+
loader=templateLoader,
|
85
|
+
bytecode_cache=bcache,
|
86
|
+
**self.config
|
87
|
+
)
|
88
|
+
# compiled_path = str(self.path.joinpath('.compiled'))
|
89
|
+
# self.env.compile_templates(
|
90
|
+
# target=compiled_path, zip='deflated'
|
91
|
+
# )
|
92
|
+
self._strparser = Environment(
|
93
|
+
loader=BaseLoader,
|
94
|
+
bytecode_cache=bcache,
|
95
|
+
undefined=StrictUndefined,
|
96
|
+
**string_config
|
97
|
+
)
|
98
|
+
## Adding Filters:
|
99
|
+
self.env.filters["jsonify"] = json_encoder
|
100
|
+
self._strparser.filters["jsonify"] = json_encoder
|
101
|
+
self.env.filters["datetime"] = datetime.datetime.fromtimestamp
|
102
|
+
self._strparser.filters["datetime"] = datetime.datetime.fromtimestamp
|
103
|
+
except Exception as err:
|
104
|
+
raise RuntimeError(
|
105
|
+
f"DI: Error loading Template Environment: {err!s}"
|
106
|
+
) from err
|
107
|
+
|
108
|
+
def get_template(self, filename: str):
|
109
|
+
"""
|
110
|
+
Get a template from Template Environment using the Filename.
|
111
|
+
"""
|
112
|
+
try:
|
113
|
+
return self.env.get_template(str(filename))
|
114
|
+
except TemplateNotFound as ex:
|
115
|
+
raise FileNotFoundError(f"Template cannot be found: {filename}") from ex
|
116
|
+
|
117
|
+
def from_string(self, content: str, params: dict):
|
118
|
+
try:
|
119
|
+
template = self._strparser.from_string(content)
|
120
|
+
result = template.render(**params)
|
121
|
+
return result
|
122
|
+
except Exception as err:
|
123
|
+
raise RuntimeError(
|
124
|
+
f"DI: Error rendering string Template, error: {err}"
|
125
|
+
) from err
|
126
|
+
|
127
|
+
@property
|
128
|
+
def environment(self):
|
129
|
+
return self.env
|
130
|
+
|
131
|
+
def render(self, filename: str, params):
|
132
|
+
result = None
|
133
|
+
try:
|
134
|
+
template = self.env.get_template(str(filename))
|
135
|
+
result = template.render(**params)
|
136
|
+
return result
|
137
|
+
except Exception as err:
|
138
|
+
raise RuntimeError(
|
139
|
+
f"DI: Error rendering template: {filename}, error: {err}"
|
140
|
+
) from err
|
141
|
+
|
142
|
+
async def async_render(self, filename: str, params: Optional[dict] = None) -> str:
|
143
|
+
"""async_render.
|
144
|
+
|
145
|
+
Renders a Jinja2 template using async-await syntax.
|
146
|
+
"""
|
147
|
+
result = None
|
148
|
+
if not params:
|
149
|
+
params = {}
|
150
|
+
try:
|
151
|
+
template = self.env.get_template(str(filename))
|
152
|
+
result = await template.render_async(**params)
|
153
|
+
return result
|
154
|
+
except TemplateError as ex:
|
155
|
+
raise ValueError(
|
156
|
+
f"Template parsing error, template: {filename}: {ex}"
|
157
|
+
) from ex
|
158
|
+
except Exception as err:
|
159
|
+
raise RuntimeError(
|
160
|
+
f"NAV: Error rendering: {filename}, error: {err}"
|
161
|
+
) from err
|
flowtask/tests.py
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
import asyncio
|
2
|
+
from typing import Any, Optional, List
|
3
|
+
from collections.abc import Awaitable
|
4
|
+
from abc import ABC
|
5
|
+
import pandas as pd
|
6
|
+
import pytest
|
7
|
+
from navconfig import BASE_DIR
|
8
|
+
from .components import getComponent
|
9
|
+
from .components.flow import FlowComponent
|
10
|
+
|
11
|
+
|
12
|
+
@pytest.fixture(autouse=True, scope="session")
|
13
|
+
def component():
|
14
|
+
cp = "Dummy"
|
15
|
+
yield cp
|
16
|
+
|
17
|
+
|
18
|
+
pytestmark = pytest.mark.asyncio
|
19
|
+
|
20
|
+
|
21
|
+
class BaseTestCase(ABC):
|
22
|
+
"""BaseTestCase.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
BoilerPlate for Testing Dataintegration Components.
|
26
|
+
"""
|
27
|
+
|
28
|
+
arguments: dict = {}
|
29
|
+
component = None
|
30
|
+
name: str = None
|
31
|
+
expected_result: Any = None
|
32
|
+
expected_result_type: type = None
|
33
|
+
expected_exception_msg: str = None
|
34
|
+
|
35
|
+
@pytest.fixture(autouse=True, scope="class")
|
36
|
+
def setup_class(self, component):
|
37
|
+
self.component = None
|
38
|
+
error = None
|
39
|
+
self.name = component
|
40
|
+
try:
|
41
|
+
obj = getComponent(component)
|
42
|
+
self.component = obj(**self.arguments)
|
43
|
+
except Exception as e:
|
44
|
+
print(e)
|
45
|
+
error = e
|
46
|
+
assert not error
|
47
|
+
yield f"Starting Component {self.name}"
|
48
|
+
|
49
|
+
def teardown_class(self):
|
50
|
+
try:
|
51
|
+
asyncio.run_until_complete(self.component.close())
|
52
|
+
except Exception:
|
53
|
+
pass
|
54
|
+
self.component = None
|
55
|
+
|
56
|
+
@pytest.fixture(autouse=True)
|
57
|
+
def setup_method(self, component):
|
58
|
+
self.name = component
|
59
|
+
error = None
|
60
|
+
try:
|
61
|
+
obj = getComponent(component)
|
62
|
+
self.component = obj(**self.arguments)
|
63
|
+
except Exception as e:
|
64
|
+
print(e)
|
65
|
+
error = e
|
66
|
+
assert not error
|
67
|
+
|
68
|
+
def teardown_method(self):
|
69
|
+
try:
|
70
|
+
asyncio.run_until_complete(self.component.close())
|
71
|
+
except Exception:
|
72
|
+
pass
|
73
|
+
self.component = None
|
74
|
+
|
75
|
+
async def test_initialize(self, component):
|
76
|
+
assert self.name == component
|
77
|
+
assert isinstance(self.component, FlowComponent) is True
|
78
|
+
assert self.component.ComponentName() == component
|
79
|
+
|
80
|
+
async def test_start(self):
|
81
|
+
assert self.component is not None
|
82
|
+
assert callable(self.component.start)
|
83
|
+
if asyncio.iscoroutinefunction(self.component.start):
|
84
|
+
start = await self.component.start()
|
85
|
+
else:
|
86
|
+
start = self.component.start()
|
87
|
+
assert start is True
|
88
|
+
if asyncio.iscoroutinefunction(self.component.close):
|
89
|
+
await self.component.close()
|
90
|
+
else:
|
91
|
+
self.component.close()
|
92
|
+
|
93
|
+
async def test_run(self):
|
94
|
+
result = None
|
95
|
+
error = None
|
96
|
+
assert self.component is not None
|
97
|
+
# start firsts:
|
98
|
+
if asyncio.iscoroutinefunction(self.component.start):
|
99
|
+
start = await self.component.start()
|
100
|
+
else:
|
101
|
+
start = self.component.start()
|
102
|
+
try:
|
103
|
+
if asyncio.iscoroutinefunction(self.component.run):
|
104
|
+
result = await self.component.run()
|
105
|
+
else:
|
106
|
+
result = self.component.run()
|
107
|
+
# print('RESULT : ', result)
|
108
|
+
if self.expected_result is not None:
|
109
|
+
assert self.expected_result == result
|
110
|
+
if self.expected_result_type:
|
111
|
+
assert isinstance(result, self.expected_result_type)
|
112
|
+
except Exception as e:
|
113
|
+
if self.expected_exception_msg:
|
114
|
+
assert e, self.expected_exception_msg
|
115
|
+
result = True
|
116
|
+
|
117
|
+
else:
|
118
|
+
error = e
|
119
|
+
if error:
|
120
|
+
print("Test ERROR >", error)
|
121
|
+
assert result is not None
|
122
|
+
assert error is None
|
123
|
+
if asyncio.iscoroutinefunction(self.component.close):
|
124
|
+
await self.component.close()
|
125
|
+
else:
|
126
|
+
self.component.close()
|
127
|
+
|
128
|
+
async def test_close(self):
|
129
|
+
error = None
|
130
|
+
assert self.component is not None
|
131
|
+
# starts first:
|
132
|
+
if asyncio.iscoroutinefunction(self.component.start):
|
133
|
+
start = await self.component.start()
|
134
|
+
else:
|
135
|
+
start = self.component.start()
|
136
|
+
try:
|
137
|
+
if asyncio.iscoroutinefunction(self.component.close):
|
138
|
+
await self.component.close()
|
139
|
+
else:
|
140
|
+
self.component.close()
|
141
|
+
except Exception as e:
|
142
|
+
error = e
|
143
|
+
assert error is None
|
144
|
+
await asyncio.sleep(1.5)
|
145
|
+
|
146
|
+
|
147
|
+
class PandasTestCase(BaseTestCase):
|
148
|
+
"""PandasTestCase.
|
149
|
+
|
150
|
+
Args:
|
151
|
+
Test Case for components that requires a previous Pandas Dataframe.
|
152
|
+
"""
|
153
|
+
|
154
|
+
file_test: str = None
|
155
|
+
data: Optional[List[dict]] = None
|
156
|
+
renamed_cols: list = []
|
157
|
+
|
158
|
+
async def startup_function(self) -> Awaitable:
|
159
|
+
return True
|
160
|
+
|
161
|
+
async def ending_function(self) -> Awaitable:
|
162
|
+
return True
|
163
|
+
|
164
|
+
@pytest.fixture(scope='session', autouse=True)
|
165
|
+
async def setup_and_teardown(self):
|
166
|
+
"""Setup and Teardown for creating and dropping the table."""
|
167
|
+
# Create table at the beginning of the session
|
168
|
+
# Ensure the setup function is called
|
169
|
+
await self.startup_function()
|
170
|
+
print(':: Calling Setup Function :: ')
|
171
|
+
yield
|
172
|
+
# Ensure the teardown function is called
|
173
|
+
await self.ending_function()
|
174
|
+
print(':: Calling Ending Function :: ')
|
175
|
+
|
176
|
+
@pytest.fixture(scope='session')
|
177
|
+
def return_pandas(self, request):
|
178
|
+
df = None
|
179
|
+
if self.file_test:
|
180
|
+
filepath = BASE_DIR.joinpath("docs", self.file_test)
|
181
|
+
assert filepath.exists()
|
182
|
+
df = pd.read_csv(filepath)
|
183
|
+
elif self.data:
|
184
|
+
df = pd.DataFrame(self.data)
|
185
|
+
else:
|
186
|
+
# If file_test is None, look for the 'data_sample' fixture
|
187
|
+
data_fixture = request.getfixturevalue('data_sample')
|
188
|
+
assert data_fixture is not None, "No data provided and no file_test available"
|
189
|
+
df = pd.DataFrame(data_fixture)
|
190
|
+
assert df is not None
|
191
|
+
return df
|
192
|
+
|
193
|
+
@pytest.fixture(autouse=True)
|
194
|
+
def setup_method(self, component, return_pandas):
|
195
|
+
self.name = component
|
196
|
+
error = None
|
197
|
+
try:
|
198
|
+
obj = getComponent(component)
|
199
|
+
df = return_pandas
|
200
|
+
self.arguments["input_result"] = df
|
201
|
+
self.component = obj(**self.arguments)
|
202
|
+
except Exception as e:
|
203
|
+
print(e)
|
204
|
+
error = e
|
205
|
+
assert not error
|
206
|
+
|
207
|
+
async def test_start(self):
|
208
|
+
assert self.component is not None
|
209
|
+
assert callable(self.component.start)
|
210
|
+
error = None
|
211
|
+
try:
|
212
|
+
await self.component.start()
|
213
|
+
except Exception as err:
|
214
|
+
error = err
|
215
|
+
assert error is None
|
216
|
+
if asyncio.iscoroutinefunction(self.component.close):
|
217
|
+
await self.component.close()
|
218
|
+
else:
|
219
|
+
self.component.close()
|
220
|
+
|
221
|
+
async def test_run(self):
|
222
|
+
result = None
|
223
|
+
error = None
|
224
|
+
assert self.component is not None
|
225
|
+
# start firsts:
|
226
|
+
if asyncio.iscoroutinefunction(self.component.start):
|
227
|
+
start = await self.component.start()
|
228
|
+
else:
|
229
|
+
start = self.component.start()
|
230
|
+
assert start is not False
|
231
|
+
try:
|
232
|
+
if asyncio.iscoroutinefunction(self.component.run):
|
233
|
+
result = await self.component.run()
|
234
|
+
else:
|
235
|
+
result = self.component.run()
|
236
|
+
assert isinstance(result, pd.DataFrame)
|
237
|
+
if self.expected_result is not None:
|
238
|
+
## TODO: making proves of transformations
|
239
|
+
assert self.expected_result == result
|
240
|
+
if self.renamed_cols is not None:
|
241
|
+
columns = result.columns.values.tolist()
|
242
|
+
# check if those columns are present in Dataframe
|
243
|
+
for col in self.renamed_cols:
|
244
|
+
assert col in columns
|
245
|
+
except Exception as e:
|
246
|
+
error = e
|
247
|
+
print("ERROR :: ", error)
|
248
|
+
assert result is not None
|
249
|
+
assert error is None
|
250
|
+
if asyncio.iscoroutinefunction(self.component.close):
|
251
|
+
await self.component.close()
|
252
|
+
else:
|
253
|
+
self.component.close()
|
254
|
+
|
255
|
+
|
256
|
+
def pytest_sessionfinish(session, exitstatus):
|
257
|
+
asyncio.get_event_loop().close()
|