Skip to content

Commit

Permalink
refactor: rename display and simplify config
Browse files Browse the repository at this point in the history
  • Loading branch information
u8slvn committed Jul 22, 2019
1 parent 6616b56 commit c257ff5
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 63 deletions.
11 changes: 4 additions & 7 deletions config.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
api:
transilien:
url: https://api.transilien.com/gare/00000000/depart/00000000
user: user
username: username
password: password

refresh_time:
default: 10
step: 10
max: 30
refresh_time: 10

device:
display:
type: console
10 changes: 5 additions & 5 deletions rerwatcher/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from rerwatcher.transilien import Transilien
from rerwatcher.daemon import Daemon
from rerwatcher.display import DisplayDeviceFactory
from rerwatcher.display import DisplayBuilder
from rerwatcher.utils import overwrite_config_with_env


Expand All @@ -15,12 +15,12 @@ def __init__(self, *args, **kwargs):
super().__init__(app_name=app_name, *args, **kwargs)

config = RerWatcher.load_config()
matrix_display = DisplayDeviceFactory.build(config['device'])
transilien = Transilien(config['api'])
display = DisplayBuilder.build(config['display'])
transilien = Transilien(config['transilien'])

self._app = _App(
config=config,
display=matrix_display,
display=display,
transilien=transilien,
)

Expand All @@ -41,7 +41,7 @@ def __init__(self, config, display, transilien):
self.is_running = False
self.transilien = transilien
self.display = display
self._refresh_time = config['refresh_time']['default']
self._refresh_time = config['refresh_time']

def start(self):
self.is_running = True
Expand Down
12 changes: 6 additions & 6 deletions rerwatcher/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
from RPLCD import CharLCD


class DisplayTypeNotSupportedError(NotImplementedError):
class UnknownDisplayTypeError(NotImplementedError):
pass


class DisplayDevice(ABC):
class Display(ABC):
@abstractmethod
def print(self, messages):
raise NotImplementedError


class Console(DisplayDevice):
class Console(Display):
def print(self, messages):
for message in messages:
print(message)


class LCD(DisplayDevice):
class LCD(Display):
def __init__(self):
self._device = CharLCD('PCF8574', 0x27)

Expand All @@ -29,7 +29,7 @@ def print(self, messages):
self._device.write_string(message)


class DisplayDeviceFactory(ABC):
class DisplayBuilder(ABC):
@staticmethod
def build(config: dict):
display = {
Expand All @@ -38,6 +38,6 @@ def build(config: dict):
}.get(config['type'])

if not display:
raise DisplayTypeNotSupportedError
raise UnknownDisplayTypeError

return display()
12 changes: 6 additions & 6 deletions rerwatcher/transilien.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@


class Requester:
def __init__(self, config: dict):
self._url = config['url']
def __init__(self, url: str, username: str, password: str):
self._url = url
self._auth = HTTPBasicAuth(
username=config['user'],
password=config['password']
username=username,
password=password
)

@request_error_handler
Expand Down Expand Up @@ -67,8 +67,8 @@ def _format_timedelta(time_delta: timedelta):


class Transilien:
def __init__(self, config):
self.requester = Requester(config)
def __init__(self, config: dict):
self.requester = Requester(**config)
self.formatter = Formatter()

@fetch_data_error_handler
Expand Down
4 changes: 0 additions & 4 deletions settings.env.dist

This file was deleted.

12 changes: 4 additions & 8 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,13 @@
logger.disable('rerwatcher')

