From a0f84bd416be91b7e861d3b5ba8aa7468ad3c4be Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 9 May 2013 16:26:06 -0400 Subject: Ignore coverage in new location. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5fa2a2ee4..8dca2069c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ .coverage .tox/ nosetests.xml -pyramid/coverage.xml +coverage.xml tutorial.db build/ dist/ -- cgit v1.2.3 From bea48e2f01070003a795aa12b8d8ba464fe15115 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 9 May 2013 16:45:05 -0400 Subject: Implement PEP302 API in PackageOverrides as '__loader__'. Proxy to the '__loader__' set by the importer, if present. Otherwise, raise NotImplementedError. --- CHANGES.txt | 5 ++ pyramid/config/assets.py | 38 ++++++++++--- pyramid/interfaces.py | 44 ++++++++++++++- pyramid/tests/test_config/test_assets.py | 96 ++++++++++++++++++++++++++++++-- 4 files changed, 171 insertions(+), 12 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e6dd9f0cb..2fcd9c62a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,11 @@ next release Features -------- +- Make the ``pyramid.config.assets.PackageOverrides`` object implement the + API for ``__loader__`` objects specified in PEP 302. Proxies to the + ``__loader__`` set by the importer, if present; otherwise, raises + ``NotImplementedError``. + - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This removes the ambiguity between the potential ``AttributeError`` that would be raised on the ``context`` when the property was not defined and the diff --git a/pyramid/config/assets.py b/pyramid/config/assets.py index 5d4682349..0616e6cda 100644 --- a/pyramid/config/assets.py +++ b/pyramid/config/assets.py @@ -81,14 +81,12 @@ class OverrideProvider(pkg_resources.DefaultProvider): self, resource_name) @implementer(IPackageOverrides) -class PackageOverrides: +class PackageOverrides(object): # pkg_resources arg in kw args below for testing def __init__(self, package, pkg_resources=pkg_resources): - if hasattr(package, '__loader__') and not isinstance(package.__loader__, - self.__class__): - raise TypeError('Package %s already has a non-%s __loader__ ' - '(probably a module in a zipped egg)' % - (package, self.__class__)) + loader = self._real_loader = getattr(package, '__loader__', None) + if isinstance(loader, self.__class__): + self._real_loader = None # We register ourselves as a __loader__ *only* to support the # setuptools _find_adapter adapter lookup; this class doesn't # actually support the PEP 302 loader "API". This is @@ -150,7 +148,33 @@ class PackageOverrides: for package, rname in self.search_path(resource_name): if pkg_resources.resource_exists(package, rname): return pkg_resources.resource_listdir(package, rname) - + + @property + def real_loader(self): + if self._real_loader is None: + raise NotImplementedError() + return self._real_loader + + def get_data(self, path): + """ See IPEP302Loader. + """ + return self.real_loader.get_data(path) + + def is_package(self, fullname): + """ See IPEP302Loader. + """ + return self.real_loader.is_package(fullname) + + def get_code(self, fullname): + """ See IPEP302Loader. + """ + return self.real_loader.get_code(fullname) + + def get_source(self, fullname): + """ See IPEP302Loader. + """ + return self.real_loader.get_source(fullname) + class DirectoryOverride: def __init__(self, path, package, prefix): diff --git a/pyramid/interfaces.py b/pyramid/interfaces.py index 4fb4d615c..a57f61ddb 100644 --- a/pyramid/interfaces.py +++ b/pyramid/interfaces.py @@ -793,7 +793,49 @@ deprecated( 'See the "What\'s new In Pyramid 1.3" document for more details.' ) -class IPackageOverrides(Interface): +class IPEP302Loader(Interface): + """ See http://www.python.org/dev/peps/pep-0302/#id30. + """ + def get_data(path): + """ Retrieve data for and arbitrary "files" from storage backend. + + Raise IOError for not found. + + Data is returned as bytes. + """ + + def is_package(fullname): + """ Return True if the module specified by 'fullname' is a package. + """ + + def get_code(fullname): + """ Return the code object for the module identified by 'fullname'. + + Return 'None' if it's a built-in or extension module. + + If the loader doesn't have the code object but it does have the source + code, return the compiled source code. + + Raise ImportError if the module can't be found by the importer at all. + """ + + def get_source(fullname): + """ Return the source code for the module identified by 'fullname'. + + Return a string, using newline characters for line endings, or None + if the source is not available. + + Raise ImportError if the module can't be found by the importer at all. + """ + + def get_filename(fullname): + """ Return the value of '__file__' if the named module was loaded. + + If the module is not found, raise ImportError. + """ + + +class IPackageOverrides(IPEP302Loader): """ Utility for pkg_resources overrides """ # VH_ROOT_KEY is an interface; its imported from other packages (e.g. diff --git a/pyramid/tests/test_config/test_assets.py b/pyramid/tests/test_config/test_assets.py index 5fe02c358..345e7f8d6 100644 --- a/pyramid/tests/test_config/test_assets.py +++ b/pyramid/tests/test_config/test_assets.py @@ -314,16 +314,40 @@ class TestPackageOverrides(unittest.TestCase): from pyramid.config.assets import PackageOverrides return PackageOverrides - def _makeOne(self, package, pkg_resources=None): + def _makeOne(self, package=None, pkg_resources=None): + if package is None: + package = DummyPackage('package') klass = self._getTargetClass() if pkg_resources is None: pkg_resources = DummyPkgResources() return klass(package, pkg_resources=pkg_resources) + def test_class_conforms_to_IPackageOverrides(self): + from zope.interface.verify import verifyClass + from pyramid.interfaces import IPackageOverrides + verifyClass(IPackageOverrides, self._getTargetClass()) + + def test_instance_conforms_to_IPackageOverrides(self): + from zope.interface.verify import verifyObject + from pyramid.interfaces import IPackageOverrides + verifyObject(IPackageOverrides, self._makeOne()) + + def test_class_conforms_to_IPEP302Loader(self): + from zope.interface.verify import verifyClass + from pyramid.interfaces import IPEP302Loader + verifyClass(IPEP302Loader, self._getTargetClass()) + + def test_instance_conforms_to_IPEP302Loader(self): + from zope.interface.verify import verifyObject + from pyramid.interfaces import IPEP302Loader + verifyObject(IPEP302Loader, self._makeOne()) + def test_ctor_package_already_has_loader_of_different_type(self): package = DummyPackage('package') - package.__loader__ = True - self.assertRaises(TypeError, self._makeOne, package) + loader = package.__loader__ = DummyLoader() + po = self._makeOne(package) + self.assertTrue(package.__loader__ is po) + self.assertTrue(po.real_loader is loader) def test_ctor_package_already_has_loader_of_same_type(self): package = DummyPackage('package') @@ -502,6 +526,55 @@ class TestPackageOverrides(unittest.TestCase): po.overrides= overrides self.assertEqual(po.listdir('whatever'), None) + # PEP 302 __loader__ extensions: use the "real" __loader__, if present. + def test_get_data_pkg_has_no___loader__(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertRaises(NotImplementedError, po.get_data, 'whatever') + + def test_get_data_pkg_has___loader__(self): + package = DummyPackage('package') + loader = package.__loader__ = DummyLoader() + po = self._makeOne(package) + self.assertEqual(po.get_data('whatever'), b'DEADBEEF') + self.assertEqual(loader._got_data, 'whatever') + + def test_is_package_pkg_has_no___loader__(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertRaises(NotImplementedError, po.is_package, 'whatever') + + def test_is_package_pkg_has___loader__(self): + package = DummyPackage('package') + loader = package.__loader__ = DummyLoader() + po = self._makeOne(package) + self.assertTrue(po.is_package('whatever')) + self.assertEqual(loader._is_package, 'whatever') + + def test_get_code_pkg_has_no___loader__(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertRaises(NotImplementedError, po.get_code, 'whatever') + + def test_get_code_pkg_has___loader__(self): + package = DummyPackage('package') + loader = package.__loader__ = DummyLoader() + po = self._makeOne(package) + self.assertEqual(po.get_code('whatever'), b'DEADBEEF') + self.assertEqual(loader._got_code, 'whatever') + + def test_get_source_pkg_has_no___loader__(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertRaises(NotImplementedError, po.get_source, 'whatever') + + def test_get_source_pkg_has___loader__(self): + package = DummyPackage('package') + loader = package.__loader__ = DummyLoader() + po = self._makeOne(package) + self.assertEqual(po.get_source('whatever'), 'def foo():\n pass') + self.assertEqual(loader._got_source, 'whatever') + class TestDirectoryOverride(unittest.TestCase): def _getTargetClass(self): from pyramid.config.assets import DirectoryOverride @@ -570,10 +643,25 @@ class DummyPkgResources: def register_loader_type(self, typ, inst): self.registered.append((typ, inst)) - + class DummyPackage: def __init__(self, name): self.__name__ = name + +class DummyLoader: + _got_data = _is_package = None + def get_data(self, path): + self._got_data = path + return b'DEADBEEF' + def is_package(self, fullname): + self._is_package = fullname + return True + def get_code(self, fullname): + self._got_code = fullname + return b'DEADBEEF' + def get_source(self, fullname): + self._got_source = fullname + return 'def foo():\n pass' class DummyUnderOverride: def __call__(self, package, path, override_package, override_prefix, -- cgit v1.2.3 From 688a93af3f074edb5ece07661c35fd2019a800f5 Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Sat, 11 May 2013 10:54:28 +0200 Subject: add missing word; be more precise --- pyramid/testing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyramid/testing.py b/pyramid/testing.py index 0c701727b..06b795f9a 100644 --- a/pyramid/testing.py +++ b/pyramid/testing.py @@ -482,9 +482,9 @@ def tearDown(unhook_zca=True): If the ``unhook_zca`` argument is ``True`` (the default), call :func:`zope.component.getSiteManager.reset`. This undoes the - action of :func:`pyramid.testing.setUp` called with the + action of :func:`pyramid.testing.setUp` when called with the argument ``hook_zca=True``. If :mod:`zope.component` cannot be - imported, ignore the argument. + imported, ``unhook_zca`` is set to ``False``. """ global have_zca if unhook_zca and have_zca: -- cgit v1.2.3 From 4e2f1f0660f77816958882459fd819f2928d0f19 Mon Sep 17 00:00:00 2001 From: Goodwill Coding Date: Thu, 16 May 2013 09:07:34 -0700 Subject: Extend informational message to pcreate output. Tutorial, docs, twitter, maillist. --- pyramid/scaffolds/__init__.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pyramid/scaffolds/__init__.py b/pyramid/scaffolds/__init__.py index dc207b540..a87041576 100644 --- a/pyramid/scaffolds/__init__.py +++ b/pyramid/scaffolds/__init__.py @@ -1,5 +1,6 @@ import binascii import os +from textwrap import dedent from pyramid.compat import native_ @@ -33,7 +34,22 @@ class PyramidTemplate(Template): """ Overrides :meth:`pyramid.scaffolds.template.Template.post`, to print "Welcome to Pyramid. Sorry for the convenience." after a successful scaffolding rendering.""" - self.out('Welcome to Pyramid. Sorry for the convenience.') + + separator = "=" * 79 + msg = dedent( + """ + %(separator)s + Tutorials: http://docs.pylonsproject.org/projects/pyramid_tutorials + Documentation: http://docs.pylonsproject.org/projects/pyramid + + Twitter (tips & updates): http://twitter.com/pylons + Mailing List: http://groups.google.com/group/pylons-discuss + + Welcome to Pyramid. Sorry for the convenience. + %(separator)s + """ % {'separator': separator}) + + self.out(msg) return Template.post(self, command, output_dir, vars) def out(self, msg): # pragma: no cover (replaceable testing hook) -- cgit v1.2.3 From 647063576a476bba503fc836839d002a7e7368c8 Mon Sep 17 00:00:00 2001 From: Goodwill Coding Date: Thu, 16 May 2013 09:10:17 -0700 Subject: fix indentaion type --- pyramid/scaffolds/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyramid/scaffolds/__init__.py b/pyramid/scaffolds/__init__.py index a87041576..c993ce5f9 100644 --- a/pyramid/scaffolds/__init__.py +++ b/pyramid/scaffolds/__init__.py @@ -47,7 +47,7 @@ class PyramidTemplate(Template): Welcome to Pyramid. Sorry for the convenience. %(separator)s - """ % {'separator': separator}) + """ % {'separator': separator}) self.out(msg) return Template.post(self, command, output_dir, vars) -- cgit v1.2.3 From 45ef9a69e51189051c03b3fdeac4458ee94d7529 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 21 May 2013 15:27:02 -0400 Subject: Prevent non-3.2-compatible MarkupSafe 0.16 from breaking us. Apps which actually use Mako templates are still broken. --- CHANGES.txt | 3 +++ pyramid/mako_templating.py | 29 +++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e6dd9f0cb..2c4f4e31c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -32,6 +32,9 @@ Features Bug Fixes --------- +- ``mako_templating``: added defensive workaround for non-importability + of ``mako`` (due to upstream ``markupsafe`` dropping Python 3.2 support). + - View lookup will now search for valid views based on the inheritance hierarchy of the context. It tries to find views based on the most specific context first, and upon predicate failure, will move up the diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index 061bcb717..5fbdd002e 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -23,8 +23,29 @@ from pyramid.interfaces import ITemplateRenderer from pyramid.settings import asbool from pyramid.util import DottedNameResolver -from mako.lookup import TemplateLookup -from mako import exceptions +try: + from mako.lookup import TemplateLookup +except (ImportError, SyntaxError, AttributeError): #pragma NO COVER + class TemplateLookup(object): + def __init__(self, **kw): + pass + def no_mako(self, *args, **kw): + raise NotImplementedError("'mako' not importable") + adjust_uri = get_template = filename_to_uri = no_mako + put_string = put_template = no_mako + +try: + from mako.exceptions import TopLevelLookupException +except (ImportError, SyntaxError, AttributeError): #pragma NO COVER + class TopLevelLookupException(Exception): + pass + +try: + from mako.exceptions import text_error_template +except (ImportError, SyntaxError, AttributeError): #pragma NO COVER + def text_error_template(lookup=None): + raise NotImplementedError("'mako' not importable") + class IMakoLookup(Interface): pass @@ -78,7 +99,7 @@ class PkgResourceTemplateLookup(TemplateLookup): srcfile = abspath_from_asset_spec(path, pname) if os.path.isfile(srcfile): return self._load(srcfile, adjusted) - raise exceptions.TopLevelLookupException( + raise TopLevelLookupException( "Can not locate template for uri %r" % uri) return TemplateLookup.get_template(self, uri) @@ -208,7 +229,7 @@ class MakoLookupTemplateRenderer(object): except: try: exc_info = sys.exc_info() - errtext = exceptions.text_error_template().render( + errtext = text_error_template().render( error=exc_info[1], traceback=exc_info[2] ) -- cgit v1.2.3 From 81c75fd1662b5b0a91616289dc44c808bb9be01a Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 21 May 2013 17:58:40 -0400 Subject: skip mako-related tests on py32 --- pyramid/mako_templating.py | 1 - .../pkgs/viewdecoratorapp/views/templates/foo.mak | 3 --- .../pkgs/viewdecoratorapp/views/templates/foo.pt | 3 +++ pyramid/tests/pkgs/viewdecoratorapp/views/views.py | 4 ++-- pyramid/tests/test_integration.py | 10 ---------- pyramid/tests/test_mako_templating.py | 23 +++++++++++++++++----- 6 files changed, 23 insertions(+), 21 deletions(-) delete mode 100644 pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.mak create mode 100644 pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index 5fbdd002e..69b48a3b5 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -1,6 +1,5 @@ import os import posixpath -import re import sys import threading diff --git a/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.mak b/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.mak deleted file mode 100644 index 6a2f701b6..000000000 --- a/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.mak +++ /dev/null @@ -1,3 +0,0 @@ - -${result} - diff --git a/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt b/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt new file mode 100644 index 000000000..6a2f701b6 --- /dev/null +++ b/pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt @@ -0,0 +1,3 @@ + +${result} + diff --git a/pyramid/tests/pkgs/viewdecoratorapp/views/views.py b/pyramid/tests/pkgs/viewdecoratorapp/views/views.py index 6f7ff1e21..2b7d7e928 100644 --- a/pyramid/tests/pkgs/viewdecoratorapp/views/views.py +++ b/pyramid/tests/pkgs/viewdecoratorapp/views/views.py @@ -1,11 +1,11 @@ from pyramid.view import view_config -@view_config(renderer='templates/foo.mak', name='first') +@view_config(renderer='templates/foo.pt', name='first') def first(request): return {'result':'OK1'} @view_config( - renderer='pyramid.tests.pkgs.viewdecoratorapp.views:templates/foo.mak', + renderer='pyramid.tests.pkgs.viewdecoratorapp.views:templates/foo.pt', name='second') def second(request): return {'result':'OK2'} diff --git a/pyramid/tests/test_integration.py b/pyramid/tests/test_integration.py index c8418c61d..66205e618 100644 --- a/pyramid/tests/test_integration.py +++ b/pyramid/tests/test_integration.py @@ -369,22 +369,12 @@ class TestForbiddenAppHasResult(IntegrationBase, unittest.TestCase): class TestViewDecoratorApp(IntegrationBase, unittest.TestCase): package = 'pyramid.tests.pkgs.viewdecoratorapp' - def _configure_mako(self): - tmpldir = os.path.join(os.path.dirname(__file__), - 'pkgs', - 'viewdecoratorapp', - 'views') - self.config.registry.settings['mako.directories'] = tmpldir def test_first(self): - # we use mako here instead of chameleon because it works on Jython - self._configure_mako() res = self.testapp.get('/first', status=200) self.assertTrue(b'OK' in res.body) def test_second(self): - # we use mako here instead of chameleon because it works on Jython - self._configure_mako() res = self.testapp.get('/second', status=200) self.assertTrue(b'OK2' in res.body) diff --git a/pyramid/tests/test_mako_templating.py b/pyramid/tests/test_mako_templating.py index 50ef360d9..75faa771d 100644 --- a/pyramid/tests/test_mako_templating.py +++ b/pyramid/tests/test_mako_templating.py @@ -22,7 +22,20 @@ class Base(object): def tearDown(self): self.config.end() -class Test_renderer_factory(Base, unittest.TestCase): +def maybe_unittest(): + # The latest release of MarkupSafe (0.17) which is used by Mako is + # incompatible with Python 3.2, so we skip these tests if we cannot + # import a Mako module which ends up importing MarkupSafe. Note that + # this version of MarkupSafe *is* compatible with Python 2.6, 2.7, and 3.3, + # so these tests should not be skipped on those platforms. + try: + import mako.lookup + except (ImportError, SyntaxError, AttributeError): + return object + else: + return unittest.TestCase + +class Test_renderer_factory(Base, maybe_unittest()): def _callFUT(self, info): from pyramid.mako_templating import renderer_factory return renderer_factory(info) @@ -298,7 +311,7 @@ class Test_renderer_factory(Base, unittest.TestCase): self.assertEqual(result.path, 'hello .world.mako') self.assertEqual(result.defname, 'comp') -class MakoRendererFactoryHelperTests(Base, unittest.TestCase): +class MakoRendererFactoryHelperTests(Base, maybe_unittest()): def _getTargetClass(self): from pyramid.mako_templating import MakoRendererFactoryHelper return MakoRendererFactoryHelper @@ -345,7 +358,7 @@ class MakoRendererFactoryHelperTests(Base, unittest.TestCase): self.assertEqual(renderer.path, 'helloworld.mak') self.assertEqual(renderer.lookup, lookup) -class MakoLookupTemplateRendererTests(Base, unittest.TestCase): +class MakoLookupTemplateRendererTests(Base, maybe_unittest()): def _getTargetClass(self): from pyramid.mako_templating import MakoLookupTemplateRenderer return MakoLookupTemplateRenderer @@ -426,7 +439,7 @@ class MakoLookupTemplateRendererTests(Base, unittest.TestCase): self.assertTrue(isinstance(result, text_type)) self.assertEqual(result, text_('result')) -class TestIntegration(unittest.TestCase): +class TestIntegration(maybe_unittest()): def setUp(self): import pyramid.mako_templating self.config = testing.setUp() @@ -501,7 +514,7 @@ class TestIntegration(unittest.TestCase): {'name':'fred'}).replace('\r','') self.assertEqual(result, text_('Hello, <b>fred</b>!\n')) -class TestPkgResourceTemplateLookup(unittest.TestCase): +class TestPkgResourceTemplateLookup(maybe_unittest()): def _makeOne(self, **kw): from pyramid.mako_templating import PkgResourceTemplateLookup return PkgResourceTemplateLookup(**kw) -- cgit v1.2.3 From 0fdb540f8e432061ec09623f0275a6b6555292ef Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 21 May 2013 18:17:57 -0400 Subject: tortured docs --- CHANGES.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 2c4f4e31c..468fe1ed1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -32,8 +32,11 @@ Features Bug Fixes --------- -- ``mako_templating``: added defensive workaround for non-importability - of ``mako`` (due to upstream ``markupsafe`` dropping Python 3.2 support). +- ``mako_templating``: added defensive workaround for non-importability of + ``mako`` due to upstream ``markupsafe`` dropping Python 3.2 support. Mako + templating will no longer work under the combination of MarkupSafe 0.17 and + Python 3.2 (although the combination of MarkupSafe 0.17 and Python 3.3 or any + supported Python 2 version will work OK). - View lookup will now search for valid views based on the inheritance hierarchy of the context. It tries to find views based on the most -- cgit v1.2.3 From d4495efddce30cf2eef771ac28e2d90b86985d39 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 21 May 2013 18:30:21 -0400 Subject: this is actually a bugfix --- CHANGES.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ceaeb3519..a471addce 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,11 +4,6 @@ next release Features -------- -- Make the ``pyramid.config.assets.PackageOverrides`` object implement the - API for ``__loader__`` objects specified in PEP 302. Proxies to the - ``__loader__`` set by the importer, if present; otherwise, raises - ``NotImplementedError``. - - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This removes the ambiguity between the potential ``AttributeError`` that would be raised on the ``context`` when the property was not defined and the @@ -37,6 +32,13 @@ Features Bug Fixes --------- +- Make the ``pyramid.config.assets.PackageOverrides`` object implement the API + for ``__loader__`` objects specified in PEP 302. Proxies to the + ``__loader__`` set by the importer, if present; otherwise, raises + ``NotImplementedError``. This makes Pyramid static view overrides work + properly under Python 3.3 (previously they would not). See + https://github.com/Pylons/pyramid/pull/1015 for more information. + - ``mako_templating``: added defensive workaround for non-importability of ``mako`` due to upstream ``markupsafe`` dropping Python 3.2 support. Mako templating will no longer work under the combination of MarkupSafe 0.17 and -- cgit v1.2.3 From 6b559994fe4006e8cc0d2135f1f4548a60ab8ff0 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 21 May 2013 19:16:34 -0400 Subject: override all known attrs and methods instead of allowing subclass to override in failure case --- pyramid/mako_templating.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index 69b48a3b5..31c398862 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -25,13 +25,17 @@ from pyramid.util import DottedNameResolver try: from mako.lookup import TemplateLookup except (ImportError, SyntaxError, AttributeError): #pragma NO COVER + def no_mako(*arg, **kw): + raise NotImplementedError( + "'mako' package is not importable (maybe downgrade MarkupSafe to " + "0.16 or below if you're using Python 3.2)" + ) class TemplateLookup(object): def __init__(self, **kw): - pass - def no_mako(self, *args, **kw): - raise NotImplementedError("'mako' not importable") - adjust_uri = get_template = filename_to_uri = no_mako - put_string = put_template = no_mako + for name in ('adjust_uri', 'get_template', 'filename_to_uri', + 'put_string', 'put_template'): + setattr(self, name, no_mako) + self.filesystem_checks = False try: from mako.exceptions import TopLevelLookupException -- cgit v1.2.3 From 922b1d40c4523fdcf9b6f37f9ccd24fda80ec592 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 21 May 2013 20:05:34 -0400 Subject: normalize exception messages, coverage --- pyramid/mako_templating.py | 15 ++++++++------- pyramid/tests/test_mako_templating.py | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index 31c398862..8d4583d82 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -22,19 +22,20 @@ from pyramid.interfaces import ITemplateRenderer from pyramid.settings import asbool from pyramid.util import DottedNameResolver +def _no_mako(*arg, **kw): # pragma: no cover + raise NotImplementedError( + "'mako' package is not importable (maybe downgrade MarkupSafe to " + "0.16 or below if you're using Python 3.2)" + ) + try: from mako.lookup import TemplateLookup except (ImportError, SyntaxError, AttributeError): #pragma NO COVER - def no_mako(*arg, **kw): - raise NotImplementedError( - "'mako' package is not importable (maybe downgrade MarkupSafe to " - "0.16 or below if you're using Python 3.2)" - ) class TemplateLookup(object): def __init__(self, **kw): for name in ('adjust_uri', 'get_template', 'filename_to_uri', 'put_string', 'put_template'): - setattr(self, name, no_mako) + setattr(self, name, _no_mako) self.filesystem_checks = False try: @@ -47,7 +48,7 @@ try: from mako.exceptions import text_error_template except (ImportError, SyntaxError, AttributeError): #pragma NO COVER def text_error_template(lookup=None): - raise NotImplementedError("'mako' not importable") + _no_mako() class IMakoLookup(Interface): diff --git a/pyramid/tests/test_mako_templating.py b/pyramid/tests/test_mako_templating.py index 75faa771d..f607a5497 100644 --- a/pyramid/tests/test_mako_templating.py +++ b/pyramid/tests/test_mako_templating.py @@ -30,7 +30,7 @@ def maybe_unittest(): # so these tests should not be skipped on those platforms. try: import mako.lookup - except (ImportError, SyntaxError, AttributeError): + except (ImportError, SyntaxError, AttributeError): # pragma: no cover return object else: return unittest.TestCase -- cgit v1.2.3 From 4073a408f05a4ee925c82fb8989a3c3994d0a454 Mon Sep 17 00:00:00 2001 From: Vojislav Stojkovic Date: Wed, 22 May 2013 16:01:15 -0400 Subject: Defer imports of Chameleon until needed. Fixes #1021. --- pyramid/chameleon_text.py | 3 +-- pyramid/chameleon_zpt.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pyramid/chameleon_text.py b/pyramid/chameleon_text.py index 8cf04bf79..d2a943a28 100644 --- a/pyramid/chameleon_text.py +++ b/pyramid/chameleon_text.py @@ -1,7 +1,5 @@ from zope.interface import implementer -from chameleon.zpt.template import PageTextTemplateFile - from pyramid.interfaces import ITemplateRenderer from pyramid.decorator import reify @@ -20,6 +18,7 @@ class TextTemplateRenderer(object): @reify # avoid looking up reload_templates before manager pushed def template(self): + from chameleon.zpt.template import PageTextTemplateFile return PageTextTemplateFile(self.path, auto_reload=self.lookup.auto_reload, debug=self.lookup.debug, diff --git a/pyramid/chameleon_zpt.py b/pyramid/chameleon_zpt.py index d8a8ee1be..89e5d02b5 100644 --- a/pyramid/chameleon_zpt.py +++ b/pyramid/chameleon_zpt.py @@ -1,7 +1,5 @@ from zope.interface import implementer -from chameleon.zpt.template import PageTemplateFile - from pyramid.interfaces import ITemplateRenderer from pyramid.decorator import reify from pyramid import renderers @@ -18,6 +16,7 @@ class ZPTTemplateRenderer(object): @reify # avoid looking up reload_templates before manager pushed def template(self): + from chameleon.zpt.template import PageTemplateFile tf = PageTemplateFile( self.path, auto_reload=self.lookup.auto_reload, -- cgit v1.2.3 From 9bb06ca706b5ce9d7d4f5c5935e7fe8d4c77ba2a Mon Sep 17 00:00:00 2001 From: Graham Higgins Date: Sat, 25 May 2013 16:51:45 +0200 Subject: Update URL for pypi author ranking link --- docs/designdefense.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/designdefense.rst b/docs/designdefense.rst index fdc57e0c1..ea46053a0 100644 --- a/docs/designdefense.rst +++ b/docs/designdefense.rst @@ -1691,7 +1691,7 @@ some sort of monolithic thing, and a lot of its software is usable externally. And while it's not really the job of this document to defend it, Zope has been around for over 10 years and has an incredibly large, active community. If you don't believe this, -http://taichino.appspot.com/pypi_ranking/authors is an eye-opening reality +http://pypi-ranking.info/author is an eye-opening reality check. Love Simplicity -- cgit v1.2.3 From bfe654f0af480473531bdff77cefb676568aac8f Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Thu, 30 May 2013 10:25:58 -0700 Subject: Support CSRF via X-CSRFToken Header --- pyramid/session.py | 26 +++++++++++++++++--------- pyramid/tests/test_session.py | 21 +++++++++++++++------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/pyramid/session.py b/pyramid/session.py index 7db8c8e0e..0433488d8 100644 --- a/pyramid/session.py +++ b/pyramid/session.py @@ -81,15 +81,22 @@ def signed_deserialize(serialized, secret, hmac=hmac): return pickle.loads(pickled) -def check_csrf_token(request, token='csrf_token', raises=True): +def check_csrf_token(request, + token='csrf_token', + header='X-CSRFToken', + raises=True): """ Check the CSRF token in the request's session against the value in - ``request.params.get(token)``. If a ``token`` keyword is not supplied - to this function, the string ``csrf_token`` will be used to look up - the token within ``request.params``. If the value in - ``request.params.get(token)`` doesn't match the value supplied by - ``request.session.get_csrf_token()``, and ``raises`` is ``True``, this - function will raise an :exc:`pyramid.httpexceptions.HTTPBadRequest` - exception. If the check does succeed and ``raises`` is ``False``, this + ``request.params.get(token)`` or ``request.headers.get(header)``. + If a ``token`` keyword is not supplied to this function, the string + ``csrf_token`` will be used to look up the token in ``request.params``. + If a ``header`` keyword is not supplied to this function, the string + ``X-CSRFToken`` will be used to look up the token in ``request.headers``. + + If the value supplied by param or by header doesn't match the value + supplied by ``request.session.get_csrf_token()``, and ``raises`` is + ``True``, this function will raise an + :exc:`pyramid.httpexceptions.HTTPBadRequest` exception. + If the check does succeed and ``raises`` is ``False``, this function will return ``False``. If the CSRF check is successful, this function will return ``True`` unconditionally. @@ -98,7 +105,8 @@ def check_csrf_token(request, token='csrf_token', raises=True): .. versionadded:: 1.4a2 """ - if request.params.get(token) != request.session.get_csrf_token(): + supplied_token = request.params.get(token, request.headers.get(header)) + if supplied_token != request.session.get_csrf_token(): if raises: raise HTTPBadRequest('incorrect CSRF token') return False diff --git a/pyramid/tests/test_session.py b/pyramid/tests/test_session.py index b3e0e20c4..d3bafb26e 100644 --- a/pyramid/tests/test_session.py +++ b/pyramid/tests/test_session.py @@ -356,20 +356,29 @@ class Test_signed_deserialize(unittest.TestCase): self.assertRaises(ValueError, self._callFUT, serialized, 'secret') class Test_check_csrf_token(unittest.TestCase): - def _callFUT(self, request, token, raises=True): + def _callFUT(self, *args, **kwargs): from ..session import check_csrf_token - return check_csrf_token(request, token, raises=raises) + return check_csrf_token(*args, **kwargs) - def test_success(self): + def test_success_token(self): request = testing.DummyRequest() request.params['csrf_token'] = request.session.get_csrf_token() - self.assertEqual(self._callFUT(request, 'csrf_token'), True) + self.assertEqual(self._callFUT(request, token='csrf_token'), True) + + def test_success_header(self): + request = testing.DummyRequest() + request.headers['X-CSRFToken'] = request.session.get_csrf_token() + self.assertEqual(self._callFUT(request, header='X-CSRFToken'), True) def test_success_default_token(self): - from ..session import check_csrf_token request = testing.DummyRequest() request.params['csrf_token'] = request.session.get_csrf_token() - self.assertEqual(check_csrf_token(request), True) + self.assertEqual(self._callFUT(request), True) + + def test_success_default_header(self): + request = testing.DummyRequest() + request.headers['X-CSRFToken'] = request.session.get_csrf_token() + self.assertEqual(self._callFUT(request), True) def test_failure_raises(self): from pyramid.httpexceptions import HTTPBadRequest -- cgit v1.2.3 From 26b0d13f2973c46cac28c209f7c67b10bfc91b62 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Thu, 30 May 2013 10:28:11 -0700 Subject: Added myself to contributors --- CONTRIBUTORS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 97eb54f7b..61155ca80 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -198,3 +198,5 @@ Contributors - Georges Dubus, 2013/03/21 - Jason McKellar, 2013/03/28 + +- Luke Cyca, 2013/05/30 -- cgit v1.2.3 From 92f0934ee4259a9b5d0f2c58228067103855be40 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sat, 1 Jun 2013 10:44:22 -0400 Subject: unused import --- pyramid/router.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyramid/router.py b/pyramid/router.py index 63c12a1af..df1f02b22 100644 --- a/pyramid/router.py +++ b/pyramid/router.py @@ -1,5 +1,4 @@ from zope.interface import ( - Interface, implementer, providedBy, ) -- cgit v1.2.3 From ea93cfd8295b215a19fcc0cd0f28ec9810616528 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Sun, 2 Jun 2013 19:05:36 -0700 Subject: Changed header name to X-CSRF-Token --- pyramid/session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyramid/session.py b/pyramid/session.py index 0433488d8..3708ef879 100644 --- a/pyramid/session.py +++ b/pyramid/session.py @@ -83,14 +83,14 @@ def signed_deserialize(serialized, secret, hmac=hmac): def check_csrf_token(request, token='csrf_token', - header='X-CSRFToken', + header='X-CSRF-Token', raises=True): """ Check the CSRF token in the request's session against the value in ``request.params.get(token)`` or ``request.headers.get(header)``. If a ``token`` keyword is not supplied to this function, the string ``csrf_token`` will be used to look up the token in ``request.params``. If a ``header`` keyword is not supplied to this function, the string - ``X-CSRFToken`` will be used to look up the token in ``request.headers``. + ``X-CSRF-Token`` will be used to look up the token in ``request.headers``. If the value supplied by param or by header doesn't match the value supplied by ``request.session.get_csrf_token()``, and ``raises`` is -- cgit v1.2.3 From d95a2732eb2f972df9fb2f954ae374b8acd06727 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Sun, 2 Jun 2013 19:08:44 -0700 Subject: Edited narrative docs about CSRF --- docs/narr/sessions.rst | 53 +++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/docs/narr/sessions.rst b/docs/narr/sessions.rst index c4f4b5f07..52b4860b3 100644 --- a/docs/narr/sessions.rst +++ b/docs/narr/sessions.rst @@ -298,14 +298,15 @@ Preventing Cross-Site Request Forgery Attacks `Cross-site request forgery `_ attacks are a -phenomenon whereby a user with an identity on your website might click on a -URL or button on another website which secretly redirects the user to your -application to perform some command that requires elevated privileges. - -You can avoid most of these attacks by making sure that the correct *CSRF -token* has been set in an :app:`Pyramid` session object before performing any -actions in code which requires elevated privileges that is invoked via a form -post. To use CSRF token support, you must enable a :term:`session factory` +phenomenon whereby a user who is logged in to your website might inadvertantly +load a URL because it is linked from, or embedded in, an attacker's website. +If the URL is one that may modify or delete data, the consequences can be dire. + +You can avoid most of these attacks by issuing a unique token to the browser +and then requiring that it be present in all potentially unsafe requests. +:app:`Pyramid` sessions provide facilities to create and check CSRF tokens. + +To use CSRF tokens, you must first enable a :term:`session factory` as described in :ref:`using_the_default_session_factory` or :ref:`using_alternate_session_factories`. @@ -324,33 +325,41 @@ To get the current CSRF token from the session, use the The ``session.get_csrf_token()`` method accepts no arguments. It returns a CSRF *token* string. If ``session.get_csrf_token()`` or -``session.new_csrf_token()`` was invoked previously for this session, the +``session.new_csrf_token()`` was invoked previously for this session, then the existing token will be returned. If no CSRF token previously existed for -this session, a new token will be will be set into the session and returned. +this session, then a new token will be will be set into the session and returned. The newly created token will be opaque and randomized. You can use the returned token as the value of a hidden field in a form that -posts to a method that requires elevated privileges. The handler for the -form post should use ``session.get_csrf_token()`` *again* to obtain the -current CSRF token related to the user from the session, and compare it to -the value of the hidden form field. For example, if your form rendering -included the CSRF token obtained via ``session.get_csrf_token()`` as a hidden -input field named ``csrf_token``: +posts to a method that requires elevated privileges, or supply it as a request +header in AJAX requests. The handler for the URL that receives the request +should then require that the correct CSRF token is supplied. -.. code-block:: python - :linenos: +Using the ``session.check_csrf_token`` Method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - token = request.session.get_csrf_token() - if token != request.POST['csrf_token']: - raise ValueError('CSRF token did not match') +In request handling code, you can check the presence and validity of a CSRF +token with ``session.check_csrf_token(request)``. If the token is valid, +it will return True, otherwise it will raise ``HTTPBadRequest``. + +By default, it checks for a GET or POST parameter named ``csrf_token`` or a +header named ``X-CSRF-Token``. .. index:: single: session.new_csrf_token +Checking CSRF Tokens With A View Predicate +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A convenient way to require a valid CSRF Token for a particular view is to +include ``check_csrf=True`` as a view predicate. +See :meth:`pyramid.config.Configurator.add_route`. + + Using the ``session.new_csrf_token`` Method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To explicitly add a new CSRF token to the session, use the +To explicitly create a new CSRF token, use the ``session.new_csrf_token()`` method. This differs only from ``session.get_csrf_token()`` inasmuch as it clears any existing CSRF token, creates a new CSRF token, sets the token into the session, and returns the -- cgit v1.2.3 From 009f843d7d72d3a9d8cc35c08db9b77e247111f5 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Tue, 4 Jun 2013 22:25:37 -0700 Subject: Add examples to narrative CSRF docs --- docs/narr/sessions.rst | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/narr/sessions.rst b/docs/narr/sessions.rst index 52b4860b3..7ec280c8a 100644 --- a/docs/narr/sessions.rst +++ b/docs/narr/sessions.rst @@ -332,7 +332,32 @@ The newly created token will be opaque and randomized. You can use the returned token as the value of a hidden field in a form that posts to a method that requires elevated privileges, or supply it as a request -header in AJAX requests. The handler for the URL that receives the request +header in AJAX requests. + +For example, include the CSRF token as a hidden field: + +.. code-block:: html + +
+ + +
+ +Or, include it as a header in a jQuery AJAX request: + +.. code-block:: javascript + + var csrfToken = ${request.session.get_csrf_token()}; + $.ajax({ + type: "POST", + url: "/myview", + headers: { 'X-CSRF-Token': csrfToken } + }).done(function() { + alert("Deleted"); + }); + + +The handler for the URL that receives the request should then require that the correct CSRF token is supplied. Using the ``session.check_csrf_token`` Method @@ -345,6 +370,16 @@ it will return True, otherwise it will raise ``HTTPBadRequest``. By default, it checks for a GET or POST parameter named ``csrf_token`` or a header named ``X-CSRF-Token``. +.. code-block:: python + + def myview(request): + session = request.session + + # Require CSRF Token + session.check_csrf_token(request): + + ... + .. index:: single: session.new_csrf_token @@ -355,6 +390,12 @@ A convenient way to require a valid CSRF Token for a particular view is to include ``check_csrf=True`` as a view predicate. See :meth:`pyramid.config.Configurator.add_route`. +.. code-block:: python + + @view_config(request_method='POST', check_csrf=True, ...) + def myview(request): + ... + Using the ``session.new_csrf_token`` Method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- cgit v1.2.3 From af9e4210d529e0f28f9429a1338a662e5dec153c Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Tue, 4 Jun 2013 22:26:12 -0700 Subject: Update tests to use X-CSRF-Token header --- pyramid/tests/test_session.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyramid/tests/test_session.py b/pyramid/tests/test_session.py index d3bafb26e..35e2b5c27 100644 --- a/pyramid/tests/test_session.py +++ b/pyramid/tests/test_session.py @@ -367,8 +367,8 @@ class Test_check_csrf_token(unittest.TestCase): def test_success_header(self): request = testing.DummyRequest() - request.headers['X-CSRFToken'] = request.session.get_csrf_token() - self.assertEqual(self._callFUT(request, header='X-CSRFToken'), True) + request.headers['X-CSRF-Token'] = request.session.get_csrf_token() + self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True) def test_success_default_token(self): request = testing.DummyRequest() @@ -377,7 +377,7 @@ class Test_check_csrf_token(unittest.TestCase): def test_success_default_header(self): request = testing.DummyRequest() - request.headers['X-CSRFToken'] = request.session.get_csrf_token() + request.headers['X-CSRF-Token'] = request.session.get_csrf_token() self.assertEqual(self._callFUT(request), True) def test_failure_raises(self): -- cgit v1.2.3 From fab8454294b6271c727a0251c78b5f55df5788bf Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Wed, 5 Jun 2013 06:04:45 -0400 Subject: add changelog note --- CHANGES.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index a471addce..6a26879a3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -29,6 +29,11 @@ Features ``initialize_myapp_db etc/development.ini a=1 b=2``. See https://github.com/Pylons/pyramid/pull/911 +- The ``request.session.check_csrf_token()`` method and the ``check_csrf`` view + predicate now take into account the value of the HTTP header named + ``X-CSRF-Token`` (as well as the ``csrf_token`` form parameter, which they + always did). The header is tried when the form parameter does not exist. + Bug Fixes --------- -- cgit v1.2.3 From 05b5925b5341734e068cd40379709c0f330898fa Mon Sep 17 00:00:00 2001 From: Ole Morten Halvorsen Date: Thu, 6 Jun 2013 20:07:08 +1000 Subject: Resources.rst quick typo fix There's 3 keys in the info dict, not two. --- docs/narr/resources.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/narr/resources.rst b/docs/narr/resources.rst index 699a3d4ac..b1bb611e5 100644 --- a/docs/narr/resources.rst +++ b/docs/narr/resources.rst @@ -300,7 +300,7 @@ the resource by :meth:`~pyramid.request.Request.resource_url`. The ``__resource_url__`` hook is passed two arguments: ``request`` and ``info``. ``request`` is the :term:`request` object passed to :meth:`~pyramid.request.Request.resource_url`. ``info`` is a dictionary with -two keys: +the following keys: ``physical_path`` A string representing the "physical path" computed for the resource, as -- cgit v1.2.3 From 050b71c19081d95c1fb8ed57a87fab7fa4dd3ab0 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 11 Jun 2013 13:19:16 -0400 Subject: - ``pyramid.testing.DummyResource`` didn't define ``__bool__``, so code under Python 3 would use ``__len__`` to find truthiness; this usually caused an instance of DummyResource to be "falsy" instead of "truthy". See https://github.com/Pylons/pyramid/pull/1032 Closes #1032 --- CHANGES.txt | 5 +++++ pyramid/testing.py | 2 ++ pyramid/tests/test_testing.py | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 6a26879a3..2c8c6ee46 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -111,6 +111,11 @@ Bug Fixes files have now been removed. See https://github.com/Pylons/pyramid/issues/981 +- ``pyramid.testing.DummyResource`` didn't define ``__bool__``, so code under + Python 3 would use ``__len__`` to find truthiness; this usually caused an + instance of DummyResource to be "falsy" instead of "truthy". See + https://github.com/Pylons/pyramid/pull/1032 + 1.4 (2012-12-18) ================ diff --git a/pyramid/testing.py b/pyramid/testing.py index 06b795f9a..9bd245e4e 100644 --- a/pyramid/testing.py +++ b/pyramid/testing.py @@ -222,6 +222,8 @@ class DummyResource: def __nonzero__(self): return True + __bool__ = __nonzero__ + def __len__(self): return len(self.subs) diff --git a/pyramid/tests/test_testing.py b/pyramid/tests/test_testing.py index 7f14462a2..da57c6301 100644 --- a/pyramid/tests/test_testing.py +++ b/pyramid/tests/test_testing.py @@ -114,6 +114,10 @@ class TestDummyResource(unittest.TestCase): resource = self._makeOne() self.assertEqual(resource.__nonzero__(), True) + def test_bool(self): + resource = self._makeOne() + self.assertEqual(resource.__bool__(), True) + def test_ctor_with__provides__(self): resource = self._makeOne(__provides__=IDummy) self.assertTrue(IDummy.providedBy(resource)) -- cgit v1.2.3 From 28afa3c12d1cd94e1f4385f9493a076c05c13a77 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 09:13:06 -0400 Subject: Tweak. --- MANIFEST.in | 725 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.rst | 4 +- 2 files changed, 727 insertions(+), 2 deletions(-) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..bc89253ce --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,725 @@ +.gitignore +.gitmodules +.travis.yml +BFG_HISTORY.txt +CHANGES.txt +CONTRIBUTORS.txt +COPYRIGHT.txt +HACKING.txt +HISTORY.txt +LICENSE.txt +README.rst +RELEASING.txt +TODO.txt +docs/.gitignore +docs/Makefile +docs/_static/latex-note.png +docs/_static/latex-warning.png +docs/_themes +docs/api/authentication.rst +docs/api/authorization.rst +docs/api/compat.rst +docs/api/config.rst +docs/api/decorator.rst +docs/api/events.rst +docs/api/exceptions.rst +docs/api/httpexceptions.rst +docs/api/i18n.rst +docs/api/interfaces.rst +docs/api/location.rst +docs/api/paster.rst +docs/api/path.rst +docs/api/registry.rst +docs/api/renderers.rst +docs/api/request.rst +docs/api/response.rst +docs/api/scaffolds.rst +docs/api/scripting.rst +docs/api/security.rst +docs/api/session.rst +docs/api/settings.rst +docs/api/static.rst +docs/api/testing.rst +docs/api/threadlocal.rst +docs/api/traversal.rst +docs/api/tweens.rst +docs/api/url.rst +docs/api/view.rst +docs/api/wsgi.rst +docs/authorintro.rst +docs/changes.rst +docs/conf.py +docs/conventions.rst +docs/convert_images.sh +docs/copyright.rst +docs/coversizing.py +docs/designdefense.rst +docs/foreword.rst +docs/glossary.rst +docs/index.rst +docs/latexindex.rst +docs/make_book +docs/make_epub +docs/make_pdf +docs/narr/MyProject/CHANGES.txt +docs/narr/MyProject/MANIFEST.in +docs/narr/MyProject/README.txt +docs/narr/MyProject/development.ini +docs/narr/MyProject/myproject/__init__.py +docs/narr/MyProject/myproject/static/favicon.ico +docs/narr/MyProject/myproject/static/footerbg.png +docs/narr/MyProject/myproject/static/headerbg.png +docs/narr/MyProject/myproject/static/ie6.css +docs/narr/MyProject/myproject/static/middlebg.png +docs/narr/MyProject/myproject/static/pylons.css +docs/narr/MyProject/myproject/static/pyramid-small.png +docs/narr/MyProject/myproject/static/pyramid.png +docs/narr/MyProject/myproject/static/transparent.gif +docs/narr/MyProject/myproject/templates/mytemplate.pt +docs/narr/MyProject/myproject/tests.py +docs/narr/MyProject/myproject/views.py +docs/narr/MyProject/production.ini +docs/narr/MyProject/setup.cfg +docs/narr/MyProject/setup.py +docs/narr/advconfig.rst +docs/narr/assets.rst +docs/narr/commandline.rst +docs/narr/configuration.rst +docs/narr/environment.rst +docs/narr/events.rst +docs/narr/extconfig.rst +docs/narr/extending.rst +docs/narr/firstapp.rst +docs/narr/hellotraversal.py +docs/narr/hellotraversal.rst +docs/narr/helloworld.py +docs/narr/hooks.rst +docs/narr/hybrid.rst +docs/narr/i18n.rst +docs/narr/install.rst +docs/narr/introduction.rst +docs/narr/introspector.rst +docs/narr/logging.rst +docs/narr/muchadoabouttraversal.rst +docs/narr/paste.rst +docs/narr/project-debug.png +docs/narr/project.png +docs/narr/project.rst +docs/narr/renderers.rst +docs/narr/resources.rst +docs/narr/resourcetreetraverser.png +docs/narr/router.png +docs/narr/router.rst +docs/narr/scaffolding.rst +docs/narr/security.rst +docs/narr/sessions.rst +docs/narr/startup.rst +docs/narr/subrequest.rst +docs/narr/tb_introspector.png +docs/narr/templates.rst +docs/narr/testing.rst +docs/narr/threadlocals.rst +docs/narr/traversal.rst +docs/narr/upgrading.rst +docs/narr/urldispatch.rst +docs/narr/vhosting.rst +docs/narr/viewconfig.rst +docs/narr/views.rst +docs/narr/webob.rst +docs/narr/zca.rst +docs/python-3.png +docs/remake +docs/tutorials/.gitignore +docs/tutorials/bfg/index.rst +docs/tutorials/modwsgi/index.rst +docs/tutorials/wiki/NOTE-relocatable.txt +docs/tutorials/wiki/authorization.rst +docs/tutorials/wiki/background.rst +docs/tutorials/wiki/basiclayout.rst +docs/tutorials/wiki/definingmodels.rst +docs/tutorials/wiki/definingviews.rst +docs/tutorials/wiki/design.rst +docs/tutorials/wiki/distributing.rst +docs/tutorials/wiki/index.rst +docs/tutorials/wiki/installation.rst +docs/tutorials/wiki/src/authorization/CHANGES.txt +docs/tutorials/wiki/src/authorization/MANIFEST.in +docs/tutorials/wiki/src/authorization/README.txt +docs/tutorials/wiki/src/authorization/development.ini +docs/tutorials/wiki/src/authorization/production.ini +docs/tutorials/wiki/src/authorization/setup.cfg +docs/tutorials/wiki/src/authorization/setup.py +docs/tutorials/wiki/src/authorization/tutorial/__init__.py +docs/tutorials/wiki/src/authorization/tutorial/models.py +docs/tutorials/wiki/src/authorization/tutorial/security.py +docs/tutorials/wiki/src/authorization/tutorial/static/favicon.ico +docs/tutorials/wiki/src/authorization/tutorial/static/footerbg.png +docs/tutorials/wiki/src/authorization/tutorial/static/headerbg.png +docs/tutorials/wiki/src/authorization/tutorial/static/ie6.css +docs/tutorials/wiki/src/authorization/tutorial/static/middlebg.png +docs/tutorials/wiki/src/authorization/tutorial/static/pylons.css +docs/tutorials/wiki/src/authorization/tutorial/static/pyramid-small.png +docs/tutorials/wiki/src/authorization/tutorial/static/pyramid.png +docs/tutorials/wiki/src/authorization/tutorial/static/transparent.gif +docs/tutorials/wiki/src/authorization/tutorial/templates/edit.pt +docs/tutorials/wiki/src/authorization/tutorial/templates/login.pt +docs/tutorials/wiki/src/authorization/tutorial/templates/mytemplate.pt +docs/tutorials/wiki/src/authorization/tutorial/templates/view.pt +docs/tutorials/wiki/src/authorization/tutorial/tests.py +docs/tutorials/wiki/src/authorization/tutorial/views.py +docs/tutorials/wiki/src/basiclayout/CHANGES.txt +docs/tutorials/wiki/src/basiclayout/MANIFEST.in +docs/tutorials/wiki/src/basiclayout/README.txt +docs/tutorials/wiki/src/basiclayout/development.ini +docs/tutorials/wiki/src/basiclayout/production.ini +docs/tutorials/wiki/src/basiclayout/setup.cfg +docs/tutorials/wiki/src/basiclayout/setup.py +docs/tutorials/wiki/src/basiclayout/tutorial/__init__.py +docs/tutorials/wiki/src/basiclayout/tutorial/models.py +docs/tutorials/wiki/src/basiclayout/tutorial/static/favicon.ico +docs/tutorials/wiki/src/basiclayout/tutorial/static/footerbg.png +docs/tutorials/wiki/src/basiclayout/tutorial/static/headerbg.png +docs/tutorials/wiki/src/basiclayout/tutorial/static/ie6.css +docs/tutorials/wiki/src/basiclayout/tutorial/static/middlebg.png +docs/tutorials/wiki/src/basiclayout/tutorial/static/pylons.css +docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid-small.png +docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid.png +docs/tutorials/wiki/src/basiclayout/tutorial/static/transparent.gif +docs/tutorials/wiki/src/basiclayout/tutorial/templates/mytemplate.pt +docs/tutorials/wiki/src/basiclayout/tutorial/tests.py +docs/tutorials/wiki/src/basiclayout/tutorial/views.py +docs/tutorials/wiki/src/models/CHANGES.txt +docs/tutorials/wiki/src/models/MANIFEST.in +docs/tutorials/wiki/src/models/README.txt +docs/tutorials/wiki/src/models/development.ini +docs/tutorials/wiki/src/models/production.ini +docs/tutorials/wiki/src/models/setup.cfg +docs/tutorials/wiki/src/models/setup.py +docs/tutorials/wiki/src/models/tutorial/__init__.py +docs/tutorials/wiki/src/models/tutorial/models.py +docs/tutorials/wiki/src/models/tutorial/static/favicon.ico +docs/tutorials/wiki/src/models/tutorial/static/footerbg.png +docs/tutorials/wiki/src/models/tutorial/static/headerbg.png +docs/tutorials/wiki/src/models/tutorial/static/ie6.css +docs/tutorials/wiki/src/models/tutorial/static/middlebg.png +docs/tutorials/wiki/src/models/tutorial/static/pylons.css +docs/tutorials/wiki/src/models/tutorial/static/pyramid-small.png +docs/tutorials/wiki/src/models/tutorial/static/pyramid.png +docs/tutorials/wiki/src/models/tutorial/static/transparent.gif +docs/tutorials/wiki/src/models/tutorial/templates/mytemplate.pt +docs/tutorials/wiki/src/models/tutorial/tests.py +docs/tutorials/wiki/src/models/tutorial/views.py +docs/tutorials/wiki/src/tests/CHANGES.txt +docs/tutorials/wiki/src/tests/MANIFEST.in +docs/tutorials/wiki/src/tests/README.txt +docs/tutorials/wiki/src/tests/development.ini +docs/tutorials/wiki/src/tests/production.ini +docs/tutorials/wiki/src/tests/setup.cfg +docs/tutorials/wiki/src/tests/setup.py +docs/tutorials/wiki/src/tests/tutorial/__init__.py +docs/tutorials/wiki/src/tests/tutorial/models.py +docs/tutorials/wiki/src/tests/tutorial/security.py +docs/tutorials/wiki/src/tests/tutorial/static/favicon.ico +docs/tutorials/wiki/src/tests/tutorial/static/footerbg.png +docs/tutorials/wiki/src/tests/tutorial/static/headerbg.png +docs/tutorials/wiki/src/tests/tutorial/static/ie6.css +docs/tutorials/wiki/src/tests/tutorial/static/middlebg.png +docs/tutorials/wiki/src/tests/tutorial/static/pylons.css +docs/tutorials/wiki/src/tests/tutorial/static/pyramid-small.png +docs/tutorials/wiki/src/tests/tutorial/static/pyramid.png +docs/tutorials/wiki/src/tests/tutorial/static/transparent.gif +docs/tutorials/wiki/src/tests/tutorial/templates/edit.pt +docs/tutorials/wiki/src/tests/tutorial/templates/login.pt +docs/tutorials/wiki/src/tests/tutorial/templates/mytemplate.pt +docs/tutorials/wiki/src/tests/tutorial/templates/view.pt +docs/tutorials/wiki/src/tests/tutorial/tests.py +docs/tutorials/wiki/src/tests/tutorial/views.py +docs/tutorials/wiki/src/views/CHANGES.txt +docs/tutorials/wiki/src/views/MANIFEST.in +docs/tutorials/wiki/src/views/README.txt +docs/tutorials/wiki/src/views/development.ini +docs/tutorials/wiki/src/views/production.ini +docs/tutorials/wiki/src/views/setup.cfg +docs/tutorials/wiki/src/views/setup.py +docs/tutorials/wiki/src/views/tutorial/__init__.py +docs/tutorials/wiki/src/views/tutorial/models.py +docs/tutorials/wiki/src/views/tutorial/static/favicon.ico +docs/tutorials/wiki/src/views/tutorial/static/footerbg.png +docs/tutorials/wiki/src/views/tutorial/static/headerbg.png +docs/tutorials/wiki/src/views/tutorial/static/ie6.css +docs/tutorials/wiki/src/views/tutorial/static/middlebg.png +docs/tutorials/wiki/src/views/tutorial/static/pylons.css +docs/tutorials/wiki/src/views/tutorial/static/pyramid-small.png +docs/tutorials/wiki/src/views/tutorial/static/pyramid.png +docs/tutorials/wiki/src/views/tutorial/static/transparent.gif +docs/tutorials/wiki/src/views/tutorial/templates/edit.pt +docs/tutorials/wiki/src/views/tutorial/templates/mytemplate.pt +docs/tutorials/wiki/src/views/tutorial/templates/view.pt +docs/tutorials/wiki/src/views/tutorial/tests.py +docs/tutorials/wiki/src/views/tutorial/views.py +docs/tutorials/wiki/tests.rst +docs/tutorials/wiki2/authorization.rst +docs/tutorials/wiki2/background.rst +docs/tutorials/wiki2/basiclayout.rst +docs/tutorials/wiki2/definingmodels.rst +docs/tutorials/wiki2/definingviews.rst +docs/tutorials/wiki2/design.rst +docs/tutorials/wiki2/distributing.rst +docs/tutorials/wiki2/index.rst +docs/tutorials/wiki2/installation.rst +docs/tutorials/wiki2/src/authorization/CHANGES.txt +docs/tutorials/wiki2/src/authorization/MANIFEST.in +docs/tutorials/wiki2/src/authorization/README.txt +docs/tutorials/wiki2/src/authorization/development.ini +docs/tutorials/wiki2/src/authorization/production.ini +docs/tutorials/wiki2/src/authorization/setup.cfg +docs/tutorials/wiki2/src/authorization/setup.py +docs/tutorials/wiki2/src/authorization/tutorial/__init__.py +docs/tutorials/wiki2/src/authorization/tutorial/models.py +docs/tutorials/wiki2/src/authorization/tutorial/scripts/__init__.py +docs/tutorials/wiki2/src/authorization/tutorial/scripts/initializedb.py +docs/tutorials/wiki2/src/authorization/tutorial/security.py +docs/tutorials/wiki2/src/authorization/tutorial/static/favicon.ico +docs/tutorials/wiki2/src/authorization/tutorial/static/footerbg.png +docs/tutorials/wiki2/src/authorization/tutorial/static/headerbg.png +docs/tutorials/wiki2/src/authorization/tutorial/static/ie6.css +docs/tutorials/wiki2/src/authorization/tutorial/static/middlebg.png +docs/tutorials/wiki2/src/authorization/tutorial/static/pylons.css +docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid-small.png +docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid.png +docs/tutorials/wiki2/src/authorization/tutorial/static/transparent.gif +docs/tutorials/wiki2/src/authorization/tutorial/templates/edit.pt +docs/tutorials/wiki2/src/authorization/tutorial/templates/login.pt +docs/tutorials/wiki2/src/authorization/tutorial/templates/mytemplate.pt +docs/tutorials/wiki2/src/authorization/tutorial/templates/view.pt +docs/tutorials/wiki2/src/authorization/tutorial/tests.py +docs/tutorials/wiki2/src/authorization/tutorial/views.py +docs/tutorials/wiki2/src/basiclayout/CHANGES.txt +docs/tutorials/wiki2/src/basiclayout/MANIFEST.in +docs/tutorials/wiki2/src/basiclayout/README.txt +docs/tutorials/wiki2/src/basiclayout/development.ini +docs/tutorials/wiki2/src/basiclayout/production.ini +docs/tutorials/wiki2/src/basiclayout/setup.cfg +docs/tutorials/wiki2/src/basiclayout/setup.py +docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py +docs/tutorials/wiki2/src/basiclayout/tutorial/models.py +docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/__init__.py +docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py +docs/tutorials/wiki2/src/basiclayout/tutorial/static/favicon.ico +docs/tutorials/wiki2/src/basiclayout/tutorial/static/footerbg.png +docs/tutorials/wiki2/src/basiclayout/tutorial/static/headerbg.png +docs/tutorials/wiki2/src/basiclayout/tutorial/static/ie6.css +docs/tutorials/wiki2/src/basiclayout/tutorial/static/middlebg.png +docs/tutorials/wiki2/src/basiclayout/tutorial/static/pylons.css +docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid-small.png +docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid.png +docs/tutorials/wiki2/src/basiclayout/tutorial/static/transparent.gif +docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.pt +docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py +docs/tutorials/wiki2/src/basiclayout/tutorial/views.py +docs/tutorials/wiki2/src/models/CHANGES.txt +docs/tutorials/wiki2/src/models/MANIFEST.in +docs/tutorials/wiki2/src/models/README.txt +docs/tutorials/wiki2/src/models/development.ini +docs/tutorials/wiki2/src/models/production.ini +docs/tutorials/wiki2/src/models/setup.cfg +docs/tutorials/wiki2/src/models/setup.py +docs/tutorials/wiki2/src/models/tutorial/__init__.py +docs/tutorials/wiki2/src/models/tutorial/models.py +docs/tutorials/wiki2/src/models/tutorial/scripts/__init__.py +docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py +docs/tutorials/wiki2/src/models/tutorial/static/favicon.ico +docs/tutorials/wiki2/src/models/tutorial/static/footerbg.png +docs/tutorials/wiki2/src/models/tutorial/static/headerbg.png +docs/tutorials/wiki2/src/models/tutorial/static/ie6.css +docs/tutorials/wiki2/src/models/tutorial/static/middlebg.png +docs/tutorials/wiki2/src/models/tutorial/static/pylons.css +docs/tutorials/wiki2/src/models/tutorial/static/pyramid-small.png +docs/tutorials/wiki2/src/models/tutorial/static/pyramid.png +docs/tutorials/wiki2/src/models/tutorial/static/transparent.gif +docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.pt +docs/tutorials/wiki2/src/models/tutorial/tests.py +docs/tutorials/wiki2/src/models/tutorial/views.py +docs/tutorials/wiki2/src/tests/CHANGES.txt +docs/tutorials/wiki2/src/tests/MANIFEST.in +docs/tutorials/wiki2/src/tests/README.txt +docs/tutorials/wiki2/src/tests/development.ini +docs/tutorials/wiki2/src/tests/production.ini +docs/tutorials/wiki2/src/tests/setup.cfg +docs/tutorials/wiki2/src/tests/setup.py +docs/tutorials/wiki2/src/tests/tutorial/__init__.py +docs/tutorials/wiki2/src/tests/tutorial/models.py +docs/tutorials/wiki2/src/tests/tutorial/scripts/__init__.py +docs/tutorials/wiki2/src/tests/tutorial/scripts/initializedb.py +docs/tutorials/wiki2/src/tests/tutorial/security.py +docs/tutorials/wiki2/src/tests/tutorial/static/favicon.ico +docs/tutorials/wiki2/src/tests/tutorial/static/footerbg.png +docs/tutorials/wiki2/src/tests/tutorial/static/headerbg.png +docs/tutorials/wiki2/src/tests/tutorial/static/ie6.css +docs/tutorials/wiki2/src/tests/tutorial/static/middlebg.png +docs/tutorials/wiki2/src/tests/tutorial/static/pylons.css +docs/tutorials/wiki2/src/tests/tutorial/static/pyramid-small.png +docs/tutorials/wiki2/src/tests/tutorial/static/pyramid.png +docs/tutorials/wiki2/src/tests/tutorial/static/transparent.gif +docs/tutorials/wiki2/src/tests/tutorial/templates/edit.pt +docs/tutorials/wiki2/src/tests/tutorial/templates/login.pt +docs/tutorials/wiki2/src/tests/tutorial/templates/mytemplate.pt +docs/tutorials/wiki2/src/tests/tutorial/templates/view.pt +docs/tutorials/wiki2/src/tests/tutorial/tests.py +docs/tutorials/wiki2/src/tests/tutorial/views.py +docs/tutorials/wiki2/src/views/CHANGES.txt +docs/tutorials/wiki2/src/views/MANIFEST.in +docs/tutorials/wiki2/src/views/README.txt +docs/tutorials/wiki2/src/views/development.ini +docs/tutorials/wiki2/src/views/production.ini +docs/tutorials/wiki2/src/views/setup.cfg +docs/tutorials/wiki2/src/views/setup.py +docs/tutorials/wiki2/src/views/tutorial/__init__.py +docs/tutorials/wiki2/src/views/tutorial/models.py +docs/tutorials/wiki2/src/views/tutorial/scripts/__init__.py +docs/tutorials/wiki2/src/views/tutorial/scripts/initializedb.py +docs/tutorials/wiki2/src/views/tutorial/static/favicon.ico +docs/tutorials/wiki2/src/views/tutorial/static/footerbg.png +docs/tutorials/wiki2/src/views/tutorial/static/headerbg.png +docs/tutorials/wiki2/src/views/tutorial/static/ie6.css +docs/tutorials/wiki2/src/views/tutorial/static/middlebg.png +docs/tutorials/wiki2/src/views/tutorial/static/pylons.css +docs/tutorials/wiki2/src/views/tutorial/static/pyramid-small.png +docs/tutorials/wiki2/src/views/tutorial/static/pyramid.png +docs/tutorials/wiki2/src/views/tutorial/static/transparent.gif +docs/tutorials/wiki2/src/views/tutorial/templates/edit.pt +docs/tutorials/wiki2/src/views/tutorial/templates/mytemplate.pt +docs/tutorials/wiki2/src/views/tutorial/templates/view.pt +docs/tutorials/wiki2/src/views/tutorial/tests.py +docs/tutorials/wiki2/src/views/tutorial/views.py +docs/tutorials/wiki2/tests.rst +docs/whatsnew-1.0.rst +docs/whatsnew-1.1.rst +docs/whatsnew-1.2.rst +docs/whatsnew-1.3.rst +docs/whatsnew-1.4.rst +pyramid/__init__.py +pyramid/asset.py +pyramid/authentication.py +pyramid/authorization.py +pyramid/chameleon_text.py +pyramid/chameleon_zpt.py +pyramid/compat.py +pyramid/config/__init__.py +pyramid/config/adapters.py +pyramid/config/assets.py +pyramid/config/factories.py +pyramid/config/i18n.py +pyramid/config/predicates.py +pyramid/config/rendering.py +pyramid/config/routes.py +pyramid/config/security.py +pyramid/config/settings.py +pyramid/config/testing.py +pyramid/config/tweens.py +pyramid/config/util.py +pyramid/config/views.py +pyramid/config/zca.py +pyramid/decorator.py +pyramid/encode.py +pyramid/events.py +pyramid/exceptions.py +pyramid/fixers/__init__.py +pyramid/fixers/fix_bfg_imports.py +pyramid/httpexceptions.py +pyramid/i18n.py +pyramid/interfaces.py +pyramid/location.py +pyramid/mako_templating.py +pyramid/paster.py +pyramid/path.py +pyramid/registry.py +pyramid/renderers.py +pyramid/request.py +pyramid/resource.py +pyramid/response.py +pyramid/router.py +pyramid/scaffolds/__init__.py +pyramid/scaffolds/alchemy/+package+/__init__.py +pyramid/scaffolds/alchemy/+package+/models.py +pyramid/scaffolds/alchemy/+package+/scripts/__init__.py +pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py +pyramid/scaffolds/alchemy/+package+/static/favicon.ico +pyramid/scaffolds/alchemy/+package+/static/footerbg.png +pyramid/scaffolds/alchemy/+package+/static/headerbg.png +pyramid/scaffolds/alchemy/+package+/static/ie6.css +pyramid/scaffolds/alchemy/+package+/static/middlebg.png +pyramid/scaffolds/alchemy/+package+/static/pylons.css +pyramid/scaffolds/alchemy/+package+/static/pyramid-small.png +pyramid/scaffolds/alchemy/+package+/static/pyramid.png +pyramid/scaffolds/alchemy/+package+/static/transparent.gif +pyramid/scaffolds/alchemy/+package+/templates/mytemplate.pt_tmpl +pyramid/scaffolds/alchemy/+package+/tests.py_tmpl +pyramid/scaffolds/alchemy/+package+/views.py_tmpl +pyramid/scaffolds/alchemy/CHANGES.txt_tmpl +pyramid/scaffolds/alchemy/MANIFEST.in_tmpl +pyramid/scaffolds/alchemy/README.txt_tmpl +pyramid/scaffolds/alchemy/development.ini_tmpl +pyramid/scaffolds/alchemy/production.ini_tmpl +pyramid/scaffolds/alchemy/setup.cfg_tmpl +pyramid/scaffolds/alchemy/setup.py_tmpl +pyramid/scaffolds/copydir.py +pyramid/scaffolds/starter/+package+/__init__.py +pyramid/scaffolds/starter/+package+/static/favicon.ico +pyramid/scaffolds/starter/+package+/static/footerbg.png +pyramid/scaffolds/starter/+package+/static/headerbg.png +pyramid/scaffolds/starter/+package+/static/ie6.css +pyramid/scaffolds/starter/+package+/static/middlebg.png +pyramid/scaffolds/starter/+package+/static/pylons.css +pyramid/scaffolds/starter/+package+/static/pyramid-small.png +pyramid/scaffolds/starter/+package+/static/pyramid.png +pyramid/scaffolds/starter/+package+/static/transparent.gif +pyramid/scaffolds/starter/+package+/templates/mytemplate.pt_tmpl +pyramid/scaffolds/starter/+package+/tests.py_tmpl +pyramid/scaffolds/starter/+package+/views.py_tmpl +pyramid/scaffolds/starter/CHANGES.txt_tmpl +pyramid/scaffolds/starter/MANIFEST.in_tmpl +pyramid/scaffolds/starter/README.txt_tmpl +pyramid/scaffolds/starter/development.ini_tmpl +pyramid/scaffolds/starter/production.ini_tmpl +pyramid/scaffolds/starter/setup.cfg_tmpl +pyramid/scaffolds/starter/setup.py_tmpl +pyramid/scaffolds/template.py +pyramid/scaffolds/tests.py +pyramid/scaffolds/zodb/+package+/__init__.py +pyramid/scaffolds/zodb/+package+/models.py +pyramid/scaffolds/zodb/+package+/static/favicon.ico +pyramid/scaffolds/zodb/+package+/static/footerbg.png +pyramid/scaffolds/zodb/+package+/static/headerbg.png +pyramid/scaffolds/zodb/+package+/static/ie6.css +pyramid/scaffolds/zodb/+package+/static/middlebg.png +pyramid/scaffolds/zodb/+package+/static/pylons.css +pyramid/scaffolds/zodb/+package+/static/pyramid-small.png +pyramid/scaffolds/zodb/+package+/static/pyramid.png +pyramid/scaffolds/zodb/+package+/static/transparent.gif +pyramid/scaffolds/zodb/+package+/templates/mytemplate.pt +pyramid/scaffolds/zodb/+package+/tests.py_tmpl +pyramid/scaffolds/zodb/+package+/views.py_tmpl +pyramid/scaffolds/zodb/CHANGES.txt_tmpl +pyramid/scaffolds/zodb/MANIFEST.in_tmpl +pyramid/scaffolds/zodb/README.txt_tmpl +pyramid/scaffolds/zodb/development.ini_tmpl +pyramid/scaffolds/zodb/production.ini_tmpl +pyramid/scaffolds/zodb/setup.cfg_tmpl +pyramid/scaffolds/zodb/setup.py_tmpl +pyramid/scripting.py +pyramid/scripts/__init__.py +pyramid/scripts/common.py +pyramid/scripts/pcreate.py +pyramid/scripts/prequest.py +pyramid/scripts/proutes.py +pyramid/scripts/pserve.py +pyramid/scripts/pshell.py +pyramid/scripts/ptweens.py +pyramid/scripts/pviews.py +pyramid/security.py +pyramid/session.py +pyramid/settings.py +pyramid/static.py +pyramid/testing.py +pyramid/tests/__init__.py +pyramid/tests/fixtures/components.mak +pyramid/tests/fixtures/dummy.ini +pyramid/tests/fixtures/hello .world.mako +pyramid/tests/fixtures/hello_inherit_pkg.mak +pyramid/tests/fixtures/hellocompo.mak +pyramid/tests/fixtures/helloinherit.mak +pyramid/tests/fixtures/helloworld.mak +pyramid/tests/fixtures/helloworld.mako +pyramid/tests/fixtures/layout.mak +pyramid/tests/fixtures/minimal.pt +pyramid/tests/fixtures/minimal.txt +pyramid/tests/fixtures/nonminimal.mak +pyramid/tests/fixtures/nonminimal.txt +pyramid/tests/fixtures/pp.pt +pyramid/tests/fixtures/static/.hiddenfile +pyramid/tests/fixtures/static/arcs.svg.tgz +pyramid/tests/fixtures/static/index.html +pyramid/tests/fixtures/static/subdir/index.html +pyramid/tests/fixtures/withmacro.pt +pyramid/tests/pkgs/__init__.py +pyramid/tests/pkgs/ccbugapp/__init__.py +pyramid/tests/pkgs/conflictapp/__init__.py +pyramid/tests/pkgs/conflictapp/included.py +pyramid/tests/pkgs/defpermbugapp/__init__.py +pyramid/tests/pkgs/eventonly/__init__.py +pyramid/tests/pkgs/exceptionviewapp/__init__.py +pyramid/tests/pkgs/exceptionviewapp/models.py +pyramid/tests/pkgs/exceptionviewapp/views.py +pyramid/tests/pkgs/fixtureapp/__init__.py +pyramid/tests/pkgs/fixtureapp/models.py +pyramid/tests/pkgs/fixtureapp/subpackage/__init__.py +pyramid/tests/pkgs/fixtureapp/subpackage/templates/bar.pt +pyramid/tests/pkgs/fixtureapp/templates/fixture.pt +pyramid/tests/pkgs/fixtureapp/views.py +pyramid/tests/pkgs/forbiddenapp/__init__.py +pyramid/tests/pkgs/forbiddenview/__init__.py +pyramid/tests/pkgs/hybridapp/__init__.py +pyramid/tests/pkgs/hybridapp/views.py +pyramid/tests/pkgs/includeapp1/__init__.py +pyramid/tests/pkgs/includeapp1/root.py +pyramid/tests/pkgs/includeapp1/three.py +pyramid/tests/pkgs/includeapp1/two.py +pyramid/tests/pkgs/localeapp/__init__.py +pyramid/tests/pkgs/localeapp/locale/GARBAGE +pyramid/tests/pkgs/localeapp/locale/be/LC_MESSAGES +pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale2/GARBAGE +pyramid/tests/pkgs/localeapp/locale2/be/LC_MESSAGES +pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale3/GARBAGE +pyramid/tests/pkgs/localeapp/locale3/be/LC_MESSAGES +pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.mo +pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.po +pyramid/tests/pkgs/notfoundview/__init__.py +pyramid/tests/pkgs/permbugapp/__init__.py +pyramid/tests/pkgs/rendererscanapp/__init__.py +pyramid/tests/pkgs/rendererscanapp/one.pt +pyramid/tests/pkgs/rendererscanapp/two/__init__.py +pyramid/tests/pkgs/rendererscanapp/two/two.pt +pyramid/tests/pkgs/restbugapp/__init__.py +pyramid/tests/pkgs/restbugapp/views.py +pyramid/tests/pkgs/static_abspath/__init__.py +pyramid/tests/pkgs/static_assetspec/__init__.py +pyramid/tests/pkgs/static_routeprefix/__init__.py +pyramid/tests/pkgs/staticpermapp/__init__.py +pyramid/tests/pkgs/subrequestapp/__init__.py +pyramid/tests/pkgs/viewdecoratorapp/__init__.py +pyramid/tests/pkgs/viewdecoratorapp/views/__init__.py +pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt +pyramid/tests/pkgs/viewdecoratorapp/views/views.py +pyramid/tests/pkgs/wsgiapp2app/__init__.py +pyramid/tests/test_asset.py +pyramid/tests/test_authentication.py +pyramid/tests/test_authorization.py +pyramid/tests/test_chameleon_text.py +pyramid/tests/test_chameleon_zpt.py +pyramid/tests/test_config/__init__.py +pyramid/tests/test_config/files/assets/dummy.txt +pyramid/tests/test_config/files/minimal.pt +pyramid/tests/test_config/path/scanerror/__init__.py +pyramid/tests/test_config/path/scanerror/will_raise_error.py +pyramid/tests/test_config/pkgs/__init__.py +pyramid/tests/test_config/pkgs/asset/__init__.py +pyramid/tests/test_config/pkgs/asset/models.py +pyramid/tests/test_config/pkgs/asset/subpackage/__init__.py +pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt +pyramid/tests/test_config/pkgs/asset/templates/fixture.pt +pyramid/tests/test_config/pkgs/asset/views.py +pyramid/tests/test_config/pkgs/scanextrakw/__init__.py +pyramid/tests/test_config/pkgs/scannable/__init__.py +pyramid/tests/test_config/pkgs/scannable/another.py +pyramid/tests/test_config/pkgs/scannable/pod/notinit.py +pyramid/tests/test_config/pkgs/scannable/subpackage/__init__.py +pyramid/tests/test_config/pkgs/scannable/subpackage/notinit.py +pyramid/tests/test_config/pkgs/scannable/subpackage/subsubpackage/__init__.py +pyramid/tests/test_config/pkgs/selfscan/__init__.py +pyramid/tests/test_config/pkgs/selfscan/another.py +pyramid/tests/test_config/test_adapters.py +pyramid/tests/test_config/test_assets.py +pyramid/tests/test_config/test_factories.py +pyramid/tests/test_config/test_i18n.py +pyramid/tests/test_config/test_init.py +pyramid/tests/test_config/test_predicates.py +pyramid/tests/test_config/test_rendering.py +pyramid/tests/test_config/test_routes.py +pyramid/tests/test_config/test_security.py +pyramid/tests/test_config/test_settings.py +pyramid/tests/test_config/test_testing.py +pyramid/tests/test_config/test_tweens.py +pyramid/tests/test_config/test_util.py +pyramid/tests/test_config/test_views.py +pyramid/tests/test_decorator.py +pyramid/tests/test_docs.py +pyramid/tests/test_encode.py +pyramid/tests/test_events.py +pyramid/tests/test_exceptions.py +pyramid/tests/test_httpexceptions.py +pyramid/tests/test_i18n.py +pyramid/tests/test_integration.py +pyramid/tests/test_location.py +pyramid/tests/test_mako_templating.py +pyramid/tests/test_paster.py +pyramid/tests/test_path.py +pyramid/tests/test_registry.py +pyramid/tests/test_renderers.py +pyramid/tests/test_request.py +pyramid/tests/test_response.py +pyramid/tests/test_router.py +pyramid/tests/test_scaffolds/__init__.py +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/__init__.py_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/resources.py +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/favicon.ico +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/footerbg.png +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/headerbg.png +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/ie6.css +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/middlebg.png +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pylons.css +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid-small.png +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid.png +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/transparent.gif +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/templates/mytemplate.pt_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/tests.py_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/+package+/views.py_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/CHANGES.txt_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/MANIFEST.in_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/README.txt_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/development.ini_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/production.ini_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/setup.cfg_tmpl +pyramid/tests/test_scaffolds/fixture_scaffold/setup.py_tmpl +pyramid/tests/test_scaffolds/test_copydir.py +pyramid/tests/test_scaffolds/test_init.py +pyramid/tests/test_scaffolds/test_template.py +pyramid/tests/test_scripting.py +pyramid/tests/test_scripts/__init__.py +pyramid/tests/test_scripts/dummy.py +pyramid/tests/test_scripts/test_common.py +pyramid/tests/test_scripts/test_pcreate.py +pyramid/tests/test_scripts/test_prequest.py +pyramid/tests/test_scripts/test_proutes.py +pyramid/tests/test_scripts/test_pserve.py +pyramid/tests/test_scripts/test_pshell.py +pyramid/tests/test_scripts/test_ptweens.py +pyramid/tests/test_scripts/test_pviews.py +pyramid/tests/test_security.py +pyramid/tests/test_session.py +pyramid/tests/test_settings.py +pyramid/tests/test_static.py +pyramid/tests/test_testing.py +pyramid/tests/test_threadlocal.py +pyramid/tests/test_traversal.py +pyramid/tests/test_url.py +pyramid/tests/test_urldispatch.py +pyramid/tests/test_util.py +pyramid/tests/test_view.py +pyramid/tests/test_wsgi.py +pyramid/threadlocal.py +pyramid/traversal.py +pyramid/tweens.py +pyramid/url.py +pyramid/urldispatch.py +pyramid/util.py +pyramid/view.py +pyramid/wsgi.py +rtd.txt +setup.cfg +setup.py +tox.ini diff --git a/README.rst b/README.rst index 4d427a13d..a3458028b 100644 --- a/README.rst +++ b/README.rst @@ -1,8 +1,8 @@ Pyramid ======= -Pyramid is a small, fast, down-to-earth, open source Python web application -development framework. It makes real-world web application development and +Pyramid is a small, fast, down-to-earth, open source Python web framework. +It makes real-world web application development and deployment more fun, more predictable, and more productive. Pyramid is produced by the `Pylons Project `_. -- cgit v1.2.3 From cb8bb94941299269d8b29ff7ae08064f4483a07f Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 09:21:18 -0400 Subject: Trigger --- .travis.yml | 1 + MANIFEST.in | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index ab9c3ff30..00c293046 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +# Wire up travis language: python python: diff --git a/MANIFEST.in b/MANIFEST.in index bc89253ce..6ac6051c7 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -8,6 +8,7 @@ COPYRIGHT.txt HACKING.txt HISTORY.txt LICENSE.txt +MANIFEST.in README.rst RELEASING.txt TODO.txt -- cgit v1.2.3 From cd9d7f5b3b087cb151052315ec6decf9e4786475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Araujo?= Date: Wed, 19 Jun 2013 12:57:26 -0400 Subject: Add support for PUT and PATCH in prequest (#877) --- pyramid/scripts/prequest.py | 6 +++--- pyramid/tests/test_scripts/test_prequest.py | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/pyramid/scripts/prequest.py b/pyramid/scripts/prequest.py index da6b8cc14..82380b8ca 100644 --- a/pyramid/scripts/prequest.py +++ b/pyramid/scripts/prequest.py @@ -59,9 +59,9 @@ class PRequestCommand(object): parser.add_option( '-m', '--method', dest='method', - choices=['GET', 'HEAD', 'POST', 'DELETE'], + choices=['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'], type='choice', - help='Request method type (GET, POST, DELETE)', + help='Request method type', ) get_app = staticmethod(get_app) @@ -127,7 +127,7 @@ class PRequestCommand(object): 'paste.command_request': True, } - if request_method == 'POST': + if request_method in ('POST', 'PUT', 'PATCH'): environ['wsgi.input'] = self.stdin environ['CONTENT_LENGTH'] = '-1' diff --git a/pyramid/tests/test_scripts/test_prequest.py b/pyramid/tests/test_scripts/test_prequest.py index 91d2b322a..64a7c3045 100644 --- a/pyramid/tests/test_scripts/test_prequest.py +++ b/pyramid/tests/test_scripts/test_prequest.py @@ -114,6 +114,32 @@ class TestPRequestCommand(unittest.TestCase): self.assertEqual(self._app_name, None) self.assertEqual(self._out, ['abc']) + def test_command_method_put(self): + from pyramid.compat import NativeIO + command = self._makeOne(['', '--method=PUT', 'development.ini', '/']) + stdin = NativeIO() + command.stdin = stdin + command.run() + self.assertEqual(self._environ['CONTENT_LENGTH'], '-1') + self.assertEqual(self._environ['wsgi.input'], stdin) + self.assertEqual(self._path_info, '/') + self.assertEqual(self._spec, 'development.ini') + self.assertEqual(self._app_name, None) + self.assertEqual(self._out, ['abc']) + + def test_command_method_patch(self): + from pyramid.compat import NativeIO + command = self._makeOne(['', '--method=PATCH', 'development.ini', '/']) + stdin = NativeIO() + command.stdin = stdin + command.run() + self.assertEqual(self._environ['CONTENT_LENGTH'], '-1') + self.assertEqual(self._environ['wsgi.input'], stdin) + self.assertEqual(self._path_info, '/') + self.assertEqual(self._spec, 'development.ini') + self.assertEqual(self._app_name, None) + self.assertEqual(self._out, ['abc']) + def test_command_with_query_string(self): command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c']) command.run() -- cgit v1.2.3 From 1a1756542d2b259f48b9f8959277f2151ccee7ed Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 15:46:52 -0400 Subject: Trailing whitespace. --- pyramid/scripts/prequest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyramid/scripts/prequest.py b/pyramid/scripts/prequest.py index da6b8cc14..024f98e5e 100644 --- a/pyramid/scripts/prequest.py +++ b/pyramid/scripts/prequest.py @@ -110,9 +110,9 @@ class PRequestCommand(object): environ = { 'REQUEST_METHOD': request_method, 'SCRIPT_NAME': '', # may be empty if app is at the root - 'PATH_INFO': path, + 'PATH_INFO': path, 'SERVER_NAME': 'localhost', # always mandatory - 'SERVER_PORT': '80', # always mandatory + 'SERVER_PORT': '80', # always mandatory 'SERVER_PROTOCOL': 'HTTP/1.0', 'CONTENT_TYPE': 'text/plain', 'REMOTE_ADDR':'127.0.0.1', -- cgit v1.2.3 From bd6922d41d23a48aa18fc50522155d99dd90f763 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 15:48:57 -0400 Subject: Update docstring to show PUT / PATCH usage. --- pyramid/scripts/prequest.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pyramid/scripts/prequest.py b/pyramid/scripts/prequest.py index d1ef9fa83..3d8921b15 100644 --- a/pyramid/scripts/prequest.py +++ b/pyramid/scripts/prequest.py @@ -18,9 +18,16 @@ class PRequestCommand(object): This command makes an artifical request to a web application that uses a PasteDeploy (.ini) configuration file for the server and application. - Use "prequest config.ini /path" to request "/path". Use "prequest - --method=POST config.ini /path < data" to do a POST with the given - request body. + Use "prequest config.ini /path" to request "/path". + + Use "prequest --method=POST config.ini /path < data" to do a POST with + the given request body. + + Use "prequest --method=PUT config.ini /path < data" to do a + PUT with the given request body. + + Use "prequest --method=PATCH config.ini /path < data" to do a + PATCH with the given request body. If the path is relative (doesn't begin with "/") it is interpreted as relative to "/". The path passed to this script should be URL-quoted. -- cgit v1.2.3 From f0f92b0d2f09922699e2cf8ab034c3e6517e169d Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 15:55:51 -0400 Subject: Changelog for PR #1033. --- CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 2c8c6ee46..082b51c41 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,9 @@ next release Features -------- +- ``scripts/prequrest.py``: add support for submitting ``PUT`` and ``PATCH`` + requests. See https://github.com/Pylons/pyramid/pull/1033. + - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This removes the ambiguity between the potential ``AttributeError`` that would be raised on the ``context`` when the property was not defined and the -- cgit v1.2.3 From 9e6c8c66aaec13e5c4868f3101b2459f56c2e0c4 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Wed, 19 Jun 2013 16:20:46 -0400 Subject: Typo --- CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 082b51c41..ba8aae559 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,7 +4,7 @@ next release Features -------- -- ``scripts/prequrest.py``: add support for submitting ``PUT`` and ``PATCH`` +- ``scripts/prequest.py``: add support for submitting ``PUT`` and ``PATCH`` requests. See https://github.com/Pylons/pyramid/pull/1033. - ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This -- cgit v1.2.3 From d59440878b67b65e57c91c7b4aa8e7cbf943a729 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 1 Jul 2013 19:00:24 -0400 Subject: Tres committed this by mistake --- MANIFEST.in | 726 ------------------------------------------------------------ 1 file changed, 726 deletions(-) delete mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 6ac6051c7..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,726 +0,0 @@ -.gitignore -.gitmodules -.travis.yml -BFG_HISTORY.txt -CHANGES.txt -CONTRIBUTORS.txt -COPYRIGHT.txt -HACKING.txt -HISTORY.txt -LICENSE.txt -MANIFEST.in -README.rst -RELEASING.txt -TODO.txt -docs/.gitignore -docs/Makefile -docs/_static/latex-note.png -docs/_static/latex-warning.png -docs/_themes -docs/api/authentication.rst -docs/api/authorization.rst -docs/api/compat.rst -docs/api/config.rst -docs/api/decorator.rst -docs/api/events.rst -docs/api/exceptions.rst -docs/api/httpexceptions.rst -docs/api/i18n.rst -docs/api/interfaces.rst -docs/api/location.rst -docs/api/paster.rst -docs/api/path.rst -docs/api/registry.rst -docs/api/renderers.rst -docs/api/request.rst -docs/api/response.rst -docs/api/scaffolds.rst -docs/api/scripting.rst -docs/api/security.rst -docs/api/session.rst -docs/api/settings.rst -docs/api/static.rst -docs/api/testing.rst -docs/api/threadlocal.rst -docs/api/traversal.rst -docs/api/tweens.rst -docs/api/url.rst -docs/api/view.rst -docs/api/wsgi.rst -docs/authorintro.rst -docs/changes.rst -docs/conf.py -docs/conventions.rst -docs/convert_images.sh -docs/copyright.rst -docs/coversizing.py -docs/designdefense.rst -docs/foreword.rst -docs/glossary.rst -docs/index.rst -docs/latexindex.rst -docs/make_book -docs/make_epub -docs/make_pdf -docs/narr/MyProject/CHANGES.txt -docs/narr/MyProject/MANIFEST.in -docs/narr/MyProject/README.txt -docs/narr/MyProject/development.ini -docs/narr/MyProject/myproject/__init__.py -docs/narr/MyProject/myproject/static/favicon.ico -docs/narr/MyProject/myproject/static/footerbg.png -docs/narr/MyProject/myproject/static/headerbg.png -docs/narr/MyProject/myproject/static/ie6.css -docs/narr/MyProject/myproject/static/middlebg.png -docs/narr/MyProject/myproject/static/pylons.css -docs/narr/MyProject/myproject/static/pyramid-small.png -docs/narr/MyProject/myproject/static/pyramid.png -docs/narr/MyProject/myproject/static/transparent.gif -docs/narr/MyProject/myproject/templates/mytemplate.pt -docs/narr/MyProject/myproject/tests.py -docs/narr/MyProject/myproject/views.py -docs/narr/MyProject/production.ini -docs/narr/MyProject/setup.cfg -docs/narr/MyProject/setup.py -docs/narr/advconfig.rst -docs/narr/assets.rst -docs/narr/commandline.rst -docs/narr/configuration.rst -docs/narr/environment.rst -docs/narr/events.rst -docs/narr/extconfig.rst -docs/narr/extending.rst -docs/narr/firstapp.rst -docs/narr/hellotraversal.py -docs/narr/hellotraversal.rst -docs/narr/helloworld.py -docs/narr/hooks.rst -docs/narr/hybrid.rst -docs/narr/i18n.rst -docs/narr/install.rst -docs/narr/introduction.rst -docs/narr/introspector.rst -docs/narr/logging.rst -docs/narr/muchadoabouttraversal.rst -docs/narr/paste.rst -docs/narr/project-debug.png -docs/narr/project.png -docs/narr/project.rst -docs/narr/renderers.rst -docs/narr/resources.rst -docs/narr/resourcetreetraverser.png -docs/narr/router.png -docs/narr/router.rst -docs/narr/scaffolding.rst -docs/narr/security.rst -docs/narr/sessions.rst -docs/narr/startup.rst -docs/narr/subrequest.rst -docs/narr/tb_introspector.png -docs/narr/templates.rst -docs/narr/testing.rst -docs/narr/threadlocals.rst -docs/narr/traversal.rst -docs/narr/upgrading.rst -docs/narr/urldispatch.rst -docs/narr/vhosting.rst -docs/narr/viewconfig.rst -docs/narr/views.rst -docs/narr/webob.rst -docs/narr/zca.rst -docs/python-3.png -docs/remake -docs/tutorials/.gitignore -docs/tutorials/bfg/index.rst -docs/tutorials/modwsgi/index.rst -docs/tutorials/wiki/NOTE-relocatable.txt -docs/tutorials/wiki/authorization.rst -docs/tutorials/wiki/background.rst -docs/tutorials/wiki/basiclayout.rst -docs/tutorials/wiki/definingmodels.rst -docs/tutorials/wiki/definingviews.rst -docs/tutorials/wiki/design.rst -docs/tutorials/wiki/distributing.rst -docs/tutorials/wiki/index.rst -docs/tutorials/wiki/installation.rst -docs/tutorials/wiki/src/authorization/CHANGES.txt -docs/tutorials/wiki/src/authorization/MANIFEST.in -docs/tutorials/wiki/src/authorization/README.txt -docs/tutorials/wiki/src/authorization/development.ini -docs/tutorials/wiki/src/authorization/production.ini -docs/tutorials/wiki/src/authorization/setup.cfg -docs/tutorials/wiki/src/authorization/setup.py -docs/tutorials/wiki/src/authorization/tutorial/__init__.py -docs/tutorials/wiki/src/authorization/tutorial/models.py -docs/tutorials/wiki/src/authorization/tutorial/security.py -docs/tutorials/wiki/src/authorization/tutorial/static/favicon.ico -docs/tutorials/wiki/src/authorization/tutorial/static/footerbg.png -docs/tutorials/wiki/src/authorization/tutorial/static/headerbg.png -docs/tutorials/wiki/src/authorization/tutorial/static/ie6.css -docs/tutorials/wiki/src/authorization/tutorial/static/middlebg.png -docs/tutorials/wiki/src/authorization/tutorial/static/pylons.css -docs/tutorials/wiki/src/authorization/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/authorization/tutorial/static/pyramid.png -docs/tutorials/wiki/src/authorization/tutorial/static/transparent.gif -docs/tutorials/wiki/src/authorization/tutorial/templates/edit.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/login.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/authorization/tutorial/templates/view.pt -docs/tutorials/wiki/src/authorization/tutorial/tests.py -docs/tutorials/wiki/src/authorization/tutorial/views.py -docs/tutorials/wiki/src/basiclayout/CHANGES.txt -docs/tutorials/wiki/src/basiclayout/MANIFEST.in -docs/tutorials/wiki/src/basiclayout/README.txt -docs/tutorials/wiki/src/basiclayout/development.ini -docs/tutorials/wiki/src/basiclayout/production.ini -docs/tutorials/wiki/src/basiclayout/setup.cfg -docs/tutorials/wiki/src/basiclayout/setup.py -docs/tutorials/wiki/src/basiclayout/tutorial/__init__.py -docs/tutorials/wiki/src/basiclayout/tutorial/models.py -docs/tutorials/wiki/src/basiclayout/tutorial/static/favicon.ico -docs/tutorials/wiki/src/basiclayout/tutorial/static/footerbg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/headerbg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/ie6.css -docs/tutorials/wiki/src/basiclayout/tutorial/static/middlebg.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/pylons.css -docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/pyramid.png -docs/tutorials/wiki/src/basiclayout/tutorial/static/transparent.gif -docs/tutorials/wiki/src/basiclayout/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/basiclayout/tutorial/tests.py -docs/tutorials/wiki/src/basiclayout/tutorial/views.py -docs/tutorials/wiki/src/models/CHANGES.txt -docs/tutorials/wiki/src/models/MANIFEST.in -docs/tutorials/wiki/src/models/README.txt -docs/tutorials/wiki/src/models/development.ini -docs/tutorials/wiki/src/models/production.ini -docs/tutorials/wiki/src/models/setup.cfg -docs/tutorials/wiki/src/models/setup.py -docs/tutorials/wiki/src/models/tutorial/__init__.py -docs/tutorials/wiki/src/models/tutorial/models.py -docs/tutorials/wiki/src/models/tutorial/static/favicon.ico -docs/tutorials/wiki/src/models/tutorial/static/footerbg.png -docs/tutorials/wiki/src/models/tutorial/static/headerbg.png -docs/tutorials/wiki/src/models/tutorial/static/ie6.css -docs/tutorials/wiki/src/models/tutorial/static/middlebg.png -docs/tutorials/wiki/src/models/tutorial/static/pylons.css -docs/tutorials/wiki/src/models/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/models/tutorial/static/pyramid.png -docs/tutorials/wiki/src/models/tutorial/static/transparent.gif -docs/tutorials/wiki/src/models/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/models/tutorial/tests.py -docs/tutorials/wiki/src/models/tutorial/views.py -docs/tutorials/wiki/src/tests/CHANGES.txt -docs/tutorials/wiki/src/tests/MANIFEST.in -docs/tutorials/wiki/src/tests/README.txt -docs/tutorials/wiki/src/tests/development.ini -docs/tutorials/wiki/src/tests/production.ini -docs/tutorials/wiki/src/tests/setup.cfg -docs/tutorials/wiki/src/tests/setup.py -docs/tutorials/wiki/src/tests/tutorial/__init__.py -docs/tutorials/wiki/src/tests/tutorial/models.py -docs/tutorials/wiki/src/tests/tutorial/security.py -docs/tutorials/wiki/src/tests/tutorial/static/favicon.ico -docs/tutorials/wiki/src/tests/tutorial/static/footerbg.png -docs/tutorials/wiki/src/tests/tutorial/static/headerbg.png -docs/tutorials/wiki/src/tests/tutorial/static/ie6.css -docs/tutorials/wiki/src/tests/tutorial/static/middlebg.png -docs/tutorials/wiki/src/tests/tutorial/static/pylons.css -docs/tutorials/wiki/src/tests/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/tests/tutorial/static/pyramid.png -docs/tutorials/wiki/src/tests/tutorial/static/transparent.gif -docs/tutorials/wiki/src/tests/tutorial/templates/edit.pt -docs/tutorials/wiki/src/tests/tutorial/templates/login.pt -docs/tutorials/wiki/src/tests/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/tests/tutorial/templates/view.pt -docs/tutorials/wiki/src/tests/tutorial/tests.py -docs/tutorials/wiki/src/tests/tutorial/views.py -docs/tutorials/wiki/src/views/CHANGES.txt -docs/tutorials/wiki/src/views/MANIFEST.in -docs/tutorials/wiki/src/views/README.txt -docs/tutorials/wiki/src/views/development.ini -docs/tutorials/wiki/src/views/production.ini -docs/tutorials/wiki/src/views/setup.cfg -docs/tutorials/wiki/src/views/setup.py -docs/tutorials/wiki/src/views/tutorial/__init__.py -docs/tutorials/wiki/src/views/tutorial/models.py -docs/tutorials/wiki/src/views/tutorial/static/favicon.ico -docs/tutorials/wiki/src/views/tutorial/static/footerbg.png -docs/tutorials/wiki/src/views/tutorial/static/headerbg.png -docs/tutorials/wiki/src/views/tutorial/static/ie6.css -docs/tutorials/wiki/src/views/tutorial/static/middlebg.png -docs/tutorials/wiki/src/views/tutorial/static/pylons.css -docs/tutorials/wiki/src/views/tutorial/static/pyramid-small.png -docs/tutorials/wiki/src/views/tutorial/static/pyramid.png -docs/tutorials/wiki/src/views/tutorial/static/transparent.gif -docs/tutorials/wiki/src/views/tutorial/templates/edit.pt -docs/tutorials/wiki/src/views/tutorial/templates/mytemplate.pt -docs/tutorials/wiki/src/views/tutorial/templates/view.pt -docs/tutorials/wiki/src/views/tutorial/tests.py -docs/tutorials/wiki/src/views/tutorial/views.py -docs/tutorials/wiki/tests.rst -docs/tutorials/wiki2/authorization.rst -docs/tutorials/wiki2/background.rst -docs/tutorials/wiki2/basiclayout.rst -docs/tutorials/wiki2/definingmodels.rst -docs/tutorials/wiki2/definingviews.rst -docs/tutorials/wiki2/design.rst -docs/tutorials/wiki2/distributing.rst -docs/tutorials/wiki2/index.rst -docs/tutorials/wiki2/installation.rst -docs/tutorials/wiki2/src/authorization/CHANGES.txt -docs/tutorials/wiki2/src/authorization/MANIFEST.in -docs/tutorials/wiki2/src/authorization/README.txt -docs/tutorials/wiki2/src/authorization/development.ini -docs/tutorials/wiki2/src/authorization/production.ini -docs/tutorials/wiki2/src/authorization/setup.cfg -docs/tutorials/wiki2/src/authorization/setup.py -docs/tutorials/wiki2/src/authorization/tutorial/__init__.py -docs/tutorials/wiki2/src/authorization/tutorial/models.py -docs/tutorials/wiki2/src/authorization/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/authorization/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/authorization/tutorial/security.py -docs/tutorials/wiki2/src/authorization/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/authorization/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/ie6.css -docs/tutorials/wiki2/src/authorization/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/authorization/tutorial/static/pylons.css -docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/authorization/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/authorization/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/authorization/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/login.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/authorization/tutorial/templates/view.pt -docs/tutorials/wiki2/src/authorization/tutorial/tests.py -docs/tutorials/wiki2/src/authorization/tutorial/views.py -docs/tutorials/wiki2/src/basiclayout/CHANGES.txt -docs/tutorials/wiki2/src/basiclayout/MANIFEST.in -docs/tutorials/wiki2/src/basiclayout/README.txt -docs/tutorials/wiki2/src/basiclayout/development.ini -docs/tutorials/wiki2/src/basiclayout/production.ini -docs/tutorials/wiki2/src/basiclayout/setup.cfg -docs/tutorials/wiki2/src/basiclayout/setup.py -docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py -docs/tutorials/wiki2/src/basiclayout/tutorial/models.py -docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/basiclayout/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/basiclayout/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/ie6.css -docs/tutorials/wiki2/src/basiclayout/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pylons.css -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/basiclayout/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py -docs/tutorials/wiki2/src/basiclayout/tutorial/views.py -docs/tutorials/wiki2/src/models/CHANGES.txt -docs/tutorials/wiki2/src/models/MANIFEST.in -docs/tutorials/wiki2/src/models/README.txt -docs/tutorials/wiki2/src/models/development.ini -docs/tutorials/wiki2/src/models/production.ini -docs/tutorials/wiki2/src/models/setup.cfg -docs/tutorials/wiki2/src/models/setup.py -docs/tutorials/wiki2/src/models/tutorial/__init__.py -docs/tutorials/wiki2/src/models/tutorial/models.py -docs/tutorials/wiki2/src/models/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/models/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/models/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/models/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/models/tutorial/static/ie6.css -docs/tutorials/wiki2/src/models/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/models/tutorial/static/pylons.css -docs/tutorials/wiki2/src/models/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/models/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/models/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/models/tutorial/tests.py -docs/tutorials/wiki2/src/models/tutorial/views.py -docs/tutorials/wiki2/src/tests/CHANGES.txt -docs/tutorials/wiki2/src/tests/MANIFEST.in -docs/tutorials/wiki2/src/tests/README.txt -docs/tutorials/wiki2/src/tests/development.ini -docs/tutorials/wiki2/src/tests/production.ini -docs/tutorials/wiki2/src/tests/setup.cfg -docs/tutorials/wiki2/src/tests/setup.py -docs/tutorials/wiki2/src/tests/tutorial/__init__.py -docs/tutorials/wiki2/src/tests/tutorial/models.py -docs/tutorials/wiki2/src/tests/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/tests/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/tests/tutorial/security.py -docs/tutorials/wiki2/src/tests/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/tests/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/tests/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/tests/tutorial/static/ie6.css -docs/tutorials/wiki2/src/tests/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/tests/tutorial/static/pylons.css -docs/tutorials/wiki2/src/tests/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/tests/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/tests/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/tests/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/login.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/tests/tutorial/templates/view.pt -docs/tutorials/wiki2/src/tests/tutorial/tests.py -docs/tutorials/wiki2/src/tests/tutorial/views.py -docs/tutorials/wiki2/src/views/CHANGES.txt -docs/tutorials/wiki2/src/views/MANIFEST.in -docs/tutorials/wiki2/src/views/README.txt -docs/tutorials/wiki2/src/views/development.ini -docs/tutorials/wiki2/src/views/production.ini -docs/tutorials/wiki2/src/views/setup.cfg -docs/tutorials/wiki2/src/views/setup.py -docs/tutorials/wiki2/src/views/tutorial/__init__.py -docs/tutorials/wiki2/src/views/tutorial/models.py -docs/tutorials/wiki2/src/views/tutorial/scripts/__init__.py -docs/tutorials/wiki2/src/views/tutorial/scripts/initializedb.py -docs/tutorials/wiki2/src/views/tutorial/static/favicon.ico -docs/tutorials/wiki2/src/views/tutorial/static/footerbg.png -docs/tutorials/wiki2/src/views/tutorial/static/headerbg.png -docs/tutorials/wiki2/src/views/tutorial/static/ie6.css -docs/tutorials/wiki2/src/views/tutorial/static/middlebg.png -docs/tutorials/wiki2/src/views/tutorial/static/pylons.css -docs/tutorials/wiki2/src/views/tutorial/static/pyramid-small.png -docs/tutorials/wiki2/src/views/tutorial/static/pyramid.png -docs/tutorials/wiki2/src/views/tutorial/static/transparent.gif -docs/tutorials/wiki2/src/views/tutorial/templates/edit.pt -docs/tutorials/wiki2/src/views/tutorial/templates/mytemplate.pt -docs/tutorials/wiki2/src/views/tutorial/templates/view.pt -docs/tutorials/wiki2/src/views/tutorial/tests.py -docs/tutorials/wiki2/src/views/tutorial/views.py -docs/tutorials/wiki2/tests.rst -docs/whatsnew-1.0.rst -docs/whatsnew-1.1.rst -docs/whatsnew-1.2.rst -docs/whatsnew-1.3.rst -docs/whatsnew-1.4.rst -pyramid/__init__.py -pyramid/asset.py -pyramid/authentication.py -pyramid/authorization.py -pyramid/chameleon_text.py -pyramid/chameleon_zpt.py -pyramid/compat.py -pyramid/config/__init__.py -pyramid/config/adapters.py -pyramid/config/assets.py -pyramid/config/factories.py -pyramid/config/i18n.py -pyramid/config/predicates.py -pyramid/config/rendering.py -pyramid/config/routes.py -pyramid/config/security.py -pyramid/config/settings.py -pyramid/config/testing.py -pyramid/config/tweens.py -pyramid/config/util.py -pyramid/config/views.py -pyramid/config/zca.py -pyramid/decorator.py -pyramid/encode.py -pyramid/events.py -pyramid/exceptions.py -pyramid/fixers/__init__.py -pyramid/fixers/fix_bfg_imports.py -pyramid/httpexceptions.py -pyramid/i18n.py -pyramid/interfaces.py -pyramid/location.py -pyramid/mako_templating.py -pyramid/paster.py -pyramid/path.py -pyramid/registry.py -pyramid/renderers.py -pyramid/request.py -pyramid/resource.py -pyramid/response.py -pyramid/router.py -pyramid/scaffolds/__init__.py -pyramid/scaffolds/alchemy/+package+/__init__.py -pyramid/scaffolds/alchemy/+package+/models.py -pyramid/scaffolds/alchemy/+package+/scripts/__init__.py -pyramid/scaffolds/alchemy/+package+/scripts/initializedb.py -pyramid/scaffolds/alchemy/+package+/static/favicon.ico -pyramid/scaffolds/alchemy/+package+/static/footerbg.png -pyramid/scaffolds/alchemy/+package+/static/headerbg.png -pyramid/scaffolds/alchemy/+package+/static/ie6.css -pyramid/scaffolds/alchemy/+package+/static/middlebg.png -pyramid/scaffolds/alchemy/+package+/static/pylons.css -pyramid/scaffolds/alchemy/+package+/static/pyramid-small.png -pyramid/scaffolds/alchemy/+package+/static/pyramid.png -pyramid/scaffolds/alchemy/+package+/static/transparent.gif -pyramid/scaffolds/alchemy/+package+/templates/mytemplate.pt_tmpl -pyramid/scaffolds/alchemy/+package+/tests.py_tmpl -pyramid/scaffolds/alchemy/+package+/views.py_tmpl -pyramid/scaffolds/alchemy/CHANGES.txt_tmpl -pyramid/scaffolds/alchemy/MANIFEST.in_tmpl -pyramid/scaffolds/alchemy/README.txt_tmpl -pyramid/scaffolds/alchemy/development.ini_tmpl -pyramid/scaffolds/alchemy/production.ini_tmpl -pyramid/scaffolds/alchemy/setup.cfg_tmpl -pyramid/scaffolds/alchemy/setup.py_tmpl -pyramid/scaffolds/copydir.py -pyramid/scaffolds/starter/+package+/__init__.py -pyramid/scaffolds/starter/+package+/static/favicon.ico -pyramid/scaffolds/starter/+package+/static/footerbg.png -pyramid/scaffolds/starter/+package+/static/headerbg.png -pyramid/scaffolds/starter/+package+/static/ie6.css -pyramid/scaffolds/starter/+package+/static/middlebg.png -pyramid/scaffolds/starter/+package+/static/pylons.css -pyramid/scaffolds/starter/+package+/static/pyramid-small.png -pyramid/scaffolds/starter/+package+/static/pyramid.png -pyramid/scaffolds/starter/+package+/static/transparent.gif -pyramid/scaffolds/starter/+package+/templates/mytemplate.pt_tmpl -pyramid/scaffolds/starter/+package+/tests.py_tmpl -pyramid/scaffolds/starter/+package+/views.py_tmpl -pyramid/scaffolds/starter/CHANGES.txt_tmpl -pyramid/scaffolds/starter/MANIFEST.in_tmpl -pyramid/scaffolds/starter/README.txt_tmpl -pyramid/scaffolds/starter/development.ini_tmpl -pyramid/scaffolds/starter/production.ini_tmpl -pyramid/scaffolds/starter/setup.cfg_tmpl -pyramid/scaffolds/starter/setup.py_tmpl -pyramid/scaffolds/template.py -pyramid/scaffolds/tests.py -pyramid/scaffolds/zodb/+package+/__init__.py -pyramid/scaffolds/zodb/+package+/models.py -pyramid/scaffolds/zodb/+package+/static/favicon.ico -pyramid/scaffolds/zodb/+package+/static/footerbg.png -pyramid/scaffolds/zodb/+package+/static/headerbg.png -pyramid/scaffolds/zodb/+package+/static/ie6.css -pyramid/scaffolds/zodb/+package+/static/middlebg.png -pyramid/scaffolds/zodb/+package+/static/pylons.css -pyramid/scaffolds/zodb/+package+/static/pyramid-small.png -pyramid/scaffolds/zodb/+package+/static/pyramid.png -pyramid/scaffolds/zodb/+package+/static/transparent.gif -pyramid/scaffolds/zodb/+package+/templates/mytemplate.pt -pyramid/scaffolds/zodb/+package+/tests.py_tmpl -pyramid/scaffolds/zodb/+package+/views.py_tmpl -pyramid/scaffolds/zodb/CHANGES.txt_tmpl -pyramid/scaffolds/zodb/MANIFEST.in_tmpl -pyramid/scaffolds/zodb/README.txt_tmpl -pyramid/scaffolds/zodb/development.ini_tmpl -pyramid/scaffolds/zodb/production.ini_tmpl -pyramid/scaffolds/zodb/setup.cfg_tmpl -pyramid/scaffolds/zodb/setup.py_tmpl -pyramid/scripting.py -pyramid/scripts/__init__.py -pyramid/scripts/common.py -pyramid/scripts/pcreate.py -pyramid/scripts/prequest.py -pyramid/scripts/proutes.py -pyramid/scripts/pserve.py -pyramid/scripts/pshell.py -pyramid/scripts/ptweens.py -pyramid/scripts/pviews.py -pyramid/security.py -pyramid/session.py -pyramid/settings.py -pyramid/static.py -pyramid/testing.py -pyramid/tests/__init__.py -pyramid/tests/fixtures/components.mak -pyramid/tests/fixtures/dummy.ini -pyramid/tests/fixtures/hello .world.mako -pyramid/tests/fixtures/hello_inherit_pkg.mak -pyramid/tests/fixtures/hellocompo.mak -pyramid/tests/fixtures/helloinherit.mak -pyramid/tests/fixtures/helloworld.mak -pyramid/tests/fixtures/helloworld.mako -pyramid/tests/fixtures/layout.mak -pyramid/tests/fixtures/minimal.pt -pyramid/tests/fixtures/minimal.txt -pyramid/tests/fixtures/nonminimal.mak -pyramid/tests/fixtures/nonminimal.txt -pyramid/tests/fixtures/pp.pt -pyramid/tests/fixtures/static/.hiddenfile -pyramid/tests/fixtures/static/arcs.svg.tgz -pyramid/tests/fixtures/static/index.html -pyramid/tests/fixtures/static/subdir/index.html -pyramid/tests/fixtures/withmacro.pt -pyramid/tests/pkgs/__init__.py -pyramid/tests/pkgs/ccbugapp/__init__.py -pyramid/tests/pkgs/conflictapp/__init__.py -pyramid/tests/pkgs/conflictapp/included.py -pyramid/tests/pkgs/defpermbugapp/__init__.py -pyramid/tests/pkgs/eventonly/__init__.py -pyramid/tests/pkgs/exceptionviewapp/__init__.py -pyramid/tests/pkgs/exceptionviewapp/models.py -pyramid/tests/pkgs/exceptionviewapp/views.py -pyramid/tests/pkgs/fixtureapp/__init__.py -pyramid/tests/pkgs/fixtureapp/models.py -pyramid/tests/pkgs/fixtureapp/subpackage/__init__.py -pyramid/tests/pkgs/fixtureapp/subpackage/templates/bar.pt -pyramid/tests/pkgs/fixtureapp/templates/fixture.pt -pyramid/tests/pkgs/fixtureapp/views.py -pyramid/tests/pkgs/forbiddenapp/__init__.py -pyramid/tests/pkgs/forbiddenview/__init__.py -pyramid/tests/pkgs/hybridapp/__init__.py -pyramid/tests/pkgs/hybridapp/views.py -pyramid/tests/pkgs/includeapp1/__init__.py -pyramid/tests/pkgs/includeapp1/root.py -pyramid/tests/pkgs/includeapp1/three.py -pyramid/tests/pkgs/includeapp1/two.py -pyramid/tests/pkgs/localeapp/__init__.py -pyramid/tests/pkgs/localeapp/locale/GARBAGE -pyramid/tests/pkgs/localeapp/locale/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/de_DE/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale2/GARBAGE -pyramid/tests/pkgs/localeapp/locale2/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale2/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale2/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale3/GARBAGE -pyramid/tests/pkgs/localeapp/locale3/be/LC_MESSAGES -pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale3/de/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.mo -pyramid/tests/pkgs/localeapp/locale3/en/LC_MESSAGES/deformsite.po -pyramid/tests/pkgs/notfoundview/__init__.py -pyramid/tests/pkgs/permbugapp/__init__.py -pyramid/tests/pkgs/rendererscanapp/__init__.py -pyramid/tests/pkgs/rendererscanapp/one.pt -pyramid/tests/pkgs/rendererscanapp/two/__init__.py -pyramid/tests/pkgs/rendererscanapp/two/two.pt -pyramid/tests/pkgs/restbugapp/__init__.py -pyramid/tests/pkgs/restbugapp/views.py -pyramid/tests/pkgs/static_abspath/__init__.py -pyramid/tests/pkgs/static_assetspec/__init__.py -pyramid/tests/pkgs/static_routeprefix/__init__.py -pyramid/tests/pkgs/staticpermapp/__init__.py -pyramid/tests/pkgs/subrequestapp/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/views/__init__.py -pyramid/tests/pkgs/viewdecoratorapp/views/templates/foo.pt -pyramid/tests/pkgs/viewdecoratorapp/views/views.py -pyramid/tests/pkgs/wsgiapp2app/__init__.py -pyramid/tests/test_asset.py -pyramid/tests/test_authentication.py -pyramid/tests/test_authorization.py -pyramid/tests/test_chameleon_text.py -pyramid/tests/test_chameleon_zpt.py -pyramid/tests/test_config/__init__.py -pyramid/tests/test_config/files/assets/dummy.txt -pyramid/tests/test_config/files/minimal.pt -pyramid/tests/test_config/path/scanerror/__init__.py -pyramid/tests/test_config/path/scanerror/will_raise_error.py -pyramid/tests/test_config/pkgs/__init__.py -pyramid/tests/test_config/pkgs/asset/__init__.py -pyramid/tests/test_config/pkgs/asset/models.py -pyramid/tests/test_config/pkgs/asset/subpackage/__init__.py -pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt -pyramid/tests/test_config/pkgs/asset/templates/fixture.pt -pyramid/tests/test_config/pkgs/asset/views.py -pyramid/tests/test_config/pkgs/scanextrakw/__init__.py -pyramid/tests/test_config/pkgs/scannable/__init__.py -pyramid/tests/test_config/pkgs/scannable/another.py -pyramid/tests/test_config/pkgs/scannable/pod/notinit.py -pyramid/tests/test_config/pkgs/scannable/subpackage/__init__.py -pyramid/tests/test_config/pkgs/scannable/subpackage/notinit.py -pyramid/tests/test_config/pkgs/scannable/subpackage/subsubpackage/__init__.py -pyramid/tests/test_config/pkgs/selfscan/__init__.py -pyramid/tests/test_config/pkgs/selfscan/another.py -pyramid/tests/test_config/test_adapters.py -pyramid/tests/test_config/test_assets.py -pyramid/tests/test_config/test_factories.py -pyramid/tests/test_config/test_i18n.py -pyramid/tests/test_config/test_init.py -pyramid/tests/test_config/test_predicates.py -pyramid/tests/test_config/test_rendering.py -pyramid/tests/test_config/test_routes.py -pyramid/tests/test_config/test_security.py -pyramid/tests/test_config/test_settings.py -pyramid/tests/test_config/test_testing.py -pyramid/tests/test_config/test_tweens.py -pyramid/tests/test_config/test_util.py -pyramid/tests/test_config/test_views.py -pyramid/tests/test_decorator.py -pyramid/tests/test_docs.py -pyramid/tests/test_encode.py -pyramid/tests/test_events.py -pyramid/tests/test_exceptions.py -pyramid/tests/test_httpexceptions.py -pyramid/tests/test_i18n.py -pyramid/tests/test_integration.py -pyramid/tests/test_location.py -pyramid/tests/test_mako_templating.py -pyramid/tests/test_paster.py -pyramid/tests/test_path.py -pyramid/tests/test_registry.py -pyramid/tests/test_renderers.py -pyramid/tests/test_request.py -pyramid/tests/test_response.py -pyramid/tests/test_router.py -pyramid/tests/test_scaffolds/__init__.py -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/__init__.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/resources.py -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/favicon.ico -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/footerbg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/headerbg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/ie6.css -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/middlebg.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pylons.css -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid-small.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/pyramid.png -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/static/transparent.gif -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/templates/mytemplate.pt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/tests.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/+package+/views.py_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/CHANGES.txt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/MANIFEST.in_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/README.txt_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/development.ini_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/production.ini_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/setup.cfg_tmpl -pyramid/tests/test_scaffolds/fixture_scaffold/setup.py_tmpl -pyramid/tests/test_scaffolds/test_copydir.py -pyramid/tests/test_scaffolds/test_init.py -pyramid/tests/test_scaffolds/test_template.py -pyramid/tests/test_scripting.py -pyramid/tests/test_scripts/__init__.py -pyramid/tests/test_scripts/dummy.py -pyramid/tests/test_scripts/test_common.py -pyramid/tests/test_scripts/test_pcreate.py -pyramid/tests/test_scripts/test_prequest.py -pyramid/tests/test_scripts/test_proutes.py -pyramid/tests/test_scripts/test_pserve.py -pyramid/tests/test_scripts/test_pshell.py -pyramid/tests/test_scripts/test_ptweens.py -pyramid/tests/test_scripts/test_pviews.py -pyramid/tests/test_security.py -pyramid/tests/test_session.py -pyramid/tests/test_settings.py -pyramid/tests/test_static.py -pyramid/tests/test_testing.py -pyramid/tests/test_threadlocal.py -pyramid/tests/test_traversal.py -pyramid/tests/test_url.py -pyramid/tests/test_urldispatch.py -pyramid/tests/test_util.py -pyramid/tests/test_view.py -pyramid/tests/test_wsgi.py -pyramid/threadlocal.py -pyramid/traversal.py -pyramid/tweens.py -pyramid/url.py -pyramid/urldispatch.py -pyramid/util.py -pyramid/view.py -pyramid/wsgi.py -rtd.txt -setup.cfg -setup.py -tox.ini -- cgit v1.2.3