plone.browserlayer 2.2.4__tar.gz → 3.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/CHANGES.rst +27 -1
  2. plone.browserlayer-3.0.1/PKG-INFO +288 -0
  3. plone.browserlayer-3.0.1/plone/__init__.py +1 -0
  4. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/README.rst +8 -6
  5. plone.browserlayer-3.0.1/plone/browserlayer/configure.zcml +34 -0
  6. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/exportimport.py +35 -35
  7. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/interfaces.py +1 -3
  8. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/layer.py +1 -3
  9. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/testing.py +3 -5
  10. plone.browserlayer-3.0.1/plone/browserlayer/tests/__init__.py +0 -0
  11. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/tests/interfaces.py +1 -3
  12. plone.browserlayer-3.0.1/plone/browserlayer/tests/local.pt +3 -0
  13. plone.browserlayer-3.0.1/plone/browserlayer/tests/profiles/testing/browserlayer.xml +6 -0
  14. plone.browserlayer-3.0.1/plone/browserlayer/tests/profiles/uninstall/browserlayer.xml +10 -0
  15. plone.browserlayer-3.0.1/plone/browserlayer/tests/standard.pt +3 -0
  16. plone.browserlayer-3.0.1/plone/browserlayer/tests/test_doctest.py +24 -0
  17. plone.browserlayer-3.0.1/plone/browserlayer/tests/testing.zcml +39 -0
  18. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/utils.py +7 -9
  19. plone.browserlayer-3.0.1/plone.browserlayer.egg-info/PKG-INFO +288 -0
  20. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/requires.txt +4 -1
  21. plone.browserlayer-3.0.1/setup.cfg +23 -0
  22. plone.browserlayer-3.0.1/setup.py +54 -0
  23. plone.browserlayer-2.2.4/PKG-INFO +0 -265
  24. plone.browserlayer-2.2.4/plone/__init__.py +0 -2
  25. plone.browserlayer-2.2.4/plone/browserlayer/configure.zcml +0 -31
  26. plone.browserlayer-2.2.4/plone/browserlayer/tests/__init__.py +0 -1
  27. plone.browserlayer-2.2.4/plone/browserlayer/tests/local.pt +0 -1
  28. plone.browserlayer-2.2.4/plone/browserlayer/tests/profiles/testing/browserlayer.xml +0 -4
  29. plone.browserlayer-2.2.4/plone/browserlayer/tests/profiles/uninstall/browserlayer.xml +0 -7
  30. plone.browserlayer-2.2.4/plone/browserlayer/tests/standard.pt +0 -1
  31. plone.browserlayer-2.2.4/plone/browserlayer/tests/test_doctest.py +0 -32
  32. plone.browserlayer-2.2.4/plone/browserlayer/tests/testing.zcml +0 -38
  33. plone.browserlayer-2.2.4/plone.browserlayer.egg-info/PKG-INFO +0 -265
  34. plone.browserlayer-2.2.4/setup.cfg +0 -7
  35. plone.browserlayer-2.2.4/setup.py +0 -57
  36. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/CONTRIBUTING.rst +0 -0
  37. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/MANIFEST.in +0 -0
  38. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/README.rst +0 -0
  39. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/docs/LICENSE.GPL +0 -0
  40. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/docs/LICENSE.txt +0 -0
  41. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/__init__.py +0 -0
  42. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/SOURCES.txt +0 -0
  43. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/dependency_links.txt +0 -0
  44. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/namespace_packages.txt +0 -0
  45. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/not-zip-safe +0 -0
  46. {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/top_level.txt +0 -0
@@ -8,6 +8,32 @@ Changelog
8
8
 
9
9
  .. towncrier release notes start
10
10
 
11
+ 3.0.1 (2023-03-14)
12
+ ------------------
13
+
14
+ Internal:
15
+
16
+
17
+ - Update configuration files.
18
+ [plone devs] (ba6bcc29)
19
+
20
+
21
+ 3.0.0 (2022-11-14)
22
+ ------------------
23
+
24
+ Breaking changes:
25
+
26
+
27
+ - Drop support for Plone 5 and Python 2. [maurits] (#600)
28
+
29
+
30
+ Bug fixes:
31
+
32
+
33
+ - Fix 'KeyError: file' in browser tests on Python 3.11.
34
+ [maurits] (#3663)
35
+
36
+
11
37
  2.2.4 (2020-09-07)
12
38
  ------------------
13
39
 
@@ -95,7 +121,7 @@ Fixes:
95
121
  2.1.2 (2012-10-03)
96
122
  ------------------
97
123
 
98
- - Add support for calling many times remove in export (ie:even when no corresponding layer is registred, remove option should not throw exception).
124
+ - Add support for calling many times remove in export (ie:even when no corresponding layer is registered, remove option should not throw exception).
99
125
  [toutpt]
100
126
 
101
127
  2.1.1 (2011-11-24)
@@ -0,0 +1,288 @@
1
+ Metadata-Version: 2.1
2
+ Name: plone.browserlayer
3
+ Version: 3.0.1
4
+ Summary: Browser layer management for Zope applications
5
+ Home-page: https://github.com/plone/plone.browserlayer
6
+ Author: Plone Foundation
7
+ Author-email: plone-developers@lists.sourceforge.net
8
+ License: GPL version 2
9
+ Keywords: plone browser layer
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Environment :: Web Environment
12
+ Classifier: Framework :: Plone
13
+ Classifier: Framework :: Plone :: 6.0
14
+ Classifier: Framework :: Plone :: Core
15
+ Classifier: Framework :: Zope :: 5
16
+ Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Requires-Python: >=3.8
24
+ Provides-Extra: test
25
+
26
+ Introduction
27
+ ============
28
+
29
+ This package aims to make it easier to register visual components (e.g. views
30
+ and viewlets) so that they only show up in a Plone site where they have been
31
+ explicitly installed.
32
+
33
+ Basic usage
34
+ -----------
35
+
36
+ To use this feature, you should:
37
+
38
+ - declare plone.browserlayer as a dependency, e.g. in setup.py::
39
+
40
+ install_requires=[
41
+ 'plone.browserlayer',
42
+ ],
43
+
44
+ - ensure that its ZCML is loaded, e.g. with an include from your own package::
45
+
46
+ <include package="plone.browserlayer" />
47
+
48
+ - create a layer marker interface unique to your product::
49
+
50
+ from zope.interface import Interface
51
+ class IMyProductLayer(Interface):
52
+ """A layer specific to my product
53
+ """
54
+
55
+ - register this with GenericSetup, in a browserlayer.xml file::
56
+
57
+ <layers>
58
+ <layer name="my.product"
59
+ interface="my.product.interfaces.IMyProductLayer" />
60
+ </layers>
61
+
62
+ - register visual components in ZCML for this layer, e.g.::
63
+
64
+ <browser:page
65
+ name="my-view"
66
+ for="*"
67
+ layer=".interfaces.IMyProductLayer"
68
+ permission="zope.Public"
69
+ template="my-view.pt"
70
+ />
71
+
72
+ Changelog
73
+ =========
74
+
75
+ .. You should *NOT* be adding new change log entries to this file.
76
+ You should create a file in the news directory instead.
77
+ For helpful instructions, please see:
78
+ https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst
79
+
80
+ .. towncrier release notes start
81
+
82
+ 3.0.1 (2023-03-14)
83
+ ------------------
84
+
85
+ Internal:
86
+
87
+
88
+ - Update configuration files.
89
+ [plone devs] (ba6bcc29)
90
+
91
+
92
+ 3.0.0 (2022-11-14)
93
+ ------------------
94
+
95
+ Breaking changes:
96
+
97
+
98
+ - Drop support for Plone 5 and Python 2. [maurits] (#600)
99
+
100
+
101
+ Bug fixes:
102
+
103
+
104
+ - Fix 'KeyError: file' in browser tests on Python 3.11.
105
+ [maurits] (#3663)
106
+
107
+
108
+ 2.2.4 (2020-09-07)
109
+ ------------------
110
+
111
+ Bug fixes:
112
+
113
+
114
+ - Fixed deprecation warning for ``zope.component.interfaces.IComponentRegistry``.
115
+ [maurits] (#3130)
116
+
117
+
118
+ 2.2.3 (2020-04-20)
119
+ ------------------
120
+
121
+ Bug fixes:
122
+
123
+
124
+ - Minor packaging updates. (#1)
125
+
126
+
127
+ 2.2.2 (2018-09-28)
128
+ ------------------
129
+
130
+ Bug fixes:
131
+
132
+ - Fix tests for py3
133
+ [pbauer]
134
+
135
+
136
+ 2.2.1 (2018-02-02)
137
+ ------------------
138
+
139
+ Bug fixes:
140
+
141
+ - Add Python 2 / 3 compatibility
142
+ [pbauer]
143
+
144
+
145
+ 2.2.0 (2017-02-12)
146
+ ------------------
147
+
148
+ Bug fixes:
149
+
150
+ - Fixed test when using Zope 4. [maurits]
151
+
152
+
153
+ 2.1.7 (2016-11-01)
154
+ ------------------
155
+
156
+ Fixes:
157
+
158
+ - Removed ZopeTestCase. We were importing from it but not using it...
159
+ [ivanteoh, maurits]
160
+
161
+
162
+ 2.1.6 (2015-10-27)
163
+ ------------------
164
+
165
+ Fixes:
166
+
167
+ - Minor cleanup in order to follow plone code style conventions.
168
+ [jensens]
169
+
170
+
171
+ 2.1.5 (2015-04-29)
172
+ ------------------
173
+
174
+ - Rerelease for clarity, because 2.1.4 got released twice.
175
+ [maurits]
176
+
177
+
178
+ 2.1.4 (2015-04-29)
179
+ ------------------
180
+
181
+ - Move tests to plone.app.testing.
182
+ [sdelcourt,timo]
183
+
184
+
185
+ 2.1.3 (2014-02-25)
186
+ ------------------
187
+
188
+ - Fix tests with diazo.
189
+ [davisagli]
190
+
191
+
192
+ 2.1.2 (2012-10-03)
193
+ ------------------
194
+
195
+ - Add support for calling many times remove in export (ie:even when no corresponding layer is registered, remove option should not throw exception).
196
+ [toutpt]
197
+
198
+ 2.1.1 (2011-11-24)
199
+ ------------------
200
+
201
+ - Added uninstall support to browserlayer.xml with the 'remove' option.
202
+ [maurits]
203
+
204
+ - GS export xml is now repeatable. Before two consecutive exports could
205
+ yield differently ordered results.
206
+ [do3cc]
207
+
208
+
209
+ 2.1 - 2011-05-12
210
+ ----------------
211
+
212
+ - Update import of BeforeTraverseEvent to come from zope.traversing instead
213
+ of zope.app.publication.
214
+ [davisagli]
215
+
216
+ - Add MANIFEST.in
217
+ [WouterVH]
218
+
219
+
220
+ 2.0.1 - 2010-09-21
221
+ ------------------
222
+
223
+ - Make sure the layers don't get applied twice if the site is traversed more
224
+ than once (such as in a vhosting URL).
225
+ [davisagli]
226
+
227
+
228
+ 2.0 - 2010-07-18
229
+ ----------------
230
+
231
+ - Update license to GPL version 2 only.
232
+ [hannosch]
233
+
234
+ - Package metadata cleanup, require Zope2 distribution.
235
+ [hannosch]
236
+
237
+
238
+ 1.0.1 - 2009-09-09
239
+ ------------------
240
+
241
+ - Be more robust against broken layer registrations. These can occur when
242
+ packages with registered layers are removed.
243
+ [wichert]
244
+
245
+ - Clarified license and copyright.
246
+ [hannosch]
247
+
248
+ - Register ourselves for the more generic ISiteRoot from CMFCore and not
249
+ IPloneSiteRoot.
250
+ [hannosch]
251
+
252
+ - Declare test dependencies in an extra.
253
+ [hannosch]
254
+
255
+ - Specify package dependencies.
256
+ [hannosch]
257
+
258
+
259
+ 1.0.0 - 2008-04-20
260
+ ------------------
261
+
262
+ - Unchanged from 1.0rc4
263
+
264
+
265
+ 1.0rc4 - 2008-04-13
266
+ -------------------
267
+
268
+ - Register the GenericSetup import and export steps using zcml. This means you
269
+ will no longer need to install this package manually.
270
+ [wichert]
271
+
272
+
273
+ 1.0rc3 - 2008-03-09
274
+ -------------------
275
+
276
+ - Include README.txt and HISTORY.txt in the package's long description.
277
+ [wichert]
278
+
279
+ - Add metadata.xml to the GenericSetup profile. This fixes a deprecation
280
+ warning for Plone 3.1 and later.
281
+ [wichert]
282
+
283
+
284
+ 1.0b1 - 2007-09-23
285
+ ------------------
286
+
287
+ - Initial package structure.
288
+ [zopeskel]
@@ -0,0 +1 @@
1
+ __import__("pkg_resources").declare_namespace(__name__)
@@ -11,20 +11,22 @@ Before the product is installed, we cannot view this:
11
11
  >>> IMyProductLayer in utils.registered_layers()
12
12
  False
13
13
 
14
- >>> from plone.testing import z2
15
-
16
- >>> from plone.testing.z2 import Browser
14
+ >>> from plone.testing.zope import Browser
17
15
  >>> browser = Browser(layer['app'])
16
+ >>> browser.handleErrors = False
17
+ >>> browser.raiseHttpErrors = False
18
+ >>> browser.open(layer['portal'].absolute_url())
18
19
  >>> browser.open(layer['portal'].absolute_url() + '/@@layer-test-view')
19
20
  Traceback (most recent call last):
20
21
  ...
21
- urllib.error.HTTPError: HTTP Error 404: Not Found
22
+ zExceptions.NotFound: http://nohost/plone/@@layer-test-view
22
23
 
23
24
  We can view a view registered for the default layer, though:
24
25
 
25
26
  >>> browser.open(layer['portal'].absolute_url() + '/@@standard-test-view')
26
27
  >>> print(browser.contents)
27
28
  A standard view
29
+ <BLANKLINE>
28
30
 
29
31
  However, if we install the product the interface is registered in the local
30
32
  site manager. Here we use the utility method directly, though we could also
@@ -61,7 +63,7 @@ It is also possible to uninstall a layer:
61
63
  >>> browser.open(layer['portal'].absolute_url() + '/@@layer-test-view')
62
64
  Traceback (most recent call last):
63
65
  ...
64
- urllib.error.HTTPError: HTTP Error 404: Not Found
66
+ zExceptions.NotFound: http://nohost/plone/@@layer-test-view
65
67
 
66
68
  GenericSetup support
67
69
  --------------------
@@ -148,7 +150,7 @@ as expected:
148
150
  >>> browser.open(layer['portal'].absolute_url() + '/@@layer-test-view')
149
151
  Traceback (most recent call last):
150
152
  ...
151
- urllib.error.HTTPError: HTTP Error 404: Not Found
153
+ zExceptions.NotFound: http://nohost/plone/@@layer-test-view
152
154
 
153
155
  >>> browser.open(layer['portal'].absolute_url() + '/@@standard-test-view')
154
156
  >>> print(browser.contents)
@@ -0,0 +1,34 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
4
+ i18n_domain="plone.browserlayer"
5
+ >
6
+
7
+ <genericsetup:importStep
8
+ name="browserlayer"
9
+ title="Package browser layers"
10
+ description="Enables use of skin layers for installed products."
11
+ handler="plone.browserlayer.exportimport.importLayers"
12
+ >
13
+ <depends name="componentregistry" />
14
+ </genericsetup:importStep>
15
+
16
+ <genericsetup:exportStep
17
+ name="browserlayer"
18
+ title="Package browser layers"
19
+ description="Export package browser layers"
20
+ handler="plone.browserlayer.exportimport.exportLayers"
21
+ />
22
+
23
+ <subscriber
24
+ for="Products.CMFCore.interfaces.ISiteRoot
25
+ zope.traversing.interfaces.IBeforeTraverseEvent"
26
+ handler=".layer.mark_layer"
27
+ />
28
+
29
+ <adapter
30
+ factory=".exportimport.BrowserLayerXMLAdapter"
31
+ name="plone.browserlayer"
32
+ />
33
+
34
+ </configure>
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  from plone.browserlayer.interfaces import ILocalBrowserLayerType
3
2
  from plone.browserlayer.utils import register_layer
4
3
  from plone.browserlayer.utils import unregister_layer
@@ -15,36 +14,35 @@ from zope.interface.interfaces import IComponentRegistry
15
14
 
16
15
 
17
16
  def dummyGetId():
18
- return ''
17
+ return ""
19
18
 
20
19
 
21
20
  @implementer(IBody)
22
21
  @adapter(IComponentRegistry, ISetupEnviron)
23
22
  class BrowserLayerXMLAdapter(XMLAdapterBase):
24
- """Im- and exporter for local browser layers
25
- """
23
+ """Im- and exporter for local browser layers"""
26
24
 
27
- name = 'browserlayer'
28
- _LOGGER_ID = 'browserlayer'
25
+ name = "browserlayer"
26
+ _LOGGER_ID = "browserlayer"
29
27
 
30
28
  def _exportNode(self):
31
29
  # hack around an issue where _getObjectNode expects to have the context
32
30
  # a meta_type and a getId method, which isn't the case for a component
33
31
  # registry
34
32
  if IComponentRegistry.providedBy(self.context):
35
- self.context.meta_type = 'ComponentRegistry'
33
+ self.context.meta_type = "ComponentRegistry"
36
34
  self.context.getId = dummyGetId
37
- node = self._getObjectNode('layers')
35
+ node = self._getObjectNode("layers")
38
36
  if IComponentRegistry.providedBy(self.context):
39
- del(self.context.meta_type)
40
- del(self.context.getId)
37
+ del self.context.meta_type
38
+ del self.context.getId
41
39
  node.appendChild(self._extractLayers())
42
- self._logger.info('Browser layers exported')
40
+ self._logger.info("Browser layers exported")
43
41
  return node
44
42
 
45
43
  def _importNode(self, node):
46
44
  self._initProvider(node)
47
- self._logger.info('Browser layers imported')
45
+ self._logger.info("Browser layers imported")
48
46
 
49
47
  def _initProvider(self, node):
50
48
  if self.environ.shouldPurge():
@@ -52,54 +50,58 @@ class BrowserLayerXMLAdapter(XMLAdapterBase):
52
50
  self._initLayers(node)
53
51
 
54
52
  def _purgeLayers(self):
55
- registeredLayers = [r.name for r in self.context.registeredUtilities()
56
- if r.provided == ILocalBrowserLayerType]
53
+ registeredLayers = [
54
+ r.name
55
+ for r in self.context.registeredUtilities()
56
+ if r.provided == ILocalBrowserLayerType
57
+ ]
57
58
  for name in registeredLayers:
58
59
  unregister_layer(name, site_manager=self.context)
59
60
 
60
61
  def _initLayers(self, node):
61
62
  for child in node.childNodes:
62
- if child.nodeName.lower() == 'layer':
63
- name = child.getAttribute('name')
64
- if child.getAttribute('remove'):
63
+ if child.nodeName.lower() == "layer":
64
+ name = child.getAttribute("name")
65
+ if child.getAttribute("remove"):
65
66
  try:
66
67
  unregister_layer(name, site_manager=self.context)
67
68
  except KeyError as e:
68
69
  self._logger.info(e)
69
70
  continue
70
- interface = _resolveDottedName(child.getAttribute('interface'))
71
+ interface = _resolveDottedName(child.getAttribute("interface"))
71
72
  register_layer(interface, name, site_manager=self.context)
72
73
 
73
74
  def _extractLayers(self):
74
75
  fragment = self._doc.createDocumentFragment()
75
76
 
76
- registrations = [r for r in self.context.registeredUtilities()
77
- if r.provided == ILocalBrowserLayerType]
77
+ registrations = [
78
+ r
79
+ for r in self.context.registeredUtilities()
80
+ if r.provided == ILocalBrowserLayerType
81
+ ]
78
82
 
79
83
  registrations.sort()
80
84
 
81
85
  for r in registrations:
82
- child = self._doc.createElement('layer')
83
- child.setAttribute('name', r.name)
84
- child.setAttribute('interface', _getDottedName(r.component))
86
+ child = self._doc.createElement("layer")
87
+ child.setAttribute("name", r.name)
88
+ child.setAttribute("interface", _getDottedName(r.component))
85
89
  fragment.appendChild(child)
86
90
 
87
91
  return fragment
88
92
 
89
93
 
90
94
  def importLayers(context):
91
- """Import local browser layers
92
- """
95
+ """Import local browser layers"""
93
96
  sm = getSiteManager(context.getSite())
94
97
  if sm is None or not IComponentRegistry.providedBy(sm):
95
- logger = context.getLogger('browserlayer')
98
+ logger = context.getLogger("browserlayer")
96
99
  logger.info("Can not register components - no site manager found.")
97
100
  return
98
101
 
99
- importer = queryMultiAdapter((sm, context), IBody,
100
- name=u'plone.browserlayer')
102
+ importer = queryMultiAdapter((sm, context), IBody, name="plone.browserlayer")
101
103
  if importer is not None:
102
- filename = '%s%s' % (importer.name, importer.suffix)
104
+ filename = f"{importer.name}{importer.suffix}"
103
105
  body = context.readDataFile(filename)
104
106
  if body is not None:
105
107
  importer.filename = filename # for error reporting
@@ -107,18 +109,16 @@ def importLayers(context):
107
109
 
108
110
 
109
111
  def exportLayers(context):
110
- """Export local browser layers
111
- """
112
+ """Export local browser layers"""
112
113
  sm = getSiteManager(context.getSite())
113
114
  if sm is None or not IComponentRegistry.providedBy(sm):
114
- logger = context.getLogger('browserlayer')
115
+ logger = context.getLogger("browserlayer")
115
116
  logger.info("Can not register components - no site manager found.")
116
117
  return
117
118
 
118
- exporter = queryMultiAdapter((sm, context), IBody,
119
- name=u'plone.browserlayer')
119
+ exporter = queryMultiAdapter((sm, context), IBody, name="plone.browserlayer")
120
120
  if exporter is not None:
121
- filename = '%s%s' % (exporter.name, exporter.suffix)
121
+ filename = f"{exporter.name}{exporter.suffix}"
122
122
  body = exporter.body
123
123
  if body is not None:
124
124
  context.writeDataFile(filename, body, exporter.mime_type)
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
1
  from zope.interface import Interface
3
2
 
4
3
 
5
4
  class ILocalBrowserLayerType(Interface):
6
- """Describes the type of interface an ILocalBrowserLayer is.
7
- """
5
+ """Describes the type of interface an ILocalBrowserLayer is."""
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  from plone.browserlayer.interfaces import ILocalBrowserLayerType
3
2
  from zope.component import getAllUtilitiesRegisteredFor
4
3
  from zope.interface import directlyProvidedBy
@@ -7,8 +6,7 @@ from zope.interface import Interface
7
6
 
8
7
 
9
8
  def mark_layer(site, event):
10
- """Mark the request with all installed layers.
11
- """
9
+ """Mark the request with all installed layers."""
12
10
  if getattr(event.request, "_plonebrowserlayer_", False):
13
11
  return
14
12
  event.request._plonebrowserlayer_ = True
@@ -1,14 +1,13 @@
1
- # -*- coding: utf-8 -*-
2
1
  from plone.app.testing import PloneSandboxLayer
3
2
  from plone.app.testing.layers import FunctionalTesting
4
3
 
5
4
 
6
5
  class PloneBrowserlayerLayer(PloneSandboxLayer):
7
-
8
6
  def setUpZope(self, app, configurationContext):
9
7
  import plone.browserlayer.tests
8
+
10
9
  self.debug_mode = True
11
- self.loadZCML('tests/testing.zcml', package=plone.browserlayer)
10
+ self.loadZCML("tests/testing.zcml", package=plone.browserlayer)
12
11
  self.loadZCML(package=plone.browserlayer)
13
12
  self.debug_mode = False
14
13
 
@@ -16,6 +15,5 @@ class PloneBrowserlayerLayer(PloneSandboxLayer):
16
15
  PLONEBROWSERLAYER_FIXTURE = PloneBrowserlayerLayer()
17
16
 
18
17
  PLONEBROWSERLAYER_FUNCTIONAL_TESTING = FunctionalTesting(
19
- bases=(PLONEBROWSERLAYER_FIXTURE,),
20
- name="PloneBrowserlayer:Functional"
18
+ bases=(PLONEBROWSERLAYER_FIXTURE,), name="PloneBrowserlayer:Functional"
21
19
  )
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
1
  from zope.interface import Interface
3
2
 
4
3
 
5
4
  class IMyProductLayer(Interface):
6
- """A layer unique to this product.
7
- """
5
+ """A layer unique to this product."""
@@ -0,0 +1,3 @@
1
+ <tal:block define="
2
+ dummy python:request.response.setHeader('Content-Type', 'text/plain');
3
+ " />A local view
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <layers>
3
+ <layer interface="plone.browserlayer.tests.interfaces.IMyProductLayer"
4
+ name="plone.browserlayer.tests"
5
+ />
6
+ </layers>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <layers>
3
+ <layer name="plone.browserlayer.tests"
4
+ remove="true"
5
+ />
6
+ <!-- remove not existing should not doing more than a log -->
7
+ <layer name="plone.browserlayer.tests.notexisting"
8
+ remove="true"
9
+ />
10
+ </layers>
@@ -0,0 +1,3 @@
1
+ <tal:block define="
2
+ dummy python:request.response.setHeader('Content-Type', 'text/plain');
3
+ " />A standard view
@@ -0,0 +1,24 @@
1
+ from plone.browserlayer.testing import PLONEBROWSERLAYER_FUNCTIONAL_TESTING
2
+ from plone.testing import layered
3
+
4
+ import doctest
5
+ import unittest
6
+
7
+
8
+ def test_suite():
9
+ return unittest.TestSuite(
10
+ [
11
+ layered(
12
+ doctest.DocFileSuite(
13
+ "README.rst",
14
+ package="plone.browserlayer",
15
+ optionflags=(
16
+ doctest.ELLIPSIS
17
+ | doctest.REPORT_ONLY_FIRST_FAILURE
18
+ | doctest.NORMALIZE_WHITESPACE
19
+ ),
20
+ ),
21
+ layer=PLONEBROWSERLAYER_FUNCTIONAL_TESTING,
22
+ )
23
+ ]
24
+ )