# Change Log

## 5.3.0 (2017/12/16)

Added

- `Multireddit.stream`, to stream submissions and comments from a Multireddit.
- `Redditor.block()`

Fixed

- Now raises `prawcore.UnavailableForLegalReasons` instead of an `AssertionError` when encountering a HTTP 451 response.

## 5.2.0 (2017/10/24)

Changed

- An attribute on `LiveUpdate` now works as lazy attribute (i.e. populate an attribute when the attribute is first accessed).

Deprecated

- `subreddit.comments.gilded` because there isn’t actually an endpoint that returns only gilded comments. Use `subreddit.gilded` instead.

Fixed

- Removed `comment.permalink()` because `comment.permalink` is now an attribute returned by Reddit.

## 5.1.0 (2017/08/31)

Added

- `Redditor.stream`, with methods `RedditorStream.submissions()` and `RedditorStream.comments()` to stream a Redditor’s comments or submissions
- `RedditorStream` has been added to facilitate `Redditor.stream`
- `Inbox.collapse()` to mark messages as collapsed.
- `Inbox.uncollapse()` to mark messages as uncollapsed.
- Raise `ClientException` when calling `refresh()` when the comment does not appear in the resulting comment tree.
- `Submission.crosspost()` to crosspost to a subreddit.

Fixed

- Calling `refresh()` on a directly fetched, deeply nested `Comment` will additionally pull in as many parent comments as possible (currently 8) enabling significantly quicker traversal to the top-most `Comment` via successive `parent()` calls.
- Calling `refresh()` previously could have resulted in a `AttributeError: 'MoreComments' object has no attribute '_replies'` exception. This situation will now result in a `ClientException`.
- Properly handle `BAD_CSS_NAME` errors when uploading stylesheet images with invalid filenames. Previously an `AssertionError` was raised.
- `Submission`’s `gilded` attribute properly returns the expected value from reddit.

## 5.0.1 (2017/07/11)

Fixed

- Calls to `hide()` and `unhide()` properly batch into requests of 50 submissions at a time.
- Lowered the average maximum delay between inactive stream checks by 4x to 16 seconds. It was previously 64 seconds, which was too long.

## 5.0.0 (2017/07/04)

Added

- `Comment.disable_inbox_replies()`, `Comment.enable_inbox_replies()` `Submission.disable_inbox_replies()`, and `Submission.enable_inbox_replies()` to toggle inbox replies on comments and submissions.

Changed

- `cloudsearch` is no longer the default syntax for `Subreddit.search()`. `lucene` is now the default syntax so that PRAW’s default is aligned with Reddit’s default.
- `Reddit.info()` will now take either a list of fullnames or a single URL string.
- `Subreddit.submit()` accepts a flair template ID and text.

Fixed

- Fix accessing `LiveUpdate.contrib` raises `AttributeError`.

Removed

- Iterating directly over `SubredditRelationship` (e.g., `subreddit.banned`, `subreddit.contributor`, `subreddit.moderator`, etc) and `SubredditFlair` is no longer possible. Iterate instead over their callables, e.g. `subreddit.banned()` and `subreddit.flair()`.
- The following methods are removed: `Subreddit.mod.approve`, `Subreddit.mod.distinguish`, `Subreddit.mod.ignore_reports`, `Subreddit.mod.remove`, `Subreddit.mod.undistinguish`, `Subreddit.mod.unignore_reports`.
- Support for passing a `Submission` to `SubredditFlair.set()` is removed.
- The `thing` argument to `SubredditFlair.set()` is removed.
- Return values from `Comment.block()`, `Message.block()`, `SubredditMessage.block()`, `SubredditFlair.delete()`, `friend()`, `Redditor.message()`, `Subreddit.message()`, `select()`, and `unfriend()` are removed as they do not provide any useful information.
- `praw.ini` no longer reads in `http_proxy` and `https_proxy` settings.
- `is_link` parameter of `SubredditRedditorFlairTemplates.add()` and `SubredditRedditorFlairTemplates.clear()`. Use `SubredditLinkFlairTemplates` instead.

## 4.6.0 (2017/07/04)

The release’s sole purpose is to announce the deprecation of the `is_link` parameter as described below:

Added

- `SubredditFlair.link_templates` to manage link flair templates.

Deprecated

