From 4f1e27e44e1e5b3631065b0bd60682046ea8e5ac Mon Sep 17 00:00:00 2001
From: Rob Wainwright <47543882+apex2504@users.noreply.github.com>
Date: Fri, 15 May 2020 00:17:33 +0100
Subject: [PATCH] improve readme, fix bug, change base url
---
README.md | 438 ++++++++++++++++++++++++++++++++++++++++-
corona_api/__init__.py | 2 +-
corona_api/client.py | 35 +++-
corona_api/request.py | 2 +-
setup.py | 2 +-
5 files changed, 469 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index cd195b7..7ad5f52 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# python-corona-api
+# corona-api
An asynchronous wrapper for the [NovelCOVID API](https://github.com/NovelCOVID/API) written in Python.
This is designed for bots using [discord.py](https://github.com/Rapptz/discord.py) but there is no discord-specific code so you are free to use this in any project as required.
@@ -10,10 +10,440 @@ This is designed for bots using [discord.py](https://github.com/Rapptz/discord.p
# Installation
### Using pip (recommended)
- `python3 -m pip install -U corona_api`
-
+
# Support
-Get support for this over on [Discord](https://takagisan.xyz/support).
-
+Get support for this on Discord, either on our [official server](https://takagisan.xyz/support) or the [NovelCOVID server](https://discord.gg/cEDxzfW).
+
+# Optional parameters in methods
+| Parameter | Supported methods | Accepted values |
+|------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `yesterday` | - `all()`
- `get_country_data()`
- `get_country_list()`
- `get_all_countries()`
- `get_all_states()`
- `get_single_state()`
- `get_state_list()`
- `get_all_continents()`
- `get_single_continent()` | - `True`
- `False` |
+| `sort` | - `get_all_countries()`
- `get_all_states()`
- `get_all_continents()` | - `'cases'`
- `'deaths'`
- `'recovered'`
- `'active'`
- `'tests'`
- `'critical'`
- `'deathsPerOneMillion'`
- `'testsPerOneMillion'`
- `'todayCases'`
- `'todayDeaths'`
- `'casesPerOneMillion'`
- `'active'` |
+
# Examples
+The following examples cover the basic usage of the library and its various features. They assume you are running Python 3.6 or above (due to the use of f-strings). However, the library is compatible with 3.5+.
+Note; many methods also support `yesterday=True` and `sort='sort method'` kwargs to get data from the previous day or sorted by various parameters. Refer to the table above to find out which ones do and do not.
+
### Discord bot
There is an example cog for your Discord bot [here](https://github.com/apex2504/python-corona-api/blob/master/examples/discord_cog.py).
+
+## Basic data
+### Global data
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_all():
+ data = await client.all() #get global data
+ print(data.cases, data.deaths) #print the number of global cases and deaths
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_all())
+```
+
+## Data for a specific country
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_country():
+ data = await client.get_country_data('UK') #get data for the UK today,
+ print(data.cases, data.deaths) #print the number of cases and deaths for the UK
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_country())
+```
+
+## Data for more than one country
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_countries():
+ data = await client.get_country_list('UK', 'USA', 'China') #get data for specified countries
+ #to get data for every country supported, use: get_all_countries()
+ print(data) #prints a list of CountryStatistics
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_countries())
+```
+## US States
+### Data for a specific state
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_state():
+ data = await client.get_single_state('Ohio') #get data for Ohio today,
+ print(data.cases, data.deaths) #print the number of cases and deaths for Ohio
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_state())
+```
+
+### Data for more than one state
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_states():
+ data = await client.get_state_list('Ohio', 'California', 'Texas') #get data for specified states
+ #to get data for every state supported, use: get_all_states()
+ print(data) #prints a list of StateStatistics
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_states())
+```
+
+## Historical statistics
+### Historical data globally
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_history():
+ data = await client.get_country_history('all', 'all') #get all the historical data for the world
+
+ print(data.name, data.case_history[0].date, data.case_history[0].value) #print name (in this case 'Global'), the date of the first entry, and the number of cases for that date
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_history())
+```
+
+### Historical data for a country
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_history():
+ data = await client.get_country_history('UK', 7) #get the past week of historical data for the UK
+
+ print(data.name, data.case_history[0].date, data.case_history[0].value) #print name, the date of the first entry, and the number of cases for that date
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_history())
+```
+
+### Historical data for a province
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_history_province():
+ data = await client.get_province_history('UK', 'Gibraltar', 7) #get the past week of historical data for Gibraltar, UK
+
+ print(data.province, data.case_history[0].date, data.case_history[0].value) #print province name, the date of the first entry, and the number of cases for that date
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_history_province())
+```
+
+### Historical data for a county within a US state
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_county():
+ data = await client.get_state_county_history('Ohio', 'Adams') #get all historical data for Adams, Ohio, USA
+
+ print(data.name, data.province, data.case_history[0].date, data.case_history[0].value) #print state and county name, the date of the first entry, and the number of cases for that date
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_county())
+```
+## John Hopkins CSSE
+### All data from the JHU CSSE
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_jhu():
+ data = await client.get_jhu_csse_data() #get data for every province and country JHU supports
+
+ print(data) #print a long list of JhuCsseStatistics
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_jhu())
+```
+
+### Data for a county within a US state
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_jhu_county():
+ data = await client.get_jhu_county_data('Ohio', 'Adams') #get data for Adams, Ohio
+
+ print(data.province_name, data.county_name, data.confirmed_cases) #print the state, county and case number
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_jhu_county())
+```
+
+### Data for every county in the USA
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_jhu_counties():
+ data = await client.get_jhu_all_counties()
+
+ print(data) #print a long list of JhuCsseStatistics
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_jhu_counties())
+```
+
+## Continental data
+### Data for every continent
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_conts():
+ data = await client.get_all_continents()
+ first = data[0]
+
+ print(first.name, first.cases, first.deaths) #print some info for the first continent in the list
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_conts())
+```
+
+### Data for a single continent
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_one_cont():
+ data = await client.get_single_continent('Europe')
+
+ print(data.name, data.cases, data.deaths) #print some info for the specified continent
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_one_cont())
+```
+
+## New York Times
+### USA data from NY Times
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_nyt_us():
+ data = await client.get_nyt_usa_data()
+ first = data[0]
+
+ print(first.date, first.cases, first.deaths) #print first piece of data
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_nyt_us())
+```
+
+### All USA state data from NY Times
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_nyt_states():
+ data = await client.get_nyt_all_states()
+ first = data[0]
+
+ print(first.state, first.date, first.cases) #print some data from the frst element
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_nyt_states())
+```
+
+### Data for a single state from NY Times
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_nyt_state():
+ data = await client.get_nyt_single_state('Ohio')
+ first = date[0]
+
+ print(first.date, first.cases, first.deaths) #print the first date, and case/death number
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_nyt_state())
+```
+
+### Every county from NY Times
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_counts():
+ data = await client.get_nyt_all_counties()
+ first = data[0]
+
+ print(first.date, first.cases, first.deaths) #print part of the first piece of data
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_counts())
+```
+
+### Counties from NYT filtered by name
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_one_county():
+ data = await client.get_nyt_single_county('Adams')
+ first = data[0]
+
+ print(first.date, first.cases, first.deaths) #print part of the first piece of data
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_one_county())
+```
+
+## Apple Mobility
+### Every country supported by Apple Mobility Data
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def all_apples():
+ data = await client.apple_all_countries()
+
+ print(data) #print all supported countries
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(apples())
+```
+
+### Every subregion within a country for Apple Mobility
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_subregions():
+ data = await client.apple_subregions('UK')
+
+ print(data.subregions) #print all supported subregions within the country
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_subregions())
+```
+
+### Apple's Mobility data for a subregion
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_one_sub():
+ data = await client.apple_mobility_data('UK', 'London')
+ first = data.statistics[0]
+
+ print(first.date, first.name, first.driving) #print some data about the first result
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_one_sub())
+```
+
+## Governmental data
+### All countries supported by the API for government data
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_gov_countries():
+ data = await client.gov_all_countries()
+
+ print(data) #print the supported countries
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_gov_countries())
+```
+
+### Get the data from a country's governmental data
+```python
+import corona_api
+import asyncio
+
+client = corona_api.Client()
+
+async def get_country_gov():
+ data = await client.gov_country('UK')
+
+ print(data) #probably will return a large amount of dict data.
+
+ await client.request_client.close() #close the ClientSession
+
+asyncio.get_event_loop().run_until_complete(get_country_gov())
+```
+
+# Note
+Due to the fact that each country's governmental/official statistics website is different, it is not feasible to create a standardised class for the data. However, if you interpret the data received from the API, it should be relatively simple to work with the given information.
\ No newline at end of file
diff --git a/corona_api/__init__.py b/corona_api/__init__.py
index 2df9a55..ba43996 100644
--- a/corona_api/__init__.py
+++ b/corona_api/__init__.py
@@ -3,6 +3,6 @@
from .statistics import *
from .utils import *
-__version__ = "0.8.4"
+__version__ = "0.8.5"
__author__ = "Rob Wainwright // apex2504"
__license__ = "MIT"
\ No newline at end of file
diff --git a/corona_api/client.py b/corona_api/client.py
index 41ff11e..e0cf525 100644
--- a/corona_api/client.py
+++ b/corona_api/client.py
@@ -7,9 +7,9 @@
class Client:
"""
- Handles interactions with the corona.lmao.ninja API
+ Handles interactions with the NovelCOVID API
"""
- def __init__(self, api_url='https://corona.lmao.ninja/v2'):
+ def __init__(self, api_url='https://disease.sh/v2'):
self.api_url = api_url
self.request_client = RequestClient()
@@ -149,7 +149,7 @@ def _generate_history(self, historical_stats, is_county=False):
def _compile_jhu_data(self, matching_county):
country = matching_county.get("country") #will always be 'US'
province = matching_county.get("province")
- county_name = matching_county.get("province")
+ county_name = matching_county.get("county")
confirmed_cases = matching_county["stats"].get("confirmed")
deaths = matching_county["stats"].get("deaths")
recoveries = matching_county["stats"].get("recovered")
@@ -475,6 +475,35 @@ async def get_single_state(self, state, **kwargs):
return compiled_state
+ async def get_state_list(self, *states, **kwargs):
+ """
+ Get the stats for more than one state
+ """
+ yesterday = kwargs.get('yesterday')
+ state_list = ','.join(map(str, states))
+
+ endpoint = SINGLE_STATE.format(self.api_url, state_list)
+ params = None
+
+ if yesterday:
+ self._check_yesterday(yesterday)
+ yesterday = str(yesterday).lower()
+ params = {"yesterday": yesterday}
+
+ data = await self.request_client.make_request(endpoint, params)
+
+ if isinstance(data, dict):
+ return self._compile_state(data)
+
+ returned_states = []
+
+ for country in data:
+ returned_states.append(
+ self._compile_state(country)
+ )
+ return returned_states
+
+
async def get_country_history(self, country='all', last_days='all'):
"""
Get historical data for a specific country or globally.
diff --git a/corona_api/request.py b/corona_api/request.py
index 20b3cb3..d0e8f17 100644
--- a/corona_api/request.py
+++ b/corona_api/request.py
@@ -1,7 +1,7 @@
import aiohttp
from .exceptions import NotFound, APIError
-ver = "0.8.4"
+ver = "0.8.5"
class RequestClient:
def __init__(self):
diff --git a/setup.py b/setup.py
index dd8546c..111b648 100644
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,7 @@
setup(
name = 'corona_api',
packages = ['corona_api'],
- version = '0.8.4',
+ version = '0.8.5',
license='MIT',
description = 'An asynchronous wrapper for the corona.lmao.ninja API written in Python.',
long_description= long_desc,