MCPcopy Index your code
hub / github.com/praw-dev/praw / objectify

Method objectify

praw/objector.py:215–277  ·  view source on GitHub ↗

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
    )

Source from the content-addressed store, hash-verified

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)

Callers 14

_objectify_dictMethod · 0.95
_objectify_requestMethod · 0.45
_bulk_generatorMethod · 0.45
__setattr__Method · 0.45
__init__Method · 0.45
parseMethod · 0.45
_fetchMethod · 0.45
replyMethod · 0.45
__setattr__Method · 0.45
itemsMethod · 0.45
parseMethod · 0.45

Calls 4

_objectify_dictMethod · 0.95
RedditAPIExceptionClass · 0.90
getMethod · 0.80
parseMethod · 0.45

Tested by

no test coverage detected