Change Log¶
6.5.1 (2010/01/07)¶
Fixed
- Removed usages of
NoReturn
that caused PRAW to fail due toImportError
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
tosubmit_image()
andsubmit_video()
to submit without using WebSockets. Reddit.redditor()
supportsfullname
param to fetch a Redditor by the fullname instead of name.Redditor
constructor now also hasfullname
param.- Add
RemovalReason
andSubredditRemovalReasons
to work with removal reasons - Attribute
removal_reasons
toSubredditModeration
to interact with new removal reason classes - Parameters
mod_note
andreason_id
toThingModerationMixin.remove()
to optionally apply a removal reason on removal - Add
SubredditModerationStream
to enable moderation streams - Attribute
stream
toSubredditModeration
to interact with new moderation streams - Add
SubredditModerationStream.edited()
to allow streaming ofSubredditModeration.edited()
- Add
SubredditModerationStream.log()
to allow streaming ofSubredditModeration.log()
- Add
SubredditModerationStream.modmail_conversations()
to allow streaming ofModmail.conversations()
- Add
SubredditModerationStream.modqueue()
to allow streaming ofSubredditModeration.modqueue()
- Add
SubredditModerationStream.reports()
to allow streaming ofSubredditModeration.reports()
- Add
SubredditModerationStream.spam()
to allow streaming ofSubredditModeration.spam()
- Add
SubredditModerationStream.unmoderated()
to allow streaming ofSubredditModeration.unmoderated()
- Add
SubredditModerationStream.unread()
to allow streaming ofSubredditModeration.unread()
- Parameter
exclude_before
tostream_generator()
to allowSubredditModerationStream.modmail_conversations()
to work - Parameters
allowable_content
andmax_emojis
toadd()
,add()
, andupdate()
, as well as its child classes.
Deprecated
moderator_subreddits()
asRedditor.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 parameterflair_id
to flair the submission immediately upon crossposting.crosspost()
support parameterflair_text
to set a custom text to the flair immediately upon crossposting.crosspost()
support parameternsfw
to mark the submission NSFW immediately upon crossposting.crosspost()
support parameterspoiler
to mark the submission as a spoiler immediately upon crossposting.
Fixed
add_community_list()
has parameterdescription
to support unannounced upstream Reddit API changes.update()
supports passing a list ofSubreddit
objects.
Changed
Removed
css_class
parameter cannot be used withbackground_color
,text_color
, ormod_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()
, andsubmit_video()
can be used to submit a post directly to a collection.praw.util.camel_to_snake
andpraw.util.snake_case_keys
.- Comments can now be locked and unlocked via
comment.mod.lock()
andcomment.mod.unlock()
. See: (ThingModerationMixin.lock()
andThingModerationMixin.unlock()
). align
parameter toSubredditStylesheet.upload_banner_additional_image()
Changed
Reddit.info()
now accepts any non-str iterable for fullnames (not justlist
).Reddit.info()
now returns a generator instead of a list when using theurl
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()
, andsubmit_video()
support parameternsfw
to mark the submission NSFW immediately upon posting.submit()
,submit_image()
, andsubmit_video()
support parameterspoiler
to mark the submission as a spoiler immediately upon posting.submit_image()
andsubmit_video()
support parametertimeout
. Default timeout has been raised from 2 seconds to 10 seconds.- Added parameter
function_kwargs
tostream_generator()
to pass additional kwargs tofunction
.
Fixed
Subreddit.random()
returnsNone
instead of raisingClientException
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 parameterflair_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
andreply_sort
to classComment
- Add class
SubredditWidgetsModeration
(accessible throughSubredditWidgets.mod
) and methodadd_text_area()
. - Add class
WidgetModeration
(accessible through the.mod
attribute on any widget) with methodsupdate()
anddelete()
. - Add method
Reddit.put()
for HTTP PUT requests. - Add methods
add_calendar()
andadd_community_list()
. - Add methods
add_image_widget()
andupload_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()
returnsNone
inread_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()
, andupdate()
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
tostream_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 likeTextArea
to support fetching Reddit widgets. - Add method
Submission.mark_visited()
to mark a submission as visited on the Reddit backend.
Fixed
- Fix
RecursionError
onSubredditEmoji
’srepr
andstr
. SubredditFilters.add()
andSubredditFilters.remove()
also accept aSubreddit
for thesubreddit
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()
toReddit
class to support HTTP PATCH requests. - Add class
Preferences
to access and update Reddit preferences. - Add attribute
User.preferences
to access an instance ofPreferences
. - 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 bystream_generator()
where the wait time was not reset after a yieldedNone
. - Parse URLs with trailing slashes and no
'comments'
element when creatingSubmission
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 anAssertionError
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. Usesubreddit.gilded
instead.
Fixed
- Removed
comment.permalink()
becausecomment.permalink
is now an attribute returned by Reddit.
5.1.0 (2017/08/31)¶
Added
Redditor.stream
, with methodsRedditorStream.submissions()
andRedditorStream.comments()
to stream a Redditor’s comments or submissionsRedditorStream
has been added to facilitateRedditor.stream
Inbox.collapse()
to mark messages as collapsed.Inbox.uncollapse()
to mark messages as uncollapsed.- Raise
ClientException
when callingrefresh()
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 nestedComment
will additionally pull in as many parent comments as possible (currently 8) enabling significantly quicker traversal to the top-mostComment
via successiveparent()
calls. - Calling
refresh()
previously could have resulted in aAttributeError: 'MoreComments' object has no attribute '_replies'
exception. This situation will now result in aClientException
. - Properly handle
BAD_CSS_NAME
errors when uploading stylesheet images with invalid filenames. Previously anAssertionError
was raised. Submission
’sgilded
attribute properly returns the expected value from reddit.
5.0.1 (2017/07/11)¶
Fixed
5.0.0 (2017/07/04)¶
Added
Comment.disable_inbox_replies()
,Comment.enable_inbox_replies()
Submission.disable_inbox_replies()
, andSubmission.enable_inbox_replies()
to toggle inbox replies on comments and submissions.
Changed
cloudsearch
is no longer the default syntax forSubreddit.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
raisesAttributeError
.
Removed
- Iterating directly over
SubredditRelationship
(e.g.,subreddit.banned
,subreddit.contributor
,subreddit.moderator
, etc) andSubredditFlair
is no longer possible. Iterate instead over their callables, e.g.subreddit.banned()
andsubreddit.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
toSubredditFlair.set()
is removed. - The
thing
argument toSubredditFlair.set()
is removed. - Return values from
Comment.block()
,Message.block()
,SubredditMessage.block()
,SubredditFlair.delete()
,friend()
,Redditor.message()
,Subreddit.message()
,select()
, andunfriend()
are removed as they do not provide any useful information. praw.ini
no longer reads inhttp_proxy
andhttps_proxy
settings.is_link
parameter ofSubredditRedditorFlairTemplates.add()
andSubredditRedditorFlairTemplates.clear()
. UseSubredditLinkFlairTemplates
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 ofSubredditRedditorFlairTemplates.add()
andSubredditRedditorFlairTemplates.clear()
. UseSubredditLinkFlairTemplates
instead.
4.5.1 (2017/05/07)¶
Fixed
- Calling
parent()
works onComment
instances obtained viacomment_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()
acceptsselftext=''
to create a title-only submission.Reddit
acceptsrequestor_class=cls
for a customized requestor class andrequestor_kwargs={'param': value}
for passing arguments to requestor initialization.comments()
,submissions()
, andstream()
accept apause_after
argument to allow pausing of the stream. The default value ofNone
retains the preexisting behavior.
Deprecated
cloudsearch
will no longer be the default syntax forSubreddit.search()
in PRAW 5. Insteadlucene
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 causedTypeError
. Submission
attributescomment_limit
andcomment_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
tolimits()
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 anAssertionError
. - Uploading an invalid image raises
APIException
. Redditor
instances obtained viamoderator
(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 attributesauthor
,dest
replies
andsubreddit
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 ofLiveThreadContribution
.LiveThreadContribution.add()
to add an update to the live thread.LiveThreadContribution.close()
to close the live thread permanently.LiveUpdate.contrib
to obtain an instance ofLiveUpdateContribution
.LiveUpdateContribution.remove()
to remove a live update.LiveContributorRelationship.accept_invite()
to accept an invite to contribute the live thread.SubredditHelper.create()
andSubredditModeration.update()
have documented support forspoilers_enabled
. Note, however, thatSubredditModeration.update()
will currently unset thespoilers_enabled
value until such a time that Reddit returns the value along with the other settings.spoiler()
andunspoiler()
to change a submission’s spoiler status.
Fixed
LiveContributorRelationship.invite()
andLiveContributorRelationship.remove_invite()
now hit endpoints, which starts with ‘api/’, for consistency.ModeratorRelationship.update()
, andModeratorRelationship.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 throughLiveThread.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()
, andunfriend()
will be removed in PRAW 5 as they do not provide any useful information.
Fixed
hide()
andunhide()
now accept a list of additional submissions.replace_more()
is now recoverable. Previously, when an exception was raised during the work done byreplace_more()
, all unreplacedMoreComments
instances were lost. NowMoreComments
instances are only removed once their children have been added to theCommentForest
enabling callers ofreplace_more()
to call the method as many times as required to complete the replacement.- Working with contributors on
SubredditWiki
is done consistently throughcontributor
notcontributors
. Subreddit.moderator()
works.live_thread.contributor()
now returnsRedditorList
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 topraw.models.LiveThread.__init__
.SubredditFilters
to work with filters for special subreddits, like/r/all
.- Added callables for
SubredditRelationship
andSubredditFlair
so thatlimit
and other parameters can be passed. - Add
reply()
toMessage
which was accidentally missed previously. - Add
sticky
parameter toCommentModeration.distinguish()
to sticky comments. flair()
to add a submission’s flair from an instance ofSubmission
.Comment.parent()
to obtain the parent of aComment
.opt_in()
andopt_out()
toSubreddit
to permit working with quarantined subreddits.LiveUpdate
to represent an individual update in aLiveThread
.- Ability to access an individual
LiveUpdate
viareddit.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. Setuse_cache=False
when calling to bypass the cache.replace_more()
can be called onComment
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) andSubredditFlair
will be removed in PRAW 5. Iterate instead over their callables, e.g.subreddit.banned()
andsubreddit.flair()
. - The following methods are deprecated to be removed in PRAW 5 and are replaced
with similar
Comment.mod...
andSubmission.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
toSubredditFlair.set()
will be removed in PRAW 5. Useflair()
instead. - The
thing
argument toSubredditFlair.set()
is replaced withredditor
and will be removed in PRAW 5.
Fixed
SubredditModeration.update()
accurately updatesexclude_banned_modqueue
,header_hover_text
,show_media
andshow_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 raiseAttributeError
instead ofPRAWException
.
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 tourl()
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 via Slack.
Added
praw.models.Comment.block()
,praw.models.Message.block()
, andpraw.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
andpraw.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()
andpraw.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 nowpraw.models.reddit.subreddit.SubredditStream.comments()
helpers.submissions_between
is nowSubreddit.submissions
. This new method now only iterates through newest submissions first and as a result makes approximately 33% fewer requests.helpers.submission_stream
is nowpraw.models.reddit.subreddit.SubredditStream.submissions()
Removed
- Removed
Reddit
’slogin
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
andMessage.uncollapse
is_username_available
. - Removed captcha related functions.
For changes prior to version 4.0 please see: 3.4.0 changelog