diff options
Diffstat (limited to 'libpathod/language')
-rw-r--r-- | libpathod/language/__init__.py | 7 | ||||
-rw-r--r-- | libpathod/language/actions.py | 11 | ||||
-rw-r--r-- | libpathod/language/base.py | 38 | ||||
-rw-r--r-- | libpathod/language/exceptions.py | 4 | ||||
-rw-r--r-- | libpathod/language/generators.py | 7 | ||||
-rw-r--r-- | libpathod/language/http.py | 7 | ||||
-rw-r--r-- | libpathod/language/message.py | 2 | ||||
-rw-r--r-- | libpathod/language/websockets.py | 1 | ||||
-rw-r--r-- | libpathod/language/writer.py | 2 |
9 files changed, 43 insertions, 36 deletions
diff --git a/libpathod/language/__init__.py b/libpathod/language/__init__.py index 2444d532..c3d34c2e 100644 --- a/libpathod/language/__init__.py +++ b/libpathod/language/__init__.py @@ -18,7 +18,7 @@ def parse_response(s): raise exceptions.ParseException("Spec must be valid ASCII.", 0, 0) try: return http.Response.expr().parseString(s, parseAll=True)[0] - except pp.ParseException, v: + except pp.ParseException as v: raise exceptions.ParseException(v.msg, v.line, v.col) @@ -39,7 +39,7 @@ def parse_requests(s): ] ) ).parseString(s, parseAll=True) - except pp.ParseException, v: + except pp.ParseException as v: raise exceptions.ParseException(v.msg, v.line, v.col) expanded = [] for i in reqs: @@ -67,8 +67,7 @@ def serve(msg, fp, settings): vals = msg.values(settings) vals.reverse() - actions = msg.actions[:] - actions.sort() + actions = sorted(msg.actions[:]) actions.reverse() actions = [i.intermediate(settings) for i in actions] diff --git a/libpathod/language/actions.py b/libpathod/language/actions.py index f5b828fe..40adb4ea 100644 --- a/libpathod/language/actions.py +++ b/libpathod/language/actions.py @@ -13,6 +13,7 @@ class _Action(base.Token): actions have one thing in common: an offset that specifies where the action should take place. """ + def __init__(self, offset): self.offset = offset @@ -36,11 +37,11 @@ class _Action(base.Token): return self.spec() @abc.abstractmethod - def spec(self): # pragma: no cover + def spec(self): # pragma: no cover pass @abc.abstractmethod - def intermediate(self, settings): # pragma: no cover + def intermediate(self, settings): # pragma: no cover pass @@ -65,7 +66,7 @@ class PauseAt(_Action): return e.setParseAction(lambda x: klass(*x)) def spec(self): - return "p%s,%s"%(self.offset, self.seconds) + return "p%s,%s" % (self.offset, self.seconds) def intermediate(self, settings): return (self.offset, "pause", self.seconds) @@ -85,7 +86,7 @@ class DisconnectAt(_Action): return e.setParseAction(lambda x: klass(*x)) def spec(self): - return "d%s"%self.offset + return "d%s" % self.offset def intermediate(self, settings): return (self.offset, "disconnect") @@ -110,7 +111,7 @@ class InjectAt(_Action): return e.setParseAction(lambda x: klass(*x)) def spec(self): - return "i%s,%s"%(self.offset, self.value.spec()) + return "i%s,%s" % (self.offset, self.value.spec()) def intermediate(self, settings): return ( diff --git a/libpathod/language/base.py b/libpathod/language/base.py index a957442e..4475d15b 100644 --- a/libpathod/language/base.py +++ b/libpathod/language/base.py @@ -5,6 +5,7 @@ import pyparsing as pp from .. import utils from . import generators, exceptions +from functools import reduce class Settings: @@ -23,7 +24,6 @@ class Settings: self.is_client = is_client - Sep = pp.Optional(pp.Literal(":")).suppress() @@ -64,14 +64,14 @@ class Token(object): __metaclass__ = abc.ABCMeta @classmethod - def expr(klass): # pragma: no cover + def expr(klass): # pragma: no cover """ A parse expression. """ return None @abc.abstractmethod - def spec(self): # pragma: no cover + def spec(self): # pragma: no cover """ A parseable specification for this token. """ @@ -176,11 +176,11 @@ class TokValueGenerate(Token): return e.setParseAction(lambda x: klass(*x)) def spec(self): - s = "@%s"%self.usize + s = "@%s" % self.usize if self.unit != "b": s += self.unit if self.datatype != "bytes": - s += ",%s"%self.datatype + s += ",%s" % self.datatype return s @@ -214,7 +214,7 @@ class TokValueFile(Token): return generators.FileGenerator(s) def spec(self): - return "<'%s'"%self.path.encode("string_escape") + return "<'%s'" % self.path.encode("string_escape") TokValue = pp.MatchFirst( @@ -250,7 +250,8 @@ class _Component(Token): A value component of the primary specification of an message. Components produce byte values desribe the bytes of the message. """ - def values(self, settings): # pragma: no cover + + def values(self, settings): # pragma: no cover """ A sequence of values, which can either be strings or generators. """ @@ -268,6 +269,7 @@ class KeyValue(_Component): A key/value pair. klass.preamble: leader """ + def __init__(self, key, value): self.key, self.value = key, value @@ -280,7 +282,7 @@ class KeyValue(_Component): return e.setParseAction(lambda x: klass(*x)) def spec(self): - return "%s%s=%s"%(self.preamble, self.key.spec(), self.value.spec()) + return "%s%s=%s" % (self.preamble, self.key.spec(), self.value.spec()) def freeze(self, settings): return self.__class__( @@ -292,6 +294,7 @@ class CaselessLiteral(_Component): """ A caseless token that can take only one value. """ + def __init__(self, value): self.value = value @@ -317,6 +320,7 @@ class OptionsOrValue(_Component): """ preamble = "" options = [] + def __init__(self, value): # If it's a string, we were passed one of the options, so we lower-case # it to be canonical. The user can specify a different case by using a @@ -350,7 +354,7 @@ class OptionsOrValue(_Component): s = self.value.spec() if s[1:-1].lower() in self.options: s = s[1:-1].lower() - return "%s%s"%(self.preamble, s) + return "%s%s" % (self.preamble, s) def freeze(self, settings): return self.__class__(self.value.freeze(settings)) @@ -368,7 +372,7 @@ class Integer(_Component): ]) if outofbounds: raise exceptions.ParseException( - "Integer value must be between %s and %s."%self.bounds, + "Integer value must be between %s and %s." % self.bounds, 0, 0 ) self.value = str(value) @@ -384,7 +388,7 @@ class Integer(_Component): return self.value def spec(self): - return "%s%s"%(self.preamble, self.value) + return "%s%s" % (self.preamble, self.value) def freeze(self, settings): return self @@ -410,7 +414,7 @@ class Value(_Component): return [self.value.get_generator(settings)] def spec(self): - return "%s%s"%(self.preamble, self.value.spec()) + return "%s%s" % (self.preamble, self.value.spec()) def freeze(self, settings): return self.__class__(self.value.freeze(settings)) @@ -433,7 +437,7 @@ class FixedLengthValue(Value): # This check will fail if we know the length upfront if lenguess is not None and lenguess != self.length: raise exceptions.RenderError( - "Invalid value length: '%s' is %s bytes, should be %s."%( + "Invalid value length: '%s' is %s bytes, should be %s." % ( self.spec(), lenguess, self.length @@ -447,7 +451,7 @@ class FixedLengthValue(Value): # file inputs if l != self.length: raise exceptions.RenderError( - "Invalid value length: '%s' is %s bytes, should be %s."%( + "Invalid value length: '%s' is %s bytes, should be %s." % ( self.spec(), l, self.length @@ -481,7 +485,7 @@ class Boolean(_Component): return e.setParseAction(parse) def spec(self): - return "%s%s"%("-" if not self.value else "", self.name) + return "%s%s" % ("-" if not self.value else "", self.name) class IntField(_Component): @@ -497,7 +501,7 @@ class IntField(_Component): self.value = self.names.get(value, value) if self.value > self.max: raise exceptions.ParseException( - "Value can't exceed %s"%self.max, 0, 0 + "Value can't exceed %s" % self.max, 0, 0 ) @classmethod @@ -514,4 +518,4 @@ class IntField(_Component): return [str(self.value)] def spec(self): - return "%s%s"%(self.preamble, self.origvalue) + return "%s%s" % (self.preamble, self.origvalue) diff --git a/libpathod/language/exceptions.py b/libpathod/language/exceptions.py index c9d0b2f0..a65c7936 100644 --- a/libpathod/language/exceptions.py +++ b/libpathod/language/exceptions.py @@ -15,7 +15,7 @@ class ParseException(Exception): self.col = col def marked(self): - return "%s\n%s"%(self.s, " " * (self.col - 1) + "^") + return "%s\n%s" % (self.s, " " * (self.col - 1) + "^") def __str__(self): - return "%s at char %s"%(self.msg, self.col) + return "%s at char %s" % (self.msg, self.col) diff --git a/libpathod/language/generators.py b/libpathod/language/generators.py index 07b0be06..0da0cb4d 100644 --- a/libpathod/language/generators.py +++ b/libpathod/language/generators.py @@ -24,6 +24,7 @@ class TransformGenerator: gen: A generator to wrap transform: A function (offset, data) -> transformed """ + def __init__(self, gen, transform): self.gen = gen self.transform = transform @@ -40,7 +41,7 @@ class TransformGenerator: return self.transform(a, d) def __repr__(self): - return "'transform(%s)'"%self.gen + return "'transform(%s)'" % self.gen class RandomGenerator: @@ -60,7 +61,7 @@ class RandomGenerator: return "".join(random.choice(chars) for x in range(a, b)) def __repr__(self): - return "%s random from %s"%(self.length, self.dtype) + return "%s random from %s" % (self.length, self.dtype) class FileGenerator: @@ -79,4 +80,4 @@ class FileGenerator: return self.map.__getslice__(a, b) def __repr__(self): - return "<%s"%self.path + return "<%s" % self.path diff --git a/libpathod/language/http.py b/libpathod/language/http.py index 543cfee3..76362253 100644 --- a/libpathod/language/http.py +++ b/libpathod/language/http.py @@ -104,7 +104,7 @@ class PathodResponse(base.Token): parseAll=True ) ) - except pp.ParseException, v: + except pp.ParseException as v: raise exceptions.ParseException(v.msg, v.line, v.col) @classmethod @@ -119,7 +119,7 @@ class PathodResponse(base.Token): ] def spec(self): - return "s%s"%(self.value.spec()) + return "s%s" % (self.value.spec()) def freeze(self, settings): f = self.parsed.freeze(settings).spec() @@ -140,6 +140,7 @@ def get_header(val, headers): class _HTTPMessage(message.Message): version = "HTTP/1.1" + @property def actions(self): return self.toks(actions._Action) @@ -153,7 +154,7 @@ class _HTTPMessage(message.Message): return self.tok(Body) @abc.abstractmethod - def preamble(self, settings): # pragma: no cover + def preamble(self, settings): # pragma: no cover pass @property diff --git a/libpathod/language/message.py b/libpathod/language/message.py index 2ff40825..8c58f021 100644 --- a/libpathod/language/message.py +++ b/libpathod/language/message.py @@ -66,7 +66,7 @@ class Message(object): return l @classmethod - def expr(klass): # pragma: no cover + def expr(klass): # pragma: no cover pass def log(self, settings): diff --git a/libpathod/language/websockets.py b/libpathod/language/websockets.py index 036d4ea5..46daa467 100644 --- a/libpathod/language/websockets.py +++ b/libpathod/language/websockets.py @@ -100,6 +100,7 @@ class WebsocketFrame(message.Message): RawBody, ) logattrs = ["body"] + @property def actions(self): return self.toks(actions._Action) diff --git a/libpathod/language/writer.py b/libpathod/language/writer.py index 24f4330b..3bacbf87 100644 --- a/libpathod/language/writer.py +++ b/libpathod/language/writer.py @@ -57,5 +57,5 @@ def write_values(fp, vals, actions, sofar=0, blocksize=BLOCKSIZE): return True elif a[1] == "inject": send_chunk(fp, a[2], blocksize, 0, len(a[2])) - except netlib.tcp.NetLibDisconnect: # pragma: no cover + except netlib.tcp.NetLibDisconnect: # pragma: no cover return True |