Change Log
**********


7.1.4 (2021/02/07)
==================

**Fixed**

* Asynchronous check will no longer fail in Python 3.6 multithreading
  edge cases.


7.1.3 (2021/02/05)
==================

**Changed**

* Asynchronous check will no longer occur when in a Jupyter notebook.


7.1.2 (2021/02/03)
==================

**Fixed**

* Asynchronous check would not work on Python 3.6 as
  "asyncio.get_running_loop" only exists on Python 3.7+.


7.1.1 (2021/02/02)
==================

**Added**

* Add method "premium()" to reflect the naming change in Reddit’s API.

* Ability to submit image galleries with "submit_gallery()".

* Ability to pass a gallery url to "Reddit.submission()".

* Ability to specify modmail mute duration.

* Add method "invited()" to get invited moderators of a subreddit.

* Ability to submit text/self posts with inline media.

* Add method "award()" and "award()" with the ability to specify type
  of award, anonymity, and message when awarding a submission or
  comment.

* Ability to specify subreddits by name using the *subreddits*
  parameter in "Reddit.info()".

* A check to see if PRAW is running in an asynchronous environment and
  will advise the user to use Async PRAW. This also adds a
  configuration option to disable the check.

**Changed**

* Drop support for Python 3.5, which is end-of-life on 2020-09-13.

* "BoundedSet" will now utilize a Last-Recently-Used (LRU) storing
  mechanism, which will change the order in which elements are removed
  from the set.

* Improved "submit_image()" and "submit_video()" performance in slow
  network environments by removing a race condition when establishing
  a websocket connection.

**Deprecated**

* "gold()" is superseded by "premium()".

* "gild()" is superseded by "award()".

* "gild()" is superseded by "award()".

**Fixed**

* An issue where leaving as a moderator fails if you are using token
  auth.

* An issue where an incorrect error was being raised due to invalid
  submission urls.

* Some cases where streams yield the same item multiple times. This
  cannot be prevented in every case.


7.1.0 (2020/06/22)
==================

**Added**

* "Rule" to represent one rule of a subreddit.

* "SubredditRules" to get and add rules.

* Ability to submit polls with "submit_poll()".

* "PollData" and "PollOption".

* Ability to view poll data and poll options via the ".poll_data"
  attribute on poll submissions.

* Add method "delete()" to "Reddit" class to support HTTP DELETE
  requests.

* Added "CalendarConfiguration" to represent the configuration of a
  "Calendar" widget.

* Added "Hover" to represent the hover state of a "Button".

* Added "Styles" to represent widget styling information.

* Ability to stream live thread updates via new class
  "LiveThreadStream" with method "updates()".

**Changed**

* "RemovalReason.update()"‘s parameters are now optional.

* "SubredditRemovalReasons.__getitem__()" now takes integers and
  slices to get removal reasons from the list of reasons as returned
  by Reddit.

**Deprecated**

* "WebSocketException.original_exception" is deprecated and slated for
  removal in PRAW 8.0.

**Fixed**

* An issue where certain subreddit settings could not be set through
  "SubredditModeration.update()", such as "welcome_message_enabled"
  and "welcome_message_text". This change also removes the need for
  PRAW to track current subreddit settings and send unmodified ones in
  the update request.

* Instances of "BadRequest"s captured by PRAW that do not contain any
  detailed JSON data are re-raised as the original "BadRequest".

* "submit_image()" and "submit_video()" will throw "MediaPostFailed"
  when Reddit fails to post an image or video post.


7.0.0 (2020/04/24)
==================

**Added**

* "config_interpolation" parameter for "Reddit" supporting basic and
  extended modes.

* Add "Redditors.partial_redditors()" that returns lightweight
  redditor objects that contain only a few fields. This is useful for
  resolving Redditor IDs to their usernames in bulk.

* "User.friends()" has a new parameter "user" that takes either an
  instance of "Redditor" or a string containing a redditor name and
  returns an instance of "Redditor" if the authenticated user is
  friends with the user, otherwise throws an exception.

* "SubmissionModeration.flair()" has the parameter "flair_template_id"
  for applying flairs with template IDs.

* "update()" supports modifying an emoji’s permissions.

* "add()" now supports optionally passing booleans to set an emoji’s
  permissions upon upload.

* Methods "SubredditLinkFlairTemplates.update()" and
  "SubredditRedditorFlairTemplates.update()" contain a new parameter,
  "fetch", that toggles the automatic fetching of existing data from
  Reddit. It is set to True by default.