- `is_link` parameter of `SubredditRedditorFlairTemplates.add()` and `SubredditRedditorFlairTemplates.clear()`. Use `SubredditLinkFlairTemplates` instead.

## 4.5.1 (2017/05/07)

Fixed

- Calling `parent()` works on `Comment` instances obtained via `comment_replies()`.

## 4.5.0 (2017/04/29)

Added

- `unread_count()` to get unread count by conversation state.
- `bulk_read()` to mark conversations as read by conversation state.
- `subreddits()` to fetch subreddits using new modmail.
- `create()` to create a new modmail conversation.
- `read()` to mark modmail conversations as read.
- `unread()` to mark modmail conversations as unread.
- `conversations()` to get new modmail conversations.
- `highlight()` to highlight modmail conversations.
- `unhighlight()` to unhighlight modmail conversations.
- `mute()` to mute modmail conversations.
- `unmute()` to unmute modmail conversations.
- `archive()` to archive modmail conversations.
- `unarchive()` to unarchive modmail conversations.
- `reply()` to reply to modmail conversations.
- `__call__()` to get a new modmail conversation.
- `Inbox.stream()` to stream new items in the inbox.
- Exponential request delay to all streams when no new items are returned in a request. The maximum delay between requests is 66 seconds.

Changed

- `submit()` accepts `selftext=''` to create a title-only submission.
- `Reddit` accepts `requestor_class=cls` for a customized requestor class and `requestor_kwargs={'param': value}` for passing arguments to requestor initialization.
- `comments()`, `submissions()`, and `stream()` accept a `pause_after` argument to allow pausing of the stream. The default value of `None` retains the preexisting behavior.

Deprecated

- `cloudsearch` will no longer be the default syntax for `Subreddit.search()` in PRAW 5. Instead `lucene` will be the default syntax so that PRAW’s default is aligned with Reddit’s default.

Fixed

- Fix bug where `WikiPage` revisions with deleted authors caused `TypeError`.
- `Submission` attributes `comment_limit` and `comment_sort` maintain their values after making instances non-lazy.

## 4.4.0 (2017/02/21)

Added

- `LiveThreadContribution.update()` to update settings of a live thread.
- `reset_timestamp` to `limits` to provide insight into when the current rate limit window will expire.
- `upload_mobile_header()` to upload subreddit mobile header.
- `upload_mobile_icon()` to upload subreddit mobile icon.
- `delete_mobile_header()` to remove subreddit mobile header.
- `delete_mobile_icon()` to remove subreddit mobile icon.
- `LiveUpdateContribution.strike()` to strike a content of a live thread.
- `LiveContributorRelationship.update()` to update contributor permissions for a redditor.
- `LiveContributorRelationship.update_invite()` to update contributor invite permissions for a redditor.
- `LiveThread.discussions()` to get submissions linking to the thread.
- `LiveThread.report()` to report the thread violating the Reddit rules.
- `LiveHelper.now()` to get the currently featured live thread.
- `LiveHelper.info()` to fetch information about each live thread in live thread IDs.

Fixed

- Uploading an image resulting in too large of a request (>500 KB) now raises `prawcore.TooLarge` instead of an `AssertionError`.
- Uploading an invalid image raises `APIException`.
- `Redditor` instances obtained via `moderator` (e.g., `reddit.subreddit('subreddit').moderator()`) will contain attributes with the relationship metadata (e.g., `mod_permissions`).
- `Message` instances retrieved from the inbox now have attributes `author`, `dest` `replies` and `subreddit` properly converted to their appropriate PRAW model.

## 4.3.0 (2017/01/19)

Added

- `LiveContributorRelationship.leave()` to abdicate the live thread contributor position.
- `LiveContributorRelationship.remove()` to remove the redditor from the live thread contributors.
- `limits` to provide insight into number of requests made and remaining in the current rate limit window.
- `LiveThread.contrib` to obtain an instance of `LiveThreadContribution`.
- `LiveThreadContribution.add()` to add an update to the live thread.
- `LiveThreadContribution.close()` to close the live thread permanently.
- `LiveUpdate.contrib` to obtain an instance of `LiveUpdateContribution`.
- `LiveUpdateContribution.remove()` to remove a live update.
- `LiveContributorRelationship.accept_invite()` to accept an invite to contribute the live thread.
- `SubredditHelper.create()` and `SubredditModeration.update()` have documented support for `spoilers_enabled`. Note, however, that `SubredditModeration.update()` will currently unset the `spoilers_enabled` value until such a time that Reddit returns the value along with the other settings.
- `spoiler()` and `unspoiler()` to change a submission’s spoiler status.

