Merge lp:~mwhudson/launchpad/code-publisher-in-lp.code into lp:launchpad

Proposed by Michael Hudson-Doyle
Status: Merged
Approved by: Curtis Hovey
Approved revision: no longer in the source branch.
Merged at revision: 11196
Proposed branch: lp:~mwhudson/launchpad/code-publisher-in-lp.code
Merge into: lp:launchpad
Diff against target: 457 lines (+135/-43)
13 files modified
lib/canonical/configure.zcml (+2/-2)
lib/canonical/launchpad/doc/webapp-publication.txt (+1/-7)
lib/canonical/launchpad/layers.py (+0/-4)
lib/canonical/launchpad/webapp/meta.zcml (+7/-0)
lib/canonical/launchpad/webapp/metazcml.py (+20/-1)
lib/canonical/launchpad/webapp/servers.py (+0/-9)
lib/canonical/launchpad/zcml/marketing.zcml (+3/-3)
lib/lp/app/tests/test_help.py (+3/-1)
lib/lp/code/browser/configure.zcml (+14/-14)
lib/lp/code/configure.zcml (+5/-1)
lib/lp/code/publisher.py (+34/-0)
lib/lp/code/tests/test_publisher.py (+45/-0)
lib/lp/registry/browser/configure.zcml (+1/-1)
To merge this branch: bzr merge lp:~mwhudson/launchpad/code-publisher-in-lp.code
Reviewer Review Type Date Requested Status
Curtis Hovey (community) Approve
Review via email: mp+30124@code.launchpad.net

Commit message

Move the code-specific publication code into lp.code

Description of the change

Hi horsemen,

This branch moves the code-specific publication gubbins into lp.code. This was surprisingly easy!

The overriding of the zope:publisher ZCML to make priority optional is a bit odd, but it beats having to insert random values into the zcml imho. I also want to override this to make switching sites off possible based on config values later, so it's worth keeping the code to do that in here.

Cheers,
mwh

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

This looks good to land. I pondered the new metazcml directive. I think we need to dismantle webapp before we add some more to it.

review: Approve
Revision history for this message
Michael Hudson-Doyle (mwhudson) wrote :

Hi, can you look at this again? It failed tests so I made a few more changes.

I think we could eliminate some boilerplate by writing our own ZCML directive, how would something like

<lp:site
   name="code"
   web_service="true"
   request_class="lp.code.publisher.CodeLayer"/>

look to you?

Revision history for this message
Curtis Hovey (sinzui) wrote :

