Skip to content

Commit

Permalink
adding comparators
Browse files Browse the repository at this point in the history
  • Loading branch information
abyx committed Dec 22, 2009
1 parent 5264eda commit 2835d4c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
28 changes: 28 additions & 0 deletions buildbot/status/web/console.py
Expand Up @@ -775,3 +775,31 @@ def body(self, request):
revisions, categories, branch, debugInfo)

return data

class RevisionComparator(object):
"""Used for comparing between revisions, as some
VCS use a plain counter for revisions (like SVN)
while others use different concepts (see Git).
"""

# TODO (avivby): Should this be a zope interface?

def isRevisionEarlier(self, first, second):
raise NotImplementedError

def getSortingKey(self):
raise NotImplementedError

class TimeRevisionComparator(RevisionComparator):
def isRevisionEarlier(self, first, second):
return first.when < second.when

def getSortingKey(self):
return operator.attrgetter('when')

class IntegerRevisionComparator(RevisionComparator):
def isRevisionEarlier(self, first, second):
return int(first.revision) < int(second.revision)

def getSortingKey(self):
return operator.attrgetter('revision')
52 changes: 52 additions & 0 deletions buildbot/test/test_console.py
Expand Up @@ -5,6 +5,7 @@
from buildbot.status import builder
from buildbot.status.web import console
from buildbot.test.runutils import RunMixin
from buildbot.changes import changes

# Configuration to be used by the getBuildDetailsTest
run_config = """
Expand Down Expand Up @@ -48,6 +49,57 @@ def testgetResultsClass(self):
self.assertEqual(console.getResultsClass(builder.FAILURE, builder.FAILURE, True), "running")
self.assertEqual(console.getResultsClass(builder.EXCEPTION, builder.FAILURE, False), "exception")

def _createDummyChange(revision):
return changes.Change('Committer', ['files'], 'comment', revision=revision)

class TimeRevisionComparatorTest(unittest.TestCase):
def setUp(self):
self.comparator = console.TimeRevisionComparator()

def testSameRevisionIsNotGreater(self):
change = _createDummyChange('abcdef')
self.assertFalse(self.comparator.isRevisionEarlier(change, change))

def testOrdersDifferentRevisions(self):
first = _createDummyChange('first_rev')
second = _createDummyChange('second_rev')

second.when += 1 # Make sure it's "after" the first
self.assertTrue(self.comparator.isRevisionEarlier(first, second))
self.assertFalse(self.comparator.isRevisionEarlier(second, first))

def testReturnedKeySortsRevisionsCorrectly(self):
my_changes = [_createDummyChange('rev' + str(i))
for i in range(1, 6)]
for i in range(1, len(my_changes)):
my_changes[i].when = my_changes[i-1].when + 1

reversed_changes = list(reversed(my_changes))
reversed_changes.sort(key=self.comparator.getSortingKey())
self.assertEqual(my_changes, reversed_changes)

class IntegerRevisionComparatorTest(unittest.TestCase):
def setUp(self):
self.comparator = console.IntegerRevisionComparator()

def testSameRevisionIsNotGreater(self):
change = _createDummyChange('1')
self.assertFalse(self.comparator.isRevisionEarlier(change, change))

def testOrdersDifferentRevisions(self):
first = _createDummyChange('1')
second = _createDummyChange('2')

self.assertTrue(self.comparator.isRevisionEarlier(first, second))
self.assertFalse(self.comparator.isRevisionEarlier(second, first))

def testReturnedKeySortsRevisionsCorrectly(self):
my_changes = [_createDummyChange(str(i)) for i in range(1, 6)]

reversed_changes = list(reversed(my_changes))
reversed_changes.sort(key=self.comparator.getSortingKey())
self.assertEqual(my_changes, reversed_changes)

# Helper class to mock a request. We define only what we really need.
class MockRequest(object):
def childLink(self, link):
Expand Down

0 comments on commit 2835d4c

Please sign in to comment.