diff options
-rw-r--r-- | .travis.yml | 15 | ||||
-rw-r--r-- | routes/mapper.py | 6 | ||||
-rw-r--r-- | routes/route.py | 12 | ||||
-rw-r--r-- | routes/util.py | 4 | ||||
-rw-r--r-- | setup.py | 4 | ||||
-rw-r--r-- | tests/test_units/test_route_escapes.py | 69 | ||||
-rw-r--r-- | tox.ini | 10 |
7 files changed, 65 insertions, 55 deletions
diff --git a/.travis.yml b/.travis.yml index 11b7981..f9a351f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,18 @@ language: python python: -- '2.7' -- '3.4' -- '3.5' -- '3.6' -- nightly -- pypy -- pypy3 + - '2.7' + - '3.5' + - '3.6' + - nightly + - pypy + - pypy3 matrix: allow_failures: - python: nightly install: pip install tox-travis script: tox after_success: -- codecov + - codecov deploy: provider: pypi user: bbangert diff --git a/routes/mapper.py b/routes/mapper.py index 3de0cfe..8916fd3 100644 --- a/routes/mapper.py +++ b/routes/mapper.py @@ -515,7 +515,7 @@ class Mapper(SubMapperParent): m.connect('date/:year/:month/:day', controller="blog", action="view") m.connect('archives/:page', controller="blog", action="by_page", - requirements = { 'page':'\d{1,2}' }) + requirements = { 'page':'\\d{1,2}' }) m.connect('category_list', 'archives/category/:section', controller='blog', action='category', section='home', type='list') @@ -999,7 +999,7 @@ class Mapper(SubMapperParent): map.resource('message', 'messages', path_prefix='{project_id}/', - requirements={"project_id": R"\d+"}) + requirements={"project_id": R"\\d+"}) # POST /01234/message # success, project_id is set to "01234" # POST /foo/message @@ -1181,7 +1181,7 @@ class Mapper(SubMapperParent): **route_options) self.connect(name_prefix + name, path, **route_options) - requirements_regexp = '[^\/]+(?<!\\\)' + requirements_regexp = '[^\\/]+(?<!\\\\)' # Add the routes that deal with member methods of a resource for method, lst in six.iteritems(member_methods): diff --git a/routes/route.py b/routes/route.py index 54a37fe..cf6df10 100644 --- a/routes/route.py +++ b/routes/route.py @@ -35,9 +35,9 @@ class Route(object): >>> newroute = Route(None, 'date/:year/:month/:day', ... controller="blog", action="view") >>> newroute = Route(None, 'archives/:page', controller="blog", - ... action="by_page", requirements = { 'page':'\d{1,2}' }) + ... action="by_page", requirements = { 'page':'\\d{1,2}' }) >>> newroute.reqs - {'page': '\\\d{1,2}'} + {'page': '\\\\d{1,2}'} .. Note:: Route is generally not called directly, a Mapper instance @@ -334,7 +334,7 @@ class Route(object): else: regpart = '(?:%s)' % partmatch if part['type'] == '.': - regparts.append('(?:\.%s)??' % regpart) + regparts.append(r'(?:\.%s)??' % regpart) else: regparts.append(regpart) else: @@ -377,7 +377,7 @@ class Route(object): else: partreg = '(?:%s)' % self.reqs[var] if typ == '.': - partreg = '(?:\.%s)??' % partreg + partreg = r'(?:\.%s)??' % partreg elif var == 'controller': if include_names: partreg = '(?P<%s>%s)' % (var, '|'.join(map(re.escape, @@ -400,7 +400,7 @@ class Route(object): else: partreg = '(?:[^%s]+?)' % exclude_chars if typ == '.': - partreg = '(?:\.%s)??' % partreg + partreg = r'(?:\.%s)??' % partreg else: end = ''.join(self.done_chars) rem = rest @@ -540,7 +540,7 @@ class Route(object): if sub_domains and environ and 'HTTP_HOST' in environ: host = environ['HTTP_HOST'].split(':')[0] - sub_match = re.compile('^(.+?)\.%s$' % domain_match) + sub_match = re.compile(r'^(.+?)\.%s$' % domain_match) subdomain = re.sub(sub_match, r'\1', host) if subdomain not in sub_domains_ignore and host != subdomain: sub_domain = subdomain diff --git a/routes/util.py b/routes/util.py index c48445f..54c8951 100644 --- a/routes/util.py +++ b/routes/util.py @@ -94,7 +94,7 @@ def _subdomain_check(kargs, mapper, environ): if len(hostmatch) > 1: port += ':' + hostmatch[1] - match = re.match('^(.+?)\.(%s)$' % mapper.domain_match, host) + match = re.match(r'^(.+?)\.(%s)$' % mapper.domain_match, host) host_subdomain, domain = match.groups() if match else (None, host) subdomain = as_unicode(subdomain, mapper.encoding) @@ -512,7 +512,7 @@ def controller_scan(directory=None): for fname in os.listdir(dirname): filename = os.path.join(dirname, fname) if os.path.isfile(filename) and \ - re.match('^[^_]{1,1}.*\.py$', fname): + re.match(r'^[^_]{1,1}.*\.py$', fname): controllers.append(prefix + fname[:-3]) elif os.path.isdir(filename): controllers.extend(find_controllers(filename, @@ -43,12 +43,8 @@ setup(name="Routes", "Programming Language :: Python :: Implementation :: CPython", 'Programming Language :: Python', "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.2", - "Programming Language :: Python :: 3.3", - "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], diff --git a/tests/test_units/test_route_escapes.py b/tests/test_units/test_route_escapes.py index fadfd5e..5db07c4 100644 --- a/tests/test_units/test_route_escapes.py +++ b/tests/test_units/test_route_escapes.py @@ -1,31 +1,38 @@ -import unittest
-from routes.route import Route
-
-class TestRouteEscape(unittest.TestCase):
- def test_normal_route(self):
- r = Route('test', '/foo/bar')
- self.assertEqual(r.routelist, ['/foo/bar'])
-
- def test_route_with_backslash(self):
- r = Route('test', '/foo\\\\bar')
- self.assertEqual(r.routelist, ['/foo\\bar'])
-
- def test_route_with_random_escapes(self):
- r = Route('test', '\\/f\\oo\\/ba\\r')
- self.assertEqual(r.routelist, ['\\/f\\oo\\/ba\\r'])
-
- def test_route_with_colon(self):
- r = Route('test', '/foo:bar/baz')
- self.assertEqual(r.routelist, ['/foo', {'name': 'bar', 'type': ':'}, '/', 'baz'])
-
- def test_route_with_escaped_colon(self):
- r = Route('test', '/foo\\:bar/baz')
- self.assertEqual(r.routelist, ['/foo:bar/baz'])
-
- def test_route_with_both_colons(self):
- r = Route('test', '/prefix/escaped\\:escaped/foo=:notescaped/bar=42')
- self.assertEqual(r.routelist, ['/prefix/escaped:escaped/foo=', {'name': 'notescaped', 'type': ':'}, '/', 'bar=42'])
-
- def test_route_with_all_escapes(self):
- r = Route('test', '/hmm\\:\\*\\{\\}*star/{brackets}/:colon')
- self.assertEqual(r.routelist, ['/hmm:*{}', {'name': 'star', 'type': '*'}, '/', {'name': 'brackets', 'type': ':'}, '/', {'name': 'colon', 'type': ':'}])
+import unittest +from routes.route import Route + + +class TestRouteEscape(unittest.TestCase): + def test_normal_route(self): + r = Route('test', '/foo/bar') + self.assertEqual(r.routelist, ['/foo/bar']) + + def test_route_with_backslash(self): + r = Route('test', '/foo\\\\bar') + self.assertEqual(r.routelist, ['/foo\\bar']) + + def test_route_with_random_escapes(self): + r = Route('test', '\\/f\\oo\\/ba\\r') + self.assertEqual(r.routelist, ['\\/f\\oo\\/ba\\r']) + + def test_route_with_colon(self): + r = Route('test', '/foo:bar/baz') + self.assertEqual( + r.routelist, ['/foo', {'name': 'bar', 'type': ':'}, '/', 'baz']) + + def test_route_with_escaped_colon(self): + r = Route('test', '/foo\\:bar/baz') + self.assertEqual(r.routelist, ['/foo:bar/baz']) + + def test_route_with_both_colons(self): + r = Route('test', '/prefix/escaped\\:escaped/foo=:notescaped/bar=42') + self.assertEqual( + r.routelist, ['/prefix/escaped:escaped/foo=', + {'name': 'notescaped', 'type': ':'}, '/', 'bar=42']) + + def test_route_with_all_escapes(self): + r = Route('test', '/hmm\\:\\*\\{\\}*star/{brackets}/:colon') + self.assertEqual( + r.routelist, ['/hmm:*{}', {'name': 'star', 'type': '*'}, '/', + {'name': 'brackets', 'type': ':'}, '/', + {'name': 'colon', 'type': ':'}]) @@ -1,5 +1,5 @@ [tox] -envlist = py26,py27,py33,py34,py35,py36,pypy,pypy3 +envlist = py{27,35,36},pypy,pypy3,style [testenv] deps= @@ -12,3 +12,11 @@ commands= pip install .[middleware] # webob optional dependency is fulfilled by [middleware] extra requirement python -c "import webob" + +[testenv:style] +deps = flake8 +commands = flake8 routes + +[flake8] +# These are all ignored until someone decided to go fix them +ignore = E125,E127,E128,E226,E305,E402,E501,E502,E504,F401,W503,W504 |