Merge lp:~thumper/launchpad/needs-review-event into lp:launchpad

Proposed by Tim Penhey
Status: Merged
Approved by: Michael Hudson-Doyle
Approved revision: no longer in the source branch.
Merged at revision: 11759
Proposed branch: lp:~thumper/launchpad/needs-review-event
Merge into: lp:launchpad
Prerequisite: lp:~thumper/launchpad/rename-created-job
Diff against target: 221 lines (+49/-19)
8 files modified
lib/lp/code/configure.zcml (+4/-0)
lib/lp/code/event/branchmergeproposal.py (+7/-0)
lib/lp/code/interfaces/event.py (+5/-0)
lib/lp/code/model/branch.py (+6/-1)
lib/lp/code/model/tests/test_branchmergeproposal.py (+9/-7)
lib/lp/code/model/tests/test_codereviewcomment.py (+1/-1)
lib/lp/code/subscribers/branchmergeproposal.py (+8/-0)
lib/lp/testing/__init__.py (+9/-10)
To merge this branch: bzr merge lp:~thumper/launchpad/needs-review-event
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+38686@code.launchpad.net

Commit message

Adds a new event for the needs review email.

Description of the change

This branch adds a new event for the needs review email. No functionality change at all, and the behaviour is exactly the same for now.

test_branchmergeproposal

To post a comment you must log in.
Revision history for this message
Michael Hudson-Doyle (mwhudson) wrote :

