spotipy/examples
Tony Jackson a7b25d0f6e
Add deprecation warnings to direct users towards using cache_handler (#630)
* Refactor functions into static methods of AuthBase

Functions is_token_expired was a loose function that was added to
SpotifyClientCredentials, SpotifyPKCE, and SpotifyImplicitGrant classes
through a method on each class that passed the call to the loose
is_token_expired function. Function _is_scope_subset was duplicated on
SpotifyClientCredentials, SpotifyPKCE, and SpotifyImplicitGrant classes.

Refactoring is_token_expired and _is_scope_subset to be static methods
on SpotifyAuthBase means both are available for all derived classes and
require less boilerplate.

* Create CacheHandler to abstract caching tokens

Previous code only supported caching to and from json files in a given
directory. In addition, the get_cached_token method mixed getting and
getting the token in the same method.

This change creates a CacheHandler class to abstract out the caching
implementation and allow the user to cache tokens in any way they
see fit. For example, the user could create a MongoCache class to store
and retrieve tokens from a Mongo database and specify that
cache_handler=MongoCache in creating an auth_manager object.

To implement the CacheHandler abstraction, the following changes are
implemented:

The validation code in each get_cached_token method in SpotifyOAuth,
SpotifyPKCE, and SpotifyImplicitGrant is moved into a validate_token
method in each class.

The CacheHandler class is created with get_cached_token and
save_token_to_cache methods.

Previous instances of self.get_cached_token() are now replaced with
self.validate_token(self.cache_handler.get_cached_token()) to preserve
the getting and validation behaviour.

cache_handler is added as an argument to SpotifyOAuth, SpotifyPKCE, and
SpotifyImplicitGrant. Specifying a cache_handler now overrides any
specification of cache_path and/or username.

To preserve backwards compatibility in handling cache files, a
CacheFileHandler class extending CacheHandler is created. If no
cache_handler is specified, the cache_path and username arguments are
used to create an instance of CacheFileHandler. It may be worth
deprecating the cache_path and username fields in favour of using
CacheFileHandler.

Tests are also modified and extended to cover the new functionality. A
sample MemoryCache CacheHandler is created to test getting and saving to
a custom CacheHandler.

* Fix cache_handler subclass check for Python 2

* Split assert message to fix line over max length

* Split cache handlers into cache_handler.py

* flake8 and autopep fixes

* Fix init to allow importing CacheHandler

When spotipy is installed as a package, CacheHandler is not accessible
from a `from spotipy import CacheHandler` statement because the import
is not specified in the __init__.py file. This commit adds CacheHandler
and CacheFileHandler to the init file so the user can import them.

* flake8 fix

* Add cache_path & username deprecation warning

When cache_path or username are specified in the constructors of
SpotifyOAuth, SpotifyPKCE, or SpotifyImplicitGrant, the constructor
creates a CacheFileHandler instance under the hood. The user is
currently able to create a CacheFileHandler instance in two ways:

1.  By creating it outside the SpotifyOAuth (or etc.) constructor and
    passing it as the cache_handler
2.  By passing cache_path and username to the constructor

Ideally, there would be one and only one obvious way to specify a
CacheFileHandler instance and the cache_handler approach allows any
CacheHandler to be used, so passing the cache_path or username to the
constructor should be deprecated.

* Update flask example to use CacheFileHandler

* Update changelog with deprecation warning info

* Restore token caching methods on auth_manager

Change 9550c8fd86 in
https://github.com/plamere/spotipy accidentally broke the caching
functionality in SpotifyOAUth, SpotifyPKCE, and SpotifyImplicitGrant by
removing the get_cached_token and _save_token_info methods from the
auth_manager object. Users with existing codebases that use the
get_cached_token and _save_token_info methods directly will experience
errors if they upgrade spotipy.

This commit restores the get_cached_token and _save_token_info methods
on the three auth_manager classes as aliases for the corresponding
methods in the cache_handler. Deprecation warnings are also added to
the get_cached_token and _save_token_info methods to direct users to
switch to using the new cache_handler approach.

* Add deprecation warning to docstrings

* Rearrange depr. warn for cache_path & username

Rearrange logic so that deprecation warning always triggers if
cache_path or username are specified. Previously, if cache_handler was
specified, no deprecation warning would be raised if cache_path or
username were specified.

In addition, if both cache_handler and cache_path or username are
specified, a new warning will be raised alongside the deprecation
warning to let the user know that the cache_path and username fields
will be ignored in favour of the cache_handler.
2021-01-13 11:34:53 +01:00
..
add_a_saved_album.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
add_a_saved_track.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
add_tracks_to_playlist.py Update Playlist Endpoints and Add Following Endpoints (#531) 2020-07-11 11:23:18 +01:00
app.py Add deprecation warnings to direct users towards using cache_handler (#630) 2021-01-13 11:34:53 +01:00
artist_albums.py Print -> Logging, fixes #84 (#461) 2020-04-03 23:03:09 +01:00
artist_discography.py Print -> Logging, fixes #84 (#461) 2020-04-03 23:03:09 +01:00
artist_recommendations.py Print -> Logging, fixes #84 (#461) 2020-04-03 23:03:09 +01:00
audio_analysis_for_track.py Format examples 2017-10-23 23:02:17 +01:00
audio_features_for_track.py Add linter, solves #348 (#415) 2020-01-12 13:19:40 +00:00
audio_features.py Add linter, solves #348 (#415) 2020-01-12 13:19:40 +00:00
change_playlist_details.py Update Playlist Endpoints and Add Following Endpoints (#531) 2020-07-11 11:23:18 +01:00
client_credentials_flow.py Fix doc and readme 2020-01-16 03:54:39 +00:00
contains_a_saved_track.py Fix examples for saved tracks (#624) 2020-12-13 02:55:42 +00:00
create_playlist.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
delete_a_saved_track.py Fix examples for saved tracks (#624) 2020-12-13 02:55:42 +00:00
headless.py Allow open_browser to be set on creation of auth_manager (SpotifyOAuth/SpotifyPKCE) (#574) 2020-09-12 12:14:08 +01:00
multiple_accounts.py Add multiple accounts example, solves #446 2020-03-12 00:53:36 +00:00
my_playlists.py Added scope, 'playlist-read-private', to examples that access user playlists using the spotipy api: current_user_playlists() (fixes #591) (#595) 2020-10-23 22:57:14 +01:00
my_top_artists.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
my_top_tracks.py Made cache_path and username optional (#567) 2020-08-30 23:59:38 +01:00
player.py Lint 2020-02-22 11:15:19 +00:00
playlist_all_non_local_tracks.py Update Playlist Endpoints and Add Following Endpoints (#531) 2020-07-11 11:23:18 +01:00
playlist_tracks.py Fixed output of playlist_tracks example (#594) 2020-10-23 17:35:16 +01:00
read_a_playlist.py Update/remove outdated examples 2020-01-16 23:47:18 +00:00
remove_specific_tracks_from_playlist.py Made cache_path and username optional (#567) 2020-08-30 23:59:38 +01:00
remove_tracks_from_playlist.py Update Playlist Endpoints and Add Following Endpoints (#531) 2020-07-11 11:23:18 +01:00
replace_tracks_in_playlist.py Made cache_path and username optional (#567) 2020-08-30 23:59:38 +01:00
search.py Fix doc and readme 2020-01-16 03:54:39 +00:00
show_album.py Fix doc and readme 2020-01-16 03:54:39 +00:00
show_artist_top_tracks.py Fix doc and readme 2020-01-16 03:54:39 +00:00
show_artist.py Fix doc and readme 2020-01-16 03:54:39 +00:00
show_featured_playlists.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
show_my_saved_tracks.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
show_new_releases.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
show_related.py Merge branch 'master' into master 2020-01-15 19:16:38 +00:00
show_track_info.py Fix doc and readme 2020-01-16 03:54:39 +00:00
show_tracks.py Merge branch 'master' into master 2020-01-15 19:16:38 +00:00
show_user.py Made cache_path and username optional (#567) 2020-08-30 23:59:38 +01:00
simple0.py Update simple0.py 2020-01-11 19:54:21 +00:00
simple1.py Merge branch 'master' into master 2020-01-15 19:16:38 +00:00
simple2.py Fix doc and readme 2020-01-16 03:54:39 +00:00
simple3.py Fix doc and readme 2020-01-16 03:54:39 +00:00
simple4.py Lint 2020-02-22 11:15:19 +00:00
test.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00
title_chain.py Merge branch 'master' into master 2020-01-15 19:16:38 +00:00
tracks.py Use client credentials flow to fix broken non-authorized requests 2018-01-16 18:58:21 -05:00
user_playlists_contents.py Added scope, 'playlist-read-private', to examples that access user playlists using the spotipy api: current_user_playlists() (fixes #591) (#595) 2020-10-23 22:57:14 +01:00
user_playlists.py Added scope, 'playlist-read-private', to examples that access user playlists using the spotipy api: current_user_playlists() (fixes #591) (#595) 2020-10-23 22:57:14 +01:00
user_public_playlists.py Add linter, solves #348 (#415) 2020-01-12 13:19:40 +00:00
user_saved_albums_delete.py Deprecate util.prompt_for_user_token() 2020-06-14 18:01:14 +01:00