2026-02-01 09:31:38 +01:00

96 lines
3.1 KiB
Python

"""Provide the RedditBase class."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from urllib.parse import urlparse
from ...endpoints import API_PATH
from ...exceptions import InvalidURL
from ..base import PRAWBase
if TYPE_CHECKING: # pragma: no cover
import praw
class RedditBase(PRAWBase):
"""Base class that represents actual Reddit objects."""
@staticmethod
def _url_parts(url: str) -> list[str]:
parsed = urlparse(url)
if not parsed.netloc:
raise InvalidURL(url)
return parsed.path.rstrip("/").split("/")
def __eq__(self, other: Any | str) -> bool:
"""Return whether the other instance equals the current."""
if isinstance(other, str):
return other.lower() == str(self).lower()
return (
isinstance(other, self.__class__)
and str(self).lower() == str(other).lower()
)
def __getattr__(self, attribute: str) -> Any:
"""Return the value of ``attribute``."""
if not attribute.startswith("_") and not self._fetched:
self._fetch()
return getattr(self, attribute)
msg = f"{self.__class__.__name__!r} object has no attribute {attribute!r}"
raise AttributeError(msg)
def __hash__(self) -> int:
"""Return the hash of the current instance."""
return hash(self.__class__.__name__) ^ hash(str(self).lower())
def __init__(
self,
reddit: praw.Reddit,
_data: dict[str, Any] | None,
_extra_attribute_to_check: str | None = None,
_fetched: bool = False,
_str_field: bool = True,
):
"""Initialize a :class:`.RedditBase` instance.
:param reddit: An instance of :class:`.Reddit`.
"""
super().__init__(reddit, _data=_data)
self._fetched = _fetched
if _str_field and self.STR_FIELD not in self.__dict__:
if (
_extra_attribute_to_check is not None
and _extra_attribute_to_check in self.__dict__
):
return
msg = f"An invalid value was specified for {self.STR_FIELD}. Check that the argument for the {self.STR_FIELD} parameter is not empty."
raise ValueError(msg)
def __ne__(self, other: object) -> bool:
"""Return whether the other instance differs from the current."""
return not self == other
def __repr__(self) -> str:
"""Return an object initialization representation of the instance."""
return f"{self.__class__.__name__}({self.STR_FIELD}={str(self)!r})"
def __str__(self) -> str:
"""Return a string representation of the instance."""
return getattr(self, self.STR_FIELD)
def _fetch(self):
self._fetched = True
def _fetch_data(self):
name, fields, params = self._fetch_info()
path = API_PATH[name].format(**fields)
return self._reddit.request(method="GET", params=params, path=path)
def _reset_attributes(self, *attributes: str):
for attribute in attributes:
if attribute in self.__dict__:
del self.__dict__[attribute]
self._fetched = False