Nicely straightforward.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/code/configure.zcml'
--- lib/lp/code/configure.zcml 2010-10-18 03:43:08 +0000
+++ lib/lp/code/configure.zcml 2010-10-18 03:43:09 +0000
@@ -353,6 +353,10 @@
353 handler="lp.code.subscribers.branchmergeproposal.merge_proposal_created"/>353 handler="lp.code.subscribers.branchmergeproposal.merge_proposal_created"/>
354 <subscriber354 <subscriber
355 for="lp.code.interfaces.branchmergeproposal.IBranchMergeProposal355 for="lp.code.interfaces.branchmergeproposal.IBranchMergeProposal
356 lp.code.interfaces.event.IBranchMergeProposalNeedsReviewEvent"
357 handler="lp.code.subscribers.branchmergeproposal.merge_proposal_needs_review"/>
358 <subscriber
359 for="lp.code.interfaces.branchmergeproposal.IBranchMergeProposal
356 lazr.lifecycle.interfaces.IObjectModifiedEvent"360 lazr.lifecycle.interfaces.IObjectModifiedEvent"
357 handler="lp.code.subscribers.branchmergeproposal.merge_proposal_modified"/>361 handler="lp.code.subscribers.branchmergeproposal.merge_proposal_modified"/>
358 <subscriber362 <subscriber
359363
=== modified file 'lib/lp/code/event/branchmergeproposal.py'
--- lib/lp/code/event/branchmergeproposal.py 2010-03-17 07:54:15 +0000
+++ lib/lp/code/event/branchmergeproposal.py 2010-10-18 03:43:09 +0000
@@ -7,6 +7,7 @@
77
8__metaclass__ = type8__metaclass__ = type
9__all__ = [9__all__ = [
10 'BranchMergeProposalNeedsReviewEvent',
10 'BranchMergeProposalStatusChangeEvent',11 'BranchMergeProposalStatusChangeEvent',
11 'NewBranchMergeProposalEvent',12 'NewBranchMergeProposalEvent',
12 'NewCodeReviewCommentEvent',13 'NewCodeReviewCommentEvent',
@@ -17,6 +18,7 @@
17from zope.interface import implements18from zope.interface import implements
1819
19from lp.code.interfaces.event import (20from lp.code.interfaces.event import (
21 IBranchMergeProposalNeedsReviewEvent,
20 IBranchMergeProposalStatusChangeEvent,22 IBranchMergeProposalStatusChangeEvent,
21 INewBranchMergeProposalEvent,23 INewBranchMergeProposalEvent,
22 INewCodeReviewCommentEvent,24 INewCodeReviewCommentEvent,
@@ -41,6 +43,11 @@
41 implements(INewBranchMergeProposalEvent)43 implements(INewBranchMergeProposalEvent)
4244
4345
46class BranchMergeProposalNeedsReviewEvent(ObjectEvent):
47 """The merge proposal has moved from work in progress to needs reivew."""
48 implements(IBranchMergeProposalNeedsReviewEvent)
49
50
44class ReviewerNominatedEvent(ObjectEvent):51class ReviewerNominatedEvent(ObjectEvent):
45 """A reviewer has been nominated."""52 """A reviewer has been nominated."""
46 implements(IReviewerNominatedEvent)53 implements(IReviewerNominatedEvent)
4754
=== modified file 'lib/lp/code/interfaces/event.py'
--- lib/lp/code/interfaces/event.py 2010-03-17 07:54:15 +0000
+++ lib/lp/code/interfaces/event.py 2010-10-18 03:43:09 +0000
@@ -6,6 +6,7 @@
6__metaclass__ = type6__metaclass__ = type
7__all__ = [7__all__ = [
8 'IBranchMergeProposalStatusChangeEvent',8 'IBranchMergeProposalStatusChangeEvent',
9 'IBranchMergeProposalNeedsReviewEvent',
9 'INewBranchMergeProposalEvent',10 'INewBranchMergeProposalEvent',
10 'INewCodeReviewCommentEvent',11 'INewCodeReviewCommentEvent',
11 'IReviewerNominatedEvent',12 'IReviewerNominatedEvent',
@@ -34,3 +35,7 @@
3435
35class INewCodeReviewCommentEvent(IObjectEvent):36class INewCodeReviewCommentEvent(IObjectEvent):
36 """A new comment has been added to the merge proposal."""37 """A new comment has been added to the merge proposal."""
38
39
40class IBranchMergeProposalNeedsReviewEvent(IObjectEvent):
41 """The merge proposal has moved from work in progress to needs reivew."""
3742
=== modified file 'lib/lp/code/model/branch.py'
--- lib/lp/code/model/branch.py 2010-10-07 22:46:08 +0000
+++ lib/lp/code/model/branch.py 2010-10-18 03:43:09 +0000
@@ -83,7 +83,10 @@
83 CannotDeleteBranch,83 CannotDeleteBranch,
84 InvalidBranchMergeProposal,84 InvalidBranchMergeProposal,
85 )85 )
86from lp.code.event.branchmergeproposal import NewBranchMergeProposalEvent86from lp.code.event.branchmergeproposal import (
87 BranchMergeProposalNeedsReviewEvent,
88 NewBranchMergeProposalEvent,
89 )
87from lp.code.interfaces.branch import (90from lp.code.interfaces.branch import (
88 BzrIdentityMixin,91 BzrIdentityMixin,
89 DEFAULT_BRANCH_STATUS_IN_LISTING,92 DEFAULT_BRANCH_STATUS_IN_LISTING,
@@ -434,6 +437,8 @@
434 reviewer, registrant, review_type, _notify_listeners=False)437 reviewer, registrant, review_type, _notify_listeners=False)
435438
436 notify(NewBranchMergeProposalEvent(bmp))439 notify(NewBranchMergeProposalEvent(bmp))
440 notify(BranchMergeProposalNeedsReviewEvent(bmp))
441
437 return bmp442 return bmp
438443
439 def _createMergeProposal(444 def _createMergeProposal(
440445
=== modified file 'lib/lp/code/model/tests/test_branchmergeproposal.py'
--- lib/lp/code/model/tests/test_branchmergeproposal.py 2010-10-18 03:43:08 +0000
+++ lib/lp/code/model/tests/test_branchmergeproposal.py 2010-10-18 03:43:09 +0000
@@ -50,6 +50,7 @@
50 WrongBranchMergeProposal,50 WrongBranchMergeProposal,
51 )51 )
52from lp.code.event.branchmergeproposal import (52from lp.code.event.branchmergeproposal import (
53 BranchMergeProposalNeedsReviewEvent,
53 NewBranchMergeProposalEvent,54 NewBranchMergeProposalEvent,
54 NewCodeReviewCommentEvent,55 NewCodeReviewCommentEvent,
55 ReviewerNominatedEvent,56 ReviewerNominatedEvent,
@@ -645,12 +646,12 @@
645 merge_proposal = self.factory.makeBranchMergeProposal()646 merge_proposal = self.factory.makeBranchMergeProposal()
646 commenter = self.factory.makePerson()647 commenter = self.factory.makePerson()
647 login_person(commenter)648 login_person(commenter)
648 result, event = self.assertNotifies(649 result, events = self.assertNotifies(
649 NewCodeReviewCommentEvent,650 NewCodeReviewCommentEvent,
650 merge_proposal.createComment,651 merge_proposal.createComment,
651 owner=commenter,652 owner=commenter,
652 subject='A review.')653 subject='A review.')
653 self.assertEqual(result, event.object)654 self.assertEqual(result, events[0].object)
654655
655 def test_notify_on_nominate_suppressed_if_requested(self):656 def test_notify_on_nominate_suppressed_if_requested(self):
656 # Ensure that the notification is supressed if the notify listeners657 # Ensure that the notification is supressed if the notify listeners
@@ -758,10 +759,11 @@
758 target_branch = self.factory.makeProductBranch(759 target_branch = self.factory.makeProductBranch(
759 product=source_branch.product)760 product=source_branch.product)
760 registrant = self.factory.makePerson()761 registrant = self.factory.makePerson()
761 result, event = self.assertNotifies(762 result, events = self.assertNotifies(
762 NewBranchMergeProposalEvent,763 [NewBranchMergeProposalEvent,
764 BranchMergeProposalNeedsReviewEvent],
763 source_branch.addLandingTarget, registrant, target_branch)765 source_branch.addLandingTarget, registrant, target_branch)
764 self.assertEqual(result, event.object)766 self.assertEqual(result, events[0].object)
765767
766 def test_getNotificationRecipients(self):768 def test_getNotificationRecipients(self):
767 """Ensure that recipients can be added/removed with subscribe"""769 """Ensure that recipients can be added/removed with subscribe"""
@@ -1333,12 +1335,12 @@
1333 merge_proposal = self.factory.makeBranchMergeProposal()1335 merge_proposal = self.factory.makeBranchMergeProposal()
1334 login_person(merge_proposal.source_branch.owner)1336 login_person(merge_proposal.source_branch.owner)
1335 reviewer = self.factory.makePerson()1337 reviewer = self.factory.makePerson()
1336 result, event = self.assertNotifies(1338 result, events = self.assertNotifies(
1337 ReviewerNominatedEvent,1339 ReviewerNominatedEvent,
1338 merge_proposal.nominateReviewer,1340 merge_proposal.nominateReviewer,
1339 reviewer=reviewer,1341 reviewer=reviewer,
1340 registrant=merge_proposal.source_branch.owner)1342 registrant=merge_proposal.source_branch.owner)
1341 self.assertEqual(result, event.object)1343 self.assertEqual(result, events[0].object)
13421344
1343 def test_notify_on_nominate_suppressed_if_requested(self):1345 def test_notify_on_nominate_suppressed_if_requested(self):
1344 # Ensure that a notification is suppressed if notify listeners is set1346 # Ensure that a notification is suppressed if notify listeners is set
13451347
=== modified file 'lib/lp/code/model/tests/test_codereviewcomment.py'
--- lib/lp/code/model/tests/test_codereviewcomment.py 2010-10-04 19:50:45 +0000
+++ lib/lp/code/model/tests/test_codereviewcomment.py 2010-10-18 03:43:09 +0000
@@ -83,7 +83,7 @@
83 self.assertEqual('Re: Message subject', reply.message.subject)83 self.assertEqual('Re: Message subject', reply.message.subject)
8484
85 def test_createNoParentComment(self):85 def test_createNoParentComment(self):
86 comment = self.bmp.createComment(86 self.bmp.createComment(
87 self.submitter, 'Message subject', 'Message content')87 self.submitter, 'Message subject', 'Message content')
88 new_comment = self.bmp.createComment(88 new_comment = self.bmp.createComment(
89 self.reviewer, 'New subject', 'New content',89 self.reviewer, 'New subject', 'New content',
9090
=== modified file 'lib/lp/code/subscribers/branchmergeproposal.py'
--- lib/lp/code/subscribers/branchmergeproposal.py 2010-10-18 03:43:08 +0000
+++ lib/lp/code/subscribers/branchmergeproposal.py 2010-10-18 03:43:09 +0000
@@ -27,6 +27,14 @@
27 Also create a job to email the subscribers about the new proposal.27 Also create a job to email the subscribers about the new proposal.
28 """28 """
29 getUtility(IUpdatePreviewDiffJobSource).create(merge_proposal)29 getUtility(IUpdatePreviewDiffJobSource).create(merge_proposal)
30
31
32def merge_proposal_needs_review(merge_proposal, event):
33 """A new merge proposal needs a review.
34
35 This event is raised when the proposal moves from work in progress to
36 needs review.
37 """
30 getUtility(IMergeProposalNeedsReviewEmailJobSource).create(38 getUtility(IMergeProposalNeedsReviewEmailJobSource).create(
31 merge_proposal)39 merge_proposal)
3240
3341
=== modified file 'lib/lp/testing/__init__.py'
--- lib/lp/testing/__init__.py 2010-10-17 21:21:07 +0000
+++ lib/lp/testing/__init__.py 2010-10-18 03:43:09 +0000
@@ -357,27 +357,26 @@
357 verifyClass(interface, cls),357 verifyClass(interface, cls),
358 "%r does not correctly implement %r." % (cls, interface))358 "%r does not correctly implement %r." % (cls, interface))
359359
360 def assertNotifies(self, event_type, callable_obj, *args, **kwargs):360 def assertNotifies(self, event_types, callable_obj, *args, **kwargs):
361 """Assert that a callable performs a given notification.361 """Assert that a callable performs a given notification.
362362
363 :param event_type: The type of event that notification is expected363 :param event_type: One or more event types that notification is
364 for.364 expected for.
365 :param callable_obj: The callable to call.365 :param callable_obj: The callable to call.
366 :param *args: The arguments to pass to the callable.366 :param *args: The arguments to pass to the callable.
367 :param **kwargs: The keyword arguments to pass to the callable.367 :param **kwargs: The keyword arguments to pass to the callable.
368 :return: (result, event), where result was the return value of the368 :return: (result, event), where result was the return value of the
369 callable, and event is the event emitted by the callable.369 callable, and event is the event emitted by the callable.
370 """370 """
371 if not isinstance(event_types, (list, tuple)):
372 event_types = [event_types]
371 result, events = capture_events(callable_obj, *args, **kwargs)373 result, events = capture_events(callable_obj, *args, **kwargs)
372 if len(events) == 0:374 if len(events) == 0:
373 raise AssertionError('No notification was performed.')375 raise AssertionError('No notification was performed.')
374 elif len(events) > 1:376 self.assertEqual(len(event_types), len(events))
375 raise AssertionError('Too many (%d) notifications performed.'377 for index, expected in enumerate(event_types):
376 % len(events))378 self.assertIsInstance(events[index], expected)
377 elif not isinstance(events[0], event_type):379 return result, events
378 raise AssertionError('Wrong event type: %r (expected %r).' %
379 (events[0], event_type))
380 return result, events[0]
381380
382 def assertNoNotification(self, callable_obj, *args, **kwargs):381 def assertNoNotification(self, callable_obj, *args, **kwargs):
383 """Assert that no notifications are generated by the callable.382 """Assert that no notifications are generated by the callable.