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,339 @@
|
|
1
|
+
import asyncio
|
2
|
+
import random
|
3
|
+
from abc import ABC
|
4
|
+
from typing import Optional, Dict, Any
|
5
|
+
|
6
|
+
from bs4 import BeautifulSoup
|
7
|
+
from lxml import html, etree
|
8
|
+
|
9
|
+
# Playwright Imports
|
10
|
+
from playwright.async_api import (
|
11
|
+
async_playwright,
|
12
|
+
TimeoutError as PlaywrightTimeoutError,
|
13
|
+
Browser,
|
14
|
+
Page,
|
15
|
+
BrowserContext,
|
16
|
+
)
|
17
|
+
|
18
|
+
# Import your logging, config, and exceptions as needed:
|
19
|
+
from navconfig.logging import logging
|
20
|
+
from ..conf import (
|
21
|
+
OXYLABS_USERNAME,
|
22
|
+
OXYLABS_PASSWORD,
|
23
|
+
OXYLABS_ENDPOINT,
|
24
|
+
GOOGLE_SEARCH_ENGINE_ID,
|
25
|
+
)
|
26
|
+
from ..exceptions import NotSupported, TimeOutError, ComponentError
|
27
|
+
from .http import ua, mobile_ua
|
28
|
+
|
29
|
+
# A list of mobile device names (these should match keys from playwright.devices)
|
30
|
+
mobile_devices = [
|
31
|
+
"iPhone X",
|
32
|
+
"Google Nexus 7",
|
33
|
+
"Pixel 2",
|
34
|
+
"Samsung Galaxy Tab",
|
35
|
+
"Nexus 5",
|
36
|
+
]
|
37
|
+
|
38
|
+
|
39
|
+
class PlaywrightService(ABC):
|
40
|
+
"""
|
41
|
+
PlaywrightService
|
42
|
+
|
43
|
+
An interface for making HTTP connections using Playwright,
|
44
|
+
analogous to your SeleniumService.
|
45
|
+
"""
|
46
|
+
accept: str = (
|
47
|
+
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
|
48
|
+
)
|
49
|
+
|
50
|
+
def __init__(self, *args, **kwargs):
|
51
|
+
# Configuration options
|
52
|
+
self.accept_cookies: Optional[tuple] = kwargs.pop("accept_cookies", None)
|
53
|
+
self.as_mobile: bool = kwargs.pop("as_mobile", False)
|
54
|
+
self.use_proxy: bool = kwargs.pop("use_proxy", False)
|
55
|
+
self.mobile_device: str = kwargs.pop("mobile_device", random.choice(mobile_devices))
|
56
|
+
self.default_tag: str = kwargs.pop("default_tag", "body")
|
57
|
+
self.accept_is_clickable: bool = kwargs.pop("accept_is_clickable", False)
|
58
|
+
self.timeout: int = kwargs.pop("timeout", 60)
|
59
|
+
self.wait_until: Optional[tuple] = kwargs.pop("wait_until", None)
|
60
|
+
self.inner_tag: Optional[tuple] = kwargs.pop("inner_tag", None)
|
61
|
+
|
62
|
+
# Headers and cookies
|
63
|
+
self.headers: Dict[str, str] = {
|
64
|
+
"Accept": self.accept,
|
65
|
+
"User-Agent": random.choice(ua),
|
66
|
+
**kwargs.get("headers", {}),
|
67
|
+
}
|
68
|
+
self.cookies: Dict[str, str] = kwargs.get("cookies", {})
|
69
|
+
if isinstance(self.cookies, str):
|
70
|
+
self.cookies = self.parse_cookies(self.cookies)
|
71
|
+
|
72
|
+
# Playwright-related attributes
|
73
|
+
self._playwright = None
|
74
|
+
self.browser: Optional[Browser] = None
|
75
|
+
self.context: Optional[BrowserContext] = None
|
76
|
+
self.page: Optional[Page] = None
|
77
|
+
|
78
|
+
# Convert any element selectors provided as tuples into Playwright-friendly selectors.
|
79
|
+
if self.accept_cookies:
|
80
|
+
self.accept_cookies = self.check_by_attribute(self.accept_cookies)
|
81
|
+
if self.inner_tag:
|
82
|
+
self.inner_tag = self.check_by_attribute(self.inner_tag)
|
83
|
+
|
84
|
+
self.logger = logging.getLogger(__name__)
|
85
|
+
|
86
|
+
def parse_cookies(self, cookie_pair: str) -> dict:
|
87
|
+
"""Parse a cookie string into a dictionary."""
|
88
|
+
cookies = {}
|
89
|
+
cookie_pairs = [c.strip() for c in cookie_pair.strip().split(";") if c.strip()]
|
90
|
+
for pair in cookie_pairs:
|
91
|
+
if "=" in pair:
|
92
|
+
name, value = pair.split("=", 1)
|
93
|
+
cookies[name.strip()] = value.strip().strip('"')
|
94
|
+
return cookies
|
95
|
+
|
96
|
+
def check_by_attribute(self, attribute: tuple) -> str:
|
97
|
+
"""
|
98
|
+
Convert a tuple (attribute, value) into a Playwright selector.
|
99
|
+
For example, ('id', 'submit') becomes '#submit' and
|
100
|
+
('xpath', '//button') becomes 'xpath=//button'.
|
101
|
+
"""
|
102
|
+
if not attribute:
|
103
|
+
return ""
|
104
|
+
el, value = attribute
|
105
|
+
if el == "id":
|
106
|
+
return f"#{value}"
|
107
|
+
elif el in ("class", "class name"):
|
108
|
+
return f".{value}"
|
109
|
+
elif el == "name":
|
110
|
+
return f"[name='{value}']"
|
111
|
+
elif el == "xpath":
|
112
|
+
return f"xpath={value}"
|
113
|
+
elif el in ("css", "css selector"):
|
114
|
+
return value
|
115
|
+
elif el in ("tag", "tag name", "tagname", "tag_name"):
|
116
|
+
return value
|
117
|
+
else:
|
118
|
+
raise NotSupported(f"Playwright: Attribute {el} is not supported.")
|
119
|
+
|
120
|
+
def proxy_playwright(self, user: str, password: str, endpoint: str) -> dict:
|
121
|
+
"""Return a proxy configuration dictionary for Playwright."""
|
122
|
+
proxy_server = f"http://{user}:{password}@{endpoint}"
|
123
|
+
self.logger.debug(f"Using proxy: {proxy_server}")
|
124
|
+
return {"server": proxy_server}
|
125
|
+
|
126
|
+
async def get_driver(self) -> Page:
|
127
|
+
"""
|
128
|
+
Initialize Playwright, launch a browser (with proxy and/or mobile emulation if configured),
|
129
|
+
and return a new Page instance.
|
130
|
+
"""
|
131
|
+
self._playwright = await async_playwright().start()
|
132
|
+
browser_args = {}
|
133
|
+
if self.use_proxy:
|
134
|
+
proxy_config = self.proxy_playwright(
|
135
|
+
f"customer-{OXYLABS_USERNAME}-sesstime-1", OXYLABS_PASSWORD, OXYLABS_ENDPOINT
|
136
|
+
)
|
137
|
+
browser_args["proxy"] = proxy_config
|
138
|
+
|
139
|
+
# Launch Chromium in headless mode (change to headless=False for debugging)
|
140
|
+
self.browser = await self._playwright.chromium.launch(headless=True, **browser_args)
|
141
|
+
|
142
|
+
# Set up context options (viewport, user agent, extra headers)
|
143
|
+
context_args: Dict[str, Any] = {
|
144
|
+
"viewport": {"width": 1280, "height": 720},
|
145
|
+
"user_agent": self.headers.get("User-Agent"),
|
146
|
+
"extra_http_headers": self.headers,
|
147
|
+
}
|
148
|
+
if self.as_mobile:
|
149
|
+
try:
|
150
|
+
# Use a built‐in device preset from Playwright.
|
151
|
+
device = self._playwright.devices[self.mobile_device]
|
152
|
+
except KeyError:
|
153
|
+
self.logger.warning(
|
154
|
+
f"Device {self.mobile_device} not found. Falling back to 'iPhone X'."
|
155
|
+
)
|
156
|
+
device = self._playwright.devices.get("iPhone X")
|
157
|
+
if device:
|
158
|
+
context_args.update(device)
|
159
|
+
|
160
|
+
self.context = await self.browser.new_context(**context_args)
|
161
|
+
self.page = await self.context.new_page()
|
162
|
+
self.page.set_default_timeout(self.timeout * 1000) # timeout is in milliseconds
|
163
|
+
return self.page
|
164
|
+
|
165
|
+
async def close_driver(self):
|
166
|
+
"""Close the page, browser context, browser, and stop Playwright."""
|
167
|
+
if self.page:
|
168
|
+
await self.page.close()
|
169
|
+
if self.context:
|
170
|
+
await self.context.close()
|
171
|
+
if self.browser:
|
172
|
+
await self.browser.close()
|
173
|
+
if self._playwright:
|
174
|
+
await self._playwright.stop()
|
175
|
+
|
176
|
+
async def _execute_scroll(self):
|
177
|
+
"""
|
178
|
+
Scroll to the bottom of the page (and then back to the top) to ensure
|
179
|
+
that lazy-loaded content is loaded.
|
180
|
+
"""
|
181
|
+
await self.page.wait_for_load_state("load")
|
182
|
+
await self.page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
|
183
|
+
await asyncio.sleep(2) # Give time for content to load
|
184
|
+
await self.page.evaluate("window.scrollTo(0, 0)")
|
185
|
+
|
186
|
+
async def save_screenshot(self, filename: str) -> None:
|
187
|
+
"""
|
188
|
+
Save a screenshot of the entire page or of a specific element if configured.
|
189
|
+
"""
|
190
|
+
if not self.page:
|
191
|
+
raise ComponentError("No page available for screenshot.")
|
192
|
+
|
193
|
+
# If you have defined a 'screenshot' attribute with a 'portion' selector,
|
194
|
+
# capture that element only.
|
195
|
+
if hasattr(self, "screenshot") and "portion" in getattr(self, "screenshot"):
|
196
|
+
selector = self.check_by_attribute(self.screenshot["portion"])
|
197
|
+
element = self.page.locator(selector)
|
198
|
+
# Wait for the element to be visible (with nonzero dimensions)
|
199
|
+
await element.wait_for(state="visible", timeout=20000)
|
200
|
+
await element.screenshot(path=filename)
|
201
|
+
else:
|
202
|
+
# Full-page screenshot
|
203
|
+
await self.page.screenshot(path=filename, full_page=True)
|
204
|
+
|
205
|
+
async def get_soup(self, parser: str = "html.parser") -> BeautifulSoup:
|
206
|
+
"""
|
207
|
+
Return a BeautifulSoup object for the current page content.
|
208
|
+
"""
|
209
|
+
if not self.page:
|
210
|
+
raise ComponentError("No page available to retrieve content.")
|
211
|
+
content = await self.page.content()
|
212
|
+
return BeautifulSoup(content, parser)
|
213
|
+
|
214
|
+
async def get_etree(self) -> tuple:
|
215
|
+
"""
|
216
|
+
Return a tuple of lxml etree objects (using etree.fromstring and html.fromstring)
|
217
|
+
for the current page content.
|
218
|
+
"""
|
219
|
+
if not self.page:
|
220
|
+
raise ComponentError("No page available to retrieve content.")
|
221
|
+
content = await self.page.content()
|
222
|
+
try:
|
223
|
+
x = etree.fromstring(content)
|
224
|
+
except etree.XMLSyntaxError:
|
225
|
+
x = None
|
226
|
+
try:
|
227
|
+
h = html.fromstring(content)
|
228
|
+
except etree.XMLSyntaxError:
|
229
|
+
h = None
|
230
|
+
return x, h
|
231
|
+
|
232
|
+
async def get_page(
|
233
|
+
self,
|
234
|
+
url: str,
|
235
|
+
cookies: Optional[Dict[str, str]] = None,
|
236
|
+
retries: int = 3,
|
237
|
+
backoff_delay: int = 2,
|
238
|
+
):
|
239
|
+
"""
|
240
|
+
Navigate to a given URL, optionally set cookies, wait for page load,
|
241
|
+
and optionally handle any cookie-acceptance banners.
|
242
|
+
"""
|
243
|
+
if not self.page:
|
244
|
+
await self.get_driver()
|
245
|
+
attempt = 0
|
246
|
+
while attempt < retries:
|
247
|
+
try:
|
248
|
+
await self.page.goto(url, wait_until="load")
|
249
|
+
if cookies:
|
250
|
+
# Convert your cookies to the format expected by Playwright.
|
251
|
+
cookie_list = []
|
252
|
+
for name, value in cookies.items():
|
253
|
+
cookie_list.append({
|
254
|
+
"name": name,
|
255
|
+
"value": value,
|
256
|
+
"url": url,
|
257
|
+
})
|
258
|
+
await self.context.add_cookies(cookie_list)
|
259
|
+
# Reload to ensure cookies take effect.
|
260
|
+
await self.page.reload(wait_until="load")
|
261
|
+
|
262
|
+
# Wait for a specific element if configured
|
263
|
+
if self.wait_until:
|
264
|
+
selector = self.check_by_attribute(self.wait_until)
|
265
|
+
await self.page.wait_for_selector(selector, timeout=20000)
|
266
|
+
else:
|
267
|
+
await self.page.wait_for_selector(self.default_tag, timeout=20000)
|
268
|
+
|
269
|
+
# Handle "Accept Cookies" if needed.
|
270
|
+
if self.accept_cookies:
|
271
|
+
try:
|
272
|
+
if self.accept_is_clickable:
|
273
|
+
await self.page.wait_for_selector(self.accept_cookies, state="visible", timeout=10000)
|
274
|
+
await self.page.click(self.accept_cookies)
|
275
|
+
else:
|
276
|
+
await self.page.wait_for_selector(self.accept_cookies, timeout=10000)
|
277
|
+
await self.page.eval_on_selector(self.accept_cookies, "el => el.click()")
|
278
|
+
except PlaywrightTimeoutError:
|
279
|
+
self.logger.warning("Accept Cookies button not found.")
|
280
|
+
await self._execute_scroll()
|
281
|
+
return # Exit after a successful navigation
|
282
|
+
except PlaywrightTimeoutError:
|
283
|
+
self.logger.warning(
|
284
|
+
f"Timeout occurred on attempt {attempt + 1}/{retries} for URL: {url}"
|
285
|
+
)
|
286
|
+
attempt += 1
|
287
|
+
if attempt < retries:
|
288
|
+
await asyncio.sleep(backoff_delay)
|
289
|
+
else:
|
290
|
+
raise TimeOutError(f"Timeout Error on URL {url} after {retries} attempts")
|
291
|
+
except Exception as exc:
|
292
|
+
raise ComponentError(f"Error during page navigation: {exc}")
|
293
|
+
|
294
|
+
async def search_google_cse(self, query: str, max_results: int = 5) -> list:
|
295
|
+
"""
|
296
|
+
Perform a Google Custom Search Engine (CSE) search using Playwright.
|
297
|
+
Returns a list of results where each result is a dict with 'title' and 'link'.
|
298
|
+
"""
|
299
|
+
search_url = f"https://cse.google.com/cse?cx={GOOGLE_SEARCH_ENGINE_ID}#gsc.tab=0&gsc.q={query}&gsc.sort="
|
300
|
+
try:
|
301
|
+
if not self.page:
|
302
|
+
await self.get_driver()
|
303
|
+
await self.page.goto(search_url, wait_until="load")
|
304
|
+
# Wait for the search results container to appear.
|
305
|
+
try:
|
306
|
+
await self.page.wait_for_selector(".gsc-results", timeout=5000)
|
307
|
+
except PlaywrightTimeoutError:
|
308
|
+
try:
|
309
|
+
await self.page.wait_for_selector(".gs-no-results-result", timeout=3000)
|
310
|
+
return [] # No results found
|
311
|
+
except PlaywrightTimeoutError:
|
312
|
+
raise RuntimeError("CSE: No results found or page failed to load.")
|
313
|
+
|
314
|
+
# Allow any JS to finish
|
315
|
+
await asyncio.sleep(2)
|
316
|
+
results = []
|
317
|
+
search_results = await self.page.query_selector_all(".gsc-webResult")
|
318
|
+
if not search_results:
|
319
|
+
search_results = await self.page.query_selector_all(".gsc-expansionArea")
|
320
|
+
for result in search_results[:max_results]:
|
321
|
+
try:
|
322
|
+
title_element = await result.query_selector(".gs-title")
|
323
|
+
if title_element:
|
324
|
+
title = (await title_element.inner_text()).strip()
|
325
|
+
url_element = await title_element.query_selector("a")
|
326
|
+
if url_element:
|
327
|
+
url = (await url_element.get_attribute("href")).strip()
|
328
|
+
if title and url:
|
329
|
+
results.append({"title": title, "link": url})
|
330
|
+
except Exception:
|
331
|
+
continue # Skip this result if any errors occur
|
332
|
+
return results
|
333
|
+
|
334
|
+
except PlaywrightTimeoutError as e:
|
335
|
+
raise RuntimeError(f"CSE Timeout: {e}")
|
336
|
+
except Exception as e:
|
337
|
+
raise RuntimeError(f"CSE Unexpected Error: {e}")
|
338
|
+
finally:
|
339
|
+
await self.close_driver()
|