Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 801 lines (612 sloc) 34.822 kb
2d93140 @mmerickel support acl as a callable
mmerickel authored
1 next release
2 ============
3
4 Features
5 --------
6
7 - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This
8 removes the ambiguity between the potential ``AttributeError`` that would
9 be raised on the ``context`` when the property was not defined and the
10 ``AttributeError`` that could be raised from any user-defined code within
11 a dynamic property. It is recommended to define a dynamic ACL as a callable
12 to avoid this ambiguity. See https://github.com/Pylons/pyramid/issues/735.
13
ff41f86 @wosc Fixes #798: Allow a protocol-relative URL to be passed to add_static_vie...
wosc authored
14 - Allow a protocol-relative URL (e.g. ``//example.com/images``) to be passed to
15 ``pyramid.config.Configurator.add_static_view``. This allows
16 externally-hosted static URLs to be generated based on the current protocol.
17
23a7c6d @mmerickel update CHANGES.txt
mmerickel authored
18 - The ``AuthTktAuthenticationPolicy`` now supports IPv6 addresses when using
19 the ``include_ip=True`` option. This is possibly incompatible with
20 alternative ``auth_tkt`` implementations, as the specification does not
21 define how to properly handle IPv6. See
22 https://github.com/Pylons/pyramid/issues/831.
23
38844f7 @mmerickel update CHANGES.txt
mmerickel authored
24 - Make it possible to use variable arguments via
25 ``pyramid.paster.get_appsettings``. This also allowed the generated
26 ``initialize_db`` script from the ``alchemy`` scaffold to grow support
27 for options in the form ``a=1 b=2`` so you can fill in
28 values in a parameterized ``.ini`` file, e.g.
29 ``initialize_myapp_db etc/development.ini a=1 b=2``.
30 See https://github.com/Pylons/pyramid/pull/911
31
fab8454 @mcdonc add changelog note
mcdonc authored
32 - The ``request.session.check_csrf_token()`` method and the ``check_csrf`` view
33 predicate now take into account the value of the HTTP header named
34 ``X-CSRF-Token`` (as well as the ``csrf_token`` form parameter, which they
35 always did). The header is tried when the form parameter does not exist.
36
9e1e6d3 @latteier Change log note.
latteier authored
37 Bug Fixes
38 ---------
39
d4495ef @mcdonc this is actually a bugfix
mcdonc authored
40 - Make the ``pyramid.config.assets.PackageOverrides`` object implement the API
41 for ``__loader__`` objects specified in PEP 302. Proxies to the
42 ``__loader__`` set by the importer, if present; otherwise, raises
43 ``NotImplementedError``. This makes Pyramid static view overrides work
44 properly under Python 3.3 (previously they would not). See
45 https://github.com/Pylons/pyramid/pull/1015 for more information.
46
0fdb540 @mcdonc tortured docs
mcdonc authored
47 - ``mako_templating``: added defensive workaround for non-importability of
48 ``mako`` due to upstream ``markupsafe`` dropping Python 3.2 support. Mako
49 templating will no longer work under the combination of MarkupSafe 0.17 and
50 Python 3.2 (although the combination of MarkupSafe 0.17 and Python 3.3 or any
51 supported Python 2 version will work OK).
45ef9a6 @tseaver Prevent non-3.2-compatible MarkupSafe 0.16 from breaking us.
tseaver authored
52
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
53 - View lookup will now search for valid views based on the inheritance
54 hierarchy of the context. It tries to find views based on the most
55 specific context first, and upon predicate failure, will move up the
56 inheritance chain to test views found by the super-type of the context.
57 In the past, only the most specific type containing views would be checked
58 and if no matching view could be found then a PredicateMismatch would be
59 raised. Now predicate mismatches don't hide valid views registered on
60 super-types. Here's an example that now works::
61
62 .. code-block:: python
9e1e6d3 @latteier Change log note.
latteier authored
63
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
64 class IResource(Interface):
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
65
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
66 ...
9e1e6d3 @latteier Change log note.
latteier authored
67
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
68 @view_config(context=IResource)
69 def get(context, request):
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
70
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
71 ...
9e1e6d3 @latteier Change log note.
latteier authored
72
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
73 @view_config(context=IResource, request_method='POST')
74 def post(context, request):
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
75
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
76 ...
9e1e6d3 @latteier Change log note.
latteier authored
77
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
78 @view_config(context=IResource, request_method='DELETE')
79 def delete(context, request):
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
80
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
81 ...
9e1e6d3 @latteier Change log note.
latteier authored
82
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
83 @implementor(IResource)
84 class MyResource:
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
85
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
86 ...
9e1e6d3 @latteier Change log note.
latteier authored
87
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
88 @view_config(context=MyResource, request_method='POST')
89 def override_post(context, request):
07c189d @stevepiercy Fix whitespace in CHANGES.txt to permit build.
stevepiercy authored
90
b6a4d40 @mmerickel Merge branch 'master' of latteier/pyramid into pull.786
mmerickel authored
91 ...
9e1e6d3 @latteier Change log note.
latteier authored
92
93 Previously the override_post view registration would hide the get
94 and delete views in the context of MyResource -- leading to a
95 predicate mismatch error when trying to use GET or DELETE
96 methods. Now the views are found and no predicate mismatch is
97 raised.
3ae8781 @mmerickel update changes.txt
mmerickel authored
98 See https://github.com/Pylons/pyramid/pull/786
9e1e6d3 @latteier Change log note.
latteier authored
99
ea278e1 @mmerickel update changelog
mmerickel authored
100 - Spaces and dots may now be in mako renderer template paths. This was
101 broken when support for the new makodef syntax was added in 1.4a1.
102 See https://github.com/Pylons/pyramid/issues/950
103
20c57e6 @mmerickel update changelog
mmerickel authored
104 - ``pyramid.debug_authorization=true`` will now correctly print out
105 ``Allowed`` for views registered with ``NO_PERMISSION_REQUIRED`` instead
106 of invoking the ``permits`` method of the authorization policy.
107 See https://github.com/Pylons/pyramid/issues/954
108
c35b298 @mmerickel update changes.txt
mmerickel authored
109 - Pyramid failed to install on some systems due to being packaged with
110 some test files containing higher order characters in their names. These
111 files have now been removed. See
112 https://github.com/Pylons/pyramid/issues/981
113
96ab9f2 @mcdonc prep for 1.4
mcdonc authored
114 1.4 (2012-12-18)
115 ================
758fa23 @mcdonc garden
mcdonc authored
116
117 Docs
118 ----
119
120 - Fix functional tests in the ZODB tutorial
121
e609e19 @mcdonc prep for 1.4b3
mcdonc authored
122 1.4b3 (2012-12-10)
123 ==================
124
125 - Packaging release only, no code changes. 1.4b2 was a brownbag release due to
126 missing directories in the tarball.
127
a7e0e60 @mcdonc prep for 1.4b2
mcdonc authored
128 1.4b2 (2012-12-10)
129 ==================
130
131 Docs
132 ----
133
134 - Scaffolding is now PEP-8 compliant (at least for a brief shining moment).
135
136 - Tutorial improvements.
ed14191 @mmerickel _depth argument to view_config is now relative to view_config
mmerickel authored
137
138 Backwards Incompatibilities
139 ---------------------------
140
141 - Modified the ``_depth`` argument to ``pyramid.view.view_config`` to accept
142 a value relative to the invocation of ``view_config`` itself. Thus, when it
143 was previously expecting a value of ``1`` or greater, to reflect that
144 the caller of ``view_config`` is 1 stack frame away from ``venusian.attach``,
145 this implementation detail is now hidden.
146
a078e19 @mcdonc add changenote
mcdonc authored
147 - Modified the ``_backframes`` argument to ``pyramid.util.action_method`` in a
148 similar way to the changes described to ``_depth`` above. This argument
149 remains undocumented, but might be used in the wild by some insane person.
150
1608b26 @mcdonc prep for 1.4b1
mcdonc authored
151 1.4b1 (2012-11-21)
152 ==================
0ccdc23 @mcdonc - A failure when trying to locate the attribute ``__text__`` on route an...
mcdonc authored
153
71cd93b @mcdonc - Small microspeed enhancement which anticipates that a
mcdonc authored
154 Features
155 --------
156
157 - Small microspeed enhancement which anticipates that a
158 ``pyramid.response.Response`` object is likely to be returned from a view.
159 Some code is shortcut if the class of the object returned by a view is this
160 class. A similar microoptimization was done to
161 ``pyramid.request.Request.is_response``.
162
9132f65 @mcdonc garden
mcdonc authored
163 - Make it possible to use variable arguments on ``p*`` commands (``pserve``,
164 ``pshell``, ``pviews``, etc) in the form ``a=1 b=2`` so you can fill in
165 values in parameterized ``.ini`` file, e.g. ``pshell etc/development.ini
6ba0fc7 @mcdonc garden
mcdonc authored
166 http_port=8080``. See https://github.com/Pylons/pyramid/pull/714
9132f65 @mcdonc garden
mcdonc authored
167
f700d37 @mcdonc garden
mcdonc authored
168 - A somewhat advanced and obscure feature of Pyramid event handlers is their
169 ability to handle "multi-interface" notifications. These notifications have
170 traditionally presented multiple objects to the subscriber callable. For
171 instance, if an event was sent by code like this::
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
172
173 registry.notify(event, context)
174
175 In the past, in order to catch such an event, you were obligated to write and
176 register an event subscriber that mentioned both the event and the context in
177 its argument list::
178
179 @subscriber([SomeEvent, SomeContextType])
f700d37 @mcdonc garden
mcdonc authored
180 def asubscriber(event, context):
181 pass
182
183 In many subscriber callables registered this way, it was common for the logic
184 in the subscriber callable to completely ignore the second and following
185 arguments (e.g. ``context`` in the above example might be ignored), because
186 they usually existed as attributes of the event anyway. You could usually
a3810e7 @mcdonc garden
mcdonc authored
187 get the same value by doing ``event.context`` or similar.
f700d37 @mcdonc garden
mcdonc authored
188
189 The fact that you needed to put an extra argument which you usually ignored
190 in the subscriber callable body was only a minor annoyance until we added
a3810e7 @mcdonc garden
mcdonc authored
191 "subscriber predicates", used to narrow the set of circumstances under which
192 a subscriber will be executed, in a prior 1.4 alpha release. Once those were
193 added, the annoyance was escalated, because subscriber predicates needed to
194 accept the same argument list and arity as the subscriber callables that they
195 were configured against. So, for example, if you had these two subscriber
196 registrations in your code::
f700d37 @mcdonc garden
mcdonc authored
197
198 @subscriber([SomeEvent, SomeContextType])
199 def asubscriber(event, context):
200 pass
201
202 @subscriber(SomeOtherEvent)
203 def asubscriber(event):
204 pass
205
206 And you wanted to use a subscriber predicate::
207
208 @subscriber([SomeEvent, SomeContextType], mypredicate=True)
a3810e7 @mcdonc garden
mcdonc authored
209 def asubscriber1(event, context):
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
210 pass
211
f700d37 @mcdonc garden
mcdonc authored
212 @subscriber(SomeOtherEvent, mypredicate=True)
a3810e7 @mcdonc garden
mcdonc authored
213 def asubscriber2(event):
f700d37 @mcdonc garden
mcdonc authored
214 pass
215
a3810e7 @mcdonc garden
mcdonc authored
216 If an existing ``mypredicate`` subscriber predicate had been written in such
217 a way that it accepted only one argument in its ``__call__``, you could not
218 use it against a subscription which named more than one interface in its
219 subscriber interface list. Similarly, if you had written a subscriber
220 predicate that accepted two arguments, you couldn't use it against a
221 registration that named only a single interface type.
222
223 For example, if you created this predicate::
f700d37 @mcdonc garden
mcdonc authored
224
225 class MyPredicate(object):
226 # portions elided...
227 def __call__(self, event):
228 return self.val == event.context.foo
229
a3810e7 @mcdonc garden
mcdonc authored
230 It would not work against a multi-interface-registered subscription, so in
231 the above example, when you attempted to use it against ``asubscriber1``, it
232 would fail at runtime with a TypeError, claiming something was attempting to
233 call it with too many arguments.
f700d37 @mcdonc garden
mcdonc authored
234
a3810e7 @mcdonc garden
mcdonc authored
235 To hack around this limitation, you were obligated to design the
236 ``mypredicate`` predicate to expect to receive in its ``__call__`` either a
237 single ``event`` argument (a SomeOtherEvent object) *or* a pair of arguments
238 (a SomeEvent object and a SomeContextType object), presumably by doing
239 something like this::
f700d37 @mcdonc garden
mcdonc authored
240
241 class MyPredicate(object):
242 # portions elided...
243 def __call__(self, event, context=None):
244 return self.val == event.context.foo
245
246 This was confusing and bad.
247
248 In order to allow people to ignore unused arguments to subscriber callables
249 and to normalize the relationship between event subscribers and subscriber
250 predicates, we now allow both subscribers and subscriber predicates to accept
251 only a single ``event`` argument even if they've been subscribed for
252 notifications that involve multiple interfaces. Subscribers and subscriber
253 predicates that accept only one argument will receive the first object passed
254 to ``notify``; this is typically (but not always) the event object. The
255 other objects involved in the subscription lookup will be discarded. You can
256 now write an event subscriber that accepts only ``event`` even if it
257 subscribes to multiple interfaces::
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
258
259 @subscriber([SomeEvent, SomeContextType])
f700d37 @mcdonc garden
mcdonc authored
260 def asubscriber(event):
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
261 # this will work!
262
f700d37 @mcdonc garden
mcdonc authored
263 This prevents you from needing to match the subscriber callable parameters to
264 the subscription type unnecessarily, especially when you don't make use of
265 any argument in your subscribers except for the event object itself.
266
267 Note, however, that if the event object is not the first
268 object in the call to ``notify``, you'll run into trouble. For example, if
269 notify is called with the context argument first::
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
270
271 registry.notify(context, event)
272
f700d37 @mcdonc garden
mcdonc authored
273 You won't be able to take advantage of the event-only feature. It will
274 "work", but the object received by your event handler won't be the event
275 object, it will be the context object, which won't be very useful::
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
276
277 @subscriber([SomeContextType, SomeEvent])
f700d37 @mcdonc garden
mcdonc authored
278 def asubscriber(event):
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
279 # bzzt! you'll be getting the context here as ``event``, and it'll
280 # be useless
281
282 Existing multiple-argument subscribers continue to work without issue, so you
283 should continue use those if your system notifies using multiple interfaces
284 and the first interface is not the event interface. For example::
285
286 @subscriber([SomeContextType, SomeEvent])
f700d37 @mcdonc garden
mcdonc authored
287 def asubscriber(context, event):
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
288 # this will still work!
289
290 The event-only feature makes it possible to use a subscriber predicate that
291 accepts only a request argument within both multiple-interface subscriber
f700d37 @mcdonc garden
mcdonc authored
292 registrations and single-interface subscriber registrations. You needn't
293 make slightly different variations of predicates depending on the
294 subscription type arguments. Instead, just write all your subscriber
295 predicates so they only accept ``event`` in their ``__call__`` and they'll be
296 useful across all registrations for subscriptions that use an event as their
297 first argument, even ones which accept more than just ``event``.
298
299 However, the same caveat applies to predicates as to subscriber callables: if
300 you're subscribing to a multi-interface event, and the first interface is not
301 the event interface, the predicate won't work properly. In such a case,
302 you'll need to match the predicate ``__call__`` argument ordering and
303 composition to the ordering of the interfaces. For example, if the
304 registration for the subscription uses ``[SomeContext, SomeEvent]``, you'll
305 need to reflect that in the ordering of the parameters of the predicate's
306 ``__call__`` method::
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
307
308 def __call__(self, context, event):
309 return event.request.path.startswith(self.val)
310
f700d37 @mcdonc garden
mcdonc authored
311 tl;dr: 1) When using multi-interface subscriptions, always use the event type
312 as the first subscription registration argument and 2) When 1 is true, use
313 only ``event`` in your subscriber and subscriber predicate parameter lists,
314 no matter how many interfaces the subscriber is notified with. This
315 combination will result in the maximum amount of reusability of subscriber
316 predicates and the least amount of thought on your part. Drink responsibly.
28fc3d5 @mcdonc - In order to normalize the relationship between event subscribers and
mcdonc authored
317
0ccdc23 @mcdonc - A failure when trying to locate the attribute ``__text__`` on route an...
mcdonc authored
318 Bug Fixes
319 ---------
320
321 - A failure when trying to locate the attribute ``__text__`` on route and view
322 predicates existed when the ``debug_routematch`` setting was true or when the
323 ``pviews`` command was used. See https://github.com/Pylons/pyramid/pull/727
324
b5e4443 @mcdonc garden
mcdonc authored
325 Documentation
326 -------------
327
328 - Sync up tutorial source files with the files that are rendered by the
329 scaffold that each uses.
330
9480686 @mcdonc prep for release
mcdonc authored
331 1.4a4 (2012-11-14)
332 ==================
c7337ba @mcdonc - Added an ``effective_principals`` route and view predicate.
mcdonc authored
333
334 Features
335 --------
336
19b8207 @mmerickel merged SHA512AuthTktAuthenticationPolicy into AuthTktAuthenticationPolic...
mmerickel authored
337 - ``pyramid.authentication.AuthTktAuthenticationPolicy`` has been updated to
338 support newer hashing algorithms such as ``sha512``. Existing applications
39ef68d @mcdonc rearrange deck chairs
mcdonc authored
339 should consider updating if possible for improved security over the default
340 md5 hashing.
19b8207 @mmerickel merged SHA512AuthTktAuthenticationPolicy into AuthTktAuthenticationPolic...
mmerickel authored
341
c7337ba @mcdonc - Added an ``effective_principals`` route and view predicate.
mcdonc authored
342 - Added an ``effective_principals`` route and view predicate.
343
07c9ee0 @mcdonc - Do not allow the userid returned from the ``authenticated_userid`` or ...
mcdonc authored
344 - Do not allow the userid returned from the ``authenticated_userid`` or the
345 userid that is one of the list of principals returned by
346 ``effective_principals`` to be either of the strings ``system.Everyone`` or
347 ``system.Authenticated`` when any of the built-in authorization policies that
348 live in ``pyramid.authentication`` are in use. These two strings are
349 reserved for internal usage by Pyramid and they will not be accepted as valid
350 userids.
351
ca46568 @mmerickel garden
mmerickel authored
352 - Slightly better debug logging from
353 ``pyramid.authentication.RepozeWho1AuthenticationPolicy``.
47146eb @mcdonc garden
mcdonc authored
354
39ef68d @mcdonc rearrange deck chairs
mcdonc authored
355 - ``pyramid.security.view_execution_permitted`` used to return ``True`` if no
926fb68 @mcdonc resolve merge conflict
mcdonc authored
356 view could be found. It now raises a ``TypeError`` exception in that case, as
357 it doesn't make sense to assert that a nonexistent view is
358 execution-permitted. See https://github.com/Pylons/pyramid/issues/299.
6099144 @mmerickel updated changes
mmerickel authored
359
a8d71ca @mcdonc - Allow a ``_depth`` argument to ``pyramid.view.view_config``, which wil...
mcdonc authored
360 - Allow a ``_depth`` argument to ``pyramid.view.view_config``, which will
361 permit limited composition reuse of the decorator by other software that
362 wants to provide custom decorators that are much like view_config.
363
1701243 @mmerickel update changelog, close #627
mmerickel authored
364 - Allow an iterable of decorators to be passed to
365 ``pyramid.config.Configurator.add_view``. This allows views to be wrapped
366 by more than one decorator without requiring combining the decorators
367 yourself.
368
a007a4f @mcdonc - In the past if a renderer returned ``None``, the body of the resulting
mcdonc authored
369 Bug Fixes
370 ---------
371
372 - In the past if a renderer returned ``None``, the body of the resulting
373 response would be set explicitly to the empty string. Instead, now, the body
374 is left unchanged, which allows the renderer to set a body itself by using
375 e.g. ``request.response.body = b'foo'``. The body set by the renderer will
376 be unmolested on the way out. See
377 https://github.com/Pylons/pyramid/issues/709
378
34d4cd0 @mcdonc - In uncommon cases, the ``pyramid_excview_tween_factory`` might have
mcdonc authored
379 - In uncommon cases, the ``pyramid_excview_tween_factory`` might have
380 inadvertently raised a ``KeyError`` looking for ``request_iface`` as an
381 attribute of the request. It no longer fails in this case. See
382 https://github.com/Pylons/pyramid/issues/700
383
267dbd2 @mcdonc - Be more tolerant of potential error conditions in ``match_param`` and
mcdonc authored
384 - Be more tolerant of potential error conditions in ``match_param`` and
385 ``physical_path`` predicate implementations; instead of raising an exception,
386 return False.
387
39ef68d @mcdonc rearrange deck chairs
mcdonc authored
388 - ``pyramid.view.render_view`` was not functioning properly under Python 3.x
389 due to a byte/unicode discrepancy. See
cd8ac80 @tshepang update some links and fix others
tshepang authored
390 https://github.com/Pylons/pyramid/issues/721
f89cfcd @mmerickel updated changelog
mmerickel authored
391
ca3df80 @mmerickel emit a warning if a user is using the default hashalg to AuthTkt
mmerickel authored
392 Deprecations
393 ------------
394
39ef68d @mcdonc rearrange deck chairs
mcdonc authored
395 - ``pyramid.authentication.AuthTktAuthenticationPolicy`` will emit a warning if
396 an application is using the policy without explicitly passing a ``hashalg``
397 argument. This is because the default is "md5" which is considered
398 theoretically subject to collision attacks. If you really want "md5" then you
399 must specify it explicitly to get rid of the warning.
400
401 Documentation
402 -------------
403
404 - All of the tutorials that use
405 ``pyramid.authentication.AuthTktAuthenticationPolicy`` now explicitly pass
406 ``sha512`` as a ``hashalg`` argument.
407
ca3df80 @mmerickel emit a warning if a user is using the default hashalg to AuthTkt
mmerickel authored
408
66fe1d0 @mcdonc - Move ``TopologicalSorter`` from ``pyramid.config.util`` to ``pyramid.u...
mcdonc authored
409 Internals
410 ---------
411
412 - Move ``TopologicalSorter`` from ``pyramid.config.util`` to ``pyramid.util``,
413 move ``CyclicDependencyError`` from ``pyramid.config.util`` to
414 ``pyramid.exceptions``, rename ``Singleton`` to ``Sentinel`` and move from
ca46568 @mmerickel garden
mmerickel authored
415 ``pyramid.config.util`` to ``pyramid.util``; this is in an effort to
0487545 @mcdonc fix docs, upgrade tutorials, add change note, deprecate using zope.depre...
mcdonc authored
416 move that stuff that may be an API one day out of ``pyramid.config.util``,
66fe1d0 @mcdonc - Move ``TopologicalSorter`` from ``pyramid.config.util`` to ``pyramid.u...
mcdonc authored
417 because that package should never be imported from non-Pyramid code.
418 TopologicalSorter is still not an API, but may become one.
419
39ef68d @mcdonc rearrange deck chairs
mcdonc authored
420 - Get rid of shady monkeypatching of ``pyramid.request.Request`` and
421 ``pyramid.response.Response`` done within the ``__init__.py`` of Pyramid.
422 Webob no longer relies on this being done. Instead, the ResponseClass
423 attribute of the Pyramid Request class is assigned to the Pyramid response
424 class; that's enough to satisfy WebOb and behave as it did before with the
425 monkeypatching.
426
4a6cca6 @mcdonc prep for 1.4a3
mcdonc authored
427 1.4a3 (2012-10-26)
428 ==================
d6fb001 @mcdonc - 1.4a ``pyramid.scripting.prepare`` behaved differently than 1.3 series
mcdonc authored
429
430 Bug Fixes
431 ---------
432
06a904f @mcdonc add docs and changelog note
mcdonc authored
433 - The match_param predicate's text method was fixed to sort its values.
434 Part of https://github.com/Pylons/pyramid/pull/705
435
d6fb001 @mcdonc - 1.4a ``pyramid.scripting.prepare`` behaved differently than 1.3 series
mcdonc authored
436 - 1.4a ``pyramid.scripting.prepare`` behaved differently than 1.3 series
437 function of same name. In particular, if passed a request, it would not
438 set the ``registry`` attribute of the request like 1.3 did. A symptom
439 would be that passing a request to ``pyramid.paster.bootstrap`` (which uses
440 the function) that did not have a ``registry`` attribute could assume that
441 the registry would be attached to the request by Pyramid. This assumption
442 could be made in 1.3, but not in 1.4. The assumption can now be made in
443 1.4 too (a registry is attached to a request passed to bootstrap or
444 prepare).
445
66d277a @mcdonc garden
mcdonc authored
446 - When registering a view configuration that named a Chameleon ZPT renderer
447 with a macro name in it (e.g. ``renderer='some/template#somemacro.pt``) as
043ccdd @tshepang eliminate other repeated words
tshepang authored
448 well as a view configuration without a macro name in it that pointed to the
9937a4e @chrisrossi Fix rst syntax error which prevented Sphinx docs from building.
chrisrossi authored
449 same template (e.g. ``renderer='some/template.pt'``), internal caching could
66d277a @mcdonc garden
mcdonc authored
450 confuse the two, and your code might have rendered one instead of the
451 other.
452
1273d56 @mcdonc - The Configurator ``testing_securitypolicy`` method now returns the pol...
mcdonc authored
453 Features
454 --------
455
c25a8fd @mcdonc - New ``physical_path`` view predicate. If specified, this value should...
mcdonc authored
456 - Allow multiple values to be specified to the ``request_param`` view/route
457 predicate as a sequence. Previously only a single string value was allowed.
458 See https://github.com/Pylons/pyramid/pull/705
459
460 - Comments with references to documentation sections placed in scaffold
461 ``.ini`` files.
462
463 - Added an HTTP Basic authentication policy
464 at ``pyramid.authentication.BasicAuthAuthenticationPolicy``.
465
1273d56 @mcdonc - The Configurator ``testing_securitypolicy`` method now returns the pol...
mcdonc authored
466 - The Configurator ``testing_securitypolicy`` method now returns the policy
467 object it creates.
468
469 - The Configurator ``testing_securitypolicy`` method accepts two new
470 arguments: ``remember_result`` and ``forget_result``. If supplied, these
471 values influence the result of the policy's ``remember`` and ``forget``
472 methods, respectively.
473
474 - The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a
475 ``forgotten`` value on the policy (the value ``True``) when its ``forget``
476 method is called.
477
478 - The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a
479 ``remembered`` value on the policy, which is the value of the ``principal``
480 argument it's called with when its ``remember`` method is called.
481
c25a8fd @mcdonc - New ``physical_path`` view predicate. If specified, this value should...
mcdonc authored
482 - New ``physical_path`` view predicate. If specified, this value should be a
483 string or a tuple representing the physical traversal path of the context
484 found via traversal for this predicate to match as true. For example:
485 ``physical_path='/'`` or ``physical_path='/a/b/c'`` or ``physical_path=('',
486 'a', 'b', 'c')``. This is not a path prefix match or a regex, it's a
487 whole-path match. It's useful when you want to always potentially show a
488 view when some object is traversed to, but you can't be sure about what kind
489 of object it will be, so you can't use the ``context`` predicate. The
490 individual path elements inbetween slash characters or in tuple elements
491 should be the Unicode representation of the name of the resource and should
492 not be encoded in any way.
493
072cbf7 @mcdonc prep for 1.4a2
mcdonc authored
494 1.4a2 (2012-09-27)
495 ==================
68c25d3 @mcdonc garden
mcdonc authored
496
d27bc79 @mcdonc garden
mcdonc authored
497 Bug Fixes
498 ---------
499
4388d31 @mcdonc mirror john's change for chameleon, better changelog message
mcdonc authored
500 - When trying to determine Mako defnames and Chameleon macro names in asset
501 specifications, take into account that the filename may have a hyphen in
502 it. See https://github.com/Pylons/pyramid/pull/692
d27bc79 @mcdonc garden
mcdonc authored
503
68c25d3 @mcdonc garden
mcdonc authored
504 Features
505 --------
506
507 - A new ``pyramid.session.check_csrf_token`` convenience function was added.
508
80cd0b1 @mcdonc garden
mcdonc authored
509 - A ``check_csrf`` view predicate was added. For example, you can now do
510 ``config.add_view(someview, check_csrf=True)``. When the predicate is
511 checked, if the ``csrf_token`` value in ``request.params`` matches the CSRF
512 token in the request's session, the view will be permitted to execute.
513 Otherwise, it will not be permitted to execute.
68c25d3 @mcdonc garden
mcdonc authored
514
098599b @mcdonc - Add ``Base.metadata.bind = engine`` to alchemy template, so that table...
mcdonc authored
515 - Add ``Base.metadata.bind = engine`` to alchemy template, so that tables
516 defined imperatively will work.
517
518 Documentation
519 -------------
520
521 - update wiki2 SQLA tutorial with the changes required after inserting
522 ``Base.metadata.bind = engine`` into the alchemy scaffold.
523
ce1e86c @mcdonc prep for 1.4a1
mcdonc authored
524 1.4a1 (2012-09-16)
525 ==================
f6bd88e @mcdonc trivial change to poke jenkins (im in on an untrusted network and cant u...
mcdonc authored
526
a39dd2f @mcdonc - Add ``REMOTE_ADDR`` to the ``prequest`` WSGI environ dict for benefit ...
mcdonc authored
527 Bug Fixes
528 ---------
529
1794b4b @mcdonc note that this is a forward port
mcdonc authored
530 - Forward port from 1.3 branch: When no authentication policy was configured,
531 a call to ``pyramid.security.effective_principals`` would unconditionally
532 return the empty list. This was incorrect, it should have unconditionally
533 returned ``[Everyone]``, and now does.
8782def @mcdonc - When no authentication policy was configured, a call to
mcdonc authored
534
3074e78 @mcdonc garden
mcdonc authored
535 - Explicit url dispatch regexes can now contain colons.
536 https://github.com/Pylons/pyramid/issues/629
537
e652518 @mcdonc - On at least one 64-bit Ubuntu system under Python 3.2, using the
mcdonc authored
538 - On at least one 64-bit Ubuntu system under Python 3.2, using the
539 ``view_config`` decorator caused a ``RuntimeError: dictionary changed size
540 during iteration`` exception. It no longer does. See
541 https://github.com/Pylons/pyramid/issues/635 for more information.
542
8b26752 @blaflamme added entry to changes.txt for mako fix
blaflamme authored
543 - In Mako Templates lookup, check if the uri is already adjusted and bring
544 it back to an asset spec. Normally occurs with inherited templates or
545 included components.
546 https://github.com/Pylons/pyramid/issues/606
547 https://github.com/Pylons/pyramid/issues/607
548
7853bc0 @blaflamme garden
blaflamme authored
549 - In Mako Templates lookup, check for absolute uri (using mako directories)
550 when mixing up inheritance with asset specs.
551 https://github.com/Pylons/pyramid/issues/662
552
75a8ff4 @mmerickel updated CHANGES with accept-header bug fix
mmerickel authored
553 - HTTP Accept headers were not being normalized causing potentially
554 conflicting view registrations to go unnoticed. Two views that only
555 differ in the case ('text/html' vs. 'text/HTML') will now raise an error.
556 https://github.com/Pylons/pyramid/pull/620
557
a9289d9 @mcdonc - Forward-port from 1.3 branch: when registering multiple views with an
mcdonc authored
558 - Forward-port from 1.3 branch: when registering multiple views with an
559 ``accept`` predicate in a Pyramid application runing under Python 3, you
560 might have received a ``TypeError: unorderable types: function() <
561 function()`` exception.
562
de797c4 @mcdonc - Coverage and docs updates for custom JSON class.
mcdonc authored
563 Features
564 --------
a39dd2f @mcdonc - Add ``REMOTE_ADDR`` to the ``prequest`` WSGI environ dict for benefit ...
mcdonc authored
565
d246597 @mcdonc reclassify bug as feature
mcdonc authored
566 - Configurator.add_directive now accepts arbitrary callables like partials or
567 objects implementing ``__call__`` which dont have ``__name__`` and
568 ``__doc__`` attributes. See https://github.com/Pylons/pyramid/issues/621
569 and https://github.com/Pylons/pyramid/pull/647.
570
95f766b @mcdonc Subscriber predicates:
mcdonc authored
571 - Third-party custom view, route, and subscriber predicates can now be added
572 for use by view authors via
573 ``pyramid.config.Configurator.add_view_predicate``,
574 ``pyramid.config.Configurator.add_route_predicate`` and
575 ``pyramid.config.Configurator.add_subscriber_predicate``. So, for example,
0196b2a @mcdonc add docs for third-party view predicates
mcdonc authored
576 doing this::
577
578 config.add_view_predicate('abc', my.package.ABCPredicate)
579
580 Might allow a view author to do this in an application that configured that
581 predicate::
582
583 @view_config(abc=1)
584
95f766b @mcdonc Subscriber predicates:
mcdonc authored
585 Similar features exist for ``add_route``, and ``add_subscriber``. See
586 "Adding A Third Party View, Route, or Subscriber Predicate" in the Hooks
587 chapter for more information.
0196b2a @mcdonc add docs for third-party view predicates
mcdonc authored
588
735abf4 @mcdonc note conflict behavior change
mcdonc authored
589 Note that changes made to support the above feature now means that only
590 actions registered using the same "order" can conflict with one another.
591 It used to be the case that actions registered at different orders could
592 potentially conflict, but to my knowledge nothing ever depended on this
593 behavior (it was a bit silly).
594
de797c4 @mcdonc - Coverage and docs updates for custom JSON class.
mcdonc authored
595 - Custom objects can be made easily JSON-serializable in Pyramid by defining
596 a ``__json__`` method on the object's class. This method should return
597 values natively serializable by ``json.dumps`` (such as ints, lists,
598 dictionaries, strings, and so forth).
077fa3a @mcdonc add change note
mcdonc authored
599
e012aa1 @mcdonc allow __json__ and custom adapters to accept request arg
mcdonc authored
600 - The JSON renderer now allows for the definition of custom type adapters to
601 convert unknown objects to JSON serializations.
602
360f251 @mcdonc - As of this release, the ``request_method`` predicate, when used, will ...
mcdonc authored
603 - As of this release, the ``request_method`` predicate, when used, will also
604 imply that ``HEAD`` is implied when you use ``GET``. For example, using
605 ``@view_config(request_method='GET')`` is equivalent to using
561a443 @mcdonc fix example
mcdonc authored
606 ``@view_config(request_method=('GET', 'HEAD'))``. Using
360f251 @mcdonc - As of this release, the ``request_method`` predicate, when used, will ...
mcdonc authored
607 ``@view_config(request_method=('GET', 'POST')`` is equivalent to using
608 ``@view_config(request_method=('GET', 'HEAD', 'POST')``. This is because
609 HEAD is a variant of GET that omits the body, and WebOb has special support
610 to return an empty body when a HEAD is used.
15c40a1 @mcdonc readme
mcdonc authored
611
023c88b @mcdonc rename set_request_method to add_request_method. closes #683
mcdonc authored
612 - ``config.add_request_method`` has been introduced to support extending
2c25342 @mmerickel docs-deprecated set_request_property
mmerickel authored
613 request objects with arbitrary callables. This method expands on the
614 previous ``config.set_request_property`` by supporting methods as well as
615 properties. This method now causes less code to be executed at
616 request construction time than ``config.set_request_property`` in
617 version 1.3.
618
619 - Don't add a ``?`` to URLs generated by ``request.resource_url`` if the
fcb2095 @mcdonc garden
mcdonc authored
620 ``query`` argument is provided but empty.
621
2c25342 @mmerickel docs-deprecated set_request_property
mmerickel authored
622 - Don't add a ``?`` to URLs generated by ``request.route_url`` if the
fcb2095 @mcdonc garden
mcdonc authored
623 ``_query`` argument is provided but empty.
988035a @mcdonc add a change note
mcdonc authored
624
625 - The static view machinery now raises (rather than returns) ``HTTPNotFound``
626 and ``HTTPMovedPermanently`` exceptions, so these can be caught by the
cec2b05 @tshepang consistency
tshepang authored
627 Not Found View (and other exception views).
ea009a6 @blaflamme added docs and changes for using defs in mako renderer
blaflamme authored
628
54d3e3e @mcdonc add a whatsnew-1.4 document
mcdonc authored
629 - The Mako renderer now supports a def name in an asset spec. When the def
8b55a68 @mcdonc garden
mcdonc authored
630 name is present in the asset spec, the system will render the template def
631 within the template and will return the result. An example asset spec is
632 ``package:path/to/template#defname.mako``. This will render the def named
54d3e3e @mcdonc add a whatsnew-1.4 document
mcdonc authored
633 ``defname`` inside the ``template.mako`` template instead of rendering the
634 entire template. The old way of returning a tuple in the form
635 ``('defname', {})`` from the view is supported for backward compatibility,
8b55a68 @mcdonc garden
mcdonc authored
636
637 - The Chameleon ZPT renderer now accepts a macro name in an asset spec. When
638 the macro name is present in the asset spec, the system will render the
639 macro listed as a ``define-macro`` and return the result instead of
640 rendering the entire template. An example asset spec:
641 ``package:path/to/template#macroname.pt``. This will render the macro
642 defined as ``macroname`` within the ``template.pt`` template instead of the
643 entire templae.
61a57ea @mcdonc - When there is a predicate mismatch exception (seen when no view matche...
mcdonc authored
644
645 - When there is a predicate mismatch exception (seen when no view matches for
646 a given request due to predicates not working), the exception now contains
647 a textual description of the predicate which didn't match.
6b180cb @mcdonc - An ``add_permission`` directive method was added to the Configurator. ...
mcdonc authored
648
649 - An ``add_permission`` directive method was added to the Configurator. This
650 directive registers a free-standing permission introspectable into the
651 Pyramid introspection system. Frameworks built atop Pyramid can thus use
08c2217 @tshepang eliminate repeated "the" words
tshepang authored
652 the ``permissions`` introspectable category data to build a
6b180cb @mcdonc - An ``add_permission`` directive method was added to the Configurator. ...
mcdonc authored
653 comprehensive list of permissions supported by a running system. Before
654 this method was added, permissions were already registered in this
655 introspectable category as a side effect of naming them in an ``add_view``
656 call, this method just makes it possible to arrange for a permission to be
657 put into the ``permissions`` introspectable category without naming it
658 along with an associated view. Here's an example of usage of
659 ``add_permission``::
660
661 config = Configurator()
662 config.add_permission('view')
2c25342 @mmerickel docs-deprecated set_request_property
mmerickel authored
663
45b6e19 @mmerickel added cookie session changes to CHANGES.txt
mmerickel authored
664 - The ``UnencryptedCookieSessionFactoryConfig`` now accepts
665 ``signed_serialize`` and ``signed_deserialize`` hooks which may be used
666 to influence how the sessions are marshalled (by default this is done
667 with HMAC+pickle).
668
28dba04 @mcdonc - ``pyramid.testing.DummyRequest`` now supports methods supplied by the
mcdonc authored
669 - ``pyramid.testing.DummyRequest`` now supports methods supplied by the
670 ``pyramid.util.InstancePropertyMixin`` class such as ``set_property``.
671
7359873 @mcdonc - Request properties and methods added via ``config.set_request_property...
mcdonc authored
672 - Request properties and methods added via ``config.set_request_property`` or
673 ``config.add_request_method`` are now available to tweens.
674
675 - Request properties and methods added via ``config.set_request_property`` or
676 ``config.add_request_method`` are now available in the request object
677 returned from ``pyramid.paster.bootstrap``.
678
dc8b49f @mcdonc garden
mcdonc authored
679 - ``request.context`` of environment request during ``bootstrap`` is now the
680 root object if a context isn't already set on a provided request.
681
07cb8f0 @mcdonc add pyramid.decorator.reify as an API. Closes #682
mcdonc authored
682 - The ``pyramid.decorator.reify`` function is now an API, and was added to
683 the API documentation.
684
97150cc @mcdonc merge jinty's testConfig code
mcdonc authored
685 - Added the ``pyramid.testing.testConfig`` context manager, which can be used
686 to generate a configurator in a test, e.g. ``with testing.testConfig(...):``.
687
64452ed @mcdonc rename subrequest to invoke_subrequest
mcdonc authored
688 - Users can now invoke a subrequest from within view code using a new
689 ``request.invoke_subrequest`` API.
37d2c22 @mcdonc docs and test
mcdonc authored
690
2c25342 @mmerickel docs-deprecated set_request_property
mmerickel authored
691 Deprecations
692 ------------
693
9cdb286 @mcdonc readd set_request_property to docs (just so when people run across it in...
mcdonc authored
694 - The ``pyramid.config.Configurator.set_request_property`` has been
695 documentation-deprecated. The method remains usable but the more
023c88b @mcdonc rename set_request_method to add_request_method. closes #683
mcdonc authored
696 featureful ``pyramid.config.Configurator.add_request_method`` should be
9cdb286 @mcdonc readd set_request_property to docs (just so when people run across it in...
mcdonc authored
697 used in its place (it has all of the same capabilities but can also extend
698 the request object with methods).
ebcdc7c @mcdonc - It is no longer possible to pass an environ dictionary directly to
mcdonc authored
699
700 Backwards Incompatibilities
701 ---------------------------
702
25d3ddf @mcdonc garden
mcdonc authored
703 - The Pyramid router no longer adds the values ``bfg.routes.route`` or
ebcdc7c @mcdonc - It is no longer possible to pass an environ dictionary directly to
mcdonc authored
704 ``bfg.routes.matchdict`` to the request's WSGI environment dictionary.
705 These values were docs-deprecated in ``repoze.bfg`` 1.0 (effectively seven
706 minor releases ago). If your code depended on these values, use
707 request.matched_route and request.matchdict instead.
708
709 - It is no longer possible to pass an environ dictionary directly to
710 ``pyramid.traversal.ResourceTreeTraverser.__call__`` (aka
711 ``ModelGraphTraverser.__call__``). Instead, you must pass a request
712 object. Passing an environment instead of a request has generated a
713 deprecation warning since Pyramid 1.1.
714
715 - Pyramid will no longer work properly if you use the
716 ``webob.request.LegacyRequest`` as a request factory. Instances of the
717 LegacyRequest class have a ``request.path_info`` which return a string.
718 This Pyramid release assumes that ``request.path_info`` will
719 unconditionally be Unicode.
720
3d42722 @mcdonc - The functions from ``pyramid.chameleon_zpt`` and ``pyramid.chameleon_t...
mcdonc authored
721 - The functions from ``pyramid.chameleon_zpt`` and ``pyramid.chameleon_text``
722 named ``get_renderer``, ``get_template``, ``render_template``, and
723 ``render_template_to_response`` have been removed. These have issued a
724 deprecation warning upon import since Pyramid 1.0. Use
725 ``pyramid.renderers.get_renderer()``,
726 ``pyramid.renderers.get_renderer().implementation()``,
727 ``pyramid.renderers.render()`` or ``pyramid.renderers.render_to_response``
728 respectively instead of these functions.
729
94a6f35 @mcdonc - The ``pyramid.configuration`` module was removed. It had been depreca...
mcdonc authored
730 - The ``pyramid.configuration`` module was removed. It had been deprecated
731 since Pyramid 1.0 and printed a deprecation warning upon its use. Use
732 ``pyramid.config`` instead.
733
b274d05 @mcdonc - The ``pyramid.paster.PyramidTemplate`` API was removed. It had been
mcdonc authored
734 - The ``pyramid.paster.PyramidTemplate`` API was removed. It had been
735 deprecated since Pyramid 1.1 and issued a warning on import. If your code
736 depended on this, adjust your code to import
737 ``pyramid.scaffolds.PyramidTemplate`` instead.
738
ef2e517 @mcdonc - The ``pyramid.settings.get_settings()`` API was removed. It had been
mcdonc authored
739 - The ``pyramid.settings.get_settings()`` API was removed. It had been
740 printing a deprecation warning since Pyramid 1.0. If your code depended on
741 this API, use ``pyramid.threadlocal.get_current_registry().settings``
742 instead or use the ``settings`` attribute of the registry available from
743 the request (``request.registry.settings``).
744
69e0aad @mcdonc - These APIs from the ``pyramid.testing`` module were removed. They hav...
mcdonc authored
745 - These APIs from the ``pyramid.testing`` module were removed. They have
746 been printing deprecation warnings since Pyramid 1.0:
747
748 * ``registerDummySecurityPolicy``, use
749 ``pyramid.config.Configurator.testing_securitypolicy`` instead.
750
751 * ``registerResources`` (aka ``registerModels``, use
752 ``pyramid.config.Configurator.testing_resources`` instead.
753
754 * ``registerEventListener``, use
755 ``pyramid.config.Configurator.testing_add_subscriber`` instead.
756
757 * ``registerTemplateRenderer`` (aka `registerDummyRenderer``), use
758 ``pyramid.config.Configurator.testing_add_template`` instead.
759
760 * ``registerView``, use ``pyramid.config.Configurator.add_view`` instead.
761
762 * ``registerUtility``, use
763 ``pyramid.config.Configurator.registry.registerUtility`` instead.
764
765 * ``registerAdapter``, use
766 ``pyramid.config.Configurator.registry.registerAdapter`` instead.
767
768 * ``registerSubscriber``, use
769 ``pyramid.config.Configurator.add_subscriber`` instead.
770
771 * ``registerRoute``, use
772 ``pyramid.config.Configurator.add_route`` instead.
773
774 * ``registerSettings``, use
775 ``pyramid.config.Configurator.add_settings`` instead.
776
64452ed @mcdonc rename subrequest to invoke_subrequest
mcdonc authored
777 - In Pyramid 1.3 and previous, the ``__call__`` method of a Response object
778 was invoked before any finished callbacks were executed. As of this
779 release, the ``__call__`` method of a Response object is invoked *after*
780 finished callbacks are executed. This is in support of the
781 ``request.invoke_subrequest`` feature.
782
b72ba1a @mcdonc add upgrading chapter, make docs render again
mcdonc authored
783 Documentation
784 -------------
785
786 - Added an "Upgrading Pyramid" chapter to the narrative documentation. It
07cb8f0 @mcdonc add pyramid.decorator.reify as an API. Closes #682
mcdonc authored
787 describes how to cope with deprecations and removals of Pyramid APIs and
788 how to show Pyramid-generated deprecation warnings while running tests and
789 while running a server.
b72ba1a @mcdonc add upgrading chapter, make docs render again
mcdonc authored
790
37d2c22 @mcdonc docs and test
mcdonc authored
791 - Added a "Invoking a Subrequest" chapter to the documentation. It describes
64452ed @mcdonc rename subrequest to invoke_subrequest
mcdonc authored
792 how to use the new ``request.invoke_subrequest`` API.
37d2c22 @mcdonc docs and test
mcdonc authored
793
ebcdc7c @mcdonc - It is no longer possible to pass an environ dictionary directly to
mcdonc authored
794 Dependencies
795 ------------
796
797 - Pyramid now requires WebOb 1.2b3+ (the prior Pyramid release only relied on
798 1.2dev+). This is to ensure that we obtain a version of WebOb that returns
799 ``request.path_info`` as text.
800
Something went wrong with that request. Please try again.