Fixed

- `LiveContributorRelationship.invite()` and `LiveContributorRelationship.remove_invite()` now hit endpoints, which starts with ‘api/’, for consistency.
- `ModeratorRelationship.update()`, and `ModeratorRelationship.update_invite()` now always remove known unlisted permissions.

## 4.2.0 (2017/01/07)

Added

- `Subreddit.rules()` to get the rules of a subreddit.
- `LiveContributorRelationship`, which can be obtained through `LiveThread.contributor`, to interact with live threads’ contributors.
- `remove_invite()` to remove a moderator invite.
- `LiveContributorRelationship.invite()` to send a contributor invitation.
- `LiveContributorRelationship.remove_invite()` to remove the contributor invitation.

Deprecated

- Return values from `Comment.block()`, `Message.block()`, `SubredditMessage.block()`, `SubredditFlair.delete()`, `friend()`, `Redditor.message()`, `Subreddit.message()`, `select()`, and `unfriend()` will be removed in PRAW 5 as they do not provide any useful information.

Fixed

- `hide()` and `unhide()` now accept a list of additional submissions.
- `replace_more()` is now recoverable. Previously, when an exception was raised during the work done by `replace_more()`, all unreplaced `MoreComments` instances were lost. Now `MoreComments` instances are only removed once their children have been added to the `CommentForest` enabling callers of `replace_more()` to call the method as many times as required to complete the replacement.
- Working with contributors on `SubredditWiki` is done consistently through `contributor` not `contributors`.
- `Subreddit.moderator()` works.
- `live_thread.contributor()` now returns `RedditorList` correctly.

Removed

- `validate_time_filter` is no longer part of the public interface.

## 4.1.0 (2016/12/24)

Added

