Fix all pylint, flake8 and pydocstyle issues

This commit is contained in:
Robbie Trencheny 2016-03-24 22:30:10 -07:00
parent 0b9699fd4b
commit 5b18ea4237

View File

@ -1,5 +1,6 @@
""" """
Support for the Uber API. Support for the Uber API.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.uber/ https://home-assistant.io/components/sensor.uber/
""" """
@ -11,7 +12,7 @@ from homeassistant.util import Throttle
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['https://github.com/denismakogon/rides-python-sdk/archive/' REQUIREMENTS = ['https://github.com/denismakogon/rides-python-sdk/archive/'
'master.zip#' 'py3-support.zip#'
'uber_rides==0.1.2-dev'] 'uber_rides==0.1.2-dev']
ICON = 'mdi:taxi' ICON = 'mdi:taxi'
@ -19,11 +20,13 @@ ICON = 'mdi:taxi'
# Return cached results if last scan was less then this time ago. # Return cached results if last scan was less then this time ago.
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=30) MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=30)
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Get the Uber sensor."""
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the Uber sensor."""
if None in (config.get('start_latitude'), config.get('start_longitude')): if None in (config.get('start_latitude'), config.get('start_longitude')):
_LOGGER.error("You must set start latitude and longitude to use the Uber sensor!") _LOGGER.error(
"You must set start latitude and longitude to use the Uber sensor!"
)
return False return False
if config.get('server_token') is None: if config.get('server_token') is None:
@ -37,37 +40,64 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
wanted_product_ids = config.get('product_ids') wanted_product_ids = config.get('product_ids')
dev = [] dev = []
timeandpriceest = UberEstimate(session, config.get('start_latitude'), config.get('start_longitude'), config.get('end_latitude'), config.get('end_longitude')) start_lat_long = LatLong(config.get('start_latitude'),
config.get('start_longitude'))
end_lat_long = LatLong(config.get('end_latitude'),
config.get('end_longitude'))
timeandpriceest = UberEstimate(session, start_lat_long, end_lat_long)
for product_id, product in timeandpriceest.products.items(): for product_id, product in timeandpriceest.products.items():
if wanted_product_ids is not None and product_id in wanted_product_ids: if wanted_product_ids is not None and product_id in wanted_product_ids:
dev.append(UberSensor('time', timeandpriceest, product_id, product)) dev.append(UberSensor('time',
dev.append(UberSensor('price', timeandpriceest, product_id, product)) timeandpriceest,
product_id, product))
dev.append(UberSensor('price',
timeandpriceest,
product_id, product))
elif wanted_product_ids is None: elif wanted_product_ids is None:
dev.append(UberSensor('time', timeandpriceest, product_id, product)) dev.append(UberSensor('time',
dev.append(UberSensor('price', timeandpriceest, product_id, product)) timeandpriceest,
product_id,
product))
dev.append(UberSensor('price',
timeandpriceest,
product_id,
product))
add_devices(dev) add_devices(dev)
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
class UberSensor(Entity): class UberSensor(Entity):
"""Implementation of an Uber Time sensor.""" """Implementation of an Uber sensor."""
def __init__(self, sensorType, products, product_id, product): def __init__(self, sensorType, products, product_id, product):
"""Initialize the sensor.""" """Initialize the Uber sensor."""
self.data = products self.data = products
self._product_id = product_id self._product_id = product_id
self._product = product self._product = product
self._sensortype = sensorType self._sensortype = sensorType
self._name = self._product.get('display_name') + " " +self._sensortype self._name = self._product.get('display_name') + " " + self._sensortype
if self._sensortype == "time": if self._sensortype == "time":
self._unit_of_measurement = "min" self._unit_of_measurement = "min"
self._state = int(self._product.get('time_estimate_seconds', 0) / 60) self._state = int(self._product.get(
'time_estimate_seconds', 0
) / 60)
elif self._sensortype == "price": elif self._sensortype == "price":
if self._product.get('price_details').get('low_estimate') is None: if self._product.get('price_details').get('low_estimate') is None:
self._unit_of_measurement = self._product.get('price_details').get('currency_code') self._unit_of_measurement = self._product.get(
self._state = int(self._product.get('price_details').get('minimum')) 'price_details'
else: ).get(
self._unit_of_measurement = self._product.get('price_details').get('currency_code') 'currency_code'
self._state = int(self._product.get('price_details').get('low_estimate')) )
self._state = int(self._product.get(
'price_details'
).get(
'minimum'
))
else:
self._unit_of_measurement = self._product.get(
'price_details').get('currency_code')
self._state = int(
self._product.get('price_details').get('low_estimate'))
self.update() self.update()
@property @property
@ -88,31 +118,49 @@ class UberSensor(Entity):
@property @property
def device_state_attributes(self): def device_state_attributes(self):
"""Return the state attributes.""" """Return the state attributes."""
distance_key = 'Trip distance (in '+self._product.get('price_details').get('distance_unit')+'s)' distance_key = 'Trip distance (in '+self._product.get(
'price_details').get('distance_unit')+'s)'
distance_val = self._product.get('distance') distance_val = self._product.get('distance')
if self._product.get('price_details').get('distance_unit') is None or self._product.get('distance') is None: if self._product.get(
distance_key = 'Trip distance' 'price_details'
distance_val = 'N/A' ).get(
'distance_unit'
) is None or self._product.get(
'distance'
) is None:
distance_key = 'Trip distance'
distance_val = 'N/A'
return { return {
'Product ID': self._product.get('product_id'), 'Product ID': self._product.get('product_id'),
'Product short description': self._product.get('short_description'), 'Product short description': self._product.get(
'Product display name': self._product.get('display_name'), 'short_description'),
'Product description': self._product.get('description'), 'Product display name': self._product.get('display_name'),
'Pickup time estimate (in seconds)': self._product.get('time_estimate_seconds'), 'Product description': self._product.get('description'),
'Trip duration (in seconds)': self._product.get('duration', 'N/A'), 'Pickup time estimate (in seconds)':
distance_key: distance_val, self._product.get('time_estimate_seconds'),
'Vehicle Capacity': self._product.get('capacity'), 'Trip duration (in seconds)': self._product.get('duration', 'N/A'),
'Minimum price': self._product.get('price_details').get('minimum'), distance_key: distance_val,
'Cost per minute': self._product.get('price_details').get('cost_per_minute'), 'Vehicle Capacity': self._product.get('capacity'),
'Distance units': self._product.get('price_details').get('distance_unit'), 'Minimum price': self._product.get('price_details').get('minimum'),
'Cancellation fee': self._product.get('price_details').get('cancellation_fee'), 'Cost per minute': self._product.get(
'Cost per distance unit': self._product.get('price_details').get('cost_per_distance'), 'price_details').get('cost_per_minute'),
'Base price': self._product.get('price_details').get('base'), 'Distance units': self._product.get(
'Price estimate': self._product.get('price_details').get('estimate', 'N/A'), 'price_details').get('distance_unit'),
'Price currency code': self._product.get('price_details').get('currency_code'), 'Cancellation fee': self._product.get(
'High price estimate': self._product.get('price_details').get('high_estimate', 'N/A'), 'price_details').get('cancellation_fee'),
'Low price estimate': self._product.get('price_details').get('low_estimate', 'N/A'), 'Cost per distance unit': self._product.get(
'Surge multiplier': self._product.get('price_details').get('surge_multiplier', 'N/A') 'price_details').get('cost_per_distance'),
'Base price': self._product.get('price_details').get('base'),
'Price estimate': self._product.get(
'price_details').get('estimate', 'N/A'),
'Price currency code': self._product.get(
'price_details').get('currency_code'),
'High price estimate': self._product.get(
'price_details').get('high_estimate', 'N/A'),
'Low price estimate': self._product.get(
'price_details').get('low_estimate', 'N/A'),
'Surge multiplier': self._product.get(
'price_details').get('surge_multiplier', 'N/A')
} }
@property @property
@ -126,51 +174,74 @@ class UberSensor(Entity):
self.data.update() self.data.update()
self._product = self.data.products[self._product_id] self._product = self.data.products[self._product_id]
class LatLong(object):
"""A container for a latitude and longitude pair."""
def __init__(self, latitude, longitude):
"""Initialize the LatLong object."""
self.latitude = latitude
self.longitude = longitude
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
class UberEstimate(object): class UberEstimate(object):
"""The Class for handling the data retrieval.""" """The class for handling the time and price estimate."""
def __init__(self, session, start_latitude, start_longitude, end_latitude=None, end_longitude=None): def __init__(self, session, start_latlong, end_latlong=None):
"""Initialize the data object.""" """Initialize the UberEstimate object."""
self._session = session self._session = session
self.start_latitude = start_latitude self.start_latitude = start_latlong.latitude
self.start_longitude = start_longitude self.start_longitude = start_latlong.longitude
self.end_latitude = end_latitude self.end_latitude = end_latlong.latitude
self.end_longitude = end_longitude self.end_longitude = end_latlong.longitude
self.products = None self.products = None
self.update() self.update()
@Throttle(MIN_TIME_BETWEEN_UPDATES) @Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self): def update(self):
"""Get the latest estimates from the Uber API.""" """Get the latest product info and estimates from the Uber API."""
from uber_rides.client import UberRidesClient from uber_rides.client import UberRidesClient
client = UberRidesClient(self._session) client = UberRidesClient(self._session)
self.products = {} self.products = {}
productsResp = client.get_products(self.start_latitude, self.start_longitude) products_response = client.get_products(
self.start_latitude, self.start_longitude)
products = productsResp.json.get('products') products = products_response.json.get('products')
for product in products: for product in products:
self.products[product.get('product_id')] = product self.products[product.get('product_id')] = product
if self.end_latitude is not None and self.end_longitude is not None: if self.end_latitude is not None and self.end_longitude is not None:
priceResp = client.get_price_estimates(self.start_latitude, self.start_longitude, self.end_latitude, self.end_longitude) price_response = client.get_price_estimates(
self.start_latitude,
self.start_longitude,
self.end_latitude,
self.end_longitude)
prices = priceResp.json.get('prices') prices = price_response.json.get('prices')
for price in prices: for price in prices:
self.products[price.get('product_id')]["duration"] = price.get('duration') self.products[price.get('product_id')][
self.products[price.get('product_id')]["distance"] = price.get('distance') "duration"] = price.get('duration')
self.products[price.get('product_id')]["price_details"]["estimate"] = price.get('estimate') self.products[price.get('product_id')][
self.products[price.get('product_id')]["price_details"]["high_estimate"] = price.get('high_estimate') "distance"] = price.get('distance')
self.products[price.get('product_id')]["price_details"]["low_estimate"] = price.get('low_estimate') self.products[price.get('product_id')]["price_details"][
self.products[price.get('product_id')]["price_details"]["surge_multiplier"] = price.get('surge_multiplier') "estimate"] = price.get('estimate')
self.products[price.get('product_id')]["price_details"][
"high_estimate"] = price.get('high_estimate')
self.products[price.get('product_id')]["price_details"][
"low_estimate"] = price.get('low_estimate')
self.products[price.get('product_id')]["price_details"][
"surge_multiplier"] = price.get('surge_multiplier')
estimateResp = client.get_pickup_time_estimates(self.start_latitude, self.start_longitude) estimate_response = client.get_pickup_time_estimates(
self.start_latitude, self.start_longitude)
estimates = estimateResp.json.get('times') estimates = estimate_response.json.get('times')
for estimate in estimates: for estimate in estimates:
self.products[estimate.get('product_id')]["time_estimate_seconds"] = estimate.get('estimate') self.products[estimate.get('product_id')][
"time_estimate_seconds"] = estimate.get('estimate')