# Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import urllib from common.buildbot import builds from common.buildbot import network def Builders(master_name): builder_data = network.FetchData(network.BuildUrl( master_name, 'json/builders')) return sorted(Builder(master_name, builder_name, builder_info) for builder_name, builder_info in builder_data.iteritems()) class Builder(object): def __init__(self, master_name, name, data): self._master_name = master_name self._name = name self._url = network.BuildUrl( master_name, 'builders/%s' % urllib.quote(self.name)) self._builds = builds.Builds(master_name, name, self._url) self.Update(data) def __lt__(self, other): return self.name < other.name def __str__(self): return self.name def Update(self, data=None): if not data: data = network.FetchData(network.BuildUrl( self.master_name, 'json/builders/%s' % urllib.quote(self.name))) self._state = data['state'] self._pending_build_count = data['pendingBuilds'] self._current_builds = frozenset(data['currentBuilds']) self._cached_builds = frozenset(data['cachedBuilds']) self._slaves = frozenset(data['slaves']) @property def master_name(self): return self._master_name @property def name(self): return self._name @property def url(self): return self._url @property def state(self): return self._state @property def builds(self): return self._builds @property def pending_build_count(self): return self._pending_build_count @property def current_builds(self): """Set of build numbers currently building. There may be multiple entries if there are multiple build slaves. """ return self._current_builds @property def cached_builds(self): """Set of builds whose data are visible on the master in increasing order. More builds may be available than this. """ return self._cached_builds @property def available_builds(self): return self.cached_builds - self.current_builds @property def last_build(self): """Last completed build.""" return max(self.available_builds) @property def slaves(self): return self._slaves