Skip to content

Latest commit

 

History

History
1843 lines (1353 loc) · 59.5 KB

CHANGES.rst

File metadata and controls

1843 lines (1353 loc) · 59.5 KB

Changelog

.. module:: reader
  :noindex:


Version 3.13

Unreleased

Version 3.12

Released 2024-03-05

Version 3.11

Released 2023-12-30

Version 3.10

Released 2023-11-12

Version 3.9

Released 2023-08-28

Version 3.8

Released 2023-08-20

Version 3.7

Released 2023-07-15

Attention!

This is the last release to support Python 3.9; see :issue:`302` for details.

Version 3.6

Released 2023-06-16

Version 3.5

Released 2023-03-19

Version 3.4

Released 2023-01-22

Version 3.3

Released 2022-12-19

This release marks reader's 5th anniversary and its 2000th commit.

Attention!

This is the last release to support Python 3.8; see :issue:`298` for details.

  • Support Python 3.11. (:issue:`289`)

  • Postpone update-related imports until needed. Shortens time from process start to usable Reader instance by 3x (imports are 72% faster). (:issue:`297`)

  • 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(...)
    
  • :ref:`twitter` plugin: don't fail when deserializing tweets with missing edit_history_tweet_ids (fails in tweepy 4.11, warns in tweepy >4.12).

Version 3.2

Released 2022-09-14

Version 3.1

