Permalink
Browse files

Merge branch 'master' of github.com:Pylons/pyramid

  • Loading branch information...
2 parents 6313e0d + 7fe736b commit acf115391088770ae434d222179fd22a693bfe46 @mcdonc mcdonc committed Feb 10, 2013
Showing with 2,076 additions and 1,273 deletions.
  1. +5 −5 BFG_HISTORY.txt
  2. +219 −2 CHANGES.txt
  3. +2 −0 CONTRIBUTORS.txt
  4. +2 −2 HACKING.txt
  5. +3 −3 TODO.txt
  6. +3 −7 docs/api/config.rst
  7. +1 −1 docs/api/paster.rst
  8. +1 −2 docs/api/path.rst
  9. +10 −13 docs/api/registry.rst
  10. +2 −4 docs/api/request.rst
  11. +23 −15 docs/conf.py
  12. +5 −5 docs/designdefense.rst
  13. +6 −7 docs/glossary.rst
  14. +7 −2 docs/index.rst
  15. +1 −1 docs/make_book
  16. +1 −1 docs/make_epub
  17. +1 −1 docs/make_pdf
  18. +1 −0 docs/narr/MyProject/myproject/__init__.py
  19. +1 −0 docs/narr/MyProject/myproject/tests.py
  20. +2 −1 docs/narr/MyProject/myproject/views.py
  21. +3 −3 docs/narr/MyProject/setup.py
  22. +2 −2 docs/narr/advconfig.rst
  23. +1 −1 docs/narr/assets.rst
  24. +3 −2 docs/narr/commandline.rst
  25. +19 −22 docs/narr/configuration.rst
  26. +4 −3 docs/narr/environment.rst
  27. +2 −4 docs/narr/extconfig.rst
  28. +1 −1 docs/narr/extending.rst
  29. +5 −5 docs/narr/firstapp.rst
  30. +9 −12 docs/narr/hooks.rst
  31. +1 −1 docs/narr/hybrid.rst
  32. +1 −1 docs/narr/i18n.rst
  33. +41 −39 docs/narr/install.rst
  34. +3 −3 docs/narr/introduction.rst
  35. +18 −1 docs/narr/introspector.rst
  36. +8 −8 docs/narr/project.rst
  37. +16 −29 docs/narr/renderers.rst
  38. +1 −1 docs/narr/sessions.rst
  39. +1 −1 docs/narr/subrequest.rst
  40. +3 −7 docs/narr/templates.rst
  41. +1 −1 docs/narr/upgrading.rst
  42. +7 −10 docs/narr/urldispatch.rst
  43. +5 −7 docs/narr/viewconfig.rst
  44. +3 −3 docs/narr/views.rst
  45. +1 −1 docs/narr/webob.rst
  46. +1 −1 docs/remake
  47. +3 −6 docs/tutorials/wiki/authorization.rst
  48. +1 −1 docs/tutorials/wiki/background.rst
  49. +23 −26 docs/tutorials/wiki/basiclayout.rst
  50. +3 −6 docs/tutorials/wiki/definingmodels.rst
  51. +1 −4 docs/tutorials/wiki/definingviews.rst
  52. +6 −6 docs/tutorials/wiki/design.rst
  53. +3 −2 docs/tutorials/wiki/index.rst
  54. +9 −93 docs/tutorials/wiki/installation.rst
  55. +24 −4 docs/tutorials/wiki/src/authorization/development.ini
  56. +14 −3 docs/tutorials/wiki/src/authorization/production.ini
  57. +4 −5 docs/tutorials/wiki/src/authorization/setup.py
  58. +2 −1 docs/tutorials/wiki/src/authorization/tutorial/__init__.py
  59. +3 −3 docs/tutorials/wiki/src/authorization/tutorial/templates/mytemplate.pt
  60. +5 −4 docs/tutorials/wiki/src/authorization/tutorial/tests.py
  61. +5 −5 docs/tutorials/wiki/src/authorization/tutorial/views.py
  62. +25 −5 docs/tutorials/wiki/src/basiclayout/development.ini
  63. +14 −3 docs/tutorials/wiki/src/basiclayout/production.ini
  64. +6 −6 docs/tutorials/wiki/src/basiclayout/setup.py
  65. +2 −0 docs/tutorials/wiki/src/basiclayout/tutorial/__init__.py
  66. +2 −0 docs/tutorials/wiki/src/basiclayout/tutorial/models.py
  67. +2 −2 docs/tutorials/wiki/src/basiclayout/tutorial/templates/mytemplate.pt
  68. +0 −1 docs/tutorials/wiki/src/basiclayout/tutorial/tests.py
  69. +2 −1 docs/tutorials/wiki/src/basiclayout/tutorial/views.py
  70. +24 −4 docs/tutorials/wiki/src/models/development.ini
  71. +14 −3 docs/tutorials/wiki/src/models/production.ini
  72. +6 −6 docs/tutorials/wiki/src/models/setup.py
  73. +3 −2 docs/tutorials/wiki/src/models/tutorial/__init__.py
  74. +3 −3 docs/tutorials/wiki/src/models/tutorial/templates/mytemplate.pt
  75. +4 −2 docs/tutorials/wiki/src/models/tutorial/views.py
  76. +24 −4 docs/tutorials/wiki/src/tests/development.ini
  77. +14 −3 docs/tutorials/wiki/src/tests/production.ini
  78. +4 −5 docs/tutorials/wiki/src/tests/setup.py
  79. +2 −1 docs/tutorials/wiki/src/tests/tutorial/__init__.py
  80. +3 −3 docs/tutorials/wiki/src/tests/tutorial/templates/mytemplate.pt
  81. +2 −1 docs/tutorials/wiki/src/tests/tutorial/tests.py
  82. +5 −5 docs/tutorials/wiki/src/tests/tutorial/views.py
  83. +25 −5 docs/tutorials/wiki/src/views/development.ini
  84. +14 −3 docs/tutorials/wiki/src/views/production.ini
  85. +4 −4 docs/tutorials/wiki/src/views/setup.py
  86. +5 −3 docs/tutorials/wiki/src/views/tutorial/__init__.py
  87. +3 −3 docs/tutorials/wiki/src/views/tutorial/templates/mytemplate.pt
  88. +14 −13 docs/tutorials/wiki/src/views/tutorial/tests.py
  89. +2 −2 docs/tutorials/wiki/src/views/tutorial/views.py
  90. +6 −8 docs/tutorials/wiki/tests.rst
  91. +15 −19 docs/tutorials/wiki2/authorization.rst
  92. +2 −3 docs/tutorials/wiki2/background.rst
  93. +27 −24 docs/tutorials/wiki2/basiclayout.rst
  94. +13 −26 docs/tutorials/wiki2/definingmodels.rst
  95. +20 −23 docs/tutorials/wiki2/definingviews.rst
  96. +1 −1 docs/tutorials/wiki2/design.rst
  97. +3 −3 docs/tutorials/wiki2/index.rst
  98. +18 −36 docs/tutorials/wiki2/installation.rst
  99. +13 −0 docs/tutorials/wiki2/src/authorization/README.txt
  100. +17 −3 docs/tutorials/wiki2/src/authorization/development.ini
  101. +5 −5 docs/tutorials/wiki2/src/authorization/setup.py
  102. +1 −1 docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
  103. +1 −0 docs/tutorials/wiki2/src/authorization/tutorial/models.py
  104. +3 −1 docs/tutorials/wiki2/src/authorization/tutorial/scripts/initializedb.py
  105. +1 −0 docs/tutorials/wiki2/src/authorization/tutorial/tests.py
  106. +13 −0 docs/tutorials/wiki2/src/basiclayout/README.txt
  107. +17 −3 docs/tutorials/wiki2/src/basiclayout/development.ini
  108. +9 −3 docs/tutorials/wiki2/src/basiclayout/production.ini
  109. +4 −5 docs/tutorials/wiki2/src/basiclayout/setup.py
  110. +1 −1 docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py
  111. +1 −1 docs/tutorials/wiki2/src/basiclayout/tutorial/models.py
  112. +3 −1 docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py
  113. +1 −1 docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.pt
  114. +1 −0 docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py
  115. +26 −2 docs/tutorials/wiki2/src/basiclayout/tutorial/views.py
  116. +13 −0 docs/tutorials/wiki2/src/models/README.txt
  117. +17 −3 docs/tutorials/wiki2/src/models/development.ini
  118. +4 −5 docs/tutorials/wiki2/src/models/setup.py
  119. +1 −1 docs/tutorials/wiki2/src/models/tutorial/__init__.py
  120. +1 −1 docs/tutorials/wiki2/src/models/tutorial/models.py
  121. +3 −1 docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py
  122. +1 −0 docs/tutorials/wiki2/src/models/tutorial/tests.py
  123. +26 −2 docs/tutorials/wiki2/src/models/tutorial/views.py
  124. +13 −0 docs/tutorials/wiki2/src/tests/README.txt
  125. +17 −3 docs/tutorials/wiki2/src/tests/development.ini
  126. +4 −4 docs/tutorials/wiki2/src/tests/setup.py
  127. +1 −1 docs/tutorials/wiki2/src/tests/tutorial/__init__.py
  128. +1 −0 docs/tutorials/wiki2/src/tests/tutorial/models.py
  129. +3 −1 docs/tutorials/wiki2/src/tests/tutorial/scripts/initializedb.py
  130. +8 −0 docs/tutorials/wiki2/src/tests/tutorial/tests.py
  131. +5 −8 docs/tutorials/wiki2/src/tests/tutorial/views.py
  132. +13 −0 docs/tutorials/wiki2/src/views/README.txt
  133. +17 −3 docs/tutorials/wiki2/src/views/development.ini
  134. +4 −5 docs/tutorials/wiki2/src/views/setup.py
  135. +1 −0 docs/tutorials/wiki2/src/views/tutorial/__init__.py
  136. +1 −1 docs/tutorials/wiki2/src/views/tutorial/models.py
  137. +3 −1 docs/tutorials/wiki2/src/views/tutorial/scripts/initializedb.py
  138. +1 −0 docs/tutorials/wiki2/src/views/tutorial/tests.py
  139. +0 −3 docs/tutorials/wiki2/tests.rst
  140. +17 −0 docs/whatsnew-1.4.rst
  141. +2 −3 pyramid/authentication.py
  142. +44 −41 pyramid/config/__init__.py
  143. +68 −26 pyramid/config/adapters.py
  144. +3 −5 pyramid/config/rendering.py
  145. +15 −15 pyramid/config/routes.py
  146. +6 −8 pyramid/config/testing.py
  147. +1 −1 pyramid/config/tweens.py
  148. +56 −2 pyramid/config/util.py
  149. +69 −104 pyramid/config/views.py
  150. +1 −1 pyramid/exceptions.py
  151. +2 −2 pyramid/httpexceptions.py
  152. +3 −3 pyramid/interfaces.py
  153. +18 −4 pyramid/paster.py
  154. +21 −23 pyramid/path.py
  155. +24 −27 pyramid/renderers.py
  156. +2 −0 pyramid/request.py
  157. +1 −1 pyramid/router.py
  158. +1 −1 pyramid/scaffolds/alchemy/+package+/__init__.py
  159. +1 −1 pyramid/scaffolds/alchemy/+package+/models.py
  160. +3 −1 pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py
  161. +1 −0 pyramid/scaffolds/alchemy/+package+/tests.py_tmpl
  162. +3 −2 pyramid/scaffolds/alchemy/+package+/views.py_tmpl
  163. +1 −2 pyramid/scaffolds/alchemy/setup.py_tmpl
  164. +1 −0 pyramid/scaffolds/starter/+package+/__init__.py
  165. +1 −0 pyramid/scaffolds/starter/+package+/tests.py_tmpl
  166. +2 −1 pyramid/scaffolds/starter/+package+/views.py_tmpl
  167. +2 −3 pyramid/scaffolds/starter/setup.py_tmpl
  168. +2 −0 pyramid/scaffolds/zodb/+package+/__init__.py
  169. +2 −0 pyramid/scaffolds/zodb/+package+/models.py
  170. +1 −0 pyramid/scaffolds/zodb/+package+/tests.py_tmpl
  171. +2 −1 pyramid/scaffolds/zodb/+package+/views.py_tmpl
  172. +5 −5 pyramid/scaffolds/zodb/setup.py_tmpl
  173. +0 −1 pyramid/scripts/__init__.py
  174. +15 −0 pyramid/scripts/common.py
  175. +4 −1 pyramid/scripts/prequest.py
  176. +4 −1 pyramid/scripts/proutes.py
  177. +24 −25 pyramid/scripts/pserve.py
  178. +3 −1 pyramid/scripts/pshell.py
  179. +2 −1 pyramid/scripts/ptweens.py
  180. +6 −3 pyramid/scripts/pviews.py
  181. +6 −6 pyramid/session.py
  182. +1 −1 pyramid/testing.py
  183. +64 −0 pyramid/tests/pkgs/eventonly/__init__.py
  184. +9 −0 pyramid/tests/test_config/test_adapters.py
  185. +186 −0 pyramid/tests/test_config/test_util.py
  186. +32 −181 pyramid/tests/test_config/test_views.py
  187. +12 −0 pyramid/tests/test_integration.py
  188. +29 −6 pyramid/tests/test_paster.py
  189. +7 −0 pyramid/tests/test_request.py
  190. +14 −3 pyramid/tests/test_router.py
  191. +13 −0 pyramid/tests/test_scripts/test_common.py
  192. +3 −1 pyramid/tests/test_scripts/test_prequest.py
  193. +22 −0 pyramid/tests/test_scripts/test_proutes.py
  194. +36 −7 pyramid/tests/test_scripts/test_pserve.py
  195. +1 −1 pyramid/tests/test_scripts/test_pviews.py
  196. +1 −1 pyramid/tests/test_view.py
  197. +1 −1 pyramid/traversal.py
  198. +3 −4 pyramid/url.py
  199. +4 −3 pyramid/util.py
  200. +22 −25 pyramid/view.py
  201. +1 −1 setup.py
