Source code for flash_services.travis
"""Defines the Travis CI service integrations."""
import logging
from .auth import HeaderMixin
from .core import ContinuousIntegrationService
from .utils import elapsed_time, estimate_time, health_summary, Outcome
logger = logging.getLogger(__name__)
[docs]class TravisOS(ContinuousIntegrationService):
"""Show the current status of an open-source project.
Arguments:
account (:py:class:`str`): The name of the account.
app (:py:class:`str`): The name of the application.
Attributes:
repo (:py:class:`str`): The repository name, in the format
``account/application``.
"""
ENDPOINT = '/repos/{repo}/builds'
FRIENDLY_NAME = 'Travis CI'
OUTCOMES = dict(
canceled=Outcome.CANCELLED,
created=Outcome.WORKING,
failed=Outcome.FAILED,
passed=Outcome.PASSED,
started=Outcome.WORKING,
errored=Outcome.CRASHED,
)
ROOT = 'https://api.travis-ci.org'
def __init__(self, *, account, app, **kwargs):
super().__init__(**kwargs)
self.account = account
self.app = app
self.repo = '{}/{}'.format(account, app)
@property
def headers(self):
headers = super().headers
headers.update({
'Accept': 'application/vnd.travis-ci.2+json',
'User-Agent': 'Flash',
})
return headers
[docs] def format_data(self, data):
"""Re-format the response data for the front-end.
Arguments:
data (:py:class:`dict`): The JSON data from the response.
Returns:
:py:class:`dict`: The re-formatted data.
"""
commits = {commit['id']: commit for commit in data.get('commits', [])}
builds = [
self.format_build(build, commits.get(build.get('commit_id'), {}))
for build in data.get('builds', [])
]
estimate_time(builds)
return dict(
builds=builds[:4],
health=health_summary(builds),
name=self.repo,
)
[docs] @classmethod
def format_build(cls, build, commit): # pylint: disable=arguments-differ
"""Re-format the build and commit data for the front-end.
Arguments:
build (:py:class:`dict`): The build data from the response.
commit (:py:class:`dict`): The commit data from the response.
Returns:
:py:class:`dict`: The re-formatted data.
"""
start, finish, elapsed = elapsed_time(
build.get('started_at'),
build.get('finished_at'),
)
return super().format_build(dict(
author=commit.get('author_name'),
duration=(
None if start is None or finish is None else finish - start
),
elapsed=elapsed,
message=commit.get('message'),
outcome=build.get('state'),
started_at=start,
))
[docs]class TravisPro(HeaderMixin, TravisOS):
"""Show the current status of a pro (travis-ci.com) project.
Arguments:
account (:py:class:`str`): The name of the account.
api_token(:py:class:`str`): The API token.
app (:py:class:`str`): The name of the application.
Attributes:
repo (:py:class:`str`): The repository name, in the format
``account/application``.
"""
FRIENDLY_NAME = 'Travis CI'
ROOT = TravisOS.ROOT.replace('.org', '.com')
def __init__(self, *, api_token, **kwargs):
api_token = 'token "{}"'.format(api_token)
super().__init__(api_token=api_token, **kwargs)