aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/language
diff options
context:
space:
mode:
Diffstat (limited to 'libpathod/language')
-rw-r--r--libpathod/language/__init__.py7
-rw-r--r--libpathod/language/actions.py11
-rw-r--r--libpathod/language/base.py38
-rw-r--r--libpathod/language/exceptions.py4
-rw-r--r--libpathod/language/generators.py7
-rw-r--r--libpathod/language/http.py7
-rw-r--r--libpathod/language/message.py2
-rw-r--r--libpathod/language/websockets.py1
-rw-r--r--libpathod/language/writer.py2
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