π Unreleased
π Support Python 3.11. (:issue:289)
π¨ Refactor parser internals. (:issue:297)
.. note::
Plugins using the (unstable) session hooks should replace::
reader._parser.session_hooks.request.append(...)
reader._parser.session_hooks.response.append(...)
with::
reader._parser.session_factory.request_hooks.append(...)
reader._parser.session_factory.response_hooks.append(...)
~reader._plugins.twitter plugin:
don't fail when deserializing tweets with missing edit_history_tweet_ids
(fails in tweepy 4.11, warns in tweepy >4.12).π Released 2022εΉ΄09ζ14ζ₯
UpdatedFeed changes:
added field :attr:~UpdatedFeed.unmodified
and property :attr:~UpdatedFeed.total;
fields :attr:~UpdatedFeed.new and :attr:~UpdatedFeed.modified
became optional.
(:issue:96)~reader.plugins.entry_dedupe causing updates to fail
if there were multiple new duplicates of the same issue.
(:issue:292)~reader.plugins.readtime
and :mod:~reader.plugins.mark_as_read causing updates to fail
if an entry was deleted by another plugin.
(:issue:292)~reader.plugins.mark_as_read causing updates to fail
if an entry had no title.ReaderError,
since it would also suppress it for bugs.click.get_terminal_size.π Released 2022εΉ΄08ζ29ζ₯
~reader.plugins.readtime plugin dependency
on readtime <https://github.com/alanhamlett/readtime_>_
(which has a transitive dependency on lxml,
which does not always have PyPy Windows wheels on PyPI).
The readtime extra is deprecated,
but remains available to avoid breaking dependent packages.
(:issue:286)279)π Released 2022εΉ΄07ζ30ζ₯
.. attention::
This release contains backwards incompatible changes.
Remove :mod:~reader.plugins.mark_as_read config tag name migration.
If you are upgrading from reader 2.10 or newer, no action is required.
.. _removed migrations 3.0:
.. attention::
If you are upgrading to *reader* 3.0 from a version **older than 2.10**,
you must open your database with *reader* 2.10 or newer once,
to run the removed migrations:
.. code-block:: sh
pip install 'reader>=2.10,<3' && \
python - db.sqlite << EOF
import sys
from reader import make_reader
from reader.plugins.mark_as_read import _migrate_pre_2_7_metadata as migrate_mark_as_read
reader = make_reader(sys.argv[1])
for feed in reader.get_feeds():
migrate_mark_as_read(reader, feed)
print("OK")
EOF
β Remove code that issued deprecation warnings in versions 2.* (:issue:268):
Reader.get_feed_metadataReader.get_feed_metadata_itemReader.set_feed_metadata_itemReader.delete_feed_metadata_itemReader.get_feed_tagsReader.add_feed_tagReader.remove_feed_tagMetadataErrorMetadataNotFoundErrorFeedMetadataNotFoundErrorEntryMetadataNotFoundError~Entry.object_id property of data objects and related exceptionsπ Make some of the parameters of the following positional-only (:issue:268):
Reader.add_feed: feedReader.delete_feed: feedReader.change_feed_url: old, newReader.get_feed: feed, defaultReader.set_feed_user_title: feed, titleReader.enable_feed_updates: feedReader.disable_feed_updates: feedReader.update_feed: feedReader.get_entry: entry, defaultReader.set_entry_read: entry, readReader.mark_entry_as_read: entryReader.mark_entry_as_unread: entryReader.set_entry_important: entry, importantReader.mark_entry_as_important: entryReader.mark_entry_as_unimportant: entryReader.add_entry: entryReader.delete_entry: entryReader.search_entries: queryReader.search_entry_counts: queryReader.get_tags: resourceReader.get_tag_keys: resourceReader.get_tag: resource, key, defaultReader.set_tag: resource, key, valueReader.delete_tag: resource, keyReader.make_reader_reserved_name: keyReader.make_plugin_reserved_name: plugin_name, keyFeedError (and subclasses): urlEntryError (and subclasses): feed_url, entry_idTagError (and subclasses): resource_id, keyIn :func:make_reader,
wrap exceptions raised during plugin initialization
in new exception :exc:PluginInitError
instead of letting them bubble up.
(:issue:268)
Swap the order of the first two arguments of :exc:TagError (and subclasses);
TagError(key, resource_id, ...) becomes
TagError(resource_id, key, ...).
(:issue:268)
π Released 2022εΉ΄07ζ23ζ₯
~Entry.object_id property of data objects
in favor of new property :attr:~Entry.resource_id.
:attr:~Entry.resource_id is the same as :attr:~Entry.object_id,
except for feeds and feed-related exceptions it is
of type tuple[str] instead of str.
:attr:~Entry.object_id will be removed in version 3.0.
(:issue:266, :issue:268)PRAGMA optimize if the database is busy.
Prevents rare "database is locked" errors when multiple threads
using the same reader terminate at the same time.
(:issue:206)π Released 2022εΉ΄07ζ17ζ₯
Reader object from multiple threads directly
(do not require it to be used as a context manager anymore).
(:issue:206)Reader objects to be reused after closing.
(:issue:206, :issue:284)~Reader.close from any thread. (:issue:206)Reader object from multiple asyncio tasks.
(:issue:206)π Released 2022εΉ΄07ζ08ζ₯
Reader objects from threads other than the creating thread.
(:issue:206)Reader objects as context managers.
(:issue:206)π Released 2022εΉ΄06ζ30ζ₯
reader would fail type checking with
error: Skipping analyzing "reader": module is installed,
but missing library stubs or py.typed marker.
(:issue:280)278)π Released 2022εΉ΄06ζ28ζ₯
~reader._plugins.twitter experimental plugin,
which allows using a Twitter account as a feed.
(:issue:271)ParseError if all entries have a missing id.
(Note that both Atom and JSON Feed entries are required to have an id
by their respective specifications.)
Thanks to Mirek DΕugosz_ for the issue and pull request.
(:issue:281)ReaderWarning.π Released 2022εΉ΄03ζ31ζ₯
β Add the :mod:~reader.plugins.readtime
:ref:built-in <built-in plugins> plugin,
which stores the entry read time as a tag during feed update.
(:issue:275)
Allow running arbitrary actions once before/after updating feeds
via :attr:~Reader.before_feeds_update_hooks /
:attr:~Reader.after_feeds_update_hooks.
Add :meth:Entry.get_content and :attr:Content.is_html.
π In the web app, use the read time provided by the
:mod:~reader.plugins.readtime plugin,
instead of calculating it on each page load.
Speeds up the rendering of the entries page by 20-30%,
hopefully winning back the time lost
when the read time feature was first added in 2.6 <Version 2.6_>_.
(:issue:275)
π In the web app, also show the read time for search results.