diff options
Diffstat (limited to 'libpathod')
-rw-r--r-- | libpathod/language/actions.py | 8 | ||||
-rw-r--r-- | libpathod/language/base.py | 79 | ||||
-rw-r--r-- | libpathod/language/http.py | 40 |
3 files changed, 53 insertions, 74 deletions
diff --git a/libpathod/language/actions.py b/libpathod/language/actions.py index 27bbd3d2..e86394a0 100644 --- a/libpathod/language/actions.py +++ b/libpathod/language/actions.py @@ -52,7 +52,7 @@ class PauseAt(_Action): @classmethod def expr(klass): e = pp.Literal("p").suppress() - e += base.Offset + e += base.TokOffset e += pp.Literal(",").suppress() e += pp.MatchFirst( [ @@ -79,7 +79,7 @@ class DisconnectAt(_Action): @classmethod def expr(klass): e = pp.Literal("d").suppress() - e += base.Offset + e += base.TokOffset return e.setParseAction(lambda x: klass(*x)) def spec(self): @@ -100,9 +100,9 @@ class InjectAt(_Action): @classmethod def expr(klass): e = pp.Literal("i").suppress() - e += base.Offset + e += base.TokOffset e += pp.Literal(",").suppress() - e += base.Value + e += base.TokValue return e.setParseAction(lambda x: klass(*x)) def spec(self): diff --git a/libpathod/language/base.py b/libpathod/language/base.py index c473a6a8..d80eec99 100644 --- a/libpathod/language/base.py +++ b/libpathod/language/base.py @@ -40,7 +40,9 @@ v_naked_literal = pp.MatchFirst( class Token(object): """ - A specification token. Tokens are immutable. + A token in the specification language. Tokens are immutable. The token + classes have no meaning in and of themselves, and are combined into + Components and Actions to build the language. """ __metaclass__ = abc.ABCMeta @@ -72,7 +74,7 @@ class Token(object): return self.spec() -class _ValueLiteral(Token): +class _TokValueLiteral(Token): def __init__(self, val): self.val = val.decode("string_escape") @@ -83,7 +85,7 @@ class _ValueLiteral(Token): return self -class ValueLiteral(_ValueLiteral): +class TokValueLiteral(_TokValueLiteral): """ A literal with Python-style string escaping """ @@ -103,7 +105,7 @@ class ValueLiteral(_ValueLiteral): return "'" + inner + "'" -class ValueNakedLiteral(_ValueLiteral): +class TokValueNakedLiteral(_TokValueLiteral): @classmethod def expr(klass): e = v_naked_literal.copy() @@ -113,7 +115,7 @@ class ValueNakedLiteral(_ValueLiteral): return self.val.encode("string_escape") -class ValueGenerate(Token): +class TokValueGenerate(Token): def __init__(self, usize, unit, datatype): if not unit: unit = "b" @@ -127,7 +129,7 @@ class ValueGenerate(Token): def freeze(self, settings): g = self.get_generator(settings) - return ValueLiteral(g[:].encode("string_escape")) + return TokValueLiteral(g[:].encode("string_escape")) @classmethod def expr(klass): @@ -156,7 +158,7 @@ class ValueGenerate(Token): return s -class ValueFile(Token): +class TokValueFile(Token): def __init__(self, path): self.path = str(path) @@ -189,26 +191,26 @@ class ValueFile(Token): return "<'%s'"%self.path.encode("string_escape") -Value = pp.MatchFirst( +TokValue = pp.MatchFirst( [ - ValueGenerate.expr(), - ValueFile.expr(), - ValueLiteral.expr() + TokValueGenerate.expr(), + TokValueFile.expr(), + TokValueLiteral.expr() ] ) -NakedValue = pp.MatchFirst( +TokNakedValue = pp.MatchFirst( [ - ValueGenerate.expr(), - ValueFile.expr(), - ValueLiteral.expr(), - ValueNakedLiteral.expr(), + TokValueGenerate.expr(), + TokValueFile.expr(), + TokValueLiteral.expr(), + TokValueNakedLiteral.expr(), ] ) -Offset = pp.MatchFirst( +TokOffset = pp.MatchFirst( [ v_integer, pp.Literal("r"), @@ -247,9 +249,9 @@ class KeyValue(_Component): @classmethod def expr(klass): e = pp.Literal(klass.preamble).suppress() - e += Value + e += TokValue e += pp.Literal("=").suppress() - e += Value + e += TokValue return e.setParseAction(lambda x: klass(*x)) def spec(self): @@ -295,7 +297,7 @@ class OptionsOrValue(_Component): # string value literal. self.option_used = False if isinstance(value, basestring): - value = ValueLiteral(value.upper()) + value = TokValueLiteral(value.upper()) self.option_used = True self.value = value @@ -303,7 +305,7 @@ class OptionsOrValue(_Component): def expr(klass): parts = [pp.CaselessLiteral(i) for i in klass.options] m = pp.MatchFirst(parts) - spec = m | Value.copy() + spec = m | TokValue.copy() spec = spec.setParseAction(lambda x: klass(*x)) if klass.preamble: spec = pp.Literal(klass.preamble).suppress() + spec @@ -345,15 +347,18 @@ class Integer(_Component): class PreValue(_Component): """ - A value lead by self.preamble. + A value component lead by an optional preamble. """ + preamble = "" + def __init__(self, value): self.value = value @classmethod def expr(klass): - e = pp.Literal(klass.preamble).suppress() - e = e + Value + e = (TokValue | TokNakedValue) + if klass.preamble: + e = pp.Literal(klass.preamble).suppress() + e return e.setParseAction(lambda x: klass(*x)) def values(self, settings): @@ -364,29 +369,3 @@ class PreValue(_Component): def freeze(self, settings): return self.__class__(self.value.freeze(settings)) - - -class SimpleValue(_Component): - """ - A simple value - i.e. one without a preface. - """ - def __init__(self, value): - if isinstance(value, basestring): - value = ValueLiteral(value) - self.value = value - - @classmethod - def expr(klass): - e = Value | NakedValue - return e.setParseAction(lambda x: klass(*x)) - - def values(self, settings): - return [ - self.value.get_generator(settings), - ] - - def spec(self): - return "%s"%(self.value.spec()) - - def freeze(self, settings): - return self.__class__(self.value.freeze(settings)) diff --git a/libpathod/language/http.py b/libpathod/language/http.py index eb671d16..800d9f08 100644 --- a/libpathod/language/http.py +++ b/libpathod/language/http.py @@ -16,7 +16,7 @@ class Raw(base.CaselessLiteral): TOK = "r" -class Path(base.SimpleValue): +class Path(base.PreValue): pass @@ -62,18 +62,18 @@ class Header(_HeaderMixin, base.KeyValue): class ShortcutContentType(_HeaderMixin, base.PreValue): preamble = "c" - key = base.ValueLiteral("Content-Type") + key = base.TokValueLiteral("Content-Type") class ShortcutLocation(_HeaderMixin, base.PreValue): preamble = "l" - key = base.ValueLiteral("Location") + key = base.TokValueLiteral("Location") class ShortcutUserAgent(_HeaderMixin, base.OptionsOrValue): preamble = "u" options = [i[1] for i in http_uastrings.UASTRINGS] - key = base.ValueLiteral("User-Agent") + key = base.TokValueLiteral("User-Agent") def values(self, settings): if self.option_used: @@ -104,7 +104,7 @@ class PathodResponse(base.Token): @classmethod def expr(klass): e = pp.Literal("s").suppress() - e = e + base.ValueLiteral.expr() + e = e + base.TokValueLiteral.expr() return e.setParseAction(lambda x: klass(*x)) def values(self, settings): @@ -117,7 +117,7 @@ class PathodResponse(base.Token): def freeze(self, settings): f = self.parsed.freeze(settings).spec() - return PathodResponse(base.ValueLiteral(f.encode("string_escape"))) + return PathodResponse(base.TokValueLiteral(f.encode("string_escape"))) def get_header(val, headers): @@ -227,8 +227,8 @@ class Response(_HTTPMessage): if not get_header(i[0], self.headers): tokens.append( Header( - base.ValueLiteral(i[0]), - base.ValueLiteral(i[1])) + base.TokValueLiteral(i[0]), + base.TokValueLiteral(i[1])) ) if not self.raw: if not get_header("Content-Length", self.headers): @@ -240,8 +240,8 @@ class Response(_HTTPMessage): ) tokens.append( Header( - base.ValueLiteral("Content-Length"), - base.ValueLiteral(str(length)), + base.TokValueLiteral("Content-Length"), + base.TokValueLiteral(str(length)), ) ) intermediate = self.__class__(tokens) @@ -326,8 +326,8 @@ class Request(_HTTPMessage): if not get_header(i[0], self.headers): tokens.append( Header( - base.ValueLiteral(i[0]), - base.ValueLiteral(i[1]) + base.TokValueLiteral(i[0]), + base.TokValueLiteral(i[1]) ) ) if not self.raw: @@ -338,16 +338,16 @@ class Request(_HTTPMessage): ) tokens.append( Header( - base.ValueLiteral("Content-Length"), - base.ValueLiteral(str(length)), + base.TokValueLiteral("Content-Length"), + base.TokValueLiteral(str(length)), ) ) if settings.request_host: if not get_header("Host", self.headers): tokens.append( Header( - base.ValueLiteral("Host"), - base.ValueLiteral(settings.request_host) + base.TokValueLiteral("Host"), + base.TokValueLiteral(settings.request_host) ) ) intermediate = self.__class__(tokens) @@ -389,10 +389,10 @@ def make_error_response(reason, body=None): tokens = [ Code("800"), Header( - base.ValueLiteral("Content-Type"), - base.ValueLiteral("text/plain") + base.TokValueLiteral("Content-Type"), + base.TokValueLiteral("text/plain") ), - Reason(base.ValueLiteral(reason)), - Body(base.ValueLiteral("pathod error: " + (body or reason))), + Reason(base.TokValueLiteral(reason)), + Body(base.TokValueLiteral("pathod error: " + (body or reason))), ] return PathodErrorResponse(tokens) |