diff options
author | Rafael H. Schloming <rhs@apache.org> | 2009-12-17 04:56:17 +0000 |
---|---|---|
committer | Rafael H. Schloming <rhs@apache.org> | 2009-12-17 04:56:17 +0000 |
commit | 59c274c2a1965255507d15df1fe028453152056e (patch) | |
tree | 0e2d402be9e5d2c1c1ad3d86b49addb6a995f12a | |
parent | 83a9954e8a056c5164dc9871a4583389d0fb2821 (diff) | |
download | qpid-python-59c274c2a1965255507d15df1fe028453152056e.tar.gz |
QPID-2286: added list support to address parser
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@891536 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/python/qpid/address.py | 26 | ||||
-rw-r--r-- | qpid/python/qpid/tests/address.py | 32 |
2 files changed, 56 insertions, 2 deletions
diff --git a/qpid/python/qpid/address.py b/qpid/python/qpid/address.py index 5c675b8782..6228ac757b 100644 --- a/qpid/python/qpid/address.py +++ b/qpid/python/qpid/address.py @@ -24,6 +24,8 @@ l = Lexicon() LBRACE = l.define("LBRACE", r"\{") RBRACE = l.define("RBRACE", r"\}") +LBRACK = l.define("LBRACK", r"\[") +RBRACK = l.define("RBRACK", r"\]") COLON = l.define("COLON", r":") SEMI = l.define("SEMI", r";") SLASH = l.define("SLASH", r"/") @@ -128,8 +130,30 @@ class AddressParser(Parser): return tok2obj(self.eat()) elif self.matches(LBRACE): return self.map() + elif self.matches(LBRACK): + return self.list() else: - raise ParseError(self.next(), NUMBER, STRING, ID, LBRACE) + raise ParseError(self.next(), NUMBER, STRING, ID, LBRACE, LBRACK) + + def list(self): + self.eat(LBRACK) + + result = [] + + while True: + if self.matches(RBRACK): + break + else: + result.append(self.value()) + if self.matches(COMMA): + self.eat(COMMA) + elif self.matches(RBRACK): + break + else: + raise ParseError(self.next(), COMMA, RBRACK) + + self.eat(RBRACK) + return result def parse(addr): return AddressParser(lex(addr)).parse() diff --git a/qpid/python/qpid/tests/address.py b/qpid/python/qpid/tests/address.py index f772425e42..7c101eee5e 100644 --- a/qpid/python/qpid/tests/address.py +++ b/qpid/python/qpid/tests/address.py @@ -145,7 +145,7 @@ class AddressTests(ParserBase, Test): def testBadOptions3(self): self.invalid("name/subject; { key:", - "expecting (NUMBER, STRING, ID, LBRACE), got EOF " + "expecting (NUMBER, STRING, ID, LBRACE, LBRACK), got EOF " "line:1,20:name/subject; { key:") def testBadOptions4(self): @@ -167,3 +167,33 @@ class AddressTests(ParserBase, Test): self.invalid("name/subject; { key: value } asdf", "expecting EOF, got ID('asdf') " "line:1,29:name/subject; { key: value } asdf") + + def testList1(self): + self.valid("name/subject; { key: [] }", "name", "subject", {"key": []}) + + def testList2(self): + self.valid("name/subject; { key: ['one'] }", "name", "subject", {"key": ['one']}) + + def testList3(self): + self.valid("name/subject; { key: [1, 2, 3] }", "name", "subject", + {"key": [1, 2, 3]}) + + def testList4(self): + self.valid("name/subject; { key: [1, [2, 3], 4] }", "name", "subject", + {"key": [1, [2, 3], 4]}) + + def testBadList1(self): + self.invalid("name/subject; { key: [ }", "expecting (NUMBER, STRING, ID, LBRACE, LBRACK), " + "got RBRACE('}') line:1,23:name/subject; { key: [ }") + + def testBadList2(self): + self.invalid("name/subject; { key: [ 1 }", "expecting (COMMA, RBRACK), " + "got RBRACE('}') line:1,25:name/subject; { key: [ 1 }") + + def testBadList3(self): + self.invalid("name/subject; { key: [ 1 2 }", "expecting (COMMA, RBRACK), " + "got NUMBER('2') line:1,25:name/subject; { key: [ 1 2 }") + + def testBadList4(self): + self.invalid("name/subject; { key: [ 1 2 ] }", "expecting (COMMA, RBRACK), " + "got NUMBER('2') line:1,25:name/subject; { key: [ 1 2 ] }") |