CONFIG = {
'api': {
'transilien': {
'url': 'https://test.url/00000000/d/00000000',
'user': 'user',
'username': 'username',
'password': 'password',
},
'refresh_time': {
'default': 10,
'step': 10,
'max': 30,
},
'device': {
'refresh_time': 10,
'display': {
'type': 'console',
},
}
Expand Down
6 changes: 3 additions & 3 deletions tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@


def test_rerwatcher_load_config(mocker):
mocker.patch.dict(os.environ, {'API__URL': 'http://test.url'})
mocker.patch.dict(os.environ, {'TRANSILIEN__URL': 'http://test.url'})

config = RerWatcher.load_config()

assert config['api']['url'] == 'http://test.url'
assert config['device']['type'] == 'console'
assert config['transilien']['url'] == 'http://test.url'
assert config['display']['type'] == 'console'


def test_rerwatcher_workflow(mocker, mock_config, capsys):
Expand Down
28 changes: 14 additions & 14 deletions tests/test_display.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pytest

from rerwatcher.display import (LCD, Console, DisplayDeviceFactory,
DisplayTypeNotSupportedError)
from rerwatcher.display import (LCD, Console, DisplayBuilder,
UnknownDisplayTypeError)


class TestLCDDisplay:
Expand All @@ -27,22 +27,22 @@ def test_print_on_console(self, capsys):
assert 'TEST: 12min\n' == captured.out


class TestDisplayDeviceFactory:
def test_device_builder_console_display(self, config):
device = DisplayDeviceFactory.build(config['device'])
class TestDisplayFactory:
def test_display_builder_console(self, config):
display = DisplayBuilder.build(config['display'])

assert isinstance(device, Console)
assert isinstance(display, Console)

def test_device_builder_matrix_display(self, mocker, config):
def test_display_builder_lcd(self, mocker, config):
mocker.patch('rerwatcher.display.CharLCD')
config['device']['type'] = 'lcd'
config['display']['type'] = 'lcd'

device = DisplayDeviceFactory.build(config['device'])
display = DisplayBuilder.build(config['display'])

assert isinstance(device, LCD)
assert isinstance(display, LCD)

def test_device_builder_fail(self, config):
config['device']['type'] = 'foo'
def test_display_builder_fail(self, config):
config['display']['type'] = 'foo'

with pytest.raises(DisplayTypeNotSupportedError):
DisplayDeviceFactory.build(config['device'])
with pytest.raises(UnknownDisplayTypeError):
DisplayBuilder.build(config['display'])
21 changes: 11 additions & 10 deletions tests/test_transilien.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,22 @@

class TestRequester:
def test_request(self, mocker, config):
config = config['transilien']
response = mocker.Mock()
response.status_code = 200
response.text = 'foo'
requests = mocker.patch(
'rerwatcher.transilien.requests.get',
return_value=response
)
requester = Requester(config['api'])
requester = Requester(**config)

result = requester.request()

url = config['api']['url']
url = config['url']
auth = HTTPBasicAuth(
username=config['api']['user'],
password=config['api']['password']
username=config['username'],
password=config['password']
)
requests.assert_called_once_with(url=url, auth=auth)
assert 'foo' == result
Expand All @@ -37,7 +38,7 @@ def test_request_fails_if_response_is_not_200(self, mocker, config):
'rerwatcher.transilien.requests.get',
return_value=response
)
requester = Requester(config['api'])
requester = Requester(**config['transilien'])

with pytest.raises(RequestError):
requester.request()
Expand All @@ -48,7 +49,7 @@ def test_request_fails(self, mocker, config, exception):
'rerwatcher.transilien.requests.get',
side_effect=exception
)
requester = Requester(config['api'])
requester = Requester(**config['transilien'])

with pytest.raises(RequestError):
requester.request()
Expand Down Expand Up @@ -92,7 +93,7 @@ def test_fetch_data(self, mocker, config):
'rerwatcher.transilien.Formatter.format',
return_value=sentinel.data
)
transilien = Transilien(config['api'])
transilien = Transilien(config['transilien'])

result = transilien.fetch_data()

Expand All @@ -105,7 +106,7 @@ def test_fetch_data_fails_on_request(self, mocker, config):
side_effect=RequestException
)
formatter = mocker.patch('rerwatcher.transilien.Formatter.format')
transilien = Transilien(config['api'])
transilien = Transilien(config['transilien'])

result = transilien.fetch_data()

Expand All @@ -121,7 +122,7 @@ def test_fetch_data_fails_on_format(self, mocker, config):
'rerwatcher.transilien.etree.fromstring',
side_effect=Exception
)
transilien = Transilien(config['api'])
transilien = Transilien(config['transilien'])

result = transilien.fetch_data()

Expand All @@ -132,7 +133,7 @@ def test_fetch_data_failst(self, mocker, config):
'rerwatcher.transilien.Requester.request',
side_effect=Exception
)
transilien = Transilien(config['api'])
transilien = Transilien(config['transilien'])

with pytest.raises(Exception):
transilien.fetch_data()

0 comments on commit c257ff5

Please sign in to comment.