Skip to content

Commit

Permalink
Finish the parser docstrings
Browse files Browse the repository at this point in the history
  • Loading branch information
tefra committed Jan 25, 2024
1 parent 22857e0 commit 8a36ab5
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 25 deletions.
2 changes: 1 addition & 1 deletion tests/formats/dataclass/parsers/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,4 @@ def test_emit_event(self):
self.parser.emit_event("foo", "{tns}BarEl", a=1, b=2)

mock_func.assert_called_once_with(a=1, b=2)
self.assertEqual({("foo", "{tns}BarEl"): mock_func}, self.parser.emit_cache)
self.assertEqual({("foo", "{tns}BarEl"): mock_func}, self.parser.hooks_cache)
5 changes: 4 additions & 1 deletion xsdata/formats/dataclass/parsers/bases.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@

@dataclass
class NodeParser(PushParser):
"""Bind xml nodes to dataclasses.
"""Bind xml nodes to data classes.
Args:
context: Model context provider
handler: The xml handler class
Attributes:
ns_map: The parsed namespace prefix-URI map
"""

context: XmlContext = field(default_factory=XmlContext)
Expand Down
2 changes: 1 addition & 1 deletion xsdata/formats/dataclass/parsers/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@dataclass
class JsonParser(AbstractParser):
"""Json parser for dataclasses.
"""Json parser for data classes.
Args:
config: Parser configuration
Expand Down
2 changes: 1 addition & 1 deletion xsdata/formats/dataclass/parsers/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class PushParser(AbstractParser):
config: The parser configuration instance
Attributes:
ns_map: Namespace registry of parsed prefix-URI mappings
ns_map: The parsed namespace prefix-URI map
"""

config: ParserConfig = field(default_factory=ParserConfig)
Expand Down
52 changes: 31 additions & 21 deletions xsdata/formats/dataclass/parsers/xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,41 @@

@dataclass
class XmlParser(NodeParser):
"""Default Xml parser for dataclasses.
"""Default Xml parser for data classes.
:param config: Parser configuration
:param context: Model context provider
:param handler: Override default XmlHandler
:ivar ms_map: The prefix-URI map generated during parsing
Args:
config: The parser config instance
context: The xml context instance
handler: The xml handler class
Attributes:
ns_map: The parsed namespace prefix-URI map
"""

handler: Type[XmlHandler] = field(default=default_handler())


@dataclass
class UserXmlParser(NodeParser):
"""User Xml parser for dataclasses with hooks for emitting events to alter the
behavior when an elements starts or ends.
:param config: Parser configuration
:param context: Model context provider
:param handler: Override default XmlHandler
:ivar ms_map: The prefix-URI map generated during parsing
:ivar emit_cache: Qname to event name cache
"""Xml parser for dataclasses with hooks to events.
The event hooks allow custom parsers to inject custom
logic between the start/end element events.
Args:
config: The parser config instance
context: The xml context instance
handler: The xml handler class
Attributes:
ns_map: The parsed namespace prefix-URI map
hooks_cache: The hooks cache is used to avoid
inspecting the class for custom methods
on duplicate events.
"""

handler: Type[XmlHandler] = field(default=default_handler())
emit_cache: Dict = field(init=False, default_factory=dict)
hooks_cache: Dict = field(init=False, default_factory=dict)

def start(
self,
Expand Down Expand Up @@ -96,18 +106,18 @@ def emit_event(self, event: str, name: str, **kwargs: Any):
any input keyword arguments.
Example::
event=start, name={urn}bookTitle -> start_booking_title(**kwargs)
:param event: Event type start|end
:param name: Element qualified name
:param kwargs: Event keyword arguments
Args:
event: The event type start|end
name: The qualified name of the element
kwargs: Additional keyword arguments passed to the hooks
"""
key = (event, name)
if key not in self.emit_cache:
if key not in self.hooks_cache:
method_name = f"{event}_{snake_case(local_name(name))}"
self.emit_cache[key] = getattr(self, method_name, None)
self.hooks_cache[key] = getattr(self, method_name, None)

method = self.emit_cache[key]
method = self.hooks_cache[key]
if method:
method(**kwargs)

0 comments on commit 8a36ab5

Please sign in to comment.