Jump to >

reviewboard.hostingsvcs.service

The base hosting service class and associated definitions.

class URLRequest(url, body=u'', headers=None, method=u'GET')[source]

Bases: urllib2.Request

A request that can use any HTTP method.

By default, the urllib2.Request class only supports HTTP GET and HTTP POST methods. This subclass allows for any HTTP method to be specified for the request.

__init__(url, body=u'', headers=None, method=u'GET')[source]

Initialize the URLRequest.

Parameters:
  • url (unicode) – The URL to make the request against.
  • body (unicode or bytes) – The content of the request.
  • headers (dict, optional) – Additional headers to attach to the request.
  • method (unicode, optional) – The request method. If not provided, it defaults to a GET request.
get_method()[source]

Return the HTTP method of the request.

Returns:The HTTP method of the request.
Return type:unicode
add_basic_auth(username, password)[source]

Add HTTP Basic Authentication headers to the request.

Parameters:
  • username (unicode or bytes) – The username.
  • password (unicode or bytes) – The password.
class HostingServiceClient(hosting_service)[source]

Bases: object

Client for communicating with a hosting service’s API.

This implementation includes abstractions for performing HTTP operations, and wrappers for those to interpret responses as JSON data.

HostingService subclasses can also include an override of this class to add additional checking (such as GitHub’s checking of rate limit headers), or add higher-level API functionality.

__init__(hosting_service)[source]

Initialize the client.

This method is a no-op. Subclasses requiring access to the hosting service or account should override this method.

Parameters:hosting_service (HostingService) – The hosting service that is using this client.
http_delete(url, headers=None, *args, **kwargs)[source]

Perform an HTTP DELETE on the given URL.

Parameters:
  • url (unicode) – The URL to perform the request on.
  • headers (dict, optional) – Extra headers to include with the request.
  • *args (tuple) – Additional positional arguments to pass to http_request().
  • **kwargs (dict) – Additional keyword arguments to pass to http_request().
Returns:

A tuple of:

  • The response body (bytes).
  • The response headers (dict).

Return type:

tuple

Raises:
http_get(url, headers=None, *args, **kwargs)[source]

Perform an HTTP GET on the given URL.

Parameters:
  • url (unicode) – The URL to perform the request on.
  • headers (dict, optional) – Extra headers to include with the request.
  • *args (tuple) – Additional positional arguments to pass to http_request().
  • **kwargs (dict) – Additional keyword arguments to pass to http_request().
Returns:

A tuple of:

  • The response body (bytes)
  • The response headers (dict)

Return type:

tuple

Raises:
http_post(url, body=None, fields=None, files=None, content_type=None, headers=None, *args, **kwargs)[source]

Perform an HTTP POST on the given URL.

Parameters:
  • url (unicode) – The URL to perform the request on.
  • body (unicode, optional) – The request body. if not provided, it will be generated from the fields and files arguments.
  • fields (dict, optional) – Form fields to use to generate the request body. This argument will only be used if body is None.
  • files (dict, optional) – Files to use to generate the request body. This argument will only be used if body is None.
  • content_type (unicode, optional) – The content type of the request. If provided, it will be appended as the Content-Type header.
  • headers (dict, optional) – Extra headers to include with the request.
  • *args (tuple) – Additional positional arguments to pass to http_request().
  • **kwargs (dict) – Additional keyword arguments to pass to http_request().
Returns:

A tuple of:

  • The response body (bytes)
  • The response headers (dict)

Return type:

tuple

Raises:
http_request(url, body=None, headers=None, method=u'GET', username=None, password=None)[source]

Perform some HTTP operation on a given URL.

If the username and password arguments are provided, the headers required for HTTP Basic Authentication will be added to the request.

Parameters:
  • url (unicode) – The URL to open.
  • body (unicode, optional) – The request body.
  • headers (dict, optional) – Headers to include in the request.
  • method (unicode, optional) – The HTTP method to use to perform the request.
  • username (unicode, optional) – The username to use for HTTP Basic Authentication.
  • password (unicode, optional) – The password to use for HTTP Basic Authentication.
Returns:

A tuple of:

  • The response body (bytes)
  • The response headers (dict)

Return type:

tuple

Raises:
json_delete(*args, **kwargs)[source]

Perform an HTTP DELETE and interpret the results as JSON.

