Skip to content

Commit ffee8e8

Browse files
committed
New parser object structure implementation
1 parent eff9ccc commit ffee8e8

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

rss_parser/__init__.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
from ._parser import Parser
1+
from ._parser import AtomParser, BaseParser, Parser, RSSParser
2+
3+
__all__ = ("BaseParser", "Parser", "AtomParser", "RSSParser")

rss_parser/_parser.py

+42-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
from typing import Optional, Type
1+
from typing import ClassVar, Optional, Type
22

33
from xmltodict import parse
44

5+
from rss_parser.custom_decorators import abstract_class_attributes
56
from rss_parser.models import XMLBaseModel
67
from rss_parser.models.atom import Atom
78
from rss_parser.models.rss import RSS
@@ -14,31 +15,59 @@
1415
# TODO: Older RSS versions
1516

1617

17-
class Parser:
18+
@abstract_class_attributes("schema")
19+
class BaseParser:
1820
"""Parser for rss/atom files."""
1921

20-
@staticmethod
21-
def check_schema(root: dict) -> tuple[dict, type[XMLBaseModel]]:
22-
if "feed" in root:
23-
return root, Atom
24-
return root["rss"], RSS
22+
schema: ClassVar[Type[XMLBaseModel]]
23+
root_key: Optional[str] = None
2524

2625
@staticmethod
2726
def to_xml(data: str, *args, **kwargs):
2827
return parse(str(data), *args, **kwargs)
2928

3029
@classmethod
31-
def parse(cls, data: str, *, schema: Optional[Type[XMLBaseModel]] = None, root_key: str = "") -> XMLBaseModel:
30+
def parse(
31+
cls,
32+
data: str,
33+
*,
34+
schema: Optional[Type[XMLBaseModel]] = None,
35+
root_key: Optional[str] = None,
36+
) -> XMLBaseModel:
3237
"""
33-
Parse XML data into schema (default: RSS 2.0 or Atom).
34-
38+
Parse XML data into schema.
3539
:param data: string of XML data that needs to be parsed
3640
:return: "schema" object
3741
"""
3842
root = cls.to_xml(data)
39-
if not isinstance(schema, XMLBaseModel):
40-
root, schema = cls.check_schema(root)
41-
else:
43+
44+
schema = schema if schema else cls.schema
45+
46+
root_key = root_key if root_key else cls.root_key
47+
48+
if root_key:
4249
root = root.get(root_key, root)
4350

4451
return schema.parse_obj(root)
52+
53+
54+
class AtomParser(BaseParser):
55+
schema = Atom
56+
57+
58+
class RSSParser(BaseParser):
59+
root_key = "rss"
60+
schema = RSS
61+
62+
63+
class Parser(RSSParser):
64+
@classmethod
65+
def parse(cls, data: str, *, schema: Optional[Type[XMLBaseModel]] = None) -> XMLBaseModel:
66+
import warnings
67+
68+
warnings.warn(
69+
"Class Parser was renamed to RSSParser " "and will be removed in the next major update",
70+
DeprecationWarning,
71+
stacklevel=2,
72+
)
73+
return RSSParser.parse(data, schema=schema)

0 commit comments

Comments
 (0)