* Values in methods "SubredditLinkFlairTemplates.update()" and
  "SubredditRedditorFlairTemplates.update()" that are left as the
  defaults will no longer be over-written if the "fetch" parameter is
  set to "True", but will fill in existing values for the flair
  template.

* The parameter "text" for methods
  "SubredditLinkFlairTemplates.update()" and
  "SubredditRedditorFlairTemplates.update()" is no longer required.

* There is a new method, "Subreddit.post_requirements()", to fetch a
  subreddit’s post requirements.

* Method "SubmissionModeration.sticky()" will now ignore the Conflict
  exception generated by trying to sticky the same post multiple
  times.

* A new method "CommentModeration.show()" will uncollapse a comment
  that was collapsed because of Crowd Control

* Methods "Subreddit.submit_image()" and "Subreddit.submit_video()"
  will throw "TooLargeMediaException" if the submitted media is
  rejected by Reddit due to the size of the media.

* Class "Reddit" has an attribute, "validate_on_submit", that can be
  set after class initialization that causes methods
  "Subreddit.submit()", "Subreddit.submit_image()",
  "Subreddit.submit_video()", and "Submission.edit()" to check that
  the submission matches a subreddit’s post validation rules. This
  attribute will be functionally useless once Reddit implements their
  change. This attribute will be deprecated on the next release after
  Reddit’s change, and will be removed on the next major release after
  Reddit’s change.

Warning:

  In May-June 2020, Reddit will force all submissions to run through a
  subreddit’s validation rules.

* Introduced a data class, "RedditErrorItem", to represent an
  individual error item returned from Reddit.

* Class "RedditAPIException" now serves as a container for the
  "RedditErrorItem"s. You can access the items by doing
  "RedditAPIException.items", which returns a list.

* "APIException" is an alias to "RedditAPIException".

* Parameter "discussion_type" to methods "Subreddit.submit()",
  "Subreddit.submit_image()", and "Subreddit.submit_video()" to
  support submitting as a live discussion (set to "CHAT").

* Instances of "Trophy" can be compared for equality with each other.

* "Reddit" has a new configurable parameter, "timeout". This defaults
  to 16 seconds. It controls how long PRAW will wait for a response
  before throwing an exception.

* PRAW now handles ratelimit errors returned as instances of
  "RedditAPIException".

* "Reddit" has one new parameter, "ratelimit_seconds" . The parameter
  configures the maximum amount of seconds to catch ratelimits for. It
  defaults to 5 seconds when not specified.

**Changed**

* "prawcore.BadRequest" should no longer be raised. Instead a more
  useful "RedditAPIException" instance will be raised.

* Set the default comment sort to "confidence" instead of "best"
  because it turns out "best" isn’t actually the correct value for the
  parameter.

**Deprecated**

* "APIException" is deprecated and slated for removal in PRAW 8.0.

**Fixed**

* "SubredditFlair.update()" will not error out when the flair text
  contains quote marks.

**Removed**

* Converting "APIException" to string will no longer escape unicode
  characters.

* Module "praw.models.modaction" no longer exists. Please use the
  module "praw.models.mod_action", or directly import "ModAction" from
  "praw.models".

* Methods "SubredditLinkFlairTemplates.update()" and
  "SubredditRedditorFlairTemplates.update()" will no longer create
  flairs that are using an invalid template id, but instead throw a
  "InvalidFlairTemplateID".

* Method "reddit.user.moderator_subreddits" has been removed. Please
  use "Redditor.moderated()" instead.


6.5.1 (2020/01/07)
==================

**Fixed**

* Removed usages of "NoReturn" that caused PRAW to fail due to
  "ImportError" in Python "<3.5.4" and "<3.6.2".


6.5.0 (2020/01/05)
==================

**Added**

* "set_original_content()" supports marking a submission as original
  content.

* "unset_original_content()" supports unmarking a submission as
  original content.

* "Redditor.moderated()" to get a list of a Redditor’s moderated
  subreddits.

* Parameter "without_websockets" to "submit_image()" and
  "submit_video()" to submit without using WebSockets.

* "Reddit.redditor()" supports "fullname" param to fetch a Redditor by
  the fullname instead of name. "Redditor" constructor now also has
  "fullname" param.

* Add "RemovalReason" and "SubredditRemovalReasons" to work with
  removal reasons

* Attribute "removal_reasons" to "SubredditModeration" to interact
  with new removal reason classes

