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
@@ -0,0 +1,530 @@
|
|
1
|
+
import os
|
2
|
+
from typing import Optional, Any, Union, ParamSpec
|
3
|
+
from abc import abstractmethod
|
4
|
+
from collections.abc import Callable
|
5
|
+
import glob
|
6
|
+
from pathlib import Path, PurePath
|
7
|
+
import orjson
|
8
|
+
from navconfig import config
|
9
|
+
from ..conf import FILE_STORAGES
|
10
|
+
from ..exceptions import (
|
11
|
+
FileNotFound
|
12
|
+
)
|
13
|
+
from ..utils import SafeDict
|
14
|
+
from ..utils.constants import (
|
15
|
+
get_constant,
|
16
|
+
get_func_value,
|
17
|
+
is_constant,
|
18
|
+
is_function
|
19
|
+
)
|
20
|
+
from ..interfaces import (
|
21
|
+
FuncSupport,
|
22
|
+
LogSupport,
|
23
|
+
ResultSupport,
|
24
|
+
StatSupport,
|
25
|
+
LocaleSupport,
|
26
|
+
MaskSupport,
|
27
|
+
SkipErrors
|
28
|
+
)
|
29
|
+
from .abstract import AbstractFlow
|
30
|
+
|
31
|
+
|
32
|
+
P = ParamSpec("P")
|
33
|
+
|
34
|
+
|
35
|
+
class FlowComponent(
|
36
|
+
FuncSupport,
|
37
|
+
MaskSupport,
|
38
|
+
LogSupport,
|
39
|
+
ResultSupport,
|
40
|
+
StatSupport,
|
41
|
+
LocaleSupport,
|
42
|
+
AbstractFlow
|
43
|
+
):
|
44
|
+
"""Abstract
|
45
|
+
|
46
|
+
Overview:
|
47
|
+
|
48
|
+
Helper for building components that consume REST APIs
|
49
|
+
|
50
|
+
.. table:: Properties
|
51
|
+
:widths: auto
|
52
|
+
+--------------+----------+-----------+--------------------------------------+
|
53
|
+
| Name | Required | Summary |
|
54
|
+
+--------------+----------+-----------+--------------------------------------+
|
55
|
+
| method | Yes | Component for Data Integrator |
|
56
|
+
+--------------+----------+-----------+--------------------------------------+
|
57
|
+
| attributes | Yes | Attribute: barcode |
|
58
|
+
+--------------+----------+-----------+--------------------------------------+
|
59
|
+
|
60
|
+
|
61
|
+
Return the list of arbitrary days
|
62
|
+
|
63
|
+
"""
|
64
|
+
def __init__(
|
65
|
+
self,
|
66
|
+
job: Optional[Union[Callable, list]] = None,
|
67
|
+
*args: P.args,
|
68
|
+
**kwargs: P.kwargs
|
69
|
+
):
|
70
|
+
# Task Related Component Name
|
71
|
+
# TODO: migration from TaskName to Component Step Name.
|
72
|
+
# self.TaskName: Optional[str] = kwargs.pop('step_name', None)
|
73
|
+
self.StepName: Optional[str] = kwargs.pop('step_name', None)
|
74
|
+
# Future Logic: trigger logic:
|
75
|
+
self.runIf: list = []
|
76
|
+
self.triggers: list = []
|
77
|
+
self._attrs: dict = {} # attributes
|
78
|
+
self._variables = {} # variables
|
79
|
+
self._params = {} # other parameters
|
80
|
+
self._args: dict = {}
|
81
|
+
self._filestore: Any = FILE_STORAGES.get('default')
|
82
|
+
self._taskstore: Any = kwargs.get('taskstorage', None)
|
83
|
+
self._started: bool = False # Avoid multiple start methods.
|
84
|
+
# Config Environment
|
85
|
+
self._environment = kwargs.pop('ENV', config)
|
86
|
+
# Object Name:
|
87
|
+
self.__name__: str = self.__class__.__name__
|
88
|
+
# program
|
89
|
+
self._program = kwargs.get('program', 'navigator')
|
90
|
+
# getting the argument parser:
|
91
|
+
self._argparser = kwargs.pop('argparser', None)
|
92
|
+
# getting the Task Pile (components pile)
|
93
|
+
self._TaskPile = kwargs.pop(
|
94
|
+
"TaskPile",
|
95
|
+
{}
|
96
|
+
)
|
97
|
+
if self._TaskPile:
|
98
|
+
setattr(self, "TaskPile", self._TaskPile)
|
99
|
+
# for changing vars (in components with "vars" feature):
|
100
|
+
self._vars = kwargs.get('vars', {}) # other vars
|
101
|
+
# attributes (root-level of component arguments):
|
102
|
+
self._attributes: dict = kwargs.pop("attributes", {})
|
103
|
+
if self._attributes:
|
104
|
+
self.add_metric("ATTRIBUTES", self._attributes)
|
105
|
+
self._args: dict = kwargs.pop("_args", {})
|
106
|
+
# conditions:
|
107
|
+
if "conditions" in kwargs:
|
108
|
+
self.conditions: dict = kwargs.pop("conditions", {})
|
109
|
+
# params:
|
110
|
+
self._params = kwargs.pop("params", {})
|
111
|
+
# parameters
|
112
|
+
self._parameters = kwargs.pop(
|
113
|
+
"parameters", []
|
114
|
+
)
|
115
|
+
# arguments list
|
116
|
+
self._arguments = kwargs.pop(
|
117
|
+
"arguments", []
|
118
|
+
)
|
119
|
+
# Calling Super:
|
120
|
+
super().__init__(*args, **kwargs)
|
121
|
+
if 'input' in kwargs:
|
122
|
+
self._input_result = kwargs.pop('input')
|
123
|
+
# processing variables
|
124
|
+
try:
|
125
|
+
variables = kwargs.pop("variables", {})
|
126
|
+
if isinstance(variables, str):
|
127
|
+
try:
|
128
|
+
variables = orjson.loads(variables)
|
129
|
+
except ValueError:
|
130
|
+
try:
|
131
|
+
variables = dict(x.split(":") for x in variables.split(","))
|
132
|
+
except (TypeError, ValueError, IndexError):
|
133
|
+
variables = {}
|
134
|
+
for arg, val in variables.items():
|
135
|
+
self._variables[arg] = val
|
136
|
+
except KeyError:
|
137
|
+
pass
|
138
|
+
# previous Job has variables, need to update from existing
|
139
|
+
self._multi: bool = False
|
140
|
+
if isinstance(job, (AbstractFlow, list, )):
|
141
|
+
self._component = job
|
142
|
+
if isinstance(job, list):
|
143
|
+
variables = {}
|
144
|
+
for j in job:
|
145
|
+
if isinstance(j, AbstractFlow):
|
146
|
+
variables = {**variables, **j.variables}
|
147
|
+
self._multi = True
|
148
|
+
try:
|
149
|
+
self._variables = {**self._variables, **variables}
|
150
|
+
except Exception as err:
|
151
|
+
print(err)
|
152
|
+
else:
|
153
|
+
try:
|
154
|
+
self._variables = {**self._variables, **job.variables}
|
155
|
+
except Exception as err:
|
156
|
+
print(err)
|
157
|
+
# call masks processing:
|
158
|
+
self._mask_processing(variables=self._variables)
|
159
|
+
# existing parameters:
|
160
|
+
try:
|
161
|
+
self._params = {**kwargs, **self._params}
|
162
|
+
except (TypeError, ValueError):
|
163
|
+
pass
|
164
|
+
for arg, val in self._params.items():
|
165
|
+
try:
|
166
|
+
if arg == "no-worker":
|
167
|
+
continue
|
168
|
+
if arg == self.StepName:
|
169
|
+
values = dict(x.split(":") for x in self._params[arg].split(","))
|
170
|
+
for key, value in values.items():
|
171
|
+
self._params[key] = value
|
172
|
+
object.__setattr__(self, key, value)
|
173
|
+
elif arg not in ["program", "TaskPile", "TaskName"]:
|
174
|
+
if self.StepName in self._attributes:
|
175
|
+
# extracting this properties from Attributes:
|
176
|
+
new_args = self._attributes.pop(self.StepName, {})
|
177
|
+
self._attributes = {**self._attributes, **new_args}
|
178
|
+
self._attrs[arg] = val
|
179
|
+
if arg in self._attributes:
|
180
|
+
val = self._attributes[arg]
|
181
|
+
try:
|
182
|
+
setattr(self, arg, val)
|
183
|
+
except Exception as err:
|
184
|
+
self._logger.warning(f"Wrong Attribute: {arg}={val}")
|
185
|
+
self._logger.exception(err)
|
186
|
+
except (AttributeError, KeyError) as err:
|
187
|
+
self._logger.error(err)
|
188
|
+
# attributes: component-based parameters (only for that component):
|
189
|
+
for key, val in self._attributes.items():
|
190
|
+
# TODO: check Attributes
|
191
|
+
if key in self._attributes:
|
192
|
+
# i need to override attibute
|
193
|
+
current_val = self._attributes[key]
|
194
|
+
if isinstance(current_val, dict):
|
195
|
+
val = {**current_val, **val}
|
196
|
+
elif isinstance(current_val, list):
|
197
|
+
current_val.append(val)
|
198
|
+
val = current_val
|
199
|
+
try:
|
200
|
+
object.__setattr__(self, key, val)
|
201
|
+
self._attrs[key] = val
|
202
|
+
except (ValueError, AttributeError) as err:
|
203
|
+
self._logger.error(err)
|
204
|
+
# processing the variables:
|
205
|
+
if hasattr(self, "vars"):
|
206
|
+
for key, val in self._vars.items():
|
207
|
+
if key in self.vars:
|
208
|
+
self.vars[key] = val
|
209
|
+
### File Storage:
|
210
|
+
self._fileStorage = FILE_STORAGES
|
211
|
+
# SkipError:
|
212
|
+
if self.skipError == "skip":
|
213
|
+
self.skipError = SkipErrors.SKIP
|
214
|
+
elif self.skipError == "log":
|
215
|
+
self.skipError = SkipErrors.LOG
|
216
|
+
else:
|
217
|
+
self.skipError = SkipErrors.ENFORCE
|
218
|
+
|
219
|
+
def __str__(self):
|
220
|
+
return f"{type(self).__name__}"
|
221
|
+
|
222
|
+
def __repr__(self):
|
223
|
+
return f"<{type(self).__name__}>"
|
224
|
+
|
225
|
+
def set_filestore(self, store):
|
226
|
+
if not store:
|
227
|
+
raise RuntimeError(
|
228
|
+
"Unable to detect File Storage."
|
229
|
+
)
|
230
|
+
self._filestore = store
|
231
|
+
|
232
|
+
def set_taskstore(self, store):
|
233
|
+
self._taskstore = store
|
234
|
+
|
235
|
+
def SetPile(self, pile):
|
236
|
+
self._TaskPile = pile
|
237
|
+
|
238
|
+
# Abstract Context Methods:
|
239
|
+
async def __aenter__(self):
|
240
|
+
if not self._started:
|
241
|
+
await self.start()
|
242
|
+
return self
|
243
|
+
|
244
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
245
|
+
try:
|
246
|
+
await self.close()
|
247
|
+
except Exception as exc:
|
248
|
+
self._logger.warning(
|
249
|
+
f"Error Closing Component: {exc!s}"
|
250
|
+
)
|
251
|
+
return self
|
252
|
+
|
253
|
+
@abstractmethod
|
254
|
+
async def start(self, **kwargs):
|
255
|
+
"""
|
256
|
+
start.
|
257
|
+
|
258
|
+
Initialize (if needed) a task
|
259
|
+
"""
|
260
|
+
|
261
|
+
@abstractmethod
|
262
|
+
async def run(self):
|
263
|
+
"""
|
264
|
+
run.
|
265
|
+
|
266
|
+
Run operations declared inside Component.
|
267
|
+
"""
|
268
|
+
|
269
|
+
@abstractmethod
|
270
|
+
async def close(self):
|
271
|
+
"""
|
272
|
+
close.
|
273
|
+
|
274
|
+
Close (if needed) component requirements.
|
275
|
+
"""
|
276
|
+
|
277
|
+
def ComponentName(self):
|
278
|
+
return self.__name__
|
279
|
+
|
280
|
+
def user_params(self):
|
281
|
+
return self._params
|
282
|
+
|
283
|
+
@property
|
284
|
+
def variables(self):
|
285
|
+
return self._variables
|
286
|
+
|
287
|
+
@variables.setter
|
288
|
+
def variables(self, value):
|
289
|
+
self._variables = value
|
290
|
+
|
291
|
+
def setVar(self, name, value):
|
292
|
+
self._variables[name] = value
|
293
|
+
|
294
|
+
def setTaskVar(self, name: str, value: Any):
|
295
|
+
name = f"{self.StepName}_{name}"
|
296
|
+
self._variables[name] = value
|
297
|
+
|
298
|
+
def set_attributes(self, name: str = "pattern"):
|
299
|
+
if hasattr(self, name):
|
300
|
+
obj = getattr(self, name)
|
301
|
+
for field, val in obj.items():
|
302
|
+
if field in self._params:
|
303
|
+
# already calculated:
|
304
|
+
self._attrs[field] = self._params[field]
|
305
|
+
setattr(self, field, self._params[field])
|
306
|
+
elif field in self._attributes:
|
307
|
+
self._attrs[field] = self._attributes[field]
|
308
|
+
setattr(self, field, self._attributes[field])
|
309
|
+
elif field in self._parameters:
|
310
|
+
self._attrs[field] = self._parameters[field]
|
311
|
+
setattr(self, field, self._parameters[field])
|
312
|
+
elif field in self._variables:
|
313
|
+
self._attrs[field] = self._variables[field]
|
314
|
+
setattr(self, field, self._variables[field])
|
315
|
+
else:
|
316
|
+
value = self.getFunc(val)
|
317
|
+
self._attrs[field] = value
|
318
|
+
setattr(self, field, value)
|
319
|
+
del self._attrs["pattern"]
|
320
|
+
|
321
|
+
def get_obj(self, name, parent):
|
322
|
+
try:
|
323
|
+
if not parent:
|
324
|
+
return getattr(self, name)
|
325
|
+
else:
|
326
|
+
return parent[name]
|
327
|
+
except AttributeError:
|
328
|
+
return False
|
329
|
+
|
330
|
+
def get_pattern(self, obj):
|
331
|
+
try:
|
332
|
+
pattern = obj["pattern"]
|
333
|
+
# del obj['pattern']
|
334
|
+
return pattern, obj
|
335
|
+
except Exception:
|
336
|
+
return None, obj
|
337
|
+
|
338
|
+
def process_pattern(self, name: str = "file", parent=None):
|
339
|
+
if not (obj := self.get_obj(name, parent)):
|
340
|
+
return False
|
341
|
+
# pattern has the form {file, value}:
|
342
|
+
if not isinstance(obj, dict):
|
343
|
+
return obj
|
344
|
+
|
345
|
+
# first, I need the pattern object:
|
346
|
+
pattern, obj = self.get_pattern(obj)
|
347
|
+
if pattern is None:
|
348
|
+
return obj
|
349
|
+
|
350
|
+
# processing the rest of variables:
|
351
|
+
if self._vars and f"{name}.pattern" in self._vars:
|
352
|
+
pattern = self._vars[f"{name}.pattern"]
|
353
|
+
elif self._variables and "pattern" in self._variables:
|
354
|
+
pattern = self._variables["pattern"]
|
355
|
+
elif "value" in self._variables:
|
356
|
+
pattern = pattern.format_map(SafeDict(value=self._variables["value"]))
|
357
|
+
if self._vars and f"{name}.value" in self._vars:
|
358
|
+
result = self._vars[f"{name}.value"]
|
359
|
+
return pattern.format_map(SafeDict(value=result))
|
360
|
+
elif "value" in obj:
|
361
|
+
# simple replacement:
|
362
|
+
result = self.getFunc(obj["value"])
|
363
|
+
return pattern.format_map(SafeDict(value=result))
|
364
|
+
elif "values" in obj:
|
365
|
+
variables = {}
|
366
|
+
result = obj["values"]
|
367
|
+
for key, val in result.items():
|
368
|
+
variables[key] = self.getFunc(val)
|
369
|
+
return pattern.format_map(SafeDict(**variables))
|
370
|
+
else:
|
371
|
+
# multi-value replacement
|
372
|
+
variables = {}
|
373
|
+
if self._variables:
|
374
|
+
pattern = pattern.format_map(SafeDict(**self._variables))
|
375
|
+
for key, val in obj.items():
|
376
|
+
if key in self._variables:
|
377
|
+
variables[key] = self._variables[key]
|
378
|
+
else:
|
379
|
+
variables[key] = self.getFunc(val)
|
380
|
+
# Return the entire object with the formatted pattern
|
381
|
+
return pattern.format_map(SafeDict(**variables))
|
382
|
+
|
383
|
+
def process_mask(self, name):
|
384
|
+
if hasattr(self, name):
|
385
|
+
obj = getattr(self, name)
|
386
|
+
for key, value in obj.items():
|
387
|
+
if key in self._vars:
|
388
|
+
obj[key] = self._vars[key]
|
389
|
+
elif self._vars and f"{name}.{key}" in self._vars:
|
390
|
+
obj[key] = self._vars[f"{name}.{key}"]
|
391
|
+
elif key in self._variables:
|
392
|
+
obj[key] = self._variables[key]
|
393
|
+
else:
|
394
|
+
# processing mask
|
395
|
+
for mask, replace in self._mask.items():
|
396
|
+
if mask in value:
|
397
|
+
obj[key] = value.replace(mask, str(replace))
|
398
|
+
return obj
|
399
|
+
else:
|
400
|
+
return {}
|
401
|
+
|
402
|
+
def var_replacement(self, obj: dict):
|
403
|
+
"""var_replacement.
|
404
|
+
|
405
|
+
Replacing occurrences of Variables into an String.
|
406
|
+
Args:
|
407
|
+
obj (Any): Any kind of object.
|
408
|
+
|
409
|
+
Returns:
|
410
|
+
Any: Object with replaced variables.
|
411
|
+
"""
|
412
|
+
if not isinstance(obj, dict):
|
413
|
+
return obj
|
414
|
+
for var, replace in obj.items():
|
415
|
+
if var in self._mask:
|
416
|
+
value = self._mask[var]
|
417
|
+
else:
|
418
|
+
if isinstance(replace, str):
|
419
|
+
value = replace.format_map(SafeDict(**self._variables))
|
420
|
+
elif var in self._variables:
|
421
|
+
value = self._variables[var]
|
422
|
+
else:
|
423
|
+
value = replace
|
424
|
+
if isinstance(obj, PurePath):
|
425
|
+
value = Path(value).resolve()
|
426
|
+
obj[var] = value
|
427
|
+
return obj
|
428
|
+
|
429
|
+
def set_variables(self, obj):
|
430
|
+
return obj.format_map(SafeDict(**self._variables))
|
431
|
+
|
432
|
+
def set_conditions(self, name: str = "conditions"):
|
433
|
+
if hasattr(self, name):
|
434
|
+
obj = getattr(self, name)
|
435
|
+
for condition, val in obj.items():
|
436
|
+
self._logger.notice(
|
437
|
+
f":: Condition : {condition} = {val}"
|
438
|
+
)
|
439
|
+
if hasattr(self, condition):
|
440
|
+
obj[condition] = getattr(self, condition)
|
441
|
+
elif is_constant(val):
|
442
|
+
obj[condition] = get_constant(val)
|
443
|
+
elif is_function(val):
|
444
|
+
obj[condition] = get_func_value(val)
|
445
|
+
if condition in self._variables:
|
446
|
+
obj[condition] = self._variables[condition]
|
447
|
+
elif condition in self._mask:
|
448
|
+
obj[condition] = self._mask[condition]
|
449
|
+
elif condition in self.conditions:
|
450
|
+
obj[condition] = val
|
451
|
+
if "pattern" in obj:
|
452
|
+
pattern = obj["pattern"]
|
453
|
+
del obj["pattern"]
|
454
|
+
# getting conditions as patterns
|
455
|
+
for field in pattern:
|
456
|
+
if field in obj:
|
457
|
+
# already settled
|
458
|
+
continue
|
459
|
+
if field in self._params:
|
460
|
+
obj[field] = self._params[field]
|
461
|
+
else:
|
462
|
+
result = None
|
463
|
+
val = pattern[field]
|
464
|
+
if is_constant(val):
|
465
|
+
result = get_constant(val)
|
466
|
+
else:
|
467
|
+
result = self.getFunc(val)
|
468
|
+
obj[field] = result
|
469
|
+
|
470
|
+
def conditions_replacement(self, obj: str):
|
471
|
+
"""conditions_replacement.
|
472
|
+
|
473
|
+
Replacing occurrences of Conditions into an String.
|
474
|
+
Args:
|
475
|
+
obj (Any): Any kind of object.
|
476
|
+
|
477
|
+
Returns:
|
478
|
+
Any: Object with replaced conditions.
|
479
|
+
"""
|
480
|
+
try:
|
481
|
+
return obj.format_map(SafeDict(**self.conditions))
|
482
|
+
except (KeyError, ValueError) as err:
|
483
|
+
self._logger.error(f"Error in conditions_replacement: {err}")
|
484
|
+
return obj
|
485
|
+
except Exception as err:
|
486
|
+
self._logger.error(f"Error in conditions_replacement: {err}")
|
487
|
+
return obj
|
488
|
+
|
489
|
+
def get_filename(self):
|
490
|
+
"""
|
491
|
+
get_filename.
|
492
|
+
Detect if File exists.
|
493
|
+
"""
|
494
|
+
if not self.filename: # pylint: disable=E0203
|
495
|
+
if hasattr(self, "file") and self.file:
|
496
|
+
file = self.get_filepattern()
|
497
|
+
if filelist := glob.glob(os.path.join(self.directory, file)):
|
498
|
+
self.filename = filelist[0]
|
499
|
+
self._variables["__FILEPATH__"] = self.filename
|
500
|
+
self._variables["__FILENAME__"] = os.path.basename(self.filename)
|
501
|
+
else:
|
502
|
+
raise FileNotFound(f"File is empty or doesn't exists: {file}")
|
503
|
+
elif self.previous:
|
504
|
+
filenames = list(self.input.keys())
|
505
|
+
if filenames:
|
506
|
+
try:
|
507
|
+
self.filename = filenames[0]
|
508
|
+
self._variables["__FILEPATH__"] = self.filename
|
509
|
+
self._variables["__FILENAME__"] = os.path.basename(
|
510
|
+
self.filename
|
511
|
+
)
|
512
|
+
except IndexError as e:
|
513
|
+
raise FileNotFound(
|
514
|
+
f"({__name__}): File is empty or doesn't exists"
|
515
|
+
) from e
|
516
|
+
else:
|
517
|
+
raise FileNotFound(f"({__name__}): File is empty or doesn't exists")
|
518
|
+
else:
|
519
|
+
return self.filename
|
520
|
+
|
521
|
+
def _print_data_(self, df, title: str = None) -> None:
|
522
|
+
if not title:
|
523
|
+
title = self.__class__.__name__
|
524
|
+
print(f"::: Printing {title} === ")
|
525
|
+
print("Data: ", df)
|
526
|
+
if df.empty:
|
527
|
+
print("The DataFrame is empty.")
|
528
|
+
else:
|
529
|
+
for column, t in df.dtypes.items():
|
530
|
+
print(f"{column} -> {t} -> {df[column].iloc[0]}")
|