View
@@ -387,7 +387,7 @@ Features
Bug Fixes
---------
-- The route pattern registered internally for a a local "static view"
+- The route pattern registered internally for a local "static view"
(either via the ``static`` ZCML directive or via the
``add_static_view`` method of the configurator) was incorrect. It
was regsistered for e.g. ``static*traverse``, while it should have
@@ -688,7 +688,7 @@ Features
A similar combining of routing and traversal is available when a
route is matched which contains a ``*traverse`` remainder marker in
its path. The ``traverse`` argument allows you to associate route
- patterns with an arbitrary traversal path without using a a
+ patterns with an arbitrary traversal path without using a
``*traverse`` remainder marker; instead you can use other match
information.
@@ -1381,7 +1381,7 @@ Internal
lookup, because the registration will always be made with a specific
request interface, but registration may not be made with a specific
context interface. In general, when creating multiadapters, you
- want to order the requires interfaces so that the the elements which
+ want to order the requires interfaces so that the elements which
are more likely to be registered using specific interfaces are
ordered before those which are less likely.
@@ -1860,7 +1860,7 @@ Backwards Incompatibilities
Bug Fixes
---------
-- The the long description of this package (as shown on PyPI) was not
+- The long description of this package (as shown on PyPI) was not
valid reStructuredText, and so was not renderable.
- Trying to use an HTTP method name string such as ``GET`` as a
@@ -2920,7 +2920,7 @@ Deprecations
- The import of ``repoze.bfg.security.Unauthorized`` is deprecated in
favor of ``repoze.bfg.exceptions.Forbidden``. The old location
still functions but emits a deprecation warning. The rename from
- ``Unauthorized`` to ``Forbidden`` brings parity to the the name of
+ ``Unauthorized`` to ``Forbidden`` brings parity to the name of
the exception and the system view it invokes when raised.
Backwards Incompatibilities
View
@@ -1,3 +1,220 @@
+1.4 (2012-12-18)
+================
+
+Docs
+----
+
+- Fix functional tests in the ZODB tutorial
+
+1.4b3 (2012-12-10)
+==================
+
+- Packaging release only, no code changes. 1.4b2 was a brownbag release due to
+ missing directories in the tarball.
+
+1.4b2 (2012-12-10)
+==================
+
+Docs
+----
+
+- Scaffolding is now PEP-8 compliant (at least for a brief shining moment).
+
+- Tutorial improvements.
+
+Backwards Incompatibilities
+---------------------------
+
+- Modified the ``_depth`` argument to ``pyramid.view.view_config`` to accept
+ a value relative to the invocation of ``view_config`` itself. Thus, when it
+ was previously expecting a value of ``1`` or greater, to reflect that
+ the caller of ``view_config`` is 1 stack frame away from ``venusian.attach``,
+ this implementation detail is now hidden.
+
+- Modified the ``_backframes`` argument to ``pyramid.util.action_method`` in a
+ similar way to the changes described to ``_depth`` above. This argument
+ remains undocumented, but might be used in the wild by some insane person.
+
+1.4b1 (2012-11-21)
+==================
+
+Features
+--------
+
+- Small microspeed enhancement which anticipates that a
+ ``pyramid.response.Response`` object is likely to be returned from a view.
+ Some code is shortcut if the class of the object returned by a view is this
+ class. A similar microoptimization was done to
+ ``pyramid.request.Request.is_response``.
+
+- Make it possible to use variable arguments on ``p*`` commands (``pserve``,
+ ``pshell``, ``pviews``, etc) in the form ``a=1 b=2`` so you can fill in
+ values in parameterized ``.ini`` file, e.g. ``pshell etc/development.ini
+ http_port=8080``. See https://github.com/Pylons/pyramid/pull/714
+
+- A somewhat advanced and obscure feature of Pyramid event handlers is their
+ ability to handle "multi-interface" notifications. These notifications have
+ traditionally presented multiple objects to the subscriber callable. For
+ instance, if an event was sent by code like this::
+
+ registry.notify(event, context)
+
+ In the past, in order to catch such an event, you were obligated to write and
+ register an event subscriber that mentioned both the event and the context in
+ its argument list::
+
+ @subscriber([SomeEvent, SomeContextType])
+ def asubscriber(event, context):
+ pass
+
+ In many subscriber callables registered this way, it was common for the logic
+ in the subscriber callable to completely ignore the second and following
+ arguments (e.g. ``context`` in the above example might be ignored), because
+ they usually existed as attributes of the event anyway. You could usually
+ get the same value by doing ``event.context`` or similar.
+
+ The fact that you needed to put an extra argument which you usually ignored
+ in the subscriber callable body was only a minor annoyance until we added
+ "subscriber predicates", used to narrow the set of circumstances under which
+ a subscriber will be executed, in a prior 1.4 alpha release. Once those were
+ added, the annoyance was escalated, because subscriber predicates needed to
+ accept the same argument list and arity as the subscriber callables that they
+ were configured against. So, for example, if you had these two subscriber
+ registrations in your code::
+
+ @subscriber([SomeEvent, SomeContextType])
+ def asubscriber(event, context):
+ pass
+
+ @subscriber(SomeOtherEvent)
+ def asubscriber(event):
+ pass
+
+ And you wanted to use a subscriber predicate::
+
+ @subscriber([SomeEvent, SomeContextType], mypredicate=True)
+ def asubscriber1(event, context):
+ pass
+
+ @subscriber(SomeOtherEvent, mypredicate=True)
+ def asubscriber2(event):
+ pass
+
+ If an existing ``mypredicate`` subscriber predicate had been written in such
+ a way that it accepted only one argument in its ``__call__``, you could not
+ use it against a subscription which named more than one interface in its
+ subscriber interface list. Similarly, if you had written a subscriber
+ predicate that accepted two arguments, you couldn't use it against a
+ registration that named only a single interface type.
+
+ For example, if you created this predicate::
+
+ class MyPredicate(object):
+ # portions elided...
+ def __call__(self, event):
+ return self.val == event.context.foo
+
+ It would not work against a multi-interface-registered subscription, so in
+ the above example, when you attempted to use it against ``asubscriber1``, it
+ would fail at runtime with a TypeError, claiming something was attempting to
+ call it with too many arguments.
+
+ To hack around this limitation, you were obligated to design the
+ ``mypredicate`` predicate to expect to receive in its ``__call__`` either a
+ single ``event`` argument (a SomeOtherEvent object) *or* a pair of arguments
+ (a SomeEvent object and a SomeContextType object), presumably by doing
+ something like this::
+
+ class MyPredicate(object):
+ # portions elided...
+ def __call__(self, event, context=None):
+ return self.val == event.context.foo
+
+ This was confusing and bad.
+
+ In order to allow people to ignore unused arguments to subscriber callables
+ and to normalize the relationship between event subscribers and subscriber
+ predicates, we now allow both subscribers and subscriber predicates to accept
+ only a single ``event`` argument even if they've been subscribed for
+ notifications that involve multiple interfaces. Subscribers and subscriber
+ predicates that accept only one argument will receive the first object passed
+ to ``notify``; this is typically (but not always) the event object. The
+ other objects involved in the subscription lookup will be discarded. You can
+ now write an event subscriber that accepts only ``event`` even if it
+ subscribes to multiple interfaces::
+
+ @subscriber([SomeEvent, SomeContextType])
+ def asubscriber(event):
+ # this will work!
+
+ This prevents you from needing to match the subscriber callable parameters to
+ the subscription type unnecessarily, especially when you don't make use of
+ any argument in your subscribers except for the event object itself.
+
+ Note, however, that if the event object is not the first
+ object in the call to ``notify``, you'll run into trouble. For example, if
+ notify is called with the context argument first::
+
+ registry.notify(context, event)
+
+ You won't be able to take advantage of the event-only feature. It will
+ "work", but the object received by your event handler won't be the event
+ object, it will be the context object, which won't be very useful::
+
+ @subscriber([SomeContextType, SomeEvent])
+ def asubscriber(event):
+ # bzzt! you'll be getting the context here as ``event``, and it'll
+ # be useless
+
+ Existing multiple-argument subscribers continue to work without issue, so you
+ should continue use those if your system notifies using multiple interfaces
+ and the first interface is not the event interface. For example::
+
+ @subscriber([SomeContextType, SomeEvent])
+ def asubscriber(context, event):
+ # this will still work!
+
+ The event-only feature makes it possible to use a subscriber predicate that
+ accepts only a request argument within both multiple-interface subscriber
+ registrations and single-interface subscriber registrations. You needn't
+ make slightly different variations of predicates depending on the
+ subscription type arguments. Instead, just write all your subscriber
+ predicates so they only accept ``event`` in their ``__call__`` and they'll be
+ useful across all registrations for subscriptions that use an event as their
+ first argument, even ones which accept more than just ``event``.
+
+ However, the same caveat applies to predicates as to subscriber callables: if
+ you're subscribing to a multi-interface event, and the first interface is not
+ the event interface, the predicate won't work properly. In such a case,
+ you'll need to match the predicate ``__call__`` argument ordering and
+ composition to the ordering of the interfaces. For example, if the
+ registration for the subscription uses ``[SomeContext, SomeEvent]``, you'll
+ need to reflect that in the ordering of the parameters of the predicate's
+ ``__call__`` method::
+
+ def __call__(self, context, event):
+ return event.request.path.startswith(self.val)
+
+ tl;dr: 1) When using multi-interface subscriptions, always use the event type
+ as the first subscription registration argument and 2) When 1 is true, use
+ only ``event`` in your subscriber and subscriber predicate parameter lists,
+ no matter how many interfaces the subscriber is notified with. This
+ combination will result in the maximum amount of reusability of subscriber
+ predicates and the least amount of thought on your part. Drink responsibly.
+
+Bug Fixes
+---------
+
+- A failure when trying to locate the attribute ``__text__`` on route and view
+ predicates existed when the ``debug_routematch`` setting was true or when the
+ ``pviews`` command was used. See https://github.com/Pylons/pyramid/pull/727
+
+Documentation
+-------------
+
+- Sync up tutorial source files with the files that are rendered by the
+ scaffold that each uses.
+
1.4a4 (2012-11-14)
==================
@@ -115,7 +332,7 @@ Bug Fixes
- When registering a view configuration that named a Chameleon ZPT renderer
with a macro name in it (e.g. ``renderer='some/template#somemacro.pt``) as
- well as a view configuration without a macro name it it that pointed to the
+ well as a view configuration without a macro name in it that pointed to the
same template (e.g. ``renderer='some/template.pt'``), internal caching could
confuse the two, and your code might have rendered one instead of the
other.
@@ -319,7 +536,7 @@ Features
- An ``add_permission`` directive method was added to the Configurator. This
directive registers a free-standing permission introspectable into the
Pyramid introspection system. Frameworks built atop Pyramid can thus use
- the the ``permissions`` introspectable category data to build a
+ the ``permissions`` introspectable category data to build a
comprehensive list of permissions supported by a running system. Before
this method was added, permissions were already registered in this
introspectable category as a side effect of naming them in an ``add_view``
View
@@ -190,3 +190,5 @@ Contributors
- David Gay, 2012/09/16
- Robert Jackiewicz, 2012/11/12
+
+- John Anderson, 2012/11/14
View
@@ -88,13 +88,13 @@ Coding Style
mandatory.
- Please do not remove trailing whitespace. Configure your editor to reduce
- diff noise.
+ diff noise. See https://github.com/Pylons/pyramid/issues/788 for more.
Running Tests
--------------
- To run tests for Pyramid on a single Python version, run ``python setup.py
- test`` against the using the Python interpreter from virtualenv into which
+ test`` against the Python interpreter from virtualenv into which
you've ``setup.py develop``-ed Pyramid.
- To run the full set of Pyramid tests on all platforms, install ``tox``
View
@@ -4,6 +4,9 @@ Pyramid TODOs
Nice-to-Have
------------
+- config.set_registry_attr with conflict detection... make sure the attr is
+ added before a commit, but register an action so a conflict can be detected.
+
- Provide the presumed renderer name to the called view as an attribute of
the request.
@@ -175,6 +178,3 @@ Probably Bad Ideas
- _fix_registry should dictify the registry being fixed.
-- config.set_registry_attr (with conflict detection)... bad idea because it
- won't take effect until after a commit and folks will be confused by that.
-
View
@@ -108,19 +108,15 @@
:class:`pyramid.registry.Introspectable` class (used during
directives to provide introspection to actions).
- .. note::
-
- This attribute is new as of :app:`Pyramid` 1.3.
+ .. versionadded:: 1.3
.. attribute:: introspector
The :term:`introspector` related to this configuration. It is an
instance implementing the :class:`pyramid.interfaces.IIntrospector`
interface.
- .. note::
-
- This attribute is new as of :app:`Pyramid` 1.3.
+ .. versionadded:: 1.3
.. attribute:: registry
@@ -130,7 +126,7 @@
.. attribute:: global_registries
The set of registries that have been created for :app:`Pyramid`
- applications, one per each call to
+ applications, one for each call to
:meth:`pyramid.config.Configurator.make_wsgi_app` in the current
process. The object itself supports iteration and has a ``last`` property
containing the last registry loaded.
View
@@ -7,7 +7,7 @@
.. autofunction:: bootstrap
- .. autofunction:: get_app(config_uri, name=None)
+ .. autofunction:: get_app(config_uri, name=None, options=None)
.. autofunction:: get_appsettings(config_uri, name=None)
View
@@ -9,8 +9,7 @@
A constant used by the constructor of
:class:`pyramid.path.DottedNameResolver` and
- :class:`pyramid.path.AssetResolver` (see their docstrings for more
- info).
+ :class:`pyramid.path.AssetResolver`.
.. autoclass:: DottedNameResolver
:members:
Oops, something went wrong.

0 comments on commit acf1153

Please sign in to comment.