Parameters:
  • *args (tuple) – Additional positional arguments to pass to http_delete().
  • **kwargs (dict) – Additional keyword arguments to pass to http_delete().
Returns:

A tuple of:

  • The JSON data (in the appropriate type)
  • The response headers (dict)

Return type:

tuple

Raises:
json_get(*args, **kwargs)[source]

Perform an HTTP GET and interpret the results as JSON.

Parameters:
  • *args (tuple) – Additional positional arguments to pass to http_get().
  • **kwargs (dict) – Additional keyword arguments to pass to http_get().
Returns:

A tuple of:

  • The JSON data (in the appropriate type)
  • The response headers (dict)

Return type:

tuple

Raises:
json_post(*args, **kwargs)[source]

Perform an HTTP POST and interpret the results as JSON.

Parameters:
  • *args (tuple) – Additional positional arguments to pass to http_post().
  • **kwargs (dict) – Additional keyword arguments to pass to http_post().
Returns:

A tuple of:

  • The JSON data (in the appropriate type)
  • The response headers (dict)

Return type:

tuple

Raises:
static build_form_data(files=None)[source]

Encode data for use in an HTTP POST.

Parameters:
  • fields (dict) – A mapping of field names (unicode) to values.
  • files (dict, optional) – A mapping of field names (unicode) to files (dict).
Returns:

A tuple of:

  • The request content (unicode).
  • The request content type (unicode).

Return type:

tuple

class HostingService(account)[source]

Bases: object

An interface to a hosting service for repositories and bug trackers.

HostingService subclasses are used to more easily configure repositories and to make use of third party APIs to perform special operations not otherwise usable by generic repositories.

A HostingService can specify forms for repository and bug tracker configuration.

It can also provide a list of repository “plans” (such as public repositories, private repositories, or other types available to the hosting service), along with configuration specific to the plan. These plans will be available when configuring the repository.

name = None[source]
plans = None[source]
supports_bug_trackers = False[source]
supports_post_commit = False[source]
supports_repositories = False[source]
supports_ssh_key_association = False[source]
supports_two_factor_auth = False[source]
supports_list_remote_repositories = False[source]
has_repository_hook_instructions = False[source]
self_hosted = False[source]
repository_url_patterns = None[source]
client_class[source]

alias of HostingServiceClient

auth_form = None[source]

Optional form used to configure authentication settings for an account.

needs_authorization = False[source]
supported_scmtools = [][source]
form = None[source]
fields = [][source]
repository_fields = {}[source]
bug_tracker_field = None[source]
__init__(account)[source]

Initialize the hosting service.

Parameters:account (reviewboard.hostingsvcs.models.HostingServiceAccount) – The account to use with the service.
is_authorized()[source]

Return whether or not the account is currently authorized.

An account may no longer be authorized if the hosting service switches to a new API that doesn’t match the current authorization records. This function will determine whether the account is still considered authorized.

Returns:Whether or not the associated account is authorized.
Return type:bool
get_password()[source]

Return the raw password for this hosting service.

Not all hosting services provide this, and not all would need it. It’s primarily used when building a Subversion client, or other SCMTools that still need direct access to the repository itself.

Returns:The password.
Return type:unicode
is_ssh_key_associated(repository, key)[source]

Return whether or not the key is associated with the repository.

If the given key is present amongst the hosting service’s deploy keys for the given repository, then it is considered to be associated.

Sub-classes should implement this when the hosting service supports SSH key association.

Parameters:
Returns:

Whether or not the key is associated with the repository.

Return type:

bool

Raises:

reviewboard.hostingsvcs.errors.SSHKeyAssociationError – If an error occured during communication with the hosting service.

associate_ssh_key(repository, key)[source]

Associate an SSH key with a given repository.

Sub-classes should implement this when the hosting service supports SSH key association.

Parameters:
Raises:

reviewboard.hostingsvcs.errors.SSHKeyAssociationError – If an error occured during key association.

authorize(username, password, hosting_url, credentials, two_factor_auth_code=None, local_site_name=None, *args, **kwargs)[source]

Authorize an account for the hosting service.

Parameters:
  • username (unicode) – The username for the account.
  • password (unicode) – The password for the account.
  • hosting_url (unicode) – The hosting URL for the service, if self-hosted.
  • credentials (dict) – All credentials provided by the authentication form. This will contain the username, password, and anything else provided by that form.
  • two_factor_auth_code (unicode, optional) – The two-factor authentication code provided by the user.
  • local_site_name (unicode, optional) – The Local Site name, if any, that the account should be bound to.
  • *args (tuple) – Extra unused positional arguments.
  • **kwargs (dict) – Extra keyword arguments containing values from the repository’s configuration.
