reviewboard.hostingsvcs.base.hosting_service¶
Base communication client support for hosting services.
New in version 6.0: This replaces the hosting service code in the old
reviewboard.hostingsvcs.service
module.
- class HostingServicePlan[source]¶
Bases:
TypedDict
Information on a hosting service plan.
New in version 6.0.
- bug_tracker_field: NotRequired[str]¶
A templated value for the bug tracker field.
The value will be filled in based on the cleaned bug tracker form data. It must take templated keys in the form of
%(key_name)s
.- Type:
- form: NotRequired[Type[BaseHostingServiceRepositoryForm]]¶
Optional form used to configure repository settings.
If not provided, a default form will be used.
This value can also be set within
repository_plans
.- Type:
- repository_fields: NotRequired[SCMToRepositoryFields]¶
Templated values to set for model repository fields.
Each key corresponds to a SCMTool ID or name, and each value to a mapping of model attribute names to templates for values to populate based on cleaned repository form data. It must take templated keys in the form of
%(key_name)s
.- Type:
- __annotations__ = {'bug_tracker_field': ForwardRef('NotRequired[str]', module='reviewboard.hostingsvcs.base.hosting_service'), 'form': ForwardRef('NotRequired[Type[BaseHostingServiceRepositoryForm]]', module='reviewboard.hostingsvcs.base.hosting_service'), 'name': ForwardRef('StrOrPromise', module='reviewboard.hostingsvcs.base.hosting_service'), 'repository_fields': ForwardRef('NotRequired[SCMToRepositoryFields]', module='reviewboard.hostingsvcs.base.hosting_service')}¶
- __optional_keys__ = frozenset({})¶
- __orig_bases__ = (<function TypedDict>,)¶
- __required_keys__ = frozenset({'bug_tracker_field', 'form', 'name', 'repository_fields'})¶
- __total__ = True¶
- HostingServiceCredentials¶
Credentials used to authenticate with a hosting service.
New in version 6.0.
- RepositoryFields¶
Information on fields in a repository.
These will map model or form attributes to values or templates for processing when saving a repository.
New in version 6.0.
- SCMToRepositoryFields¶
A mapping of SCMTool IDs to repository fields.
New in version 6.0.
- class BaseHostingService(account: HostingServiceAccount)[source]¶
Bases:
object
An interface to a hosting service for repositories and bug trackers.
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 hosting service can specify forms for authentication, 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.
Changed in version 6.0:
Moved from
reviewboard.hostingsvcs.service
toreviewboard.hostingsvcs.base.hosting_service
and renamed fromHostingService
toBaseHostingService
.
- hosting_service_id: Optional[str] = None¶
The unique ID of the hosting service.
This should be lowercase, and only consist of the characters a-z, 0-9,
_
, and-
.New in version 3.0.16: This should now be set on all custom hosting services. It will be required in Review Board 4.0.
- Type:
- plans: Optional[Sequence[Tuple[str, HostingServicePlan]]] = None¶
A list of available hosting service plans.
Each plan may map to different configuration forms and saved state, helping subclasses support different APIs or data models provided by the server, and better helping users supply the information needed to configure the repository.
- Type:
- supports_bug_trackers: bool = False¶
Whether this service supports bug trackers.
This should be set to
True
if the service provides its own bug tracker and the subclass implements all of the following methods:- Type:
- supports_post_commit: bool = False¶
Whether this service supports post-commit requests.
This should be set to
True
if the subclass implements all of the following methods:- Type:
- supports_repositories: bool = False¶
Whether this service supports source code repositories.
This should be set to
True
if the service provides a compatible source code repository and the subclass implements all of the following methods:Several other optional methods may also be defined and used if this is set.
- Type:
- supports_ssh_key_association: bool = False¶
Whether this service supports automatic association of SSH keys.
This should be set to
True
if the service provides any way of automatically assigning an SSH key for a user for repository access, and the subclass implements the following methods:- Type:
- supports_two_factor_auth: bool = False¶
Whether this service supports two-factor authentication.
This should be set to
True
if the service supports two-factor authentication when communicating with the API and the service implements support inauthorize()
.- Type:
- supports_list_remote_repositories: bool = False¶
Whether this service supports listing remote repositories.
This should be set to
True
if the service supports looking up repositories via the API and the subclass implements all of the following methods:- Type:
- has_repository_hook_instructions: bool = False¶
Whether this service provides repository hook instructions.
This should be set to
True
if the subclass implements instructions’ on configuring useful repository hooks in the following method:- Type:
- visible: bool = True¶
Whether this service should be shown as an available option.
This should be set to
False
when a service is no longer available to use, and should be hidden from repository configuration. The implementation can then be largely stubbed out. Users will see a message in the repository configuration page.New in version 3.0.17.
- Type:
- self_hosted: bool = False¶
Whether this service can be self-hosted.
This should be set to
True
if the service can be hosted at a custom URL.- Type:
- repository_url_patterns: Optional[List[_AnyURL]] = None¶
Custom URL patterns to include for the hosting service.
This can be used to create URLs for hooks or other utility purposes. These will be installed under:
/repos/<repository_id>/<hosting_service_id>/
/s/<local_site>/repos/<repository_id>/<hosting_service_id>/
- Type:
- client_class¶
The utility class used to perform client functionality.
Client classes are responsible for communicating with the hosting service at an API level. Instance of this hosting service will receive a client instance.
Subclasses should set this to a subclass of
HostingServiceClient
.- Type:
alias of
HostingServiceClient
- auth_form: Optional[Type[BaseHostingServiceAuthForm]] = None¶
Optional form used to configure authentication settings for an account.
If not provided, a default form will be used.
- Type:
- needs_authorization: bool = False¶
Whether usage of this hosting service requires authorization.
This value can also be set within
repository_plans
.- Type:
- form: Optional[Type[BaseHostingServiceRepositoryForm]] = None¶
Optional form used to configure repository settings.
If not provided, a default form will be used.
This value can also be set within
repository_plans
.- Type:
- repository_fields: SCMToRepositoryFields = {}¶
Templated values to set for model repository fields.
Each key corresponds to a SCMTool ID or name, and each value to a mapping of model attribute names to templates for values to populate based on cleaned repository form data. It must take templated keys in the form of
%(key_name)s
.- Type:
- bug_tracker_field: Optional[str] = None¶
A templated value for the bug tracker field.
The value will be filled in based on the cleaned bug tracker form data. It must take templated keys in the form of
%(key_name)s
.- Type:
- supported_scmtools: List[str] = []¶
A list of SCMTools IDs or names that are supported by this service.
This should contain a list of SCMTool IDs that this service can work with. For backwards-compatibility, it may instead contain a list of SCMTool names (corresponding to database registration names).
This may also be specified per-plan in the
plans
.Changed in version 3.0.16: Added support for SCMTool IDs. A future version will deprecate using SCMTool names here.
- visible_scmtools: Optional[List[str]] = None¶
A list of SCMTool IDs that are visible when configuring the service.
This should contain a list of SCMTool IDs that this service will show when configuring a repository. It can be used to offer continued legacy support for an SCMTool without offering it when creating new repositories. If not specified, all SCMTools listed in
supported_scmtools
are assumed to be visible.If explicitly set, this should always be equal to or a subset of
supported_scmtools
.This may also be specified per-plan in the
plans
.New in version 3.0.17.
- __init__(account: HostingServiceAccount) None [source]¶
Initialize the hosting service.
- Parameters:
account (
reviewboard.hostingsvcs.models.HostingServiceAccount
) – The account to use with the service.
- client: HostingServiceClient¶
The client instance for talking to the hosting service.
- Type:
HostingServiceClient
- is_authorized() bool [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:
- get_password() Optional[str] [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:
- is_ssh_key_associated(repository: Repository, key: PKey) bool [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.
Subclasses should implement this when the hosting service supports SSH key association.
- Parameters:
repository (
reviewboard.scmtools.models.Repository
) – The repository the key must be associated with.key (
paramiko.PKey
) – The key to check for association.
- Returns:
Whether or not the key is associated with the repository.
- Return type:
- Raises:
reviewboard.hostingsvcs.errors.SSHKeyAssociationError – If an error occurred during communication with the hosting service.
- associate_ssh_key(repository: Repository, key: PKey) None [source]¶
Associate an SSH key with a given repository.
Subclasses should implement this when the hosting service supports SSH key association.
- Parameters:
repository (
reviewboard.scmtools.models.Repository
) – The repository to associate the key with.key (
paramiko.PKey
) – The key to add to the repository’s list of deploy keys.
- Raises:
reviewboard.hostingsvcs.errors.SSHKeyAssociationError – If an error occurred during key association.
- authorize(username: Optional[str], password: Optional[str], hosting_url: Optional[str], credentials: Dict[str, Any], two_factor_auth_code: Optional[str] = None, local_site_name: Optional[str] = None, *args, **kwargs) None [source]¶
Authorize an account for the hosting service.
- Parameters:
username (
str
) – The username for the account.password (
str
) – The password for the account.hosting_url (
str
) – 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 (
str
, optional) – The two-factor authentication code provided by the user.local_site_name (
str
, 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:
reviewboard.hostingsvcs.errors.AuthorizationError – The credentials provided were not valid.
reviewboard.hostingsvcs.errors.TwoFactorAuthCodeRequiredError – A two-factor authentication code is required to authorize this account. The request must be retried with the same credentials and with the
two_factor_auth_code
parameter provided.
- check_repository(path: str, username: Optional[str], password: Optional[str], scmtool_class: Type[SCMTool], local_site_name: Optional[str], *args, **kwargs) None [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 (
str
) – The repository URL.username (
str
) – The username to use.password (
str
) – The password to use.scmtool_class (
type
) – The subclass ofSCMTool
that should be used.local_site_name (
unicode
) – The name of the local site associated with the repository, orNone
.*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: Repository, path: str, revision: str, *args, **kwargs) bytes [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 (
str
) – The file path.revision (
str
) – 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:
- Raises:
NotImplementedError – If this hosting service does not support repositories.
- get_file_exists(repository: Repository, path: str, revision: str, *args, **kwargs) bool [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 (
str
) – The file path.revision (
str
) – 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:
- Raises:
NotImplementedError – If this hosting service does not support repositories.
- get_branches(repository: Repository) Sequence[Branch] [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:
- Raises:
reviewboard.hostingsvcs.errors.HostingServiceError – There was an error fetching branches.
- get_commits(repository: Repository, branch: Optional[str] = None, start: Optional[str] = None) Sequence[Commit] [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 (
str
, optional) –The branch to retrieve from.
If this is not provided, the default branch will be used.
start (
str
, optional) –An optional starting revision.
If this is not provided, the most recent commits will be returned.
- Returns:
The retrieved commits.
- Return type:
- Raises:
reviewboard.hostingsvcs.errors.HostingServiceError – There was an error fetching commits.
- get_change(repository: Repository, revision: str) Commit [source]¶
Return an individual change.
This method should be implemented by subclasses.
- Parameters:
repository (
reviewboard.scmtools.models.Repository
) – The repository to get the change from.revision (
str
) – The revision to retrieve.
- Returns:
The change.
- Return type:
- Raises:
reviewboard.hostingsvcs.errors.HostingServiceError – There was an error fetching the commit.
- get_remote_repositories(owner: Optional[str] = None, owner_type: Optional[str] = None, filter_type: Optional[str] = None, start: Optional[int] = None, per_page: Optional[int] = None, **kwargs) APIPaginator [source]¶
Return a list of remote repositories for the owner.
This method should be implemented by subclasses.
- Parameters:
owner (
str
, optional) –The owner of the repositories.
This is usually a username.
owner_type (
str
, optional) – A hosting service-specific indicator of what the owner is (such as a user or a group).filter_type (
str
, 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: str) RemoteRepository [source]¶
Return the remote repository for the ID.
This method should be implemented by subclasses.
- Parameters:
repository_id (
str
) –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.
- normalize_patch(repository: Repository, patch: bytes, filename: str, revision: str) bytes [source]¶
Normalize a diff/patch file before it’s applied.
This can be used to take an uploaded diff file and modify it so that it can be properly applied. This may, for instance, uncollapse keywords or remove metadata that would confuse patch.
By default, this passes along the normalization to the repository’s
SCMTool
.- Parameters:
repository (
reviewboard.scmtools.models.Repository
) – The repository the patch is meant to apply to.patch (
bytes
) – The diff/patch file to normalize.filename (
str
) – The name of the file being changed in the diff.revision (
str
) – The revision of the file being changed in the diff.
- Returns:
The resulting diff/patch file.
- Return type:
- classmethod get_repository_fields(username: str, hosting_url: Optional[str], plan: str, tool_name: str, field_vars: Dict[str, str]) Dict[str, Any] [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 theHostingService
’s defaults.- Parameters:
- Returns:
The filled in repository fields.
- Return type:
- Raises:
KeyError – The provided plan is not valid for the hosting service.
- get_repository_hook_instructions(request: HttpRequest, repository: Repository) SafeString [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:
request (
django.http.HttpRequest
) – The current HTTP request.repository (
reviewboard.scmtools.models.Repository
) – The repository for webhook setup instructions.
- Returns:
Rendered and escaped HTML for displaying to the user.
- Return type:
django.utils.text.SafeString
- classmethod get_bug_tracker_requires_username(plan: Optional[str] = None) bool [source]¶
Return whether or not the bug tracker requires usernames.
- Parameters:
plan (
str
, optional) – The name of the plan associated with the account.- Returns:
True
if a username is required.False
if it is not.- Return type:
- Raises:
NotImplementedError – If the hosting service does not support bug tracking.
- classmethod get_bug_tracker_field(plan: str, field_vars: Dict[str, str]) str [source]¶
Return the bug tracker field for the given plan.
- Parameters:
- Returns:
The value of the bug tracker field.
- Return type:
- Raises
- KeyError:
The provided plan is not valid for the hosting service.
- __annotations__ = {'auth_form': 'Optional[Type[BaseHostingServiceAuthForm]]', 'bug_tracker_field': 'Optional[str]', 'client': 'HostingServiceClient', 'client_class': 'Type[HostingServiceClient]', 'form': 'Optional[Type[BaseHostingServiceRepositoryForm]]', 'has_repository_hook_instructions': 'bool', 'hosting_service_id': 'Optional[str]', 'name': 'Optional[StrOrPromise]', 'needs_authorization': 'bool', 'plans': 'Optional[Sequence[Tuple[str, HostingServicePlan]]]', 'repository_fields': 'SCMToRepositoryFields', 'repository_url_patterns': 'Optional[List[_AnyURL]]', 'self_hosted': 'bool', 'supported_scmtools': 'List[str]', 'supports_bug_trackers': 'bool', 'supports_list_remote_repositories': 'bool', 'supports_post_commit': 'bool', 'supports_repositories': 'bool', 'supports_ssh_key_association': 'bool', 'supports_two_factor_auth': 'bool', 'visible': 'bool', 'visible_scmtools': 'Optional[List[str]]'}¶