* Parameters "mod_note" and "reason_id" to
  "ThingModerationMixin.remove()" to optionally apply a removal reason
  on removal

* Add "SubredditModerationStream" to enable moderation streams

* Attribute "stream" to "SubredditModeration" to interact with new
  moderation streams

* Add "SubredditModerationStream.edited()" to allow streaming of
  "SubredditModeration.edited()"

* Add "SubredditModerationStream.log()" to allow streaming of
  "SubredditModeration.log()"

* Add "SubredditModerationStream.modmail_conversations()" to allow
  streaming of "Modmail.conversations()"

* Add "SubredditModerationStream.modqueue()" to allow streaming of
  "SubredditModeration.modqueue()"

* Add "SubredditModerationStream.reports()" to allow streaming of
  "SubredditModeration.reports()"

* Add "SubredditModerationStream.spam()" to allow streaming of
  "SubredditModeration.spam()"

* Add "SubredditModerationStream.unmoderated()" to allow streaming of
  "SubredditModeration.unmoderated()"

* Add "SubredditModerationStream.unread()" to allow streaming of
  "SubredditModeration.unread()"

* Parameter "exclude_before" to "stream_generator()" to allow
  "SubredditModerationStream.modmail_conversations()" to work

* Parameters "allowable_content" and "max_emojis" to "add()", "add()",
  and "update()", as well as its child classes.

**Deprecated**

* Method "reddit.user.moderator_subreddits" as "Redditor.moderated()"
  provides more functionality.

* The file for ModActions (praw/models/modaction.py) has been moved to
  praw/models/mod_action.py and the previous has been Deprecated.

**Expected Changes**

* The behavior of "APIException" will no longer unicode-escape strings
  in the next minor release.


6.4.0 (2019/09/21)
==================

**Added**

* "crosspost()" support parameter "flair_id" to flair the submission
  immediately upon crossposting.

* "crosspost()" support parameter "flair_text" to set a custom text to
  the flair immediately upon crossposting.

* "crosspost()" support parameter "nsfw" to mark the submission NSFW
  immediately upon crossposting.

* "crosspost()" support parameter "spoiler" to mark the submission as
  a spoiler immediately upon crossposting.

**Fixed**

* "add_community_list()" has parameter "description" to support
  unannounced upstream Reddit API changes.

* "update()" supports passing a list of "Subreddit" objects.

**Changed**

* Removed "css_class" parameter cannot be used with
  "background_color", "text_color", or "mod_only" constraint on
  methods:

  * "SubredditFlairTemplates.update()"

  * "SubredditRedditorFlairTemplates.add()"

  * "SubredditLinkFlairTemplates.add()"

**Removed**

* Drop official support for Python 2.7.

* "Multireddit.rename()" no longer works due to a change in the Reddit
  API.


6.3.1 (2019/06/10)
==================

**Removed**

* "SubredditListingMixin.gilded()", as this was supposed to be removed
  in 6.0.0 after deprecation in 5.2.0.


6.3.0 (2019/06/09)
==================

**Added**

* Collections ("Collection" and helper classes).

* "submit()", "submit_image()", and "submit_video()" can be used to
  submit a post directly to a collection.

* "praw.util.camel_to_snake" and "praw.util.snake_case_keys".

* Comments can now be locked and unlocked via "comment.mod.lock()" and
  "comment.mod.unlock()". See: ("ThingModerationMixin.lock()" and
  "ThingModerationMixin.unlock()").

* "align" parameter to
  "SubredditStylesheet.upload_banner_additional_image()"

**Changed**

* "Reddit.info()" now accepts any non-str iterable for fullnames (not
  just "list").

* "Reddit.info()" now returns a generator instead of a list when using
  the "url" parameter.


6.2.0 (2019/05/05)
==================

**Added**

* "SubredditStylesheet.upload_banner()"

* "SubredditStylesheet.upload_banner_additional_image()"

* "SubredditStylesheet.upload_banner_hover_image()"

* "SubredditStylesheet.delete_banner()"

* "SubredditStylesheet.delete_banner_additional_image()"

* "SubredditStylesheet.delete_banner_hover_image()"

* "submit()", "submit_image()", and "submit_video()" support parameter
  "nsfw" to mark the submission NSFW immediately upon posting.

* "submit()", "submit_image()", and "submit_video()" support parameter
  "spoiler" to mark the submission as a spoiler immediately upon
  posting.

