Create :class:`.RedditBase` objects from data. :param data: The structured data. :returns: An instance of :class:`.RedditBase`, or ``None`` if given ``data`` is ``None``.
(
self, *, data: dict[str, Any] | list[Any] | bool | None
)
| 213 | return parser.parse(data, self._reddit) |
| 214 | |
| 215 | def objectify( |
| 216 | self, *, data: dict[str, Any] | list[Any] | bool | None |
| 217 | ) -> RedditBase | dict[str, Any] | list[Any] | bool | None: |
| 218 | """Create :class:`.RedditBase` objects from data. |
| 219 | |
| 220 | :param data: The structured data. |
| 221 | |
| 222 | :returns: An instance of :class:`.RedditBase`, or ``None`` if given ``data`` is |
| 223 | ``None``. |
| 224 | |
| 225 | """ |
| 226 | if data is None: # 204 no content |
| 227 | return None |
| 228 | if isinstance(data, list): |
| 229 | return [self.objectify(data=item) for item in data] |
| 230 | if isinstance(data, bool): # Reddit.username_available |
| 231 | return data |
| 232 | if "json" in data and "errors" in data["json"]: |
| 233 | errors = data["json"]["errors"] |
| 234 | # ``errors`` is normally an empty list on success, but some endpoints |
| 235 | # (e.g. ``api/hide``) now return ``null``; treat both as no error. |
| 236 | if errors: |
| 237 | raise RedditAPIException(errors) |
| 238 | if "kind" in data and ("shortName" in data or data["kind"] in {"menu", "moderators"}): |
| 239 | # This is a widget |
| 240 | parser = self.parsers.get(data["kind"], self.parsers["widget"]) |
| 241 | return parser.parse(data, self._reddit) |
| 242 | if {"kind", "data"}.issubset(data) and data["kind"] in self.parsers: |
| 243 | parser = self.parsers[data["kind"]] |
| 244 | if data["kind"] == "ModeratedList": |
| 245 | return parser.parse(data, self._reddit) |
| 246 | return parser.parse(data["data"], self._reddit) |
| 247 | if "json" in data and "data" in data["json"]: |
| 248 | if "websocket_url" in data["json"]["data"]: |
| 249 | return data |
| 250 | if "things" in data["json"]["data"]: # Submission.reply |
| 251 | return self.objectify(data=data["json"]["data"]["things"]) |
| 252 | if "rules" in data["json"]["data"]: |
| 253 | return self.objectify(data=loads(data["json"]["data"]["rules"])) |
| 254 | if "drafts_count" in data["json"]["data"] and all( |
| 255 | key not in data["json"]["data"] for key in ["name", "url"] |
| 256 | ): # Draft |
| 257 | data["json"]["data"].pop("drafts_count") |
| 258 | return self.parsers["Draft"].parse(data["json"]["data"], self._reddit) |
| 259 | if "url" in data["json"]["data"]: # Subreddit.submit |
| 260 | # The URL is the URL to the submission, so it's removed. |
| 261 | del data["json"]["data"]["url"] |
| 262 | parser = self.parsers[self._reddit.config.kinds["submission"]] |
| 263 | if data["json"]["data"]["id"].startswith(f"{self._reddit.config.kinds['submission']}_"): |
| 264 | # With polls, Reddit returns a fullname but calls it an "id". This |
| 265 | # fixes this by coercing the fullname into an id. |
| 266 | data["json"]["data"]["id"] = data["json"]["data"]["id"].split("_", 1)[1] |
| 267 | else: |
| 268 | parser = self.parsers["LiveUpdateEvent"] |
| 269 | return parser.parse(data["json"]["data"], self._reddit) |
| 270 | if {"is_public_link", "title", "body"}.issubset(data): |
| 271 | parser = self.parsers["Draft"] |
| 272 | return parser.parse(data, self._reddit) |
no test coverage detected