- `praw.models.Subreddits.search_by_topic()` to search subreddits by topic. (see: https://www.reddit.com/dev/api/#GET_api_subreddits_by_topic).
- `praw.models.LiveHelper.__call__()` to provide interface to `praw.models.LiveThread.__init__`.
- `SubredditFilters` to work with filters for special subreddits, like `/r/all`.
- Added callables for `SubredditRelationship` and `SubredditFlair` so that `limit` and other parameters can be passed.
- Add `reply()` to `Message` which was accidentally missed previously.
- Add `sticky` parameter to `CommentModeration.distinguish()` to sticky comments.
- `flair()` to add a submission’s flair from an instance of `Submission`.
- `Comment.parent()` to obtain the parent of a `Comment`.
- `opt_in()` and `opt_out()` to `Subreddit` to permit working with quarantined subreddits.
- `LiveUpdate` to represent an individual update in a `LiveThread`.
- Ability to access an individual `LiveUpdate` via `reddit.live('THREAD_ID')['UPDATE_ID']`.
- `LiveThread.updates()` to iterate the updates of the thread.

Changed

- `me()` now caches its result in order to reduce redundant requests for methods that depend on it. Set `use_cache=False` when calling to bypass the cache.
- `replace_more()` can be called on `Comment` `replies`.

Deprecated

- `validate_time_filter` will be removed from the public interface in PRAW 4.2 as it was never intended to be part of it to begin with.
- Iterating directly over `SubredditRelationship` (e.g., `subreddit.banned`, `subreddit.contributor`, `subreddit.moderator`, etc) and `SubredditFlair` will be removed in PRAW 5. Iterate instead over their callables, e.g. `subreddit.banned()` and `subreddit.flair()`.
- The following methods are deprecated to be removed in PRAW 5 and are replaced with similar `Comment.mod...` and `Submission.mod...` alternatives: `Subreddit.mod.approve`, `Subreddit.mod.distinguish`, `Subreddit.mod.ignore_reports`, `Subreddit.mod.remove`, `Subreddit.mod.undistinguish`, `Subreddit.mod.unignore_reports`.
- Support for passing a `Submission` to `SubredditFlair.set()` will be removed in PRAW 5. Use `flair()` instead.
- The `thing` argument to `SubredditFlair.set()` is replaced with `redditor` and will be removed in PRAW 5.

Fixed

- `SubredditModeration.update()` accurately updates `exclude_banned_modqueue`, `header_hover_text`, `show_media` and `show_media_preview` values.
- Instances of `Comment` obtained through the inbox (including mentions) are now refreshable.
- Searching `/r/all` should now work as intended for all users.
- Accessing an invalid attribute on an instance of `Message` will raise `AttributeError` instead of `PRAWException`.

## 4.0.0 (2016/11/29)

Fixed

- Fix bug where ipython tries to access attribute `_ipython_canary_method_should_not_exist_` resulting in a useless fetch.
- Fix bug where Comment replies becomes `[]` after attempting to access an invalid attribute on the Comment.
- Reddit.wiki[…] converts the passed in page name to lower case as pages are only saved in lower case and non-lower case page names results in a Redirect exception (thanks pcjonathan).

## 4.0.0rc3 (2016/11/26)

Added

- `implicit` parameter to `url()` to support the implicit flow for installed applications (see: https://github.com/reddit/reddit/wiki/OAuth2#authorization-implicit-grant-flow)
- `scopes()` to discover which scopes are available to the current authentication
- Lots of documentation: http://praw.readthedocs.io/

## 4.0.0rc2 (2016/11/20)

Fixed

- `authorize()` properly sets the session’s Authentication (thanks @williammck).

## 4.0.0rc1 (2016/11/20)

PRAW 4 introduces significant breaking changes. The numerous changes are not listed here, only the feature removals. Please read through Quick Start to help with updating your code to PRAW 4. If you require additional help please ask on /r/redditdev or in the praw-dev/praw channel on gitter.

Added

- `praw.models.Comment.block()`, `praw.models.Message.block()`, and `praw.models.SubredditMessage.block()` to permit blocking unwanted user contact.
- `praw.models.LiveHelper.create()` to create new live threads.
- `praw.models.Redditor.unblock()` to undo a block.
- `praw.models.Subreddits.gold()` to iterate through gold subreddits.
- `praw.models.Subreddits.search()` to search for subreddits by name and description.
- `praw.models.Subreddits.stream()` to obtain newly created subreddits in near-realtime.
- `praw.models.User.karma()` to retrieve the current user’s subreddit karma.
- `praw.models.reddit.submission.SubmissionModeration.lock()` and `praw.models.reddit.submission.SubmissionModeration.unlock()` to change a Submission’s lock state.
- `praw.models.reddit.subreddit.SubredditFlairTemplates.delete()` to delete a single flair template.
- `praw.models.reddit.subreddit.SubredditModeration.unread()` to iterate over unread moderation messages.
- `praw.models.reddit.subreddit.ModeratorRelationship.invite()` to invite a moderator to a subreddit.
- `praw.models.reddit.subreddit.ModeratorRelationship.update()` to update a moderator’s permissions.
- `praw.models.reddit.subreddit.ModeratorRelationship.update_invite()` to update an invited moderator’s permissions.
- `praw.models.Front.random_rising()`, `praw.models.Subreddit.random_rising()` and `praw.models.Multireddit.random_rising()`.
- `WikiPage` supports a revision argument.
- `revisions()` to obtain a list of recent revisions to a subreddit.
- `revisions()` to obtain a list of revisions for a wiki page.
- Support installed-type OAuth apps.
- Support read-only OAuth for all application types.
- Support script-type OAuth apps.

Changed

Note

Only prominent changes are listed here.

- `helpers.comments_stream` is now `praw.models.reddit.subreddit.SubredditStream.comments()`
- `helpers.submissions_between` is now `praw.models.Subreddit.submissions()`. This new method now only iterates through newest submissions first and as a result makes approximately 33% fewer requests.
- `helpers.submission_stream` is now `praw.models.reddit.subreddit.SubredditStream.submissions()`

Removed

- Removed `Reddit`’s `login` method. Authentication must be done through OAuth.
- Removed `praw-multiprocess` as this functionality is no longer needed with PRAW 4.
- Removed non-oauth functions `Message.collapse` and `Message.uncollapse` `is_username_available`.
- Removed captcha related functions.

For changes prior to version 4.0 please see: 3.4.0 changelog