* "submit_image()" and "submit_video()" support parameter "timeout".
  Default timeout has been raised from 2 seconds to 10 seconds.

* Added parameter "function_kwargs" to "stream_generator()" to pass
  additional kwargs to "function".

**Fixed**

* "Subreddit.random()" returns "None" instead of raising
  "ClientException" when the subreddit does not support generating
  random submissions.

**Other**

* Bumped minimum prawcore version to 1.0.1.


6.1.1 (2019/01/29)
==================

**Added**

* "set()" supports parameter "flair_template_id" for giving a user
  redesign flair.


6.1.0 (2019/01/19)
==================

**Added**

* Add method "Redditor.trophies()" to get a list of the Redditor’s
  trophies.

* Add class "PostFlairWidget".

* Add attributes "reply_limit" and "reply_sort" to class "Comment"

* Add class "SubredditWidgetsModeration" (accessible through
  "SubredditWidgets.mod") and method "add_text_area()".

* Add class "WidgetModeration" (accessible through the ".mod"
  attribute on any widget) with methods "update()" and "delete()".

* Add method "Reddit.put()" for HTTP PUT requests.

* Add methods "add_calendar()" and "add_community_list()".

* Add methods "add_image_widget()" and "upload_image()".

* Add method "add_custom_widget()".

* Add method "add_post_flair_widget()".

* Add method "add_menu()".

* Add method "add_button_widget()".

* Add method "reorder()" to reorder a subreddit’s widgets.

* Add "Redditors" ("reddit.redditors") to provide Redditor listings.

* Add "submit_image()" for submitting native images to Reddit.

* Add "submit_video()" for submitting native videos and videogifs to
  Reddit.

**Changed**

* "User.me()" returns "None" in "read_only" mode.

* "SubredditLinkFlairTemplates.__iter__()" uses the v2 flair API
  endpoint. This change will result in additional fields being
  returned. All fields that were previously returned will still be
  returned.

* "SubredditRedditorFlairTemplates.__iter__()" uses the v2 flair API
  endpoint. The method will still return the exact same items.

* Methods "add()", "add()", "update()", and "update()" can add and
  update redesign-style flairs with the v2 flair API endpoint. They
  can still update pre-redesign-style flairs with the older endpoint.

**Fixed**

* Widgets of unknown types are parsed as "Widget"s rather than raising
  an exception.


6.0.0 (2018/07/24)
==================

**Added**

* Add method "WikiPage.revision()" to get a specific wiki page
  revision.

* Added parameter "skip_existing" to "stream_generator()" to skip
  existing items when starting a stream.

* Add method "Front.best()" to get the front page “best” listing.

* Add "Subreddit.widgets", "SubredditWidgets", and widget subclasses
  like "TextArea" to support fetching Reddit widgets.

* Add method "Submission.mark_visited()" to mark a submission as
  visited on the Reddit backend.

**Fixed**

* Fix "RecursionError" on "SubredditEmoji"’s "repr" and "str".

* "SubredditFilters.add()" and "SubredditFilters.remove()" also accept
  a "Subreddit" for the "subreddit" parameter.

* Remove restriction which prevents installed (non-confidential) apps
  from using OAuth2 authorization code grant flow.

**Removed**

* "Subreddit.submissions" as the API endpoint backing the method is no
  more. See https://www.reddit.com/r/changelog/comments/7tus5f/update
  _to_search_api/.


5.4.0 (2018/03/27)
==================

**Added**

* Add method "patch()" to "Reddit" class to support HTTP PATCH
  requests.

* Add class "Preferences" to access and update Reddit preferences.

* Add attribute "User.preferences" to access an instance of
  "Preferences".

* Add method "Message.delete()".

* Add class "Emoji" to work with custom subreddit emoji.

**Deprecated**

* "Subreddit.submissions" as the API endpoint backing the method is
  going away. See https://www.reddit.com/r/changelog/comments/7tus5f/
  update_to_search_api/.

**Fixed**

* Fix bug with positive "pause_after" values in streams provided by
  "stream_generator()" where the wait time was not reset after a
  yielded "None".

* Parse URLs with trailing slashes and no ""comments"" element when
  creating "Submission" objects.

* Fix bug where "Subreddit.submissions" returns a same submission more
  than once

* Fix bug where "ListingGenerator" fetches the same batch of
  submissions in an infinite loop when ""before"" parameter is
  provided.

**Removed**

* Removed support for Python 3.3 as it is no longer supported by
  requests.


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: https://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 via Slack.

**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 "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
