diff --git a/.gitignore b/.gitignore index ac1655a1e..674722aac 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ MANIFEST /doc .coverage netlib +venv diff --git a/libpathod/rparse.py b/libpathod/rparse.py index 6306f7461..e08da49f5 100644 --- a/libpathod/rparse.py +++ b/libpathod/rparse.py @@ -155,20 +155,29 @@ class FileGenerator: return self.map.__getslice__(a, b) -class ValueLiteral: +class _Value: def __init__(self, val): self.val = val def get_generator(self, settings): return LiteralGenerator(self.val) + def __str__(self): + return self.val + + +class ValueLiteral(_Value): @classmethod def expr(klass): e = v_literal.copy() return e.setParseAction(lambda x: klass(*x)) - def __str__(self): - return self.val + +class ValueNakedLiteral(_Value): + @classmethod + def expr(klass): + e = v_naked_literal.copy() + return e.setParseAction(lambda x: klass(*x)) class ValueGenerate: @@ -238,6 +247,16 @@ Value = pp.MatchFirst( ) +NakedValue = pp.MatchFirst( + [ + ValueGenerate.expr(), + ValueFile.expr(), + ValueLiteral.expr(), + ValueNakedLiteral.expr(), + ] +) + + class ShortcutContentType: def __init__(self, value): self.value = value @@ -302,7 +321,7 @@ class Path: @classmethod def expr(klass): - e = v_naked_literal.copy() + e = NakedValue.copy() return e.setParseAction(lambda x: klass(*x)) diff --git a/test/test_rparse.py b/test/test_rparse.py index 9f330f510..cb1076c28 100644 --- a/test/test_rparse.py +++ b/test/test_rparse.py @@ -42,6 +42,10 @@ class TestMisc: assert v.expr() assert str(v) + def test_valuenakedliteral(self): + v = rparse.ValueNakedLiteral("foo") + assert v.expr() + def test_file_value(self): v = rparse.Value.parseString("<'one two'")[0] assert str(v) @@ -200,6 +204,10 @@ class TestParseRequest: r = rparse.parse_request({}, 'GET:"/foo"') assert r.method == "GET" assert r.path == "/foo" + r = rparse.parse_request({}, 'GET:/foo') + assert r.path == "/foo" + r = rparse.parse_request({}, 'GET:@1k') + assert len(r.path) == 1024 def test_render(self): s = cStringIO.StringIO()