diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..42aff5e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "python.pythonPath": "/usr/bin/python3", + "python.testing.pytestArgs": [ + "COVID19Py" + ], + "python.testing.unittestEnabled": false, + "python.testing.nosetestsEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/COVID19Py/covid19.py b/COVID19Py/covid19.py index a68faa7..e91a87f 100644 --- a/COVID19Py/covid19.py +++ b/COVID19Py/covid19.py @@ -2,6 +2,62 @@ import requests import json + + +class CovidLoc: + url = "" + data_source = "" + + + + def sources(self, url, data): + self.url = url + self.data_source = data + + def _request(self, endpoint, params=None): + if params is None: + params = {} + response = requests.get(self.url + endpoint, {**params, "source":self.data_source}) + response.raise_for_status() + return response + + def getLocationByIdTwoo(self, country_id: int): + """ + :param country_id: Country Id, an int + :return: A dictionary with case information for the specified location. + """ + data = self._request("/v2/locations/" + str(country_id)) + return data + + def getLocationByCountryTwo(self, country, timelines=False) -> List[Dict]: + """ + :param country: String denoting name of the country + :param timelines: Whether timeline information should be returned as well. + :return: A list of areas that correspond to the country name. If the country is invalid, it returns an empty list. + """ + data = None + if timelines: + data = self._request("/v2/locations", {"country": country, "timelines": str(timelines).lower()}) + else: + data = self._request("/v2/locations", {"country": country}) + return data + + def getLocationByCountryCodeTwo(self, country_code, timelines=False) -> List[Dict]: + """ + :param country_code: String denoting the ISO 3166-1 alpha-2 code (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the country + :param timelines: Whether timeline information should be returned as well. + :return: A list of areas that correspond to the country_code. If the country_code is invalid, it returns an empty list. + """ + data = None + if timelines: + data = self._request("/v2/locations", {"country_code": country_code, "timelines": str(timelines).lower()}) + else: + data = self._request("/v2/locations", {"country_code": country_code}) + return data + + +covidloc = CovidLoc() + class COVID19(object): default_url = "https://covid-tracker-us.herokuapp.com" url = "" @@ -9,12 +65,14 @@ class COVID19(object): previousData = None latestData = None _valid_data_sources = [] - + covidLoc = "hello" mirrors_source = "https://raw.github.com/Kamaropoulos/COVID19Py/master/mirrors.json" mirrors = None - def __init__(self, url="https://covid-tracker-us.herokuapp.com", data_source='jhu'): + def __init__(self, url="https://covid-tracker-us.herokuapp.com", data_source='jhu', covidLocation = covidloc): # Skip mirror checking if custom url was passed + self.covidLoc = covidLocation + if url == self.default_url: # Load mirrors response = requests.get(self.mirrors_source) @@ -49,6 +107,9 @@ def __init__(self, url="https://covid-tracker-us.herokuapp.com", data_source='jh raise ValueError("Invalid data source. Expected one of: %s" % self._valid_data_sources) self.data_source = data_source + self.covidLoc.sources(self.url,self.data_source) + + def _update(self, timelines): latest = self.getLatest() locations = self.getLocations(timelines) @@ -129,12 +190,8 @@ def getLocationByCountryCode(self, country_code, timelines=False) -> List[Dict]: :param timelines: Whether timeline information should be returned as well. :return: A list of areas that correspond to the country_code. If the country_code is invalid, it returns an empty list. """ - data = None - if timelines: - data = self._request("/v2/locations", {"country_code": country_code, "timelines": str(timelines).lower()}) - else: - data = self._request("/v2/locations", {"country_code": country_code}) - return data["locations"] + + return self.covidLoc.getLocationByCountryCodeTwo(country_code).json()["locations"] def getLocationByCountry(self, country, timelines=False) -> List[Dict]: """ @@ -142,17 +199,14 @@ def getLocationByCountry(self, country, timelines=False) -> List[Dict]: :param timelines: Whether timeline information should be returned as well. :return: A list of areas that correspond to the country name. If the country is invalid, it returns an empty list. """ - data = None - if timelines: - data = self._request("/v2/locations", {"country": country, "timelines": str(timelines).lower()}) - else: - data = self._request("/v2/locations", {"country": country}) - return data["locations"] - + + return self.covidLoc.getLocationByCountryTwo(country).json()["locations"] + + def getLocationById(self, country_id: int): """ :param country_id: Country Id, an int :return: A dictionary with case information for the specified location. """ - data = self._request("/v2/locations/" + str(country_id)) - return data["location"] + + return self.covidLoc.getLocationByIdTwoo(39).json()["location"] \ No newline at end of file diff --git a/README.md b/README.md index 27491cc..a68553f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # COVID19Py + + [![Downloads](https://pepy.tech/badge/covid19py)](https://pepy.tech/project/covid19py) [![Downloads](https://pepy.tech/badge/covid19py/month)](https://pepy.tech/project/covid19py/month) [![Downloads](https://pepy.tech/badge/covid19py/week)](https://pepy.tech/project/covid19py/week) @@ -8,8 +10,11 @@ [![CodeFactor](https://www.codefactor.io/repository/github/kamaropoulos/covid19py/badge)](https://www.codefactor.io/repository/github/kamaropoulos/covid19py) [![HitCount](http://hits.dwyl.com/Kamaropoulos/COVID19Py.svg)](http://hits.dwyl.com/Kamaropoulos/COVID19Py) [![GitHub stars](https://img.shields.io/github/stars/Kamaropoulos/COVID19Py.svg?style=social&label=Star)](https://github.com/Kamaropoulos/COVID19Py) + + A tiny Python package for easy access to up-to-date Coronavirus (COVID-19, SARS-CoV-2) cases data. + ## About @@ -18,10 +23,12 @@ COVID19Py is a Python wrapper made to be compatible with [ExpDev07/coronavirus-t It retrieves data directly from an instance of [@ExpDev07](https://covid-tracker-us.herokuapp.com/)'s backend but it can also be set up to use a different backend. To achieve this, just pass the URL of the backend as a parameter to the library's constructor: + ```python import COVID19Py covid19 = COVID19Py.COVID19("https://my-awesome-covid19-backend") ``` + ## Installation In order install this package, simply run: @@ -43,9 +50,11 @@ covid19 = COVID19Py.COVID19() COVID19Py supports the retrieval of data from multiple data sources. To choose a specific data source, simply pass it as a parameter to the library's constructor: + ```python covid19 = COVID19Py.COVID19(data_source="csbs") ``` + For more details about the available data sources, please check the [API's documentation](https://github.com/ExpDev07/coronavirus-tracker-api/blob/master/README.md#picking-data-source). ### Getting latest amount of total confirmed cases, deaths, and recoveries: @@ -65,6 +74,7 @@ or: ```python locations = covid19.getLocations(timelines=True) ``` + to also get timelines. You can also rank the results by `confirmed`, `deaths` or `recovered`. @@ -78,10 +88,13 @@ locations = covid19.getLocations(rank_by='recovered') ```python location = covid19.getLocationByCountryCode("US") ``` + or: + ```python location = covid19.getLocationByCountryCode("US", timelines=True) ``` + to also get timelines. ### Getting a specific location (includes timelines by default): @@ -102,7 +115,6 @@ or: location = covid19.getLocationByCountry("Zimbabwe", timelines=True) ``` - ### Getting all data at once: You can also get all the available data with one command. @@ -110,10 +122,13 @@ You can also get all the available data with one command. ```python data = covid19.getAll() ``` + or: + ```python data = covid19.getAll(timelines=True) ``` + to also get timelines. `latest` will be available on `data["latest"]` and `locations` will be available on `data["locations"]`. @@ -125,18 +140,21 @@ When using `getAll()`, COVID19Py will also store the previous version of the ret ```python changes = covid19.getLatestChanges() ``` + ```json { - "confirmed": 512, - "deaths": 16, - "recovered": 1024 + "confirmed": 512, + "deaths": 16, + "recovered": 1024 } ``` + ## Contributing You will need to fork this repository onto your own GitHub account, then clone the repo to your local machine. In the project directory, you will need to make sure the required packages are installed. To install requirements from the Pipfile, run a command like the following, which may depend on how you have package management set up: + ```bash pipenv install ``` @@ -157,6 +175,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d + This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + +# just testing!