Breaking Changes
Events.get_events(...)
now returns a list ofEvent
instances rather than a list ofdict
representing events.Event
inherits fromMapping
but will not have all the same capabilities asdict
.- Your code is affected if you use
Events.get_events(...)
and expect a list ofdict
rather than a list ofMapping
. For example, if you use__setitem__
(event['key'] = value
),update()
,copy()
, or if your code depends on thestr
orrepr
of theEvent
. Use of__getitem__
(event['key']
),get()
, and otherMapping
methods is unaffected. See https://docs.python.org/2.7/library/collections.html#collections-abstract-base-classes for methods supported onMapping
instances. - Migration: If you still need to treat an
Event
as adict
, you can get a deepcopy of the originaldict
using the new property onBaseAPIJSONObject
,response_object
.
- Your code is affected if you use
- The logging format strings in
LoggingNetwork
have changed in a way that will break logging for any applications that have overridden any of these strings. They now use keyword format placeholders instead of positional placeholders. All custom format strings will now have to use the same keyword format placeholders. Though this is a breaking change, the good news is that using keyword format placeholders means that any future changes will be automatically backwards-compatibile (as long as there aren't any changes to change/remove any of the keywords).
Features
- Added more flexibility to the object translation system:
- Can create non-global
Translator
instances, which can extend or not-extend the global defaultTranslator
. - Can initialize
BoxSession
with a customTranslator
. - Can register custom subclasses on the
Translator
which is associated with aBoxSession
or aClient
. - All translation of API responses now use the
Translator
that is referenced by theBoxSession
, instead of directly using the global defaultTranslator
.
- Can create non-global
- When the
auto_session_renewal
isTrue
when calling any of the request methods onBoxSession
, if there is no access token,BoxSession
will renew the token _before_ making the request. This saves an API call. - Various enhancements to the
JWTAuth
baseclass:- The
authenticate_app_user()
method is renamed toauthenticate_user()
, to reflect that it may now be used to authenticate managed users as well. See the method docstring for details.authenticate_app_user()
is now an alias ofauthenticate_user()
, in order to not introduce an unnecessary backwards-incompatibility. - The
user
argument toauthenticate_user()
may now be either a user ID string or aUser
instance. Before it had to be aUser
instance. - The constructor now accepts an optional
user
keyword argument, which may be a user ID string or aUser
instance. When this is passed,authenticate_user()
and can be called without passing a value for theuser
argument. More importantly, this means thatrefresh()
can be called immediately after construction, with no need for a manual call toauthenticate_user()
. Combined with the aforementioned improvement to theauto_session_renewal
functionality ofBoxSession
, this means that authentication forJWTAuth
objects can be done completely automatically, at the time of first API call. - Document that the
enterprise_id
argument toJWTAuth
is allowed to beNone
. authenticate_instance()
now accepts anenterprise
argument, which can be used to set and authenticate as the enterprise service account user, ifNone
was passed forenterprise_id
at construction time.
- The
- Added an
Event
class. - Moved
metadata()
method toItem
so it's now available forFolder
as well asFile
.
Other
- Added extra information to
BoxAPIException
. - Added
collaboration()
method toClient
. - Reworked the class hierarchy. Previously,
BaseEndpoint
was the parent ofBaseObject
which was the parent of all smart objects. NowBaseObject
is a child of bothBaseEndpoint
andBaseAPIJSONObject
.BaseObject
is the parent of all objects that are a part of the REST API. Another subclass ofBaseAPIJSONObject
,APIJSONObject
, was created to represent pseudo-smart objects such asEvent
that are not directly accessible through an API endpoint. - Added
network_response_constructor
as an optional property on theNetwork
interface. Implementations are encouraged to override this property, and use it to constructNetworkResponse
instances. That way, subclass implementations can easily extend the functionality of theNetworkResponse
, by re-overriding this property. This property is defined and used in theDefaultNetwork
implementation. - Move response logging to a new
LoggingNetworkResponse
class (which is made possible by the aforementionednetwork_response_constructor
property). Now the SDK decides whether to log the response body, based on whether the caller reads or streams the content. - Add more information to the request/response logs from
LoggingNetwork
. - Add logging for request exceptions in
LoggingNetwork
. - Fixed an exception that was being raised from
ExtendableEnumMeta.__dir__()
. - CPython 3.6 support.
- Bugfix so that
JWTAuth
opens the PEM private key file in'rb'
mode.
- Bugfix so that
OAuth2
always has the correct tokens after a call torefresh()
.
- Added a
revoke()
method to theOAuth2
class. Calling it will revoke the current access/refresh token pair.
- Added a new class,
LoggingClient
. It's aClient
that uses theLoggingNetwork
class so that requests to the Box API and its responses are logged. - Added a new class,
DevelopmentClient
that combinesLoggingClient
with the existingDeveloperTokenClient
. This client is ideal for exploring the Box API or for use when developing your application. - Made the
oauth
parameter toClient
optional. The constructor now accepts new parameters that it will use to construct theOAuth2
instance it needs to auth with the Box API. - Changed the default User Agent string sent with requests to the Box API. It is now 'box-python-sdk-<version>'.
- Box objects have an improved
__repr__
, making them easier to identify during debugging sessions. - Box objects now implement
__dir__
, making them easier to explore. When created with a Box API response, these objects will now include the API response fields as attributes.
Make sure that
__all__
is only defined once, as a list ofstr
. Some programs (e.g. PyInstaller) naively parse __init__.py files, and if__all__
is defined twice, the second one will be ignored. This can cause__all__
to appear as a list ofunicode
on Python 2.Create wheel with correct conditional dependencies and license file.
Change the
license
meta-data from the full license text, to just a short string, as specified in [1][2].[1] <https://docs.python.org/3.5/distutils/setupscript.html#additional-meta-data>
Include entire test/ directory in source distribution. test/__init__.py was previously missing.
Update documentation.
- Files now support getting a direct download url.
- Added key id parameter to JWT Auth.
Bugfixes
- Fixed import error for installations that don't have redis installed.
- Fixed use of
raw_input
in the developer token auth for py3 compatibility.
- Added a new class,
DeveloperTokenClient
that makes it easy to get started using the SDK with a Box developer token. It uses another new class,DeveloperTokenAuth
for auth.
Bugfixes
- Added limit, offset, and filter_term parameters to
client.users()
to match up with the Box API.
- Fix
boxsdk.util.log.setup_logging()
on Python 3.
- Add requests-toolbelt to setup.py (it was accidentally missing from 1.3.0).
- CPython 3.5 support.
- Support for cryptography>=1.0 on PyPy 2.6.
- Travis CI testing for CPython 3.5 and PyPy 2.6.0.
- Added a logging network class that logs requests and responses.
- Added new options for auth classes, including storing tokens in Redis and storing them on a remote server.
- Stream uploads of files from disk.
- The SDK now supports setting a password when creating a shared link.
Bugfixes
- Fixed an ImportError for installs that didn't install the [jwt] extras.
- Added support for Box Developer Edition. This includes JWT auth (auth as enterprise or as app user),
and
create_user
functionality. - Added support for setting shared link expiration dates.
- Added support for setting shared link permissions.
- Added support for 'As-User' requests. See https://box-content.readme.io/#as-user-1
- Improved support for accessing shared items. Items returned from the
client.get_shared_item
method will remember the shared link (and the optionally provided shared link password) so methods called on the returned items will be properly authorized.
- Add context_info from failed requests to BoxAPIException instances.
Bugfixes
Item.remove_shared_link()
was trying to return an incorrect (according to its own documentation) value, and was also attempting to calculate that value in a way that made an incorrect assumption about the API response. The latter problem caused invocations of the method to raise TypeError. The method now handles the response correctly, and correctly returns typebool
.
- Added support for the Box accelerator API for premium accounts.
- Added support for preflight check during file uploads and updates.
- Added support to the search endpoint for metadata filters.
- Added support to the search endpoint for filtering based on result type and content types.
- Added support for the /shared_items endpoint.
client.get_shared_item
can be used to get information about a shared link. See https://developers.box.com/docs/#shared-items
Bugfixes
- Certain endpoints (e.g. search, get folder items) no longer raise an exception when the response contains items that are neither files nor folders.
- A minor change to namespacing. The
OAuth2
class can now be imported directly fromboxsdk
. Demo code has been updated to reflect the change.
Features
- The SDK now supports Box metadata. See the metadata docs for more information.
- The object paging API has been improved. SDK extensions that need fine-grained control over when the next "page" of API results will be fetched can now do that.
Example Code
- The example code has been improved to be more robust and to work with all Python versions supported by the SDK (CPython 2.6-2.7, CPython 3.3-3.4, and PyPy).
- The example code has an example on how to use the new metadata feature.
- The README has improved code examples.
Bugfixes
- Oauth2 redirect URIs containing non-ASCII characters are now supported.