I like the suggestion. IT is not clear that site is a vhost. The directive could be vhost, but I think vhost="code" is most clear.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/configure.zcml'
--- lib/canonical/configure.zcml 2010-07-15 15:57:40 +0000
+++ lib/canonical/configure.zcml 2010-07-20 23:57:54 +0000
@@ -99,14 +99,14 @@
99 <browser:defaultView99 <browser:defaultView
100 for="canonical.launchpad.interfaces.ILaunchpadRoot"100 for="canonical.launchpad.interfaces.ILaunchpadRoot"
101 name="+code"101 name="+code"
102 layer="canonical.launchpad.layers.CodeLayer"102 layer="lp.code.publisher.CodeLayer"
103 />103 />
104 <browser:page104 <browser:page
105 name=""105 name=""
106 for="canonical.launchpad.interfaces.ILaunchpadRoot"106 for="canonical.launchpad.interfaces.ILaunchpadRoot"
107 class="canonical.launchpad.browser.launchpad.LaunchpadImageFolder"107 class="canonical.launchpad.browser.launchpad.LaunchpadImageFolder"
108 permission="zope.Public"108 permission="zope.Public"
109 layer="canonical.launchpad.layers.CodeLayer"109 layer="lp.code.publisher.CodeLayer"
110 />110 />
111111
112 <!-- virtual host: translations -->112 <!-- virtual host: translations -->
113113
=== modified file 'lib/canonical/launchpad/doc/webapp-publication.txt'
--- lib/canonical/launchpad/doc/webapp-publication.txt 2010-03-02 03:22:01 +0000
+++ lib/canonical/launchpad/doc/webapp-publication.txt 2010-07-20 23:57:54 +0000
@@ -372,10 +372,6 @@
372 BugsBrowserRequest372 BugsBrowserRequest
373 BugsPublication373 BugsPublication
374374
375 >>> print_request_and_publication('code.launchpad.dev')
376 CodeBrowserRequest
377 CodePublication
378
379 >>> print_request_and_publication('feeds.launchpad.dev')375 >>> print_request_and_publication('feeds.launchpad.dev')
380 FeedsBrowserRequest376 FeedsBrowserRequest
381 FeedsPublication377 FeedsPublication
@@ -417,7 +413,7 @@
417 WebServiceClientRequest413 WebServiceClientRequest
418 WebServicePublication414 WebServicePublication
419 >>> for subdomain in [415 >>> for subdomain in [
420 ... 'answers', 'blueprints', 'bugs', 'code', 'translations']:416 ... 'answers', 'blueprints', 'bugs', 'translations']:
421 ... print_request_and_publication(417 ... print_request_and_publication(
422 ... '%s.launchpad.dev' % subdomain, method='GET',418 ... '%s.launchpad.dev' % subdomain, method='GET',
423 ... extra_environment={'PATH_INFO': '/api'})419 ... extra_environment={'PATH_INFO': '/api'})
@@ -429,8 +425,6 @@
429 WebServicePublication425 WebServicePublication
430 WebServiceClientRequest426 WebServiceClientRequest
431 WebServicePublication427 WebServicePublication
432 WebServiceClientRequest
433 WebServicePublication
434428
435Requests for '/api' on other hosts like feeds are handled like429Requests for '/api' on other hosts like feeds are handled like
436other requests on these hosts:430other requests on these hosts:
437431
=== modified file 'lib/canonical/launchpad/layers.py'
--- lib/canonical/launchpad/layers.py 2009-12-25 22:36:11 +0000
+++ lib/canonical/launchpad/layers.py 2010-07-20 23:57:54 +0000
@@ -36,10 +36,6 @@
36 """The `BugsLayer` layer."""36 """The `BugsLayer` layer."""
3737
3838
39class CodeLayer(LaunchpadLayer):
40 """The `CodeLayer` layer."""
41
42
43class BlueprintLayer(LaunchpadLayer):39class BlueprintLayer(LaunchpadLayer):
44 """The `BlueprintLayer` layer."""40 """The `BlueprintLayer` layer."""
45BlueprintsLayer = BlueprintLayer41BlueprintsLayer = BlueprintLayer
4642
=== modified file 'lib/canonical/launchpad/webapp/meta.zcml'
--- lib/canonical/launchpad/webapp/meta.zcml 2009-07-13 18:15:02 +0000
+++ lib/canonical/launchpad/webapp/meta.zcml 2010-07-20 23:57:54 +0000
@@ -69,6 +69,13 @@
69 handler="canonical.launchpad.webapp.metazcml.authorizations"69 handler="canonical.launchpad.webapp.metazcml.authorizations"
70 />70 />
7171
72 <directive
73 namespace="http://namespaces.zope.org/zope"
74 name="publisher"
75 schema="canonical.launchpad.webapp.metazcml.ILaunchpadPublicationDirective"
76 handler="canonical.launchpad.webapp.metazcml.launchpadPublisher"
77 />
78
72 <groupingDirective79 <groupingDirective
73 namespace="http://namespaces.zope.org/zope"80 namespace="http://namespaces.zope.org/zope"
74 name="facet"81 name="facet"
7582
=== modified file 'lib/canonical/launchpad/webapp/metazcml.py'
--- lib/canonical/launchpad/webapp/metazcml.py 2010-04-11 14:46:42 +0000
+++ lib/canonical/launchpad/webapp/metazcml.py 2010-07-20 23:57:54 +0000
@@ -10,6 +10,8 @@
10import zope.configuration.config10import zope.configuration.config
11from zope.app.file.image import Image11from zope.app.file.image import Image
12from zope.app.pagetemplate.engine import TrustedEngine12from zope.app.pagetemplate.engine import TrustedEngine
13from zope.app.publication.metaconfigure import publisher
14from zope.app.publication.metadirectives import IRequestPublicationDirective
13from zope.component import getUtility15from zope.component import getUtility
14from zope.component.security import PublicPermission16from zope.component.security import PublicPermission
15from zope.component.zcml import adapter, handler, utility, view17from zope.component.zcml import adapter, handler, utility, view
@@ -19,7 +21,7 @@
19from zope.publisher.interfaces.browser import (21from zope.publisher.interfaces.browser import (
20 IBrowserPublisher, IBrowserRequest, IDefaultBrowserLayer)22 IBrowserPublisher, IBrowserRequest, IDefaultBrowserLayer)
21from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest23from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
22from zope.schema import TextLine24from zope.schema import Int, TextLine
23from zope.security.checker import Checker, CheckerPublic25from zope.security.checker import Checker, CheckerPublic
24from zope.security.interfaces import IPermission26from zope.security.interfaces import IPermission
25from zope.security.permission import Permission27from zope.security.permission import Permission
@@ -33,6 +35,7 @@
33from z3c.ptcompat.zcml import page_directive as original_page35from z3c.ptcompat.zcml import page_directive as original_page
34from z3c.ptcompat.zcml import pages_directive as original_pages36from z3c.ptcompat.zcml import pages_directive as original_pages
3537
38from canonical.config import config
36from canonical.launchpad.layers import FeedsLayer39from canonical.launchpad.layers import FeedsLayer
37from canonical.launchpad.webapp.interfaces import (40from canonical.launchpad.webapp.interfaces import (
38 IApplicationMenu, IAuthorization, ICanonicalUrlData, IContextMenu,41 IApplicationMenu, IAuthorization, ICanonicalUrlData, IContextMenu,
@@ -651,3 +654,19 @@
651 description=''):654 description=''):
652 permission = LaunchpadPermission(id, title, access_level, description)655 permission = LaunchpadPermission(id, title, access_level, description)
653 utility(_context, ILaunchpadPermission, permission, name=id)656 utility(_context, ILaunchpadPermission, permission, name=id)
657
658
659class ILaunchpadPublicationDirective(IRequestPublicationDirective):
660
661 priorty = Int(required=False)
662
663_arbitrary_priority = 12
664
665
666def launchpadPublisher(_context, name, factory, methods=['*'],
667 mimetypes=['*'], priority=None):
668 global _arbitrary_priority
669 if priority is None:
670 _arbitrary_priority += 1
671 priority = _arbitrary_priority
672 publisher(_context, name, factory, methods, mimetypes, priority)
654673
=== modified file 'lib/canonical/launchpad/webapp/servers.py'
--- lib/canonical/launchpad/webapp/servers.py 2010-07-19 14:45:32 +0000
+++ lib/canonical/launchpad/webapp/servers.py 2010-07-20 23:57:54 +0000
@@ -1023,14 +1023,6 @@
1023class BlueprintPublication(LaunchpadBrowserPublication):1023class BlueprintPublication(LaunchpadBrowserPublication):
1024 """The publication used for the Blueprint site."""1024 """The publication used for the Blueprint site."""
10251025
1026# ---- code
1027
1028class CodePublication(LaunchpadBrowserPublication):
1029 """The publication used for the Code site."""
1030
1031class CodeBrowserRequest(LaunchpadBrowserRequest):
1032 implements(canonical.launchpad.layers.CodeLayer)
1033
1034# ---- translations1026# ---- translations
10351027
1036class TranslationsPublication(LaunchpadBrowserPublication):1028class TranslationsPublication(LaunchpadBrowserPublication):
@@ -1484,7 +1476,6 @@
1484 VWSHRP('mainsite', LaunchpadBrowserRequest, MainLaunchpadPublication,1476 VWSHRP('mainsite', LaunchpadBrowserRequest, MainLaunchpadPublication,
1485 handle_default_host=True),1477 handle_default_host=True),
1486 VWSHRP('blueprints', BlueprintBrowserRequest, BlueprintPublication),1478 VWSHRP('blueprints', BlueprintBrowserRequest, BlueprintPublication),
1487 VWSHRP('code', CodeBrowserRequest, CodePublication),
1488 VWSHRP('translations', TranslationsBrowserRequest,1479 VWSHRP('translations', TranslationsBrowserRequest,
1489 TranslationsPublication),1480 TranslationsPublication),
1490 VWSHRP('bugs', BugsBrowserRequest, BugsPublication),1481 VWSHRP('bugs', BugsBrowserRequest, BugsPublication),
14911482
=== modified file 'lib/canonical/launchpad/zcml/marketing.zcml'
--- lib/canonical/launchpad/zcml/marketing.zcml 2009-07-13 18:15:02 +0000
+++ lib/canonical/launchpad/zcml/marketing.zcml 2010-07-20 23:57:54 +0000
@@ -95,14 +95,14 @@
95 <!-- Marketing material for Code. -->95 <!-- Marketing material for Code. -->
96 <browser:renamed-page96 <browser:renamed-page
97 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"97 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"
98 layer="canonical.launchpad.layers.CodeLayer"98 layer="lp.code.publisher.CodeLayer"
99 name="+about"99 name="+about"
100 new_name="+tour/branch-hosting-tracking"100 new_name="+tour/branch-hosting-tracking"
101 rootsite="mainsite"101 rootsite="mainsite"
102 />102 />
103 <browser:renamed-page103 <browser:renamed-page
104 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"104 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"
105 layer="canonical.launchpad.layers.CodeLayer"105 layer="lp.code.publisher.CodeLayer"
106 name="+faq"106 name="+faq"
107 new_name="+tour/branch-hosting-tracking"107 new_name="+tour/branch-hosting-tracking"
108 rootsite="mainsite"108 rootsite="mainsite"
@@ -110,7 +110,7 @@
110 <browser:renamed-page110 <browser:renamed-page
111 name="+tour"111 name="+tour"
112 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"112 for="canonical.launchpad.webapp.interfaces.ILaunchpadApplication"
113 layer="canonical.launchpad.layers.CodeLayer"113 layer="lp.code.publisher.CodeLayer"
114 new_name="+tour/branch-hosting-tracking"114 new_name="+tour/branch-hosting-tracking"
115 rootsite="mainsite"115 rootsite="mainsite"
116 />116 />
117117
=== modified file 'lib/lp/app/tests/test_help.py'
--- lib/lp/app/tests/test_help.py 2010-07-18 00:23:02 +0000
+++ lib/lp/app/tests/test_help.py 2010-07-20 23:57:54 +0000
@@ -11,13 +11,15 @@
1111
12from canonical.testing.layers import FunctionalLayer12from canonical.testing.layers import FunctionalLayer
13from canonical.launchpad.layers import (13from canonical.launchpad.layers import (
14 AnswersLayer, BlueprintsLayer, BugsLayer, CodeLayer, LaunchpadLayer,14 AnswersLayer, BlueprintsLayer, BugsLayer, LaunchpadLayer,
15 TranslationsLayer)15 TranslationsLayer)
16from canonical.launchpad.testing.systemdocs import create_view16from canonical.launchpad.testing.systemdocs import create_view
17from canonical.launchpad.webapp.interfaces import ILaunchpadApplication17from canonical.launchpad.webapp.interfaces import ILaunchpadApplication
1818
19from canonical.lazr.folder import ExportedFolder19from canonical.lazr.folder import ExportedFolder
2020
21from lp.code.publisher import CodeLayer
22
21# The root of the tree23# The root of the tree
22ROOT = os.path.realpath(24ROOT = os.path.realpath(
23 os.path.join(25 os.path.join(
2426
=== modified file 'lib/lp/code/browser/configure.zcml'
--- lib/lp/code/browser/configure.zcml 2010-07-14 10:09:35 +0000
+++ lib/lp/code/browser/configure.zcml 2010-07-20 23:57:54 +0000
@@ -18,11 +18,11 @@
1818
19 <browser:defaultView19 <browser:defaultView
20 for="lp.registry.interfaces.product.IProductSet"20 for="lp.registry.interfaces.product.IProductSet"
21 layer="canonical.launchpad.layers.CodeLayer"21 layer="lp.code.publisher.CodeLayer"
22 name="+project-cloud"/>22 name="+project-cloud"/>
23 <browser:page23 <browser:page
24 for="lp.registry.interfaces.product.IProductSet"24 for="lp.registry.interfaces.product.IProductSet"
25 layer="canonical.launchpad.layers.CodeLayer"25 layer="lp.code.publisher.CodeLayer"
26 name="+project-cloud"26 name="+project-cloud"
27 class="lp.code.browser.bazaar.BazaarProductView"27 class="lp.code.browser.bazaar.BazaarProductView"
28 template="../templates/code-in-branches.pt"28 template="../templates/code-in-branches.pt"
@@ -87,7 +87,7 @@
87 <browser:defaultView87 <browser:defaultView
88 for="lp.code.interfaces.codeimportmachine.ICodeImportMachine"88 for="lp.code.interfaces.codeimportmachine.ICodeImportMachine"
89 name="+index"89 name="+index"
90 layer="canonical.launchpad.layers.CodeLayer"/>90 layer="lp.code.publisher.CodeLayer"/>
91 <browser:page91 <browser:page
92 for="lp.code.interfaces.codeimportmachine.ICodeImportMachine"92 for="lp.code.interfaces.codeimportmachine.ICodeImportMachine"
93 class="lp.code.browser.codeimportmachine.CodeImportMachineView"93 class="lp.code.browser.codeimportmachine.CodeImportMachineView"
@@ -109,7 +109,7 @@
109 <browser:defaultView109 <browser:defaultView
110 for="lp.code.interfaces.codeimportmachine.ICodeImportMachineSet"110 for="lp.code.interfaces.codeimportmachine.ICodeImportMachineSet"
111 name="+index"111 name="+index"
112 layer="canonical.launchpad.layers.CodeLayer"/>112 layer="lp.code.publisher.CodeLayer"/>
113 <browser:page113 <browser:page
114 for="lp.code.interfaces.codeimportmachine.ICodeImportMachineSet"114 for="lp.code.interfaces.codeimportmachine.ICodeImportMachineSet"
115 class="lp.code.browser.codeimportmachine.CodeImportMachineSetView"115 class="lp.code.browser.codeimportmachine.CodeImportMachineSetView"
@@ -685,7 +685,7 @@
685 <browser:defaultView685 <browser:defaultView
686 for="lp.code.interfaces.codeimport.ICodeImportSet"686 for="lp.code.interfaces.codeimport.ICodeImportSet"
687 name="+index"687 name="+index"
688 layer="canonical.launchpad.layers.CodeLayer"/>688 layer="lp.code.publisher.CodeLayer"/>
689 <browser:page689 <browser:page
690 for="lp.code.interfaces.codeimport.ICodeImportSet"690 for="lp.code.interfaces.codeimport.ICodeImportSet"
691 class="lp.code.browser.codeimport.CodeImportSetView"691 class="lp.code.browser.codeimport.CodeImportSetView"
@@ -717,7 +717,7 @@
717 <browser:defaultView717 <browser:defaultView
718 for="lp.registry.interfaces.projectgroup.IProjectGroup"718 for="lp.registry.interfaces.projectgroup.IProjectGroup"
719 name="+branches"719 name="+branches"
720 layer="canonical.launchpad.layers.CodeLayer"/>720 layer="lp.code.publisher.CodeLayer"/>
721 <browser:page721 <browser:page
722 for="lp.registry.interfaces.sourcepackage.ISourcePackage"722 for="lp.registry.interfaces.sourcepackage.ISourcePackage"
723 class="lp.code.browser.branchlisting.SourcePackageBranchesView"723 class="lp.code.browser.branchlisting.SourcePackageBranchesView"
@@ -804,7 +804,7 @@
804 PersonBranchesMenu"/>804 PersonBranchesMenu"/>
805 <browser:defaultView805 <browser:defaultView
806 for="lp.registry.interfaces.person.IPerson"806 for="lp.registry.interfaces.person.IPerson"
807 layer="canonical.launchpad.layers.CodeLayer"807 layer="lp.code.publisher.CodeLayer"
808 name="+branches"/>808 name="+branches"/>
809 <browser:page809 <browser:page
810 for="lp.registry.interfaces.person.IPerson"810 for="lp.registry.interfaces.person.IPerson"
@@ -914,22 +914,22 @@
914914
915 <browser:defaultView915 <browser:defaultView
916 for="lp.registry.interfaces.sourcepackage.ISourcePackage"916 for="lp.registry.interfaces.sourcepackage.ISourcePackage"
917 layer="canonical.launchpad.layers.CodeLayer"917 layer="lp.code.publisher.CodeLayer"
918 name="+branches"/>918 name="+branches"/>
919919
920 <browser:defaultView920 <browser:defaultView
921 for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"921 for="lp.registry.interfaces.distributionsourcepackage.IDistributionSourcePackage"
922 layer="canonical.launchpad.layers.CodeLayer"922 layer="lp.code.publisher.CodeLayer"
923 name="+code-index"/>923 name="+code-index"/>
924924
925 <browser:defaultView925 <browser:defaultView
926 for="lp.registry.interfaces.distribution.IDistribution"926 for="lp.registry.interfaces.distribution.IDistribution"
927 layer="canonical.launchpad.layers.CodeLayer"927 layer="lp.code.publisher.CodeLayer"
928 name="+branches"/>928 name="+branches"/>
929929
930 <browser:defaultView930 <browser:defaultView
931 for="lp.registry.interfaces.distroseries.IDistroSeries"931 for="lp.registry.interfaces.distroseries.IDistroSeries"
932 layer="canonical.launchpad.layers.CodeLayer"932 layer="lp.code.publisher.CodeLayer"
933 name="+branches"/>933 name="+branches"/>
934934
935 <browser:url935 <browser:url
@@ -956,7 +956,7 @@
956956
957 <browser:defaultView957 <browser:defaultView
958 for="lp.registry.interfaces.personproduct.IPersonProduct"958 for="lp.registry.interfaces.personproduct.IPersonProduct"
959 layer="canonical.launchpad.layers.CodeLayer"959 layer="lp.code.publisher.CodeLayer"
960 name="+branches" />960 name="+branches" />
961961
962 <browser:page962 <browser:page
@@ -1099,7 +1099,7 @@
1099 <browser:defaultView1099 <browser:defaultView
1100 for="lp.code.interfaces.sourcepackagerecipe.ISourcePackageRecipe"1100 for="lp.code.interfaces.sourcepackagerecipe.ISourcePackageRecipe"
1101 name="+index"1101 name="+index"
1102 layer="canonical.launchpad.layers.CodeLayer"/>1102 layer="lp.code.publisher.CodeLayer"/>
1103 <browser:page1103 <browser:page
1104 for="lp.code.interfaces.sourcepackagerecipe.ISourcePackageRecipe"1104 for="lp.code.interfaces.sourcepackagerecipe.ISourcePackageRecipe"
1105 class="lp.code.browser.sourcepackagerecipe.SourcePackageRecipeView"1105 class="lp.code.browser.sourcepackagerecipe.SourcePackageRecipeView"
@@ -1117,7 +1117,7 @@
1117 <browser:defaultView1117 <browser:defaultView
1118 for="lp.code.interfaces.sourcepackagerecipebuild.ISourcePackageRecipeBuild"1118 for="lp.code.interfaces.sourcepackagerecipebuild.ISourcePackageRecipeBuild"
1119 name="+index"1119 name="+index"
1120 layer="canonical.launchpad.layers.CodeLayer"/>1120 layer="lp.code.publisher.CodeLayer"/>
1121 <browser:page1121 <browser:page
1122 for="lp.code.interfaces.sourcepackagerecipebuild.ISourcePackageRecipeBuild"1122 for="lp.code.interfaces.sourcepackagerecipebuild.ISourcePackageRecipeBuild"
1123 class="lp.code.browser.sourcepackagerecipebuild.SourcePackageRecipeBuildView"1123 class="lp.code.browser.sourcepackagerecipebuild.SourcePackageRecipeBuildView"
11241124
=== modified file 'lib/lp/code/configure.zcml'
--- lib/lp/code/configure.zcml 2010-06-16 18:18:32 +0000
+++ lib/lp/code/configure.zcml 2010-07-20 23:57:54 +0000
@@ -13,6 +13,10 @@
13 <include package=".browser"/>13 <include package=".browser"/>
14 <authorizations module="lp.code.security" />14 <authorizations module="lp.code.security" />
1515
16 <publisher
17 name="code"
18 factory="lp.code.publisher.code_request_publication_factory"/>
19
16 <!-- Branch Merge Queue -->20 <!-- Branch Merge Queue -->
1721
18 <class class="lp.code.model.branchmergequeue.SingleBranchMergeQueue">22 <class class="lp.code.model.branchmergequeue.SingleBranchMergeQueue">
@@ -981,7 +985,7 @@
981 <adapter factory="lp.code.model.linkedbranch.DistributionPackageLinkedBranch" />985 <adapter factory="lp.code.model.linkedbranch.DistributionPackageLinkedBranch" />
982986
983 <lp:help-folder987 <lp:help-folder
984 folder="help" type="canonical.launchpad.layers.CodeLayer" />988 folder="help" type="lp.code.publisher.CodeLayer" />
985989
986 <!-- Diffs -->990 <!-- Diffs -->
987 <class class="lp.code.model.diff.Diff">991 <class class="lp.code.model.diff.Diff">
988992
=== added file 'lib/lp/code/publisher.py'
--- lib/lp/code/publisher.py 1970-01-01 00:00:00 +0000
+++ lib/lp/code/publisher.py 2010-07-20 23:57:54 +0000
@@ -0,0 +1,34 @@
1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Code's custom publication."""
5
6__metaclass__ = type
7__all__ = [
8 'CodeBrowserRequest',
9 'CodeLayer',
10 'code_request_publication_factory',
11 ]
12
13
14from zope.interface import implements
15from zope.publisher.interfaces.browser import (
16 IBrowserRequest, IDefaultBrowserLayer)
17
18from canonical.launchpad.webapp.publication import LaunchpadBrowserPublication
19from canonical.launchpad.webapp.servers import (
20 LaunchpadBrowserRequest, VHostWebServiceRequestPublicationFactory)
21
22
23class CodeLayer(IBrowserRequest, IDefaultBrowserLayer):
24 """The Code layer."""
25
26
27class CodeBrowserRequest(LaunchpadBrowserRequest):
28 """Instances of CodeBrowserRequest provide `CodeLayer`."""
29 implements(CodeLayer)
30
31
32def code_request_publication_factory():
33 return VHostWebServiceRequestPublicationFactory(
34 'code', CodeBrowserRequest, LaunchpadBrowserPublication)
035
=== added file 'lib/lp/code/tests/test_publisher.py'
--- lib/lp/code/tests/test_publisher.py 1970-01-01 00:00:00 +0000
+++ lib/lp/code/tests/test_publisher.py 2010-07-20 23:57:54 +0000
@@ -0,0 +1,45 @@
1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Tests for code's custom publications."""
5
6__metaclass__ = type
7
8import unittest
9
10from canonical.config import config
11from canonical.launchpad.layers import WebServiceLayer
12from canonical.testing.layers import FunctionalLayer
13
14from lp.testing import TestCase
15from lp.testing.publication import get_request_and_publication
16
17from lp.code.publisher import CodeLayer
18
19
20class TestRegistration(TestCase):
21 """Code's publication customizations are installed correctly."""
22
23 layer = FunctionalLayer
24
25 def test_code_request_provides_code_layer(self):
26 # The request constructed for requests to the code hostname provides
27 # CodeLayer.
28 request, publication = get_request_and_publication(
29 host=config.vhost.code.hostname)
30 self.assertProvides(request, CodeLayer)
31
32 def test_code_host_has_api(self):
33 # Requests to /api on the code domain are treated as web service
34 # requests.
35 request, publication = get_request_and_publication(
36 host=config.vhost.code.hostname,
37 extra_environment={'PATH_INFO': '/api/1.0'})
38 # XXX MichaelHudson, 2010-07-20, bug=607664: WebServiceLayer only
39 # actually provides WebServiceLayer in the sense of verifyObject after
40 # traversal has started.
41 self.assertTrue(WebServiceLayer.providedBy(request))
42
43
44def test_suite():
45 return unittest.TestLoader().loadTestsFromName(__name__)
046
=== modified file 'lib/lp/registry/browser/configure.zcml'
--- lib/lp/registry/browser/configure.zcml 2010-05-27 04:10:17 +0000
+++ lib/lp/registry/browser/configure.zcml 2010-07-20 23:57:54 +0000
@@ -1357,7 +1357,7 @@
1357 <browser:defaultView1357 <browser:defaultView
1358 for="lp.registry.interfaces.product.IProduct"1358 for="lp.registry.interfaces.product.IProduct"
1359 name="+code-index"1359 name="+code-index"
1360 layer="canonical.launchpad.layers.CodeLayer"/>1360 layer="lp.code.publisher.CodeLayer"/>
1361 <browser:defaultView1361 <browser:defaultView
1362 for="lp.registry.interfaces.product.IProduct"1362 for="lp.registry.interfaces.product.IProduct"
1363 layer="canonical.launchpad.layers.AnswersLayer"1363 layer="canonical.launchpad.layers.AnswersLayer"