All notable changes to this project will be documented in this file. See standard-version for commit guidelines.
3.13.0 (2024-08-22)
3.12.0 (2024-08-06)
- add create sign request function with different required parameters (#878) (d972f54)
- Support Box AI features (#877) (3026d2a)
3.11.0 (2024-06-07)
3.10.0 (2024-05-22)
- Change exception type for missing location header (#871) (8c5e0ec)
- fix annnotation of oauths access_token (#855) (804780e)
- Fix retention policy integration test (#867) (8e0d640)
- Remove delete classification (#861) (393cfef)
- Update exception file get download URL (#866) (94dcbcd)
3.9.2 (2023-10-18)
3.9.1 (2023-09-14)
3.9.0 (2023-09-06)
- adds get sign template and get sign templates methods on Client (#835) (fbc783d)
- Support create sign request with template ID (#834) (4f11d75)
3.8.1 (2023-08-01)
3.8.0 (2023-07-25)
3.7.3 (2023-07-07)
3.7.2 (2023-05-26)
3.7.1 (2023-04-18)
- Rename filter date parameters in legal hold creation according to the documentation (#810) (f52c66a)
3.7.0 (2023-03-08)
- Update
retention_policies
andretention_policy_assignments
(#803) (8b72f7e) - Use multiple threading for chunked upload (#800) (506ce0d)
3.6.2 (2023-02-07)
3.6.1 (2023-01-09)
3.6.0 (2023-01-03)
- Fix index error when getting an empty list of user term of service statuses (#780) (23d763a)
- Specify which exceptions should be retried (#784) (833cd46)
3.5.1 (2022-11-30)
- Renew connection when Connection reset error occurs (#771) (bcaab27), closes #756 #757 #763 #765 #766 #770
- Retry JWT auth when got error: required unique
jti
claim. (#768) (878e958) - Update
pyjtw
dependency to work with Python 3.10 (#772) (b13c5cd)
3.5.0 (2022-09-23)
- Add
redirect_url
anddeclined_redirect_url
fields to Sign Request (#752) (5d1f609) - Add support for modifiable retention policies & enable deleting retention policy assignment (#759) (847301b)
- Support file request APIs (#747) (71895e3)
- Do not log the content of downloaded file (#760) (5d26431)
- Fix closing file after chunked upload (#761) (b433692)
3.4.0 (2022-07-06)
- Add support for editable shared links for files (#737) (1396200)
- Support uploading and deleting user avatar (#743) (fe00a9e)
3.3.0 (2022-04-28)
- Add missing fields to metadata template field (#719) (9e574a3), closes #717
- Upload session commit return None on 202 (#718) (86a1856), closes #715
3.2.0 (2022-03-11)
- Add setting
disposition_at
field for files under retention (#710) (91b1373) - Add support for Client Credentials Grant authentication method (#705) (d33d16d)
3.1.0 (2022-02-16)
- Add support for Python 3.10 (#692) (d4aed82)
- Add support for Python 3.8, Python 3.9,
pypy-3.7
andpypy-3.8
. (#689) (0aa94cc) - Deprecate
use_index
parameter fromMDQ
of files/folders (#666) (2595720) - Replace external package
mock
with Python standard libraryunittest.mock
(#697) (6fd6366) - Upgrade cryptography library to the most recent version. (#668) (9c94d08), closes #667
UploadSession.commit
returnsNone
when retry limit was reached (#696) (9456fe0)- Add missing
api_call
decorator forcreate_upload_session
(#686) (3510d3a) - Fix chunked upload (#673) (2605fd7), closes #671
- Move sphinx to test requirements (#662)
- Drop support for python 2.7 (#645)
- Add missing parameter
stream_position
toget_admin_events
method (#648) - Drop support for python 3.5 (#654)
- Remove deprecated code using insensitive language (#651)
- Enforcing usage of keyword-only arguments in some functions (#656)
- Add missing
api_call
decorators onmultiput
calls (#653) - Added
py.typed
file formypy
to recognise type hints (#657)
- Add
admin_logs_streaming
support for events stream (#623) - Add
vanity_name
parameter for creating shared link to a file or folder (#637) - Add getting files and file versions under retention for a retention policy assignment (#633)
- Support base item operations for WebLink class (#639)
- Limit cryptography to version <3.5.0 (#636)
- Avoid raising 404 when a thumbnail cannot be generated for a file (#642)
- Upgrade cryptography to version 3 (#620)
- Fix bug when thumbnail representations are not found (#597)
- Add metadata query functionality (#574)
- Add folder lock functionality (#581)
- Add search query support for the
include_recent_shared_links
field (#582) - Update
get_groups()
to use documented parameter to filter by name (#586)
- Deprecate and add method for getting a thumbnail (#572)
- Add support for
copyInstanceOnItemCopy
field for metadata templates (#546) - Allow creating tasks with the
action
andcompletion_rule
parameters (#544) - Add zip functionality (#539)
- Fix bug with updating a collaboration role to owner (#536)
- Allow ints to be passed in as item IDs (#530)
- Fix exception handling for OAuth
- Fix path parameter sanitization
- Added support for token exchange using shared links
- Added the ability to pass in a SHA1 value for file uploads
- Fixed bug in
_get_retry_request_callable
introduced in release 2.7.0 which caused chunked uploads to fail
- Fixed bug in
get_admin_events
function which caused errors when the optionalevent_types
parameter was omitted. - Add marker based pagination for listing users.
- Added support for more attribute parameters when uploading new files and new versions of existing files.
- Combined preflight check and lookup of accelerator URL into a single request for uploads.
- Fixed JWT retry logic so a new JTI claim is generated on each retry.
- Fixed bug where JWT authentication requests returned incorrect error codes.
- Fixed retry logic so when a
Retry-After
header is passed back from the API, the SDK waits for the amount of time specified in the header before retrying.
- Added
api_call
decorator for copy method.
- Added a new get events function with created_before, created_after, and event_type parameters
- Allowed passing
None
to clear configurable_permission field in the add_member() method.
- Patch release for issues with v2.4.0.
- Fixing an issue in v2.3.1 where package could not be installed.
- Fixing an issue in v2.3.0 where package could not be installed.
- Added the ability to set file description upon upload
- Added support for basic authenticated proxy and unauthenticated proxy
- Updated requests-toolbelt dependency restriction.
- Fixing an issue in v2.2.0 where package could not be installed.
- Added abilty for user to retrieve an avatar for a user.
- Changed retry strategy to use exponential backoff with randomized jitter.
- Added ability for user to chunk upload files and resume uploads for interrupted uploads.
- Added ability to verify webhook message.
- Added ability for user to add metadata classification to files and folders.
- Bugfix where calling
.response_object()
method on an API object could throw.
-
Python 2.6 is no longer supported.
-
Python 3.3 is no longer supported.
-
client.search()
now returns aSearch
object that exposes aquery()
method to call the Search API. Useclient.search().query(**search_params)
instead ofclient.search(**search_params)
. -
client.get_memberships(...)
has a change in signature. The limit and offset parameters have swapped positions to keep consistency with the rest of the SDK. -
client.groups(...)
has been changed toclient.get_groups
. The limit and offset parameters have swapped positions. -
The
unshared_at
parameter foritem.create_shared_link(...)
andfile.get_shared_link_download_url(...)
now takes an https://tools.ietf.org/html/rfc3339#section-5.8unicode
string instead of adatetime.date
. Users migrating from v1.x can pass the value ofdate.isoformat()
instead of thedate
object itself. -
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
-
LoggingNetwork
has been removed. Logging calls are now made from theDefaultNetwork
class. In addition, the logging format strings in this class 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). -
File.update_contents()
andFile.update_contents_with_stream()
now correctly return aFile
object with the correct internal JSON structure. Previously it would return aFile
object where the file JSON is hidden insidefile['entries'][0]
. This is a bugfix, but will be a breaking change for any clients that have already written code to handle the bug. -
Comparing two objects (e.g. a
File
and aFolder
) that have the same Box ID but different types with==
will now correctly returnFalse
. -
The following methods now return iterators over the entire collection of returned objects, rather than a single page:
client.users()
client.groups()
client.search().query()
folder.get_items()
Since
folder.get_items()
now returns an iterator,folder.get_items_limit_offset()
andfolder.get_items_marker()
have been removed. To use marker based paging withfolder.get_items()
, pass theuse_marker=True
parameter and optionally specify amarker
parameter to begin paging from that point in the collection.Additionally,
group.membership()
has been renamed togroup.get_memberships()
, and returns an iterator of membership objects. This method no longer provides the option to return tuples with paging information. -
The
Translator
class has been reworked;translator.get(...)
still returns the constructor for the object class corresponding to the passed in type, buttranslator.translate(...)
now takes aSession
and response object directly and produces the translated object. This method will also translate any nested objects found.- This change obviates the need for
GroupMembership
to have a custom constructor; it now uses the defaultBaseObject
constructor.
- This change obviates the need for
- All publicly documented API endpoints and parameters should now be supported by the SDK
- 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
. - Nested objects are now translated by
translator.translate()
- 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. - Auth objects can now be closed, which prevents them from being used
to request new tokens. This will also revoke any existing tokens
(though that feature can be disabled by passing
revoke=False
). Also introduces aclosing()
context manager method, which will auto-close the auth object on exit. - 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. - The constructor now supports passing the RSA private key in two
different ways: by file system path (existing functionality), or
by passing the key data directly (new functionality). The
rsa_private_key_file_sys_path
parameter is now optional, but it is required to pass exactly one ofrsa_private_key_file_sys_path
orrsa_private_key_data
. - 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.- Authentications that fail due to the expiration time not falling within the correct window of time are now automatically retried using the time given in the Date header of the Box API response. This can happen naturally when the system time of the machine running the Box SDK doesn't agree with the system time of the Box API servers.
- The
- Added an
Event
class. - Moved
metadata()
method toItem
so it's now available forFolder
as well asFile
. - The
BaseAPIJSONObject
baseclass (which is a superclass of all API response objects) now supports__contains__
and__iter__
. They behave the same as forMapping
. That is,__contains__
checks for JSON keys in the object, and__iter__
yields all of the object's keys. - Added a
RecentItem
class. - Added
client.get_recent_items()
to retrieve a user's recently accessed items on Box. - Added support for the
can_view_path
parameter when creating new collaborations. - Added
BoxObjectCollection
and subclassesLimitOffsetBasedObjectCollection
andMarkerBasedObjectCollection
to more easily manage paging of objects from an endpoint. These classes manage the logic of constructing requests to an endpoint and storing the results, then provide__next__
to easily iterate over the results. The option to return results one by one or as aPage
of results is also provided. - Added a
downscope_token()
method to theClient
class. This generates a token that has its permissions reduced to the provided scopes and for the optionally providedFile
orFolder
. - Added methods for configuring
JWTAuth
from config file:JWTAuth.from_settings_file
andJWTAuth.from_settings_dictionary
. - Added
network_response
property toBoxOAuthException
. - API Configuration can now be done per
BoxSession
instance.
- 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
. - Bugfix so that the return value of
JWTAuth.refresh()
correctly matches that of the auth interface (by returning a tuple of ((access token), (refresh token or None)), instead of just the access token). In particular, this fixes an exception inBoxSession
that always occurred when it tried to refresh anyJWTAuth
object. - Fixed an exception that was being raised from
ExtendableEnumMeta.__dir__()
. - CPython 3.6 support.
- Increased required minimum version of six to 1.9.0.
- 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.
- 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.
- 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.
- 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://developer.box.com/en/guides/authentication/oauth2/as-user/
- 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.
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
- 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.
- 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.
- 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.
- Oauth2 redirect URIs containing non-ASCII characters are now supported.