* create custom urllib3.Retry class for printing warnings on rate/request limits
* move import urllib3 from client.py to util.py
* Using Retry.increment instead of Retry.is_retry. Shows the Retry-After value in the warning as well
* Making sure that max column <= 99
* add types.TracebackType
* Change warning in request/rate limit warning
* adding all parameters, just to make sure
* fixing length of line
* making sure that response is not None
* Added and revised function docstrings for util.py
* added credentials to gitignore
* Addressed request changes by reverting/modifying function docstrings to match the format used in client.py
* Add python_requires to help pip
* Update supported versions in tox.ini
* Upgrade Python syntax with pyupgrade --py37-plus
* Bump GitHub Actions
* Add Python 3.11 and 3.12 to CI
* Remove six dependency
* Remove redundant dependencies
* Remove redudant Python 3.5 code
* Drop support for EOL Python 3.7
* Upgrade Python syntax with pyupgrade --py38-plus
* Update CHANGELOG
* More f-strings
---------
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
* Allow the scope to be either a list or comma separated string
* Move normalize scope to util file and make it a base method
Also adjust documentation to reflect the new scope parameter supporting a list
* Add change to CHANGELOG.md
* 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 SpotifyImplicitGrant with get_access_token and get_cached_token (and minimum related functions)
* Add some overlooked necessary methods/values in SpotifyImplicitGrant
* Remove unsuppported functionality and make SpotifyImplicitGrant public
* Allow/Expose integration of SpotifyImplicitGrant in client
* Add Implicit Grant tests and decrease abilities of prompt_for_user_token
Remove Implicit Grant and state support from prompt_for_user_token
* Add documentation and changelog entry
* Touch up PEP8 compliance
* Ignore long line with link for flake8
* Correct changelog
* Restore compatibility with Python 2.7
* Correct help(SpotifyImplicitGrant.get_access_token)
* Remove as_dict from SpotifyImplicitGrant.get_access_token
* Combine status check functionality with implicit grant support
In oauth2.py:
* Add state checking to SpotifyImplicitGrant
* Add dedicated SpotifyStateError as subclass of SpotifyOauthError
* Moved `_get_user_input` from SpotifyOAuth to superclass SpotifyAuthBase
* Renamed `parse_oauth_response_url` to `parse_auth_response_url`
* Moved error handling into `parse_auth_response_url`
Made minor changes in tests and client.py accordingly
* Update changelog
* Trim down tests for SpotifyImplicitGrant
* Fix trailing whitespace
* - Verify that the state received alongside the authorization code is consistent with the one sent
- Refactor URL parsing for the local server way and the interactive way
- Add tests for interactive way
* Resurrect public methods parse_response_code and get_authorization_code
* Use new method parse_oatuh_response_url for parse_response_code implementation.
* Fixed issue where using rediret uri 'localhost' (without specifying a port) would cause the authorization process to hang (not asking the user to paste/enter the URL redirected to)
* Updated the documentation to match the changes to the authorization process - also kind of fixing issues #474 and #471
* Fixed Flake8 over-indentation remark
When spotify redirects the browser to localhost, serve the page with a
simple http server implemented by HTTPServer. By this way, we can obtain
the tokens the oauth service want so provide us, and no need to input the
user the redirect URL.
This method only works when the application in spotify developer dashboard
is configured to redirect the requests to localhost.
To use this method it is required to specify the redirect_url pointing to
localhost with simple http, to a non-privilegized port (unless the script is
run as root).
* Auto-refresh AuthCode flow token.
* Reformatted.
* Reformatted.
* Removed invalid syntax.
* Removed abstract class SpotifyAuthManager.
* Fix typo on docstrings.
* Optionally try to fetch main input parameters from environment.
Implements the capability of trying to fetch the following parameters from the environment, when they're not directly passed to the authorization handler.
The affected parameters are: client_id, client_secret, redirect_uri.
An SpotifyOauthError is raised if no value gets found.
* Removed f-string for Python2 compatibility.
* Fix line-too-long.
* Remove useless import.
* Add username to docstring.
* Remove redundant return.
* Fix empty lines print statement for backward compatibility with Python2.
* Update simple4 example.
* Set optional 'as_dict' parameter on OAuth 'get_access_token'.
* Update changelog.
Co-authored-by: Stéphane Bruckert <stephane.bruckert@gmail.com>
* auto-refresh user token
* example for a long-running user-request app
* wrap long lines
* combine duplicate code into _refresh_token_if_expired method
* add changelog entry