class Covid19DateDataRTL: """ Facade class that abstracts away all the logic for requesting, transforming, and loading new CSV date data into MongoDB. """ logger = build_logger("Covid19DateDataRTL") dates_service = DatesService() csv_requester = CSVRequester() csv_date_transformer = CSVDateTransformer() def execute_rtl(self) -> str: """ Entry point for the class. """ urls_and_dates = self.csv_requester.check_for_new_csv() date_documents = [] for url, file in urls_and_dates: requested_data = self._request(url, file) if requested_data: date_documents.extend(self._transform(requested_data)) if not date_documents: self.logger.info("No new data!") return "No new data!" dates = [d["date"].strftime("%d-%m-%Y") for d in date_documents] self.logger.info("Loading new transformed data.") result = self._load(date_documents) if result and result.acknowledged: return "Data updated for:\n" + "\n".join(dates) def _request(self, url: str, filename: str) -> Dict: """ Requests new CSV data from github, should there be any. :return: """ return self.csv_requester.request_new_csv(url, filename) def _transform(self, data: dict): """ Transforms new CSV data into structure suitable for MongoDB. """ transformed_data = self.csv_date_transformer.transform_csv_data(data) if transformed_data: return transformed_data def _load(self, date_documents: list) -> InsertManyResult: """ Persists new date data as MongoDB documents in covid-19 db. """ return self.dates_service.insert_multiple_dates(date_documents)
def __init__(self): self.logger = build_logger("CountriesService") self.mongo_dates_dao = MongoDAO("dates") self.mongo_countries_dao = MongoDAO("countries")
""" Contains the class acting as the direct interface to a standalone MongoDB 'covid-19'. """ import datetime from typing import Dict, List from flask import current_app from pymongo import MongoClient, WriteConcern from pymongo.command_cursor import CommandCursor from pymongo.cursor import Cursor from pymongo.results import InsertManyResult, InsertOneResult from webapp.utils.loggers import build_logger LOGGER = build_logger("MongoDAO") class MongoDAO: """ Data access class that uses the PyMongo package to interact directly with a standalone mongo instance to retrieve and insert documents to and from the 'covid-19' db. """ client = MongoClient( username=current_app.config["MONGO_USERNAME"], password=current_app.config["MONGO_PASSWORD"], ) db = client.get_database("covid-19")
""" Contains the class acting as intermediary between the Mongo dates collection and calling code. """ import datetime from typing import Dict, List, Optional from pymongo.results import InsertManyResult from webapp.data.mongo.mongo_dao import MongoDAO from webapp.utils.loggers import build_logger LOGGER = build_logger("DatesService") class DatesService: """ Acts as intermediary service layer between a MongoDAO and calling code at the view layer. """ def __init__(self): self.mongo_dao = MongoDAO("dates") def get_dates_data(self, country: str) -> List[Dict]: """ Uses MongoDAO to retrieve date data for a specified country and pass to the list constructor. Also filters out dates with no cases. :param country: String representing country. :return: A list of date documents
def __init__(self, dataframe: DataFrame): self.dataframe = dataframe self.logger = build_logger("SeabornPlotter")
def __init__(self): self.logger = build_logger("CSVDateTransformer")
from typing import Dict, List import pandas from pandas import DataFrame from webapp.utils.loggers import build_logger LOGGER = build_logger("DocumentConverter") class DocumentConverter: """ todo """ def __init__(self, data: List[Dict]): self.data = data def convert_dates_to_dataframe(self): """ TODO :return: """ temp_dict = { "dates": [], "confirmed": [], "recovered": [], "deaths": [], } for document in self.data:
def __init__(self): self.logger = build_logger("CSVRequester") self.repo_url = current_app.config["GIT_COVID_REPO_URL"] self.root_url = current_app.config["GITHUB_RAW_ROOT_URL"]