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.
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/CHANGES.rst +27 -1
- plone.browserlayer-3.0.1/PKG-INFO +288 -0
- plone.browserlayer-3.0.1/plone/__init__.py +1 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/README.rst +8 -6
- plone.browserlayer-3.0.1/plone/browserlayer/configure.zcml +34 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/exportimport.py +35 -35
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/interfaces.py +1 -3
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/layer.py +1 -3
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/testing.py +3 -5
- plone.browserlayer-3.0.1/plone/browserlayer/tests/__init__.py +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/tests/interfaces.py +1 -3
- plone.browserlayer-3.0.1/plone/browserlayer/tests/local.pt +3 -0
- plone.browserlayer-3.0.1/plone/browserlayer/tests/profiles/testing/browserlayer.xml +6 -0
- plone.browserlayer-3.0.1/plone/browserlayer/tests/profiles/uninstall/browserlayer.xml +10 -0
- plone.browserlayer-3.0.1/plone/browserlayer/tests/standard.pt +3 -0
- plone.browserlayer-3.0.1/plone/browserlayer/tests/test_doctest.py +24 -0
- plone.browserlayer-3.0.1/plone/browserlayer/tests/testing.zcml +39 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/utils.py +7 -9
- plone.browserlayer-3.0.1/plone.browserlayer.egg-info/PKG-INFO +288 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/requires.txt +4 -1
- plone.browserlayer-3.0.1/setup.cfg +23 -0
- plone.browserlayer-3.0.1/setup.py +54 -0
- plone.browserlayer-2.2.4/PKG-INFO +0 -265
- plone.browserlayer-2.2.4/plone/__init__.py +0 -2
- plone.browserlayer-2.2.4/plone/browserlayer/configure.zcml +0 -31
- plone.browserlayer-2.2.4/plone/browserlayer/tests/__init__.py +0 -1
- plone.browserlayer-2.2.4/plone/browserlayer/tests/local.pt +0 -1
- plone.browserlayer-2.2.4/plone/browserlayer/tests/profiles/testing/browserlayer.xml +0 -4
- plone.browserlayer-2.2.4/plone/browserlayer/tests/profiles/uninstall/browserlayer.xml +0 -7
- plone.browserlayer-2.2.4/plone/browserlayer/tests/standard.pt +0 -1
- plone.browserlayer-2.2.4/plone/browserlayer/tests/test_doctest.py +0 -32
- plone.browserlayer-2.2.4/plone/browserlayer/tests/testing.zcml +0 -38
- plone.browserlayer-2.2.4/plone.browserlayer.egg-info/PKG-INFO +0 -265
- plone.browserlayer-2.2.4/setup.cfg +0 -7
- plone.browserlayer-2.2.4/setup.py +0 -57
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/CONTRIBUTING.rst +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/MANIFEST.in +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/README.rst +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/docs/LICENSE.GPL +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/docs/LICENSE.txt +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone/browserlayer/__init__.py +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/SOURCES.txt +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/dependency_links.txt +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/namespace_packages.txt +0 -0
- {plone.browserlayer-2.2.4 → plone.browserlayer-3.0.1}/plone.browserlayer.egg-info/not-zip-safe +0 -0
- {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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
28
|
-
_LOGGER_ID =
|
|
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 =
|
|
33
|
+
self.context.meta_type = "ComponentRegistry"
|
|
36
34
|
self.context.getId = dummyGetId
|
|
37
|
-
node = self._getObjectNode(
|
|
35
|
+
node = self._getObjectNode("layers")
|
|
38
36
|
if IComponentRegistry.providedBy(self.context):
|
|
39
|
-
del
|
|
40
|
-
del
|
|
37
|
+
del self.context.meta_type
|
|
38
|
+
del self.context.getId
|
|
41
39
|
node.appendChild(self._extractLayers())
|
|
42
|
-
self._logger.info(
|
|
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(
|
|
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 = [
|
|
56
|
-
|
|
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() ==
|
|
63
|
-
name = child.getAttribute(
|
|
64
|
-
if child.getAttribute(
|
|
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(
|
|
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 = [
|
|
77
|
-
|
|
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(
|
|
83
|
-
child.setAttribute(
|
|
84
|
-
child.setAttribute(
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
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,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(
|
|
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
|
)
|
|
File without changes
|
|
@@ -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,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
|
+
)
|