add sorting to object models and fix list-deliverables

Some of the previous changes in the series broke assumptions made by
list-deliverables, so fix things.

Change-Id: I703154199de38667801bcfe789cb7a46adf4e53e
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann 2018-02-21 09:26:08 -05:00
parent c8d367b6be
commit 6dd966a1a6
2 changed files with 48 additions and 9 deletions

@ -196,11 +196,11 @@ def main():
if args.no_stable_branch:
if deliv.get_branch_location('stable/' + series) is not None:
continue
if args.unreleased and (deliv.versions or not deliv.is_releasable):
if args.unreleased and (deliv.is_released or not deliv.is_releasable):
continue
if version_ending and deliv.latest_release and deliv.latest_release.endswith(version_ending):
if version_ending and deliv.is_released and deliv.latest_release.endswith(version_ending):
continue
if args.missing_rc and deliv.latest_release and 'rc' in deliv.latest_release:
if args.missing_rc and deliv.is_released and 'rc' in deliv.latest_release:
continue
if args.tag:
tags = deliv.tags

@ -16,6 +16,7 @@
import collections
import copy
import functools
import glob
import os
import os.path
@ -198,6 +199,7 @@ class Deliverables(object):
)
@functools.total_ordering
class Repo(object):
def __init__(self, name, data, deliv):
@ -221,7 +223,17 @@ class Repo(object):
def pypi_name(self):
return self._data.get('pypi-name')
def __eq__(self, other):
return self.name == other.name
def __gt__(self, other):
return self.name > other.name
def __str__(self):
return self.name
@functools.total_ordering
class ReleaseProject(object):
def __init__(self, repo, hash, data, release=None):
@ -235,12 +247,19 @@ class ReleaseProject(object):
def tarball_base(self):
return self._data.get('tarball-base')
def __eq__(self, other):
return self.repo == other.repo
def __gt__(self, other):
return self.repo > other.repo
class Release(object):
def __init__(self, version, projects, deliv):
def __init__(self, version, projects, data, deliv):
self.version = version
self.deliv = weakref.proxy(deliv)
self._data = data
self._projects = {
p['repo']: ReleaseProject(p['repo'], p['hash'], p, self)
for p in projects
@ -248,9 +267,10 @@ class Release(object):
@property
def projects(self):
return sorted(self._projects.values(), key=lambda p: p.repo.name)
return sorted(self._projects.values())
@functools.total_ordering
class Deliverable(object):
_governance_data = None
@ -291,7 +311,7 @@ class Deliverable(object):
@property
def repos(self):
return sorted(self._repos.values(), key=lambda r: r.name)
return sorted(self._repos.values())
@property
def known_repo_names(self):
@ -314,6 +334,10 @@ class Deliverable(object):
def is_releasable(self):
return self.model != 'untagged'
@property
def is_released(self):
return len(self._data.get('releases', [])) > 0
@property
def is_cycle_based(self):
return self.model.startswith('cycle-')
@ -328,8 +352,9 @@ class Deliverable(object):
@property
def latest_release(self):
rel = (self.releases or [{}])[-1]
return rel.get('version')
if not self.is_released:
return ''
return self.releases[-1].version
@property
def release_notes(self):
@ -353,7 +378,12 @@ class Deliverable(object):
@property
def releases(self):
return [
Release(deliv=self, **r)
Release(
version=r['version'],
projects=r['projects'],
data=r,
deliv=self,
)
for r in self._data.get('releases', [])
]
@ -378,3 +408,12 @@ class Deliverable(object):
@property
def data(self):
return copy.deepcopy(self._data)
def __eq__(self, other):
return self.name == other.name
def __gt__(self, other):
return self.name > other.name
def __str__(self):
return self.name