Skip to content
This repository has been archived by the owner on Jan 14, 2024. It is now read-only.

Commit

Permalink
xml: support for forwarding stream language to XSO
Browse files Browse the repository at this point in the history
  • Loading branch information
horazont committed Dec 10, 2017
1 parent 300fc24 commit 9b96ccc
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
12 changes: 12 additions & 0 deletions aioxmpp/xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,7 @@ def __init__(self):
self.remote_from = None
self.remote_to = None
self.remote_id = None
self.remote_lang = None

@property
def stanza_parser(self):
Expand All @@ -826,6 +827,7 @@ def stanza_parser(self, value):
if self._state != ProcessorState.CLEAN:
raise RuntimeError("invalid state: {}".format(self._state))
self._stanza_parser = value
self._stanza_parser.lang = self.remote_lang

def processingInstruction(self, target, foo):
raise errors.StreamError(
Expand Down Expand Up @@ -922,6 +924,16 @@ def startElementNS(self, name, qname, attributes):
"id attribute required in response header"
)

try:
lang = attributes.pop((namespaces.xml, "lang"))
except KeyError:
self.remote_lang = None
else:
self.remote_lang = structs.LanguageTag.fromstr(lang)

if self._stanza_parser is not None:
self._stanza_parser.lang = self.remote_lang

if self.on_stream_header:
self.on_stream_header()

Expand Down
36 changes: 36 additions & 0 deletions tests/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -2021,6 +2021,42 @@ class Foo(xso.XSO):
# cm.exception.condition
# )

def test_forwards_xml_lang_to_parser(self):
results = []

def recv(obj):
nonlocal results
results.append(obj)

class Foo(xso.XSO):
TAG = ("uri:foo", "foo")

attr = xso.LangAttr()

self.proc.stanza_parser = xso.XSOParser()
self.proc.stanza_parser.add_class(Foo, recv)

attrs = dict(self.STREAM_HEADER_ATTRS)
attrs[namespaces.xml, "lang"] = "en"

self.proc.startDocument()
self.proc.startElementNS(self.STREAM_HEADER_TAG, None,
attrs)

self.proc.startElementNS(Foo.TAG, None, {})
self.proc.endElementNS(Foo.TAG, None)

self.assertEqual(1, len(results))

f = results.pop()
self.assertEqual(
f.attr,
structs.LanguageTag.fromstr("en")
)

self.proc.endElementNS(self.STREAM_HEADER_TAG, None)
self.proc.endDocument()

def tearDown(self):
del self.proc
del self.parser
Expand Down

0 comments on commit 9b96ccc

Please sign in to comment.