Raises:
check_repository(path, username, password, scmtool_class, local_site_name, *args, **kwargs)[source]

Checks the validity of a repository configuration.

This performs a check against the hosting service or repository to ensure that the information provided by the user represents a valid repository.

This is passed in the repository details, such as the path and raw credentials, as well as the SCMTool class being used, the LocalSite’s name (if any), and all field data from the HostingServiceForm as keyword arguments.

Parameters:
  • path (unicode) – The repository URL.
  • username (unicode) – The username to use.
  • password (unicode) – The password to use.
  • scmtool_class (type) – The subclass of SCMTool that should be used.
  • local_site_name (unicode) – The name of the local site associated with the repository, or None.
  • *args (tuple) – Additional positional arguments, unique to each hosting service.
  • **kwargs (dict) – Additional keyword arguments, unique to each hosting service.
Raises:

reviewboard.hostingsvcs.errors.RepositoryError – The repository is not valid.

get_file(repository, path, revision, *args, **kwargs)[source]

Return the requested file.

Files can only be returned from hosting services that support repositories.

Parameters:
  • repository (reviewboard.scmtools.models.Repository) – The repository to retrieve the file from.
  • path (unicode) – The file path.
  • revision (unicode) – The revision the file should be retrieved from.
  • *args (tuple) – Ignored positional arguments.
  • **kwargs (dict) – Additional keyword arguments to pass to the SCMTool.
Returns:

The contents of the file.

Return type:

bytes

Raises:

NotImplementedError – If this hosting service does not support repositories.

get_file_exists(repository, path, revision, *args, **kwargs)[source]

Return whether or not the given path exists in the repository.

Parameters:
  • repository (reviewboard.scmtools.models.Repository) – The repository to check for file existence.
  • path (unicode) – The file path.
  • revision (unicode) – The revision to check for file existence.
  • *args (tuple) – Ignored positional arguments.
  • **kwargs (dict) – Additional keyword arguments to be passed to the SCMTool.
Returns:

Whether or not the file exists at the given revision in the repository.

Return type:

bool

Raises:

NotImplementedError – If this hosting service does not support repositories.

get_branches(repository)[source]

Return a list of all branches in the repositories.

This should be implemented by subclasses, and is expected to return a list of Branch objects. One (and only one) of those objects should have the “default” field set to True.

Parameters:repository (reviewboard.scmtools.models.Repository) – The repository for which branches should be returned.
Returns:The branches.
Return type:list of reviewboard.scmtools.core.Branch
get_commits(repository, branch=None, start=None)[source]

Return a list of commits backward in history from a given point.

