From b0e7786d9f6735c6c579ca5186c698bb99240457 Mon Sep 17 00:00:00 2001 From: Yuriy Taraday Date: Fri, 25 Mar 2016 15:46:32 +0300 Subject: [PATCH] Add id_or_name URL converter Change-Id: I615d28eb17963466c232562ff1a1791fe0d43879 --- tuning_box/converters.py | 16 ++++++++++++++ tuning_box/tests/test_converters.py | 33 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/tuning_box/converters.py b/tuning_box/converters.py index 9832459..9944d71 100644 --- a/tuning_box/converters.py +++ b/tuning_box/converters.py @@ -41,6 +41,22 @@ class Levels(routing.BaseConverter): for p in parts) return ''.join(p + '/' for p in quoted_parts) + +class IdOrName(routing.BaseConverter): + """Converter that matches either int or URL part including "/" as string""" + + regex = '[^/].*?' + + def to_python(self, value): + try: + return int(value) + except ValueError: + return value + + def to_url(self, value): + return super(IdOrName, self).to_url(str(value)) + ALL = { 'levels': Levels, + 'id_or_name': IdOrName, } diff --git a/tuning_box/tests/test_converters.py b/tuning_box/tests/test_converters.py index 2539fa9..6c217b6 100644 --- a/tuning_box/tests/test_converters.py +++ b/tuning_box/tests/test_converters.py @@ -50,3 +50,36 @@ class TestLevels(base.TestCase): res = self.mapad.build( 'l', {'levels': [('level1', 'value1'), ('level2', 'value2')]}) self.assertEqual(res, '/smth/level1/value1/level2/value2/values') + + +class TestIdOrName(base.TestCase): + def setUp(self): + super(TestIdOrName, self).setUp() + self.map = routing.Map([ + routing.Rule('/', endpoint='i'), + ], converters={'id_or_name': converters.IdOrName}) + self.mapad = self.map.bind('example.org', '/') + + def test_int(self): + route, kwargs = self.mapad.match('/1') + self.assertEqual(kwargs['id_or_name'], 1) + + def test_name(self): + route, kwargs = self.mapad.match('/name') + self.assertEqual(kwargs['id_or_name'], 'name') + + def test_name_with_slashes(self): + route, kwargs = self.mapad.match('/name/with/slashes') + self.assertEqual(kwargs['id_or_name'], 'name/with/slashes') + + def test_reverse_int(self): + res = self.mapad.build('i', {'id_or_name': 1}) + self.assertEqual(res, '/1') + + def test_reverse_name(self): + res = self.mapad.build('i', {'id_or_name': 'name'}) + self.assertEqual(res, '/name') + + def test_reverse_name_with_slashes(self): + res = self.mapad.build('i', {'id_or_name': 'name/with/slashes'}) + self.assertEqual(res, '/name/with/slashes')