Released 2022-08-29

  • Drop :mod:`~reader.plugins.readtime` plugin dependency on 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`)
  • Sort entries by added date most of the time, with the exception of those imported on the first update. Previously, entries would be sorted by added only if they were published less than 7 days ago, causing entries that appear in the feed months after their published to never appear at the top (so the user would never see them). (:issue:`279`)

Version 3.0

Released 2022-07-30

Attention!

This release contains backwards incompatible changes.

Version 2.17

Released 2022-07-23

Version 2.16

Released 2022-07-17

Version 2.15

Released 2022-07-08

Version 2.14

Released 2022-06-30

  • Mark reader as providing type information. Previously, code importing from :mod:`reader` would fail type checking with error: Skipping analyzing "reader": module is installed, but missing library stubs or py.typed marker. (:issue:`280`)
  • Drop Python 3.7 support. (:issue:`278`)
  • Support PyPy 3.9.

Version 2.13

Released 2022-06-28

  • Add the :ref:`twitter` experimental plugin, which allows using a Twitter account as a feed. (:issue:`271`)
  • Skip with a warning entries that have no <guid> or <link> in an RSS feed; only raise :exc:`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`)
  • Add :exc:`ReaderWarning`.

Version 2.12

Released 2022-03-31

Version 2.11

Released 2022-03-17

  • Fix issue causing :func:`make_reader` to fail with message database requirement error: required SQLite compile options missing: ['ENABLE_JSON1'] when using SQLite 3.38 or newer. (:issue:`273`)

Version 2.10

Released 2022-03-12

  • Support entry and global tags. (:issue:`272`, :issue:`228`, :issue:`267`)

  • Remove :meth:`~Reader.get_tags()` support for the (None,) (any feed) and :const:`None` (any resource) wildcard resource values.

    Warning

    This is a minor compatibility break, but is unlikely to affect existing users; the usefulness of the wildcards was limited, because it was impossible to tell to which resource a (key, value) pair belongs.

  • Allow passing a (feed URL,) 1-tuple anywhere a feed URL can be passed to a :class:`Reader` method.

  • Remove the global_metadata experimental plugin (superseded by global tags).

  • In the web application, support editing entry and global metadata. Fix broken delete metadata button. Fix broken error flashing.

Version 2.9

Released 2022-02-07

  • Decrease :meth:`~Reader.update_feeds()` memory usage by ~35% (using the maxrss before the call as baseline; overall process maxrss decreases by ~20%). The improvement is not in reader code, but in feedparser; reader will temporarily vendor feedparser until the fix makes it upstream and is released on PyPI. (:issue:`265`)
  • In the web application, allow sorting feeds by the number of entries: important, unread, per day during the last 1, 3, 12 months. (:issue:`249`, :issue:`245`).

Version 2.8

Released 2022-01-22

Version 2.7

Released 2022-01-04

Version 2.6

Released 2021-11-15

Version 2.5

Released 2021-10-28

Version 2.4

Released 2021-10-19

Version 2.3

Released 2021-10-11

  • Support Python 3.10. (:issue:`248`)

  • :mod:`~reader.plugins.entry_dedupe` now deletes old duplicates instead of marking them as read/unimportant. (:issue:`140`)

    Note

    Please comment in :issue:`140` / open an issue if you were relying on the old behavior.

  • Fix :mod:`~reader.plugins.entry_dedupe` bug introduced in 2.2, causing the newest read entry to be marked as unread if none of its duplicates are read (idem for important). This was an issue only when re-running the plugin for existing entries, not for new entries (since new entries are unread/unimportant).

Version 2.2

Released 2021-10-08

Version 2.1

Released 2021-08-18

Version 2.0

Released 2021-07-17

Attention!

This release contains backwards incompatible changes.

Version 1.20

Released 2021-07-12

Version 1.19

Released 2021-06-16

Version 1.18

Released 2021-06-03

Version 1.17

Released 2021-05-06

  • Reserve tags and metadata keys starting with .reader. and .plugin. for reader- and plugin-specific uses. See the :ref:`reserved names` user guide section for details. (:issue:`186`)

  • Ignore :attr:`~Feed.updated` when updating feeds; only update the feed if other feed data changed or if any entries were added/updated. (:issue:`231`)

    Prevents spurious updates for feeds whose :attr:`~Feed.updated` changes excessively (either because the entries' content changes excessively, or because an RSS feed does not have a dc:date element, and feedparser falls back to lastBuildDate for :attr:`~Feed.updated`).

  • The regex_mark_as_read experimental plugin is now :ref:`built-in <built-in plugins>`. To use it with the CLI / web application, use the plugin name instead of the entry point (reader.mark_as_read).

    The config metadata key and format changed; the config will be migrated automatically on the next feed update, during reader version 1.17 only. If you used regex_mark_as_read and are upgrading to a version >1.17, install 1.17 (pip install reader==1.17) and run a full feed update (python -m reader update) before installing the newer version.

  • The enclosure-tags, preview-feed-list, and sqlite-releases unstable extras are not available anymore. Use the unstable-plugins extra to install dependencies of the unstable plugins instead.

  • In the web application, allow updating a feed manually. (:issue:`195`)

Version 1.16

Released 2021-03-29

Version 1.15

Released 2021-03-21

  • Update entries whenever their content changes, regardless of their :attr:`~Entry.updated` date. (:issue:`179`)

    Limit content-only updates (not due to an :attr:`~Entry.updated` change) to 24 consecutive updates, to prevent spurious updates for entries whose content changes excessively (for example, because it includes the current time). (:issue:`225`)

    Previously, entries would be updated only if the entry :attr:`~Entry.updated` was newer than the stored one.

  • Fix bug causing entries that don't have :attr:`~Entry.updated` set in the feed to not be updated if the feed is marked as stale. Feed staleness is an internal feature used during storage migrations; this bug could only manifest when migrating from 0.22 to 1.x. (found during :issue:`179`)

  • Minor web application improvements.

  • Minor CLI improvements.

Version 1.14

Released 2021-02-22

  • Add the :meth:`~Reader.update_feeds_iter` method, which yields the update status of each feed as it gets updated. (:issue:`204`)
  • Change the return type of :meth:`~Reader.update_feed` from None to Optional[UpdatedFeed]. (:issue:`204`)
  • Add the session_timeout argument to :func:`make_reader` to set a timeout for retrieving HTTP(S) feeds. The default (connect timeout, read timeout) is (3.05, 60) seconds; the previous behavior was to never time out.
  • Use PRAGMA user_version instead of a version table. (:issue:`210`)
  • Use PRAGMA application_id to identify reader databases; the id is 0x66656564read in ASCII / UTF-8. (:issue:`211`)
  • Change the reader update command to show a progress bar and update summary (with colors), instead of plain log output. (:issue:`204`)
  • Fix broken Mypy config following 0.800 release. (:issue:`213`)

Version 1.13

Released 2021-01-29

  • JSON Feed support. (:issue:`206`)
  • Split feed retrieval from parsing; should make it easier to add new/custom parsers. (:issue:`206`)
  • Prevent any logging output from the reader logger by default. (:issue:`207`)
  • In the preview_feed_list plugin, add <link rel=alternative ...> tags as a feed detection heuristic.
  • In the preview_feed_list plugin, add <a> tags as a fallback feed detection heuristic.
  • In the web application, fix bug causing the entries page to crash when counts are enabled.

Version 1.12

Released 2020-12-13

Version 1.11

Released 2020-11-28

  • Allow disabling feed updates for specific feeds. (:issue:`187`)
  • Add methods to get aggregated feed and entry counts. (:issue:`185`)
  • In the web application: allow disabling feed updates for a feed; allow filtering feeds by whether they have updates enabled; do not show feed update errors for feeds that have updates disabled. (:issue:`187`)
  • In the web application, show feed and entry counts when ?counts=yes is used. (:issue:`185`)
  • In the web application, use YAML instead of JSON for the tags and metadata fields.

Version 1.10

Released 2020-11-20

Version 1.9

Released 2020-10-28

  • Support Python 3.9. (:issue:`199`)
  • Support Windows (requires Python >= 3.9). (:issue:`163`)
  • Use GitHub Actions to do macOS and Windows CI builds. (:issue:`199`)
  • Rename the cloudflare_ua_fix plugin to ua_fallback. Retry any feed that gets a 403, not just those served by Cloudflare. (:issue:`181`)
  • Fix type annotation to avoid mypy 0.790 errors. (:issue:`198`)

Version 1.8

Released 2020-10-02

Version 1.7

Released 2020-09-19

  • Add new methods to support feed tags: :meth:`~Reader.add_feed_tag`, :meth:`~Reader.remove_feed_tag`, and :meth:`~Reader.get_feed_tags`. Allow filtering feeds and entries by their feed tags. (:issue:`184`)
  • Add the broken argument to :meth:`~Reader.get_feeds`, which allows getting only feeds that failed / did not fail during the last update. (:issue:`189`)
  • feedparser 5.x support is deprecated in favor of feedparser 6.x. Using feedparser 5.x will raise a deprecation warning in version 1.7, and support will be removed the following version. (:issue:`190`)
  • Tag-related web application features: show tags in the feed list; allow adding/removing tags; allow filtering feeds and entries by their feed tag; add a page that lists all tags. (:issue:`184`)
  • In the web application, allow showing only feeds that failed / did not fail. (:issue:`189`)
  • In the preview_feed_list plugin, add <meta> tags as a feed detection heuristic.
  • Add a few property-based tests. (:issue:`188`)

Version 1.6

Released 2020-09-04

  • Add the feed_root argument to :func:`make_reader`, which allows limiting local feed parsing to a specific directory or disabling it altogether. Using it is recommended, since by default reader will access any local feed path (in 2.0, local file parsing will be disabled by default). (:issue:`155`)
  • Support loading CLI and web application settings from a :doc:`configuration file <config>`. (:issue:`177`)
  • Fail fast for feeds that return HTTP 4xx or 5xx status codes, instead of (likely) failing later with an ambiguous XML parsing error. The cause of the raised :exc:`ParseError` is now an instance of :exc:`requests.HTTPError`. (:issue:`182`)
  • Add cloudflare_ua_fix plugin (work around Cloudflare sometimes blocking requests). (:issue:`181`)
  • feedparser 6.0 (beta) compatibility fixes.
  • Internal parser API changes to support alternative parsers, pre-request hooks, and making arbitrary HTTP requests using the same logic :class:`Reader` uses. (:issue:`155`)
  • In the /preview page and the preview_feed_list plugin, use the same plugins the main :class:`Reader` does. (enabled by :issue:`155`)

Version 1.5

Released 2020-07-30

  • Use rowid when deleting from the search index, instead of the entry id. Previously, each :meth:`~Reader.update_search` call would result in a full scan, even if there was nothing to update/delete. This should reduce the amount of reads significantly (deleting 4 entries from a database with 10k entries resulted in an 1000x decrease in bytes read). (:issue:`178`)

  • Require at least SQLite 3.18 (released 2017-03-30) for the current :meth:`~Reader.update_search` implementation; all other reader features continue to work with SQLite >= 3.15. (:issue:`178`)

  • Run PRAGMA optimize on :meth:`~Reader.close()`. This should increase the performance of all methods. As an example, in :issue:`178` it was found that :meth:`~Reader.update_search` resulted in a full scan of the entries table, even if there was nothing to update; this change should prevent this from happening. (:issue:`143`)

    Note

    PRAGMA optimize is a no-op in SQLite versions earlier than 3.18. In order to avoid the case described above, you should run ANALYZE regularly (e.g. every few days).

Version 1.4

Released 2020-07-13

  • Work to reduce the likelihood of "database is locked" errors during updates (:issue:`175`):
    • Prepare entries to be added to the search index (:meth:`~Reader.update_search`) outside transactions.
    • Fix bug causing duplicate rows in the search index when an entry changes while updating the search index.
    • Update the search index only when the indexed values change (details below).
    • Use SQLite WAL (details below).
  • Update the search index only when the indexed values change. Previously, any change on a feed would result in all its entries being re-indexed, even if the feed title or the entry content didn't change. This should reduce the :meth:`~Reader.update_search` run time significantly.
  • Use SQLite's write-ahead logging to increase concurrency. At the moment there is no way to disable WAL. This change may be reverted in the future. (:issue:`169`)
  • Require at least click 7.0 for the cli extra.
  • Do not fail for feeds with incorrectly-declared media types, if feedparser can parse the feed; this is similar to the current behavior for incorrectly-declared encodings. (:issue:`171`)
  • Raise :exc:`ParseError` during update for feeds feedparser can't detect the type of, instead of silently returning an empty feed. (:issue:`171`)
  • Add sort argument to :meth:`~Reader.search_entries`. Allow sorting search results by recency in addition to relevance (the default). (:issue:`176`)
  • In the web application, display a nice error message for invalid search queries instead of returning an HTTP 500 Internal Server Error.
  • Other minor web application improvements.
  • Minor CLI logging improvements.

Version 1.3

Released 2020-06-23

Version 1.2

Released 2020-05-18

  • Minor web application improvements.
  • Remove unneeded additional query in methods that use pagination (for n = len(result) / page size, always do n queries instead n+1). :meth:`~Reader.get_entries` and :meth:`~Reader.search_entries` are now 33–7% and 46–36% faster, respectively, for results of size 32–256. (:issue:`166`)
  • All queries are now chunked/paginated to avoid locking the SQLite storage for too long, decreasing the chance of concurrent queries timing out; the problem was most visible during :meth:`~Reader.update_search`. This should cap memory usage for methods returning an iterable that were not paginated before; previously the whole result set would be read before returning it. (:issue:`167`)

Version 1.1

Released 2020-05-08

  • Add sort argument to :meth:`~Reader.get_entries`. Allow sorting entries randomly in addition to the default most-recent-first order. (:issue:`105`)
  • Allow changing the entry sort order in the web application. (:issue:`105`)
  • Use a query builder instead of appending strings manually for the more complicated queries in search and storage. (:issue:`123`)
  • Make searching entries faster by filtering them before searching; e.g. if 1/5 of the entries are read, searching only read entries is now ~5x faster. (enabled by :issue:`123`)

Version 1.0.1

Released 2020-04-30

Version 1.0

Released 2020-04-28

  • Make all private submodules explicitly private. (:issue:`156`)

    Note

    All direct imports from :mod:`reader` continue to work.

    • The reader.core.* modules moved to reader.* (most of them prefixed by _).
    • The web application WSGI entry point moved from reader.app.wsgi:app to reader._app.wsgi:app.
    • The entry points for plugins that ship with reader moved from reader.plugins.* to reader._plugins.*.
  • Require at least beautifulsoup4 4.5 for the search extra (before, the version was unspecified). (:issue:`161`)

  • Rename the web application dependencies extra from web-app to app.

  • Fix relative link resolution and content sanitization; sgmllib3k is now a required dependency for this reason. (:issue:`125`, :issue:`157`)

Version 0.22

Released 2020-04-14

Version 0.21

Released 2020-04-04

  • Minor consistency improvements to the web app search button. (:issue:`122`)
  • Add support for web application plugins. (:issue:`80`)
  • The enclosure tag proxy is now a plugin, and is disabled by default. See its documentation for details. (:issue:`52`)
  • In the web app, the "add feed" button shows a preview before adding the feed. (:issue:`145`)
  • In the web app, if the feed to be previewed is not actually a feed, show a list of feeds linked from that URL. This is a plugin, and is disabled by default. (:issue:`150`)
  • reader now uses a User-Agent header like python-reader/0.21 when retrieving feeds instead of the default requests one. (:issue:`154`)

Version 0.20

Released 2020-03-31

Version 0.19

Released 2020-03-25

Version 0.18

Released 2020-01-26

Version 0.17

Released 2019-10-12

Version 0.16

Released 2019-09-02

Version 0.15

Released 2019-08-24

  • Improve entry page rendering for text/plain content. (:issue:`117`)
  • Improve entry page rendering for images and code blocks. (:issue:`126`)
  • Show enclosures on the entry page. (:issue:`128`)
  • Show the entry author. (:issue:`129`)
  • Fix bug causing the enclosure tag proxy to use too much memory. (:issue:`133`)
  • Start using mypy on the core modules. (:issue:`132`)

Version 0.14

Released 2019-08-12

Version 0.13

Released 2019-07-12

Version 0.12

Released 2019-06-22

  • Fix flashed messages never disappearing. (:issue:`81`)
  • Minor metadata page UI improvements.
  • Allow limiting the number of entries on the entries page via the limit URL parameter.
  • Add link to the feed on the entries and feeds pages. (:issue:`118`)
  • Use Black and pre-commit to enforce style.

Version 0.11

Released 2019-05-26

  • Support storing per-feed metadata. (:issue:`114`)
  • Add feed metadata page to the web app. (:issue:`114`)
  • The regex_mark_as_read plugin is now configurable via feed metadata; drop support for the READER_PLUGIN_REGEX_MARK_AS_READ_CONFIG file. (:issue:`114`)

Version 0.10

Released 2019-05-18

  • Unify plugin loading and error handling code. (:issue:`112`)
  • Minor improvements to CLI error reporting.

Version 0.9

Released 2019-05-12

Version 0.8

Released 2019-04-21

  • Make the internal APIs use explicit types instead of tuples. (:issue:`111`)
  • Finish updater internal API. (:issue:`107`)
  • Automate part of the release process (scripts/release.py).

Version 0.7

Released 2019-04-14

Version 0.6

Released 2019-04-13

  • Minor web application style changes to make the layout more condensed.
  • Factor out update logic into a separate interface. (:issue:`107`)
  • Fix update failing if the feed does not have a content type header. (:issue:`108`)

Version 0.5

Released 2019-02-09

  • Make updating new feeds up to 2 orders of magnitude faster; fixes a problem introduced by :issue:`94`. (:issue:`104`)
  • Move the core modules to a separate subpackage and enforce test coverage (make coverage now fails if the coverage for core modules is less than 100%). (:issue:`101`)
  • Support Python 3.8 development branch.
  • Add dev and docs extras (to install development requirements).
  • Build HTML documentation when running tox.
  • Add test-all and docs make targets (to run tox / build HTML docs).

Version 0.4

Released 2019-01-02

Version 0.3

Released on 2018-12-22

Version 0.2

Released on 2018-11-25

  • Factor out storage-related functionality into a separate interface. (:issue:`94`)
  • Fix update --new-only updating the same feed repeatedly on databases that predate --new-only. (:issue:`95`)
  • Add web application screenshots to the documentation.

Version 0.1.1

Released on 2018-10-21

  • Fix broken reader serve command (broken in 0.1).
  • Raise :exc:`StorageError` for unsupported SQLite configurations at :class:`Reader` instantiation instead of failing at run-time with a generic StorageError("sqlite3 error"). (:issue:`92`)
  • Fix wrong submit button being used when pressing enter in non-button fields. (:issue:`69`)
  • Raise :exc:`StorageError` for failed migrations instead of an undocumented exception. (:issue:`92`)
  • Use requests-mock in parser tests instead of a web server (test suite run time down by ~35%). (:issue:`90`)

Version 0.1

Released on 2018-09-15