From d0573797f67796f9078e42b492f32542d5942820 Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sat, 29 Dec 2018 16:34:08 +0000 Subject: [PATCH 1/7] Update london_underground.py --- homeassistant/components/sensor/london_underground.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/london_underground.py b/homeassistant/components/sensor/london_underground.py index a0617469cbaad6..ad440597d7b589 100644 --- a/homeassistant/components/sensor/london_underground.py +++ b/homeassistant/components/sensor/london_underground.py @@ -119,15 +119,17 @@ def parse_api_response(response): data_dict = dict.fromkeys(lines) for line in response: + statuses = [status['statusSeverityDescription'] for status in line['lineStatuses']] state = ' + '.join(sorted(set(statuses))) - if state == 'Good Service': + if state == 'Good Service': # if good status, this is the only status returned reason = 'Nothing to report' else: - reason = ' *** '.join( - [status['reason'] for status in line['lineStatuses']]) + reason = ' *** '.join([status['disruption']['additionalInfo'] + for status in line['lineStatuses']]) + reason = reason.replace('\r\n', ' ') attr = {'State': state, 'Description': reason} data_dict[line['name']] = attr From 2ff088fb31ae90f8460793b7b26f82f3b363ebaa Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sat, 29 Dec 2018 17:18:37 +0000 Subject: [PATCH 2/7] Update test --- .../sensor/test_london_underground.py | 27 +- tests/fixtures/london_underground.json | 465 ------------------ 2 files changed, 24 insertions(+), 468 deletions(-) delete mode 100644 tests/fixtures/london_underground.json diff --git a/tests/components/sensor/test_london_underground.py b/tests/components/sensor/test_london_underground.py index 7acd61f6440a2b..9cb97ec1e7c7c6 100644 --- a/tests/components/sensor/test_london_underground.py +++ b/tests/components/sensor/test_london_underground.py @@ -1,10 +1,11 @@ """The tests for the tube_state platform.""" +import json import unittest import requests_mock from homeassistant.components.sensor.london_underground import CONF_LINE, URL from homeassistant.setup import setup_component -from tests.common import load_fixture, get_test_home_assistant +from tests.common import get_test_home_assistant VALID_CONFIG = { 'platform': 'london_underground', @@ -13,6 +14,26 @@ ] } +VALID_RESPONSE = [ + { + "id": "london-overground", + "name": "London Overground", + "modeName": "overground", + "disruptions": [ + ], + "lineStatuses": [ + { + "statusSeverityDescription": "Minor Delays", + + "disruption": { + + "additionalInfo": "Something\r\nelse" + } + } + ], + + }, +] class TestLondonTubeSensor(unittest.TestCase): """Test the tube_state platform.""" @@ -29,9 +50,9 @@ def tearDown(self): @requests_mock.Mocker() def test_setup(self, mock_req): """Test for operational tube_state sensor with proper attributes.""" - mock_req.get(URL, text=load_fixture('london_underground.json')) + mock_req.get(URL, text=json.dumps(VALID_RESPONSE)) assert setup_component(self.hass, 'sensor', {'sensor': self.config}) state = self.hass.states.get('sensor.london_overground') assert state.state == 'Minor Delays' - assert state.attributes.get('Description') == 'something' + assert state.attributes.get('Description') == 'Something else' diff --git a/tests/fixtures/london_underground.json b/tests/fixtures/london_underground.json deleted file mode 100644 index fddae7e89e2448..00000000000000 --- a/tests/fixtures/london_underground.json +++ /dev/null @@ -1,465 +0,0 @@ -[ - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "bakerloo", - "name": "Bakerloo", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.703Z", - "modified": "2017-06-28T11:43:10.703Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Bakerloo&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "central", - "name": "Central", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.623Z", - "modified": "2017-06-28T11:43:10.623Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Central&serviceTypes=Regular" - }, - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Night", - "uri": "/Line/Route?ids=Central&serviceTypes=Night" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "circle", - "name": "Circle", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.733Z", - "modified": "2017-06-28T11:43:10.733Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Circle&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "district", - "name": "District", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.623Z", - "modified": "2017-06-28T11:43:10.623Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=District&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "dlr", - "name": "DLR", - "modeName": "dlr", - "disruptions": [], - "created": "2017-06-28T11:43:10.703Z", - "modified": "2017-06-28T11:43:10.703Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=DLR&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "hammersmith-city", - "name": "Hammersmith & City", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.67Z", - "modified": "2017-06-28T11:43:10.67Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Hammersmith & City&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "jubilee", - "name": "Jubilee", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.623Z", - "modified": "2017-06-28T11:43:10.623Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Jubilee&serviceTypes=Regular" - }, - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Night", - "uri": "/Line/Route?ids=Jubilee&serviceTypes=Night" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "london-overground", - "name": "London Overground", - "modeName": "overground", - "disruptions": [], - "created": "2017-06-28T11:43:10.607Z", - "modified": "2017-06-28T11:43:10.607Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "lineId": "london-overground", - "statusSeverity": 9, - "statusSeverityDescription": "Minor Delays", - "reason": "something", - "created": "0001-01-01T00:00:00", - "validityPeriods": [ - { - "$type": "Tfl.Api.Presentation.Entities.ValidityPeriod, Tfl.Api.Presentation.Entities", - "fromDate": "2017-06-29T06:27:21Z", - "toDate": "2017-06-30T01:29:00Z", - "isNow": true - } - ], - "disruption": { - "$type": "Tfl.Api.Presentation.Entities.Disruption, Tfl.Api.Presentation.Entities", - "category": "RealTime", - "categoryDescription": "RealTime", - "description": "London Overground: Minor delays Richmond to Stratford and Willesden Junction to Clapham Junction while we fix a faulty train at Richmond, GOOD SERVICE all other routes. ", - "affectedRoutes": [], - "affectedStops": [], - "closureText": "minorDelays" - } - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=London Overground&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "metropolitan", - "name": "Metropolitan", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.703Z", - "modified": "2017-06-28T11:43:10.703Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Metropolitan&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "northern", - "name": "Northern", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.67Z", - "modified": "2017-06-28T11:43:10.67Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Northern&serviceTypes=Regular" - }, - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Night", - "uri": "/Line/Route?ids=Northern&serviceTypes=Night" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "piccadilly", - "name": "Piccadilly", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.67Z", - "modified": "2017-06-28T11:43:10.67Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Piccadilly&serviceTypes=Regular" - }, - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Night", - "uri": "/Line/Route?ids=Piccadilly&serviceTypes=Night" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "tfl-rail", - "name": "TfL Rail", - "modeName": "tflrail", - "disruptions": [], - "created": "2017-06-28T11:43:10.657Z", - "modified": "2017-06-28T11:43:10.657Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=TfL Rail&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "victoria", - "name": "Victoria", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.607Z", - "modified": "2017-06-28T11:43:10.607Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Victoria&serviceTypes=Regular" - }, - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Night", - "uri": "/Line/Route?ids=Victoria&serviceTypes=Night" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - }, - { - "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", - "id": "waterloo-city", - "name": "Waterloo & City", - "modeName": "tube", - "disruptions": [], - "created": "2017-06-28T11:43:10.703Z", - "modified": "2017-06-28T11:43:10.703Z", - "lineStatuses": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", - "id": 0, - "statusSeverity": 10, - "statusSeverityDescription": "Good Service", - "created": "0001-01-01T00:00:00", - "validityPeriods": [] - } - ], - "routeSections": [], - "serviceTypes": [ - { - "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", - "name": "Regular", - "uri": "/Line/Route?ids=Waterloo & City&serviceTypes=Regular" - } - ], - "crowding": { - "$type": "Tfl.Api.Presentation.Entities.Crowding, Tfl.Api.Presentation.Entities" - } - } -] From e6457c3c1df52c606e0a00ce46a2270ad1fa7f97 Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sat, 29 Dec 2018 17:22:00 +0000 Subject: [PATCH 3/7] Update london_underground.py --- homeassistant/components/sensor/london_underground.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/london_underground.py b/homeassistant/components/sensor/london_underground.py index ad440597d7b589..d002652dbbda47 100644 --- a/homeassistant/components/sensor/london_underground.py +++ b/homeassistant/components/sensor/london_underground.py @@ -124,11 +124,11 @@ def parse_api_response(response): for status in line['lineStatuses']] state = ' + '.join(sorted(set(statuses))) - if state == 'Good Service': # if good status, this is the only status returned + if state == 'Good Service': reason = 'Nothing to report' else: reason = ' *** '.join([status['disruption']['additionalInfo'] - for status in line['lineStatuses']]) + for status in line['lineStatuses']]) reason = reason.replace('\r\n', ' ') attr = {'State': state, 'Description': reason} From b03457e378145c7ed2c9ec6f0dcc5d59d5085b90 Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sat, 29 Dec 2018 17:35:47 +0000 Subject: [PATCH 4/7] Update london_underground.py --- homeassistant/components/sensor/london_underground.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/london_underground.py b/homeassistant/components/sensor/london_underground.py index d002652dbbda47..0148211319c763 100644 --- a/homeassistant/components/sensor/london_underground.py +++ b/homeassistant/components/sensor/london_underground.py @@ -127,8 +127,10 @@ def parse_api_response(response): if state == 'Good Service': reason = 'Nothing to report' else: - reason = ' *** '.join([status['disruption']['additionalInfo'] - for status in line['lineStatuses']]) + reason = ' *** '.join( + [status['disruption']['additionalInfo'] for status + in line['lineStatuses']] + ) reason = reason.replace('\r\n', ' ') attr = {'State': state, 'Description': reason} From 80aaa4b1faf77b82bc23c33fad3cd54711bed4c5 Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sun, 30 Dec 2018 06:47:51 +0000 Subject: [PATCH 5/7] Update london_underground.py --- .../components/sensor/london_underground.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/sensor/london_underground.py b/homeassistant/components/sensor/london_underground.py index 0148211319c763..d9e5c5d6968bcd 100644 --- a/homeassistant/components/sensor/london_underground.py +++ b/homeassistant/components/sensor/london_underground.py @@ -127,11 +127,13 @@ def parse_api_response(response): if state == 'Good Service': reason = 'Nothing to report' else: - reason = ' *** '.join( - [status['disruption']['additionalInfo'] for status - in line['lineStatuses']] - ) - reason = reason.replace('\r\n', ' ') + reason = " *** ".join( + [ + status["disruption"]["additionalInfo"] + for status in line["lineStatuses"] + ] + ) + reason = reason.replace("\r\n", " ") attr = {'State': state, 'Description': reason} data_dict[line['name']] = attr From 4d6a48325188e13c19acd6b890c4a8feb77b513e Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Sun, 30 Dec 2018 07:29:04 +0000 Subject: [PATCH 6/7] Fix lint --- tests/components/sensor/test_london_underground.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/components/sensor/test_london_underground.py b/tests/components/sensor/test_london_underground.py index 9cb97ec1e7c7c6..f0e71957c279c0 100644 --- a/tests/components/sensor/test_london_underground.py +++ b/tests/components/sensor/test_london_underground.py @@ -35,6 +35,7 @@ }, ] + class TestLondonTubeSensor(unittest.TestCase): """Test the tube_state platform.""" From e6f2f8a0e11b6a14b97031f1170632f825899f04 Mon Sep 17 00:00:00 2001 From: robmarkcole Date: Mon, 31 Dec 2018 10:47:52 +0000 Subject: [PATCH 7/7] Use london-tube-status==0.2 --- .coveragerc | 1 + .../components/sensor/london_underground.py | 52 +--------------- requirements_all.txt | 3 + .../sensor/test_london_underground.py | 59 ------------------- 4 files changed, 7 insertions(+), 108 deletions(-) delete mode 100644 tests/components/sensor/test_london_underground.py diff --git a/.coveragerc b/.coveragerc index 5f361929f5dff2..3a16f3ee4362ab 100644 --- a/.coveragerc +++ b/.coveragerc @@ -777,6 +777,7 @@ omit = homeassistant/components/sensor/launch_library.py homeassistant/components/sensor/linky.py homeassistant/components/sensor/linux_battery.py + homeassistant/components/sensor/london_underground.py homeassistant/components/sensor/loopenergy.py homeassistant/components/sensor/luftdaten.py homeassistant/components/sensor/lyft.py diff --git a/homeassistant/components/sensor/london_underground.py b/homeassistant/components/sensor/london_underground.py index d9e5c5d6968bcd..d44806cf481733 100644 --- a/homeassistant/components/sensor/london_underground.py +++ b/homeassistant/components/sensor/london_underground.py @@ -8,12 +8,12 @@ from datetime import timedelta import voluptuous as vol -import requests import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.helpers.entity import Entity -from homeassistant.util import Throttle + +REQUIREMENTS = ['london-tube-status==0.2'] _LOGGER = logging.getLogger(__name__) @@ -35,7 +35,6 @@ 'TfL Rail', 'Victoria', 'Waterloo & City'] -URL = 'https://api.tfl.gov.uk/line/mode/tube,overground,dlr,tflrail/status' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_LINE): @@ -45,6 +44,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Tube sensor.""" + from london_tube_status import TubeData data = TubeData() data.update() sensors = [] @@ -93,49 +93,3 @@ def update(self): self._data.update() self._state = self._data.data[self.name]['State'] self._description = self._data.data[self.name]['Description'] - - -class TubeData: - """Get the latest tube data from TFL.""" - - def __init__(self): - """Initialize the TubeData object.""" - self.data = None - - # Update only once in scan interval. - @Throttle(SCAN_INTERVAL) - def update(self): - """Get the latest data from TFL.""" - response = requests.get(URL) - if response.status_code != 200: - _LOGGER.warning("Invalid response from API") - else: - self.data = parse_api_response(response.json()) - - -def parse_api_response(response): - """Take in the TFL API json response.""" - lines = [line['name'] for line in response] - data_dict = dict.fromkeys(lines) - - for line in response: - - statuses = [status['statusSeverityDescription'] - for status in line['lineStatuses']] - state = ' + '.join(sorted(set(statuses))) - - if state == 'Good Service': - reason = 'Nothing to report' - else: - reason = " *** ".join( - [ - status["disruption"]["additionalInfo"] - for status in line["lineStatuses"] - ] - ) - reason = reason.replace("\r\n", " ") - - attr = {'State': state, 'Description': reason} - data_dict[line['name']] = attr - - return data_dict diff --git a/requirements_all.txt b/requirements_all.txt index ff64a2104f6b89..66fcb6a0fc7823 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -627,6 +627,9 @@ locationsharinglib==3.0.9 # homeassistant.components.logi_circle logi_circle==0.1.7 +# homeassistant.components.sensor.london_underground +london-tube-status==0.2 + # homeassistant.components.luftdaten luftdaten==0.3.4 diff --git a/tests/components/sensor/test_london_underground.py b/tests/components/sensor/test_london_underground.py deleted file mode 100644 index f0e71957c279c0..00000000000000 --- a/tests/components/sensor/test_london_underground.py +++ /dev/null @@ -1,59 +0,0 @@ -"""The tests for the tube_state platform.""" -import json -import unittest -import requests_mock - -from homeassistant.components.sensor.london_underground import CONF_LINE, URL -from homeassistant.setup import setup_component -from tests.common import get_test_home_assistant - -VALID_CONFIG = { - 'platform': 'london_underground', - CONF_LINE: [ - 'London Overground', - ] -} - -VALID_RESPONSE = [ - { - "id": "london-overground", - "name": "London Overground", - "modeName": "overground", - "disruptions": [ - ], - "lineStatuses": [ - { - "statusSeverityDescription": "Minor Delays", - - "disruption": { - - "additionalInfo": "Something\r\nelse" - } - } - ], - - }, -] - - -class TestLondonTubeSensor(unittest.TestCase): - """Test the tube_state platform.""" - - def setUp(self): - """Initialize values for this testcase class.""" - self.hass = get_test_home_assistant() - self.config = VALID_CONFIG - - def tearDown(self): - """Stop everything that was started.""" - self.hass.stop() - - @requests_mock.Mocker() - def test_setup(self, mock_req): - """Test for operational tube_state sensor with proper attributes.""" - mock_req.get(URL, text=json.dumps(VALID_RESPONSE)) - assert setup_component(self.hass, 'sensor', {'sensor': self.config}) - - state = self.hass.states.get('sensor.london_overground') - assert state.state == 'Minor Delays' - assert state.attributes.get('Description') == 'Something else'