This should be implemented by subclasses, and is expected to return a list of Commit objects (usually 30, but this is flexible depending on the limitations of the APIs provided.

This can be called multiple times in succession using the “parent” field of the last entry as the start parameter in order to paginate through the history of commits in the repository.

Parameters:
  • repository (reviewboard.scmtools.models.Repository) – The repository to retrieve commits from.
  • branch (unicode, optional) – The branch to retrieve from. If this is not provided, the default branch will be used.
  • start (unicode, optional) – An optional starting revision. If this is not provided, the most recent commits will be returned.
Returns:

The retrieved commits.

Return type:

list of reviewboard.scmtools.core.Commit

get_change(repository, revision)[source]

Return an individual change.

This method should be implemented by subclasses.

Parameters:
Returns:

The change.

Return type:

reviewboard.scmtools.core.Commit

get_remote_repositories(owner=None, owner_type=None, filter_type=None, start=None, per_page=None, **kwargs)[source]

Return a list of remote repositories for the owner.

This method should be implemented by subclasses.

Parameters:
  • owner (unicode, optional) – The owner of the repositories. This is usually a username.
  • owner_type (unicode, optional) – A hosting service-specific indicator of what the owner is (such as a user or a group).
  • filter_type (unicode, optional) – Some hosting service-specific criteria to filter by.
  • start (int, optional) – The index to start at.
  • per_page (int, optional) – The number of results per page.
Returns:

A paginator for the returned repositories.

Return type:

reviewboard.hostingsvcs.utils.APIPaginator

get_remote_repository(repository_id)[source]

Return the remote repository for the ID.

This method should be implemented by subclasses.

Parameters:repository_id (unicode) – The repository’s identifier. This is unique to each hosting service.
Returns:The remote repository.
Return type:reviewboard.hostingsvcs.repository.RemoteRepository
Raises:django.core.excptions.ObjectDoesNotExist – If the remote repository does not exist.
classmethod get_repository_fields(username, hosting_url, plan, tool_name, field_vars)[source]

Return the repository fields based on the given plan and tool.

If the plan argument is specified, that will be used to fill in some tool-specific field values. Otherwise they will be retrieved from the HostingService’s defaults.

Parameters:
  • username (unicode) – The username.
  • hosting_url (unicode) – The URL of the repository.
  • plan (unicode) – The name of the plan.
  • tool_name (unicode) – The name of the SCMTool.
  • field_vars (dict) – The field values from the hosting service form.
Returns:

The filled in repository fields.

Return type:

dict

Raises:

KeyError – The provided plan is not valid for the hosting service.

get_repository_hook_instructions(request, repository)[source]

Return instructions for setting up incoming webhooks.

Subclasses can override this (and set has_repository_hook_instructions = True on the subclass) to provide instructions that administrators can see when trying to configure an incoming webhook for the hosting service.

Parameters:
Returns:

Rendered and escaped HTML for displaying to the user.

Return type:

django.utils.text.SafeText

classmethod get_bug_tracker_requires_username(plan=None)[source]

Return whether or not the bug tracker requires usernames.

Parameters:plan (unicode, optional) – The name of the plan associated with the account.
Raises:NotImplementedError – If the hosting service does not support bug tracking.
classmethod get_bug_tracker_field(plan, field_vars)[source]

Return the bug tracker field for the given plan.

Parameters:
  • plan (unicode) – The name of the plan associated with the account.
  • field_vars (dict) – The field values from the hosting service form.
Returns:

The value of the bug tracker field.

Return type:

unicode

Raises
KeyError:
The provided plan is not valid for the hosting service.
classmethod get_field(plan, name, default=None)[source]

Return the value of the field for the given plan.

If plan is not None, the field will be looked up in the plan configuration for the service. Otherwise the hosting service’s default value will be used.

Parameters:
  • plan (unicode) – The plan name.
  • name (unicode) – The field name.
  • default (unicode, optional) – A default value if the field is not present.
Returns:

The field value.

Return type:

unicode

class HostingServiceRegistry[source]

Bases: reviewboard.registries.registry.EntryPointRegistry

A registry for managing hosting services.

entry_point = u'reviewboard.hosting_services'[source]
lookup_attrs = [u'hosting_service_id'][source]
errors = {u'already_registered': _(u'"%(item)s" is already a registered hosting service.'), u'load_entry_point': _(u'Unable to load repository hosting service %(entry_point)s: %(error)s.'), u'not_registered': _(u'"%(attr_value)s" is not a registered hosting service.')}[source]
__init__()[source]
unregister(service)[source]

Unregister a hosting service.

This will remove all registered URLs that the hosting service has defined.

Parameters:service (type) – The HostingService subclass.
process_value_from_entry_point(entry_point)[source]

Load the class from the entry point.

The id attribute will be set on the class from the entry point’s name.

Parameters:entry_point (pkg_resources.EntryPoint) – The entry point.
Returns:The HostingService subclass.
Return type:type
register(service)[source]

Register a hosting service.

This also adds the URL patterns defined by the hosting service. If the hosting service has a HostingService.repository_url_patterns attribute that is non-None, they will be automatically added.

Parameters:service (type) – The HostingService subclass.
get_hosting_services()[source]

Return the list of hosting services.

Returns:The HostingService subclasses.
Return type:list
get_hosting_service(name)[source]

Return the hosting service with the given name.

If the hosting service is not found, None will be returned.

register_hosting_service(name, cls)[source]

Register a custom hosting service class.

A name can only be registered once. A KeyError will be thrown if attempting to register a second time.

Parameters:
  • name (unicode) – The name of the hosting service.
  • cls (type) – The hosting service class. This should be a subclass of HostingService.
unregister_hosting_service(name)[source]

Unregister a previously registered hosting service.

Parameters:name (unicode) – The name of the hosting service.