summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyramid/authentication.py31
-rw-r--r--pyramid/authorization.py6
-rw-r--r--pyramid/config/__init__.py25
-rw-r--r--pyramid/config/adapters.py2
-rw-r--r--pyramid/config/assets.py8
-rw-r--r--pyramid/config/util.py2
-rw-r--r--pyramid/config/views.py70
-rw-r--r--pyramid/exceptions.py6
-rw-r--r--pyramid/httpexceptions.py82
-rw-r--r--pyramid/i18n.py7
-rw-r--r--pyramid/interfaces.py2
-rw-r--r--pyramid/path.py4
-rw-r--r--pyramid/registry.py8
-rw-r--r--pyramid/request.py9
-rw-r--r--pyramid/scaffolds/copydir.py19
-rw-r--r--pyramid/scaffolds/tests.py8
-rw-r--r--pyramid/scaffolds/zodb/+package+/models.py2
-rw-r--r--pyramid/scripts/pcreate.py2
-rw-r--r--pyramid/scripts/prequest.py14
-rw-r--r--pyramid/scripts/pserve.py32
-rw-r--r--pyramid/scripts/ptweens.py4
-rw-r--r--pyramid/scripts/pviews.py8
-rw-r--r--pyramid/static.py8
-rw-r--r--pyramid/testing.py15
-rw-r--r--pyramid/traversal.py54
-rw-r--r--pyramid/url.py19
-rw-r--r--pyramid/util.py7
-rw-r--r--pyramid/view.py2
-rw-r--r--setup.cfg4
-rw-r--r--tox.ini14
30 files changed, 266 insertions, 208 deletions
diff --git a/pyramid/authentication.py b/pyramid/authentication.py
index e0e241e52..0924b5901 100644
--- a/pyramid/authentication.py
+++ b/pyramid/authentication.py
@@ -36,6 +36,7 @@ from pyramid.util import strings_differ
VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$")
+
class CallbackAuthenticationPolicy(object):
""" Abstract class """
@@ -77,10 +78,10 @@ class CallbackAuthenticationPolicy(object):
debug and self._log(
('use of userid %r is disallowed by any built-in Pyramid '
'security policy, returning None' % userid),
- 'authenticated_userid' ,
+ 'authenticated_userid',
request)
return None
-
+
if self.callback is None:
debug and self._log(
'there was no groupfinder callback; returning %r' % (userid,),
@@ -146,7 +147,7 @@ class CallbackAuthenticationPolicy(object):
request
)
return effective_principals
-
+
if self.callback is None:
debug and self._log(
'groupfinder callback is None, so groups is []',
@@ -178,9 +179,10 @@ class CallbackAuthenticationPolicy(object):
effective_principals,),
'effective_principals',
request
- )
+ )
return effective_principals
+
@implementer(IAuthenticationPolicy)
class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
""" A :app:`Pyramid` :term:`authentication policy` which
@@ -248,7 +250,7 @@ class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
'authenticated_userid',
request)
return None
-
+
if self._clean_principal(userid) is None:
self.debug and self._log(
('use of userid %r is disallowed by any built-in Pyramid '
@@ -336,7 +338,7 @@ class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
def remember(self, request, userid, **kw):
""" Store the ``userid`` as ``repoze.who.userid``.
-
+
The identity to authenticated to :mod:`repoze.who`
will contain the given userid as ``userid``, and
provide all keyword arguments as additional identity
@@ -839,15 +841,15 @@ class AuthTktCookieHelper(object):
hashalg='md5', parent_domain=False, domain=None):
serializer = _SimpleSerializer()
-
+
self.cookie_profile = CookieProfile(
- cookie_name = cookie_name,
- secure = secure,
- max_age = max_age,
- httponly = http_only,
- path = path,
+ cookie_name=cookie_name,
+ secure=secure,
+ max_age=max_age,
+ httponly=http_only,
+ path=path,
serializer=serializer
- )
+ )
self.secret = secret
self.cookie_name = cookie_name
@@ -882,7 +884,7 @@ class AuthTktCookieHelper(object):
kw['domains'] = domains
if max_age is not None:
kw['max_age'] = max_age
-
+
headers = profile.get_headers(value, **kw)
return headers
@@ -1187,4 +1189,3 @@ class _SimpleSerializer(object):
def dumps(self, appstruct):
return bytes_(appstruct)
-
diff --git a/pyramid/authorization.py b/pyramid/authorization.py
index 5e7baa19d..4845762ef 100644
--- a/pyramid/authorization.py
+++ b/pyramid/authorization.py
@@ -73,7 +73,7 @@ class ACLAuthorizationPolicy(object):
:class:`pyramid.security.ACLDenied` if not."""
acl = '<No ACL found on any object in resource lineage>'
-
+
for location in lineage(context):
try:
acl = location.__acl__
@@ -121,7 +121,7 @@ class ACLAuthorizationPolicy(object):
allowed_here = set()
denied_here = set()
-
+
if acl and callable(acl):
acl = acl()
@@ -129,7 +129,7 @@ class ACLAuthorizationPolicy(object):
if not is_nonstr_iter(ace_permissions):
ace_permissions = [ace_permissions]
if (ace_action == Allow) and (permission in ace_permissions):
- if not ace_principal in denied_here:
+ if ace_principal not in denied_here:
allowed_here.add(ace_principal)
if (ace_action == Deny) and (permission in ace_permissions):
denied_here.add(ace_principal)
diff --git a/pyramid/config/__init__.py b/pyramid/config/__init__.py
index 401def208..7e8eb0326 100644
--- a/pyramid/config/__init__.py
+++ b/pyramid/config/__init__.py
@@ -435,7 +435,7 @@ class Configurator(
if session_factory is not None:
self.set_session_factory(session_factory)
- tweens = aslist(registry.settings.get('pyramid.tweens', []))
+ tweens = aslist(registry.settings.get('pyramid.tweens', []))
for factory in tweens:
self._add_tween(factory, explicit=True)
@@ -955,11 +955,11 @@ class Configurator(
if package is None: # pragma: no cover
package = caller_package()
- ctorkw = {'config':self}
+ ctorkw = {'config': self}
ctorkw.update(kw)
scanner = self.venusian.Scanner(**ctorkw)
-
+
scanner.scan(package, categories=categories, onerror=onerror,
ignore=ignore)
@@ -980,7 +980,7 @@ class Configurator(
# Push the registry onto the stack in case any code that depends on
# the registry threadlocal APIs used in listeners subscribed to the
# IApplicationCreated event.
- self.manager.push({'registry':self.registry, 'request':None})
+ self.manager.push({'registry': self.registry, 'request': None})
try:
self.registry.notify(ApplicationCreated(app))
finally:
@@ -988,6 +988,7 @@ class Configurator(
return app
+
# this class is licensed under the ZPL (stolen from Zope)
class ActionState(object):
def __init__(self):
@@ -1141,9 +1142,9 @@ class ActionState(object):
# O(n lg n).
all_actions.extend(self.actions)
pending_actions = resume(resolveConflicts(
- executed_actions
- + list(pending_actions)
- + self.actions
+ executed_actions +
+ list(pending_actions) +
+ self.actions
))
self.actions = []
@@ -1277,18 +1278,20 @@ def resolveConflicts(actions):
for _, _, action in rest:
includepath = action['includepath']
# Test whether path is a prefix of opath
- if (includepath[:len(basepath)] != basepath # not a prefix
- or includepath == basepath):
+ if (includepath[:len(basepath)] != basepath or # not a prefix
+ includepath == basepath):
L = conflicts.setdefault(discriminator, [baseinfo])
L.append(action['info'])
if conflicts:
raise ConfigurationConflictError(conflicts)
- # sort conflict-resolved actions by (order, i) and yield them one by one
+ # sort conflict-resolved actions by (order, i) and yield them one
+ # by one
for a in [x[2] for x in sorted(output, key=operator.itemgetter(0, 1))]:
yield a
-
+
+
def expand_action(discriminator, callable=None, args=(), kw=None,
includepath=(), info=None, order=0, introspectables=()):
if kw is None:
diff --git a/pyramid/config/adapters.py b/pyramid/config/adapters.py
index 3d11980da..a68070134 100644
--- a/pyramid/config/adapters.py
+++ b/pyramid/config/adapters.py
@@ -255,7 +255,7 @@ class AdaptersConfiguratorMixin(object):
See :ref:`changing_the_traverser` for more information.
"""
iface = self.maybe_dotted(iface)
- adapter= self.maybe_dotted(adapter)
+ adapter = self.maybe_dotted(adapter)
def register(iface=iface):
if iface is None:
iface = Interface
diff --git a/pyramid/config/assets.py b/pyramid/config/assets.py
index 6dabea358..bbdf18ced 100644
--- a/pyramid/config/assets.py
+++ b/pyramid/config/assets.py
@@ -20,7 +20,7 @@ class OverrideProvider(pkg_resources.DefaultProvider):
reg = get_current_registry()
overrides = reg.queryUtility(IPackageOverrides, self.module_name)
return overrides
-
+
def get_resource_filename(self, manager, resource_name):
""" Return a true filesystem path for resource_name,
co-ordinating the extraction with manager, if the resource
@@ -33,12 +33,12 @@ class OverrideProvider(pkg_resources.DefaultProvider):
return filename
return pkg_resources.DefaultProvider.get_resource_filename(
self, manager, resource_name)
-
+
def get_resource_stream(self, manager, resource_name):
""" Return a readable file-like object for resource_name."""
overrides = self._get_overrides()
if overrides is not None:
- stream = overrides.get_stream(resource_name)
+ stream = overrides.get_stream(resource_name)
if stream is not None:
return stream
return pkg_resources.DefaultProvider.get_resource_stream(
@@ -387,5 +387,3 @@ class AssetsConfiguratorMixin(object):
self.action(None, register, introspectables=(intr,))
override_resource = override_asset # bw compat
-
-
diff --git a/pyramid/config/util.py b/pyramid/config/util.py
index 23cdc6be8..0fd9ef4a7 100644
--- a/pyramid/config/util.py
+++ b/pyramid/config/util.py
@@ -151,7 +151,7 @@ class PredicateList(object):
hashes = [hashes]
for h in hashes:
phash.update(bytes_(h))
- weights.append(1 << n+1)
+ weights.append(1 << n + 1)
preds.append(pred)
if kw:
raise ConfigurationError('Unknown predicate values: %r' % (kw,))
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index aba28467d..eff1e2e95 100644
--- a/pyramid/config/views.py
+++ b/pyramid/config/views.py
@@ -157,7 +157,7 @@ class ViewDeriver(object):
self.decorated_view(
self.rendered_view(
self.mapped_view(
- view)))))))))
+ view)))))))))
@wraps_view
def mapped_view(self, view):
@@ -232,7 +232,11 @@ class ViewDeriver(object):
permission = None
wrapped_view = view
- if self.authn_policy and self.authz_policy and (permission is not None):
+ if (
+ self.authn_policy and
+ self.authz_policy and
+ (permission is not None)
+ ):
def _permitted(context, request):
principals = self.authn_policy.effective_principals(request)
return self.authz_policy.permits(context, principals,
@@ -270,7 +274,8 @@ class ViewDeriver(object):
else:
principals = self.authn_policy.effective_principals(
request)
- msg = str(self.authz_policy.permits(context, principals,
+ msg = str(self.authz_policy.permits(context,
+ principals,
permission))
else:
msg = 'Allowed (no authorization policy in use)'
@@ -293,14 +298,16 @@ class ViewDeriver(object):
preds = self.kw.get('predicates', ())
if not preds:
return view
+
def predicate_wrapper(context, request):
for predicate in preds:
if not predicate(context, request):
view_name = getattr(view, '__name__', view)
raise PredicateMismatch(
- 'predicate mismatch for view %s (%s)' % (
- view_name, predicate.text()))
+ 'predicate mismatch for view %s (%s)' % (
+ view_name, predicate.text()))
return view(context, request)
+
def checker(context, request):
return all((predicate(context, request) for predicate in
preds))
@@ -321,7 +328,7 @@ class ViewDeriver(object):
(accept is None) and
(order == MAX_ORDER) and
(phash == DEFAULT_PHASH)
- ):
+ ):
return view # defaults
def attr_view(context, request):
return view(context, request)
@@ -350,7 +357,7 @@ class ViewDeriver(object):
def _rendered_view(self, view, view_renderer):
def rendered_view(context, request):
result = view(context, request)
- if result.__class__ is Response: # potential common case
+ if result.__class__ is Response: # potential common case
response = result
else:
registry = self.registry
@@ -365,9 +372,10 @@ class ViewDeriver(object):
renderer = renderers.RendererHelper(
name=renderer_name,
package=self.kw.get('package'),
- registry = registry)
+ registry=registry)
else:
renderer = view_renderer.clone()
+
if '__view__' in attrs:
view_inst = attrs.pop('__view__')
else:
@@ -380,9 +388,10 @@ class ViewDeriver(object):
def _response_resolved_view(self, view):
registry = self.registry
+
def viewresult_to_response(context, request):
result = view(context, request)
- if result.__class__ is Response: # common case
+ if result.__class__ is Response: # common case
response = result
else:
response = registry.queryAdapterOrSelf(result, IResponse)
@@ -413,6 +422,7 @@ class ViewDeriver(object):
return view
return decorator(view)
+
@implementer(IViewMapper)
@provider(IViewMapperFactory)
class DefaultViewMapper(object):
@@ -631,7 +641,8 @@ class ViewsConfiguratorMixin(object):
http_cache=None,
match_param=None,
check_csrf=None,
- **predicates):
+ **predicates
+ ):
""" Add a :term:`view configuration` to the current
configuration state. Arguments to ``add_view`` are broken
down below into *predicate* arguments and *non-predicate*
@@ -1126,7 +1137,7 @@ class ViewsConfiguratorMixin(object):
if isinstance(renderer, string_types):
renderer = renderers.RendererHelper(
name=renderer, package=self.package,
- registry = self.registry)
+ registry=self.registry)
if accept is not None:
accept = accept.lower()
@@ -1154,7 +1165,11 @@ class ViewsConfiguratorMixin(object):
# is. It can't be computed any sooner because thirdparty
# predicates may not yet exist when add_view is called.
order, preds, phash = predlist.make(self, **pvals)
- view_intr.update({'phash':phash, 'order':order, 'predicates':preds})
+ view_intr.update({
+ 'phash': phash,
+ 'order': order,
+ 'predicates': preds
+ })
return ('view', context, name, route_name, phash)
discriminator = Deferred(discrim_func)
@@ -1351,7 +1366,7 @@ class ViewsConfiguratorMixin(object):
tmpl_intr is not None and
intrspc is not None and
intrspc.get('renderer factories', renderer_type) is not None
- ):
+ ):
# allow failure of registered template factories to be deferred
# until view execution, like other bad renderer factories; if
# we tried to relate this to an existing renderer factory
@@ -1393,7 +1408,7 @@ class ViewsConfiguratorMixin(object):
permission,
permission,
'permission'
- )
+ )
perm_intr['value'] = permission
perm_intr.relate('views', discriminator)
introspectables.append(perm_intr)
@@ -1425,7 +1440,7 @@ class ViewsConfiguratorMixin(object):
factory,
weighs_more_than=weighs_more_than,
weighs_less_than=weighs_less_than
- )
+ )
def add_default_view_predicates(self):
p = pyramid.config.predicates
@@ -1443,7 +1458,7 @@ class ViewsConfiguratorMixin(object):
('physical_path', p.PhysicalPathPredicate),
('effective_principals', p.EffectivePrincipalsPredicate),
('custom', p.CustomPredicate),
- ):
+ ):
self.add_view_predicate(name, factory)
def derive_view(self, view, attr=None, renderer=None):
@@ -1535,7 +1550,7 @@ class ViewsConfiguratorMixin(object):
if isinstance(renderer, string_types):
renderer = renderers.RendererHelper(
name=renderer, package=self.package,
- registry = self.registry)
+ registry=self.registry)
if renderer is None:
# use default renderer if one exists
if self.registry.queryUtility(IRendererFactory) is not None:
@@ -1583,7 +1598,7 @@ class ViewsConfiguratorMixin(object):
mapper=None,
match_param=None,
**predicates
- ):
+ ):
""" Add a forbidden view to the current configuration state. The
view will be called when Pyramid or application code raises a
:exc:`pyramid.httpexceptions.HTTPForbidden` exception and the set of
@@ -1616,7 +1631,7 @@ class ViewsConfiguratorMixin(object):
raise ConfigurationError(
'%s may not be used as an argument to add_forbidden_view'
% arg
- )
+ )
if view is None:
view = default_exceptionresponse_view
@@ -1641,7 +1656,7 @@ class ViewsConfiguratorMixin(object):
permission=NO_PERMISSION_REQUIRED,
attr=attr,
renderer=renderer,
- )
+ )
settings.update(predicates)
return self.add_view(**settings)
@@ -1670,7 +1685,7 @@ class ViewsConfiguratorMixin(object):
match_param=None,
append_slash=False,
**predicates
- ):
+ ):
""" Add a default Not Found View to the current configuration state.
The view will be called when Pyramid or application code raises an
:exc:`pyramid.httpexceptions.HTTPNotFound` exception (e.g. when a
@@ -1710,7 +1725,7 @@ class ViewsConfiguratorMixin(object):
raise ConfigurationError(
'%s may not be used as an argument to add_notfound_view'
% arg
- )
+ )
if view is None:
view = default_exceptionresponse_view
@@ -1733,7 +1748,7 @@ class ViewsConfiguratorMixin(object):
match_param=match_param,
route_name=route_name,
permission=NO_PERMISSION_REQUIRED,
- )
+ )
settings.update(predicates)
if append_slash:
view = self._derive_view(view, attr=attr, renderer=renderer)
@@ -1906,7 +1921,7 @@ def isexception(o):
return (
isinstance(o, Exception) or
(inspect.isclass(o) and (issubclass(o, Exception)))
- )
+ )
@implementer(IStaticURLInfo)
@@ -2020,7 +2035,7 @@ class StaticURLInfo(object):
# register a route using the computed view, permission, and
# pattern, plus any extras passed to us via add_static_view
- pattern = "%s*subpath" % name # name already ends with slash
+ pattern = "%s*subpath" % name # name already ends with slash
if config.route_prefix:
route_name = '__%s/%s' % (config.route_prefix, name)
else:
@@ -2032,12 +2047,12 @@ class StaticURLInfo(object):
permission=permission,
context=context,
renderer=renderer,
- )
+ )
def register():
registrations = self._get_registrations(config.registry)
- names = [ t[0] for t in registrations ]
+ names = [t[0] for t in registrations]
if name in names:
idx = names.index(name)
@@ -2054,4 +2069,3 @@ class StaticURLInfo(object):
intr['spec'] = spec
config.action(None, callable=register, introspectables=(intr,))
-
diff --git a/pyramid/exceptions.py b/pyramid/exceptions.py
index c59d109df..c1481ce9c 100644
--- a/pyramid/exceptions.py
+++ b/pyramid/exceptions.py
@@ -33,7 +33,7 @@ class PredicateMismatch(HTTPNotFound):
be treated as :class:`HTTPNotFound`` by any exception view
registrations. Thus, typically, this exception will not be seen
publicly.
-
+
However, this exception will be raised if the predicates of all
views configured to handle another exception context cannot be
successfully matched. For instance, if a view is configured to
@@ -79,7 +79,7 @@ class ConfigurationConflictError(ConfigurationError):
r.append(" For: %s" % (discriminator, ))
for info in infos:
for line in str(info).rstrip().split(CR):
- r.append(" "+line)
+ r.append(" " + line)
return CR.join(r)
@@ -109,5 +109,3 @@ class CyclicDependencyError(Exception):
L.append('%r sorts before %r' % (dependent, dependees))
msg = 'Implicit ordering cycle:' + '; '.join(L)
return msg
-
-
diff --git a/pyramid/httpexceptions.py b/pyramid/httpexceptions.py
index a30129e16..465769834 100644
--- a/pyramid/httpexceptions.py
+++ b/pyramid/httpexceptions.py
@@ -116,10 +116,10 @@ Substitution of response headers into template values is always performed.
Substitution of WSGI environment values is performed if a ``request`` is
passed to the exception's constructor.
-The subclasses of :class:`~_HTTPMove`
+The subclasses of :class:`~_HTTPMove`
(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,
:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and
-:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``
+:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``
field. Reflecting this, these subclasses have one additional keyword argument:
``location``, which indicates the location to which to redirect.
"""
@@ -296,7 +296,7 @@ class HTTPError(HTTPException):
base class for exceptions with status codes in the 400s and 500s
This is an exception which indicates that an error has occurred,
- and that any work in progress should not be committed.
+ and that any work in progress should not be committed.
"""
class HTTPRedirection(HTTPException):
@@ -324,7 +324,7 @@ class HTTPOk(HTTPSuccessful):
subclass of :class:`~HTTPSuccessful`
Indicates that the request has succeeded.
-
+
code: 200, title: OK
"""
code = 200
@@ -336,7 +336,7 @@ class HTTPCreated(HTTPSuccessful):
This indicates that request has been fulfilled and resulted in a new
resource being created.
-
+
code: 201, title: Created
"""
code = 201
@@ -375,7 +375,7 @@ class HTTPNoContent(HTTPSuccessful):
This indicates that the server has fulfilled the request but does
not need to return an entity-body, and might want to return updated
metainformation.
-
+
code: 204, title: No Content
"""
code = 204
@@ -389,7 +389,7 @@ class HTTPResetContent(HTTPSuccessful):
This indicates that the server has fulfilled the request and
the user agent SHOULD reset the document view which caused the
request to be sent.
-
+
code: 205, title: Reset Content
"""
code = 205
@@ -402,7 +402,7 @@ class HTTPPartialContent(HTTPSuccessful):
This indicates that the server has fulfilled the partial GET
request for the resource.
-
+
code: 206, title: Partial Content
"""
code = 206
@@ -460,7 +460,7 @@ class HTTPMultipleChoices(_HTTPMove):
and agent-driven negotiation information is being provided so that
the user can select a preferred representation and redirect its
request to that location.
-
+
code: 300, title: Multiple Choices
"""
code = 300
@@ -485,7 +485,7 @@ class HTTPFound(_HTTPMove):
This indicates that the requested resource resides temporarily under
a different URI.
-
+
code: 302, title: Found
"""
code = 302
@@ -501,7 +501,7 @@ class HTTPSeeOther(_HTTPMove):
This indicates that the response to the request can be found under
a different URI and SHOULD be retrieved using a GET method on that
resource.
-
+
code: 303, title: See Other
"""
code = 303
@@ -528,7 +528,7 @@ class HTTPUseProxy(_HTTPMove):
This indicates that the requested resource MUST be accessed through
the proxy given by the Location field.
-
+
code: 305, title: Use Proxy
"""
# Not a move, but looks a little like one
@@ -543,7 +543,7 @@ class HTTPTemporaryRedirect(_HTTPMove):
This indicates that the requested resource resides temporarily
under a different URI.
-
+
code: 307, title: Temporary Redirect
"""
code = 307
@@ -583,7 +583,7 @@ class HTTPUnauthorized(HTTPClientError):
subclass of :class:`~HTTPClientError`
This indicates that the request requires user authentication.
-
+
code: 401, title: Unauthorized
"""
code = 401
@@ -597,7 +597,7 @@ class HTTPUnauthorized(HTTPClientError):
class HTTPPaymentRequired(HTTPClientError):
"""
subclass of :class:`~HTTPClientError`
-
+
code: 402, title: Payment Required
"""
code = 402
@@ -636,7 +636,7 @@ class HTTPForbidden(HTTPClientError):
# differences from webob.exc.HTTPForbidden:
#
# - accepts a ``result`` keyword argument
- #
+ #
# - overrides constructor to set ``self.result``
#
# differences from older ``pyramid.exceptions.Forbidden``:
@@ -659,7 +659,7 @@ class HTTPNotFound(HTTPClientError):
This indicates that the server did not find anything matching the
Request-URI.
-
+
code: 404, title: Not Found
Raise this exception within :term:`view` code to immediately
@@ -702,7 +702,7 @@ class HTTPNotAcceptable(HTTPClientError):
capable of generating response entities which have content
characteristics not acceptable according to the accept headers
sent in the request.
-
+
code: 406, title: Not Acceptable
"""
# differences from webob.exc.HTTPNotAcceptable:
@@ -717,7 +717,7 @@ class HTTPProxyAuthenticationRequired(HTTPClientError):
This is similar to 401, but indicates that the client must first
authenticate itself with the proxy.
-
+
code: 407, title: Proxy Authentication Required
"""
code = 407
@@ -730,7 +730,7 @@ class HTTPRequestTimeout(HTTPClientError):
This indicates that the client did not produce a request within
the time that the server was prepared to wait.
-
+
code: 408, title: Request Timeout
"""
code = 408
@@ -744,7 +744,7 @@ class HTTPConflict(HTTPClientError):
This indicates that the request could not be completed due to a
conflict with the current state of the resource.
-
+
code: 409, title: Conflict
"""
code = 409
@@ -758,7 +758,7 @@ class HTTPGone(HTTPClientError):
This indicates that the requested resource is no longer available
at the server and no forwarding address is known.
-
+
code: 410, title: Gone
"""
code = 410
@@ -772,7 +772,7 @@ class HTTPLengthRequired(HTTPClientError):
This indicates that the server refuses to accept the request
without a defined Content-Length.
-
+
code: 411, title: Length Required
"""
code = 411
@@ -786,7 +786,7 @@ class HTTPPreconditionFailed(HTTPClientError):
This indicates that the precondition given in one or more of the
request-header fields evaluated to false when it was tested on the
server.
-
+
code: 412, title: Precondition Failed
"""
code = 412
@@ -814,7 +814,7 @@ class HTTPRequestURITooLong(HTTPClientError):
This indicates that the server is refusing to service the request
because the Request-URI is longer than the server is willing to
interpret.
-
+
code: 414, title: Request-URI Too Long
"""
code = 414
@@ -828,7 +828,7 @@ class HTTPUnsupportedMediaType(HTTPClientError):
This indicates that the server is refusing to service the request
because the entity of the request is in a format not supported by
the requested resource for the requested method.
-
+
code: 415, title: Unsupported Media Type
"""
# differences from webob.exc.HTTPUnsupportedMediaType:
@@ -846,7 +846,7 @@ class HTTPRequestRangeNotSatisfiable(HTTPClientError):
range-specifier values in this field overlap the current extent
of the selected resource, and the request did not include an
If-Range request-header field.
-
+
code: 416, title: Request Range Not Satisfiable
"""
code = 416
@@ -859,7 +859,7 @@ class HTTPExpectationFailed(HTTPClientError):
This indidcates that the expectation given in an Expect
request-header field could not be met by this server.
-
+
code: 417, title: Expectation Failed
"""
code = 417
@@ -871,13 +871,13 @@ class HTTPUnprocessableEntity(HTTPClientError):
subclass of :class:`~HTTPClientError`
This indicates that the server is unable to process the contained
- instructions.
+ instructions.
May be used to notify the client that their JSON/XML is well formed, but
not correct for the current request.
See RFC4918 section 11 for more information.
-
+
code: 422, title: Unprocessable Entity
"""
## Note: from WebDAV
@@ -890,7 +890,7 @@ class HTTPLocked(HTTPClientError):
subclass of :class:`~HTTPClientError`
This indicates that the resource is locked.
-
+
code: 423, title: Locked
"""
## Note: from WebDAV
@@ -904,7 +904,7 @@ class HTTPFailedDependency(HTTPClientError):
This indicates that the method could not be performed because the
requested action depended on another action and that action failed.
-
+
code: 424, title: Failed Dependency
"""
## Note: from WebDAV
@@ -1003,7 +1003,7 @@ class HTTPNotImplemented(HTTPServerError):
This indicates that the server does not support the functionality
required to fulfill the request.
-
+
code: 501, title: Not Implemented
"""
# differences from webob.exc.HTTPNotAcceptable:
@@ -1019,7 +1019,7 @@ class HTTPBadGateway(HTTPServerError):
This indicates that the server, while acting as a gateway or proxy,
received an invalid response from the upstream server it accessed
in attempting to fulfill the request.
-
+
code: 502, title: Bad Gateway
"""
code = 502
@@ -1032,7 +1032,7 @@ class HTTPServiceUnavailable(HTTPServerError):
This indicates that the server is currently unable to handle the
request due to a temporary overloading or maintenance of the server.
-
+
code: 503, title: Service Unavailable
"""
code = 503
@@ -1075,7 +1075,7 @@ class HTTPInsufficientStorage(HTTPServerError):
This indicates that the server does not have enough space to save
the resource.
-
+
code: 507, title: Insufficient Storage
"""
code = 507
@@ -1100,12 +1100,14 @@ def default_exceptionresponse_view(context, request):
context = request.exception or context
return context # assumed to be an IResponse
-status_map={}
+status_map = {}
code = None
for name, value in list(globals().items()):
- if (isinstance(value, class_types) and
- issubclass(value, HTTPException)
- and not name.startswith('_')):
+ if (
+ isinstance(value, class_types) and
+ issubclass(value, HTTPException) and
+ not name.startswith('_')
+ ):
code = getattr(value, 'code', None)
if code:
status_map[code] = value
diff --git a/pyramid/i18n.py b/pyramid/i18n.py
index c30351f7a..458f6168d 100644
--- a/pyramid/i18n.py
+++ b/pyramid/i18n.py
@@ -8,9 +8,6 @@ from translationstring import (
TranslationStringFactory, # API
)
-TranslationString = TranslationString # PyFlakes
-TranslationStringFactory = TranslationStringFactory # PyFlakes
-
from pyramid.compat import PY3
from pyramid.decorator import reify
@@ -22,6 +19,10 @@ from pyramid.interfaces import (
from pyramid.threadlocal import get_current_registry
+TranslationString = TranslationString # PyFlakes
+TranslationStringFactory = TranslationStringFactory # PyFlakes
+
+
class Localizer(object):
"""
An object providing translation and pluralizations related to
diff --git a/pyramid/interfaces.py b/pyramid/interfaces.py
index bab91b0ee..7b9a850d1 100644
--- a/pyramid/interfaces.py
+++ b/pyramid/interfaces.py
@@ -149,7 +149,7 @@ class IResponse(Interface):
"""Gets and sets and deletes the Content-MD5 header. For more
information on Content-MD5 see RFC 2616 section 14.14.""")
- content_range = Attribute(
+ content_range = Attribute(
"""Gets and sets and deletes the Content-Range header. For more
information on Content-Range see section 14.16. Converts using
ContentRange object.""")
diff --git a/pyramid/path.py b/pyramid/path.py
index f2d8fff55..b79c5a6ac 100644
--- a/pyramid/path.py
+++ b/pyramid/path.py
@@ -15,7 +15,7 @@ init_names = [ '__init__%s' % x[0] for x in imp.get_suffixes() if
def caller_path(path, level=2):
if not os.path.isabs(path):
- module = caller_module(level+1)
+ module = caller_module(level + 1)
prefix = package_path(module)
path = os.path.join(prefix, path)
return path
@@ -53,7 +53,7 @@ def package_of(pkg_or_module):
def caller_package(level=2, caller_module=caller_module):
# caller_module in arglist for tests
- module = caller_module(level+1)
+ module = caller_module(level + 1)
f = getattr(module, '__file__', '')
if (('__init__.py' in f) or ('__init__$py' in f)): # empty at >>>
# Module is a package
diff --git a/pyramid/registry.py b/pyramid/registry.py
index 8c05940b9..0610a274e 100644
--- a/pyramid/registry.py
+++ b/pyramid/registry.py
@@ -117,10 +117,10 @@ class Introspector(object):
values = category.values()
values = sorted(set(values), key=sort_key)
return [
- {'introspectable':intr,
- 'related':self.related(intr)}
- for intr in values
- ]
+ {'introspectable': intr,
+ 'related': self.related(intr)}
+ for intr in values
+ ]
def categorized(self, sort_key=None):
L = []
diff --git a/pyramid/request.py b/pyramid/request.py
index 3cbe5d9e3..d9fcd6d8b 100644
--- a/pyramid/request.py
+++ b/pyramid/request.py
@@ -22,7 +22,7 @@ from pyramid.compat import (
from pyramid.decorator import reify
from pyramid.i18n import LocalizerRequestMixin
-from pyramid.response import Response, _get_response_factory
+from pyramid.response import Response, _get_response_factory
from pyramid.security import (
AuthenticationAPIMixin,
AuthorizationAPIMixin,
@@ -64,7 +64,7 @@ class CallbackMethodsMixin(object):
called if an exception happens in application code, or if the
response object returned by :term:`view` code is invalid.
- All response callbacks are called *after* the tweens and
+ All response callbacks are called *after* the tweens and
*before* the :class:`pyramid.events.NewResponse` event is sent.
Errors raised by callbacks are not handled specially. They
@@ -236,7 +236,7 @@ class Request(
def json_body(self):
return json.loads(text_(self.body, self.charset))
-
+
def route_request_iface(name, bases=()):
# zope.interface treats the __name__ as the __doc__ and changes __name__
# to None for interfaces that contain spaces if you do not pass a
@@ -250,9 +250,10 @@ def route_request_iface(name, bases=()):
iface.combined = InterfaceClass(
'%s_combined_IRequest' % name,
bases=(iface, IRequest),
- __doc__ = 'route_request_iface-generated combined interface')
+ __doc__='route_request_iface-generated combined interface')
return iface
+
def add_global_response_headers(request, headerlist):
def add_headers(request, response):
for k, v in headerlist:
diff --git a/pyramid/scaffolds/copydir.py b/pyramid/scaffolds/copydir.py
index 3b871dc19..4471777f2 100644
--- a/pyramid/scaffolds/copydir.py
+++ b/pyramid/scaffolds/copydir.py
@@ -15,6 +15,7 @@ from pyramid.compat import (
fsenc = sys.getfilesystemencoding()
+
class SkipTemplate(Exception):
"""
Raised to indicate that the template should not be copied over.
@@ -61,7 +62,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
names = sorted(pkg_resources.resource_listdir(source[0], source[1]))
else:
names = sorted(os.listdir(source))
- pad = ' '*(indent*2)
+ pad = ' ' * (indent * 2)
if not os.path.exists(dest):
if verbosity >= 1:
out('%sCreating %s/' % (pad, dest))
@@ -90,7 +91,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
if verbosity:
out('%sRecursing into %s' % (pad, os.path.basename(full)))
copy_dir((source[0], full), dest_full, vars, verbosity, simulate,
- indent=indent+1, sub_vars=sub_vars,
+ indent=indent + 1, sub_vars=sub_vars,
interactive=interactive, overwrite=overwrite,
template_renderer=template_renderer, out_=out_)
continue
@@ -98,7 +99,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
if verbosity:
out('%sRecursing into %s' % (pad, os.path.basename(full)))
copy_dir(full, dest_full, vars, verbosity, simulate,
- indent=indent+1, sub_vars=sub_vars,
+ indent=indent + 1, sub_vars=sub_vars,
interactive=interactive, overwrite=overwrite,
template_renderer=template_renderer, out_=out_)
continue
@@ -185,14 +186,14 @@ def query_interactive(src_fn, dest_fn, src_content, dest_content,
dest_content.splitlines(),
src_content.splitlines(),
dest_fn, src_fn))
- added = len([l for l in u_diff if l.startswith('+')
- and not l.startswith('+++')])
- removed = len([l for l in u_diff if l.startswith('-')
- and not l.startswith('---')])
+ added = len([l for l in u_diff if l.startswith('+') and
+ not l.startswith('+++')])
+ removed = len([l for l in u_diff if l.startswith('-') and
+ not l.startswith('---')])
if added > removed:
- msg = '; %i lines added' % (added-removed)
+ msg = '; %i lines added' % (added - removed)
elif removed > added:
- msg = '; %i lines removed' % (removed-added)
+ msg = '; %i lines removed' % (removed - added)
else:
msg = ''
out('Replace %i bytes with %i bytes (%i/%i lines changed%s)' % (
diff --git a/pyramid/scaffolds/tests.py b/pyramid/scaffolds/tests.py
index db828759e..49358c1cf 100644
--- a/pyramid/scaffolds/tests.py
+++ b/pyramid/scaffolds/tests.py
@@ -10,8 +10,9 @@ try:
except ImportError:
import httplib
+
class TemplateTest(object):
- def make_venv(self, directory): # pragma: no cover
+ def make_venv(self, directory): # pragma: no cover
import virtualenv
from virtualenv import Logger
logger = Logger([(Logger.level_for_integer(2), sys.stdout)])
@@ -20,7 +21,8 @@ class TemplateTest(object):
site_packages=False,
clear=False,
unzip_setuptools=True)
- def install(self, tmpl_name): # pragma: no cover
+
+ def install(self, tmpl_name): # pragma: no cover
try:
self.old_cwd = os.getcwd()
self.directory = tempfile.mkdtemp()
@@ -58,7 +60,7 @@ class TemplateTest(object):
if hastoolbar:
assert toolbarchunk in data, ininame
else:
- assert not toolbarchunk in data, ininame
+ assert toolbarchunk not in data, ininame
finally:
proc.terminate()
finally:
diff --git a/pyramid/scaffolds/zodb/+package+/models.py b/pyramid/scaffolds/zodb/+package+/models.py
index a94b36ef4..e5aa3e9f7 100644
--- a/pyramid/scaffolds/zodb/+package+/models.py
+++ b/pyramid/scaffolds/zodb/+package+/models.py
@@ -6,7 +6,7 @@ class MyModel(PersistentMapping):
def appmaker(zodb_root):
- if not 'app_root' in zodb_root:
+ if 'app_root' not in zodb_root:
app_root = MyModel()
zodb_root['app_root'] = app_root
import transaction
diff --git a/pyramid/scripts/pcreate.py b/pyramid/scripts/pcreate.py
index d2c5f8c27..f6376f575 100644
--- a/pyramid/scripts/pcreate.py
+++ b/pyramid/scripts/pcreate.py
@@ -132,7 +132,7 @@ class PCreateCommand(object):
for scaffold in scaffolds:
self.out(' %s:%s %s' % (
scaffold.name,
- ' '*(max_name-len(scaffold.name)), scaffold.summary))
+ ' ' * (max_name - len(scaffold.name)), scaffold.summary))
else:
self.out('No scaffolds available')
return 0
diff --git a/pyramid/scripts/prequest.py b/pyramid/scripts/prequest.py
index 34eeadf32..61e422c64 100644
--- a/pyramid/scripts/prequest.py
+++ b/pyramid/scripts/prequest.py
@@ -52,8 +52,10 @@ class PRequestCommand(object):
parser.add_option(
'-n', '--app-name',
dest='app_name',
- metavar= 'NAME',
- help="Load the named application from the config file (default 'main')",
+ metavar='NAME',
+ help=(
+ "Load the named application from the config file (default 'main')"
+ ),
type="string",
)
parser.add_option(
@@ -62,8 +64,10 @@ class PRequestCommand(object):
metavar='NAME:VALUE',
type='string',
action='append',
- help="Header to add to request (you can use this option multiple times)"
- )
+ help=(
+ "Header to add to request (you can use this option multiple times)"
+ ),
+ )
parser.add_option(
'-d', '--display-headers',
dest='display_headers',
@@ -167,7 +171,7 @@ class PRequestCommand(object):
if name.lower() == 'content-type':
name = 'CONTENT_TYPE'
else:
- name = 'HTTP_'+name.upper().replace('-', '_')
+ name = 'HTTP_' + name.upper().replace('-', '_')
environ[name] = value
request = Request.blank(path, environ=environ)
diff --git a/pyramid/scripts/pserve.py b/pyramid/scripts/pserve.py
index 57e4ab012..e97bdcd48 100644
--- a/pyramid/scripts/pserve.py
+++ b/pyramid/scripts/pserve.py
@@ -143,7 +143,7 @@ class PServeCommand(object):
default=default_verbosity,
dest='verbose',
action='count',
- help="Set verbose level (default "+str(default_verbosity)+")")
+ help="Set verbose level (default " + str(default_verbosity) + ")")
parser.add_option(
'-q', '--quiet',
action='store_const',
@@ -188,15 +188,17 @@ class PServeCommand(object):
print(msg)
def get_options(self):
- if (len(self.args) > 1
- and self.args[1] in self.possible_subcommands):
+ if (
+ len(self.args) > 1 and
+ self.args[1] in self.possible_subcommands
+ ):
restvars = self.args[2:]
else:
restvars = self.args[1:]
return parse_vars(restvars)
- def run(self): # pragma: no cover
+ def run(self): # pragma: no cover
if self.options.stop_daemon:
return self.stop_daemon()
@@ -213,8 +215,10 @@ class PServeCommand(object):
return 2
app_spec = self.args[0]
- if (len(self.args) > 1
- and self.args[1] in self.possible_subcommands):
+ if (
+ len(self.args) > 1 and
+ self.args[1] in self.possible_subcommands
+ ):
cmd = self.args[1]
else:
cmd = None
@@ -299,8 +303,10 @@ class PServeCommand(object):
self.out(str(ex))
return 2
- if (self.options.monitor_restart
- and not os.environ.get(self._monitor_environ_key)):
+ if (
+ self.options.monitor_restart and
+ not os.environ.get(self._monitor_environ_key)
+ ):
return self.restart_with_monitor()
if self.options.pid_file:
@@ -568,7 +574,9 @@ class PServeCommand(object):
def change_user_group(self, user, group): # pragma: no cover
if not user and not group:
return
- import pwd, grp
+ import pwd
+ import grp
+
uid = gid = None
if group:
try:
@@ -602,6 +610,7 @@ class PServeCommand(object):
if uid:
os.setuid(uid)
+
class LazyWriter(object):
"""
@@ -762,11 +771,12 @@ class _methodwrapper(object):
self.type = type
def __call__(self, *args, **kw):
- assert not 'self' in kw and not 'cls' in kw, (
+ assert 'self' not in kw and 'cls' not in kw, (
"You cannot use 'self' or 'cls' arguments to a "
"classinstancemethod")
return self.func(*((self.obj, self.type) + args), **kw)
+
class Monitor(object): # pragma: no cover
"""
A file monitor and server restarter.
@@ -860,7 +870,7 @@ class Monitor(object): # pragma: no cover
continue
if filename.endswith('.pyc') and os.path.exists(filename[:-1]):
mtime = max(os.stat(filename[:-1]).st_mtime, mtime)
- if not filename in self.module_mtimes:
+ if filename not in self.module_mtimes:
self.module_mtimes[filename] = mtime
elif self.module_mtimes[filename] < mtime:
print("%s changed; reloading..." % filename)
diff --git a/pyramid/scripts/ptweens.py b/pyramid/scripts/ptweens.py
index ad52d5d8f..a7aa009da 100644
--- a/pyramid/scripts/ptweens.py
+++ b/pyramid/scripts/ptweens.py
@@ -42,7 +42,7 @@ class PTweensCommand(object):
def _get_tweens(self, registry):
from pyramid.config import Configurator
- config = Configurator(registry = registry)
+ config = Configurator(registry=registry)
return config.registry.queryUtility(ITweens)
def out(self, msg): # pragma: no cover
@@ -52,7 +52,7 @@ class PTweensCommand(object):
def show_chain(self, chain):
fmt = '%-10s %-65s'
self.out(fmt % ('Position', 'Name'))
- self.out(fmt % ('-'*len('Position'), '-'*len('Name')))
+ self.out(fmt % ('-' * len('Position'), '-' * len('Name')))
self.out(fmt % ('-', INGRESS))
for pos, (name, _) in enumerate(chain):
self.out(fmt % (pos, name))
diff --git a/pyramid/scripts/pviews.py b/pyramid/scripts/pviews.py
index 5e92ec4e6..15eebdfb4 100644
--- a/pyramid/scripts/pviews.py
+++ b/pyramid/scripts/pviews.py
@@ -140,10 +140,8 @@ class PViewsCommand(object):
if traverser is None:
traverser = ResourceTreeTraverser(root)
tdict = traverser(request)
- context, view_name, subpath, traversed, vroot, vroot_path =(
- tdict['context'], tdict['view_name'], tdict['subpath'],
- tdict['traversed'], tdict['virtual_root'],
- tdict['virtual_root_path'])
+ context, view_name = (tdict['context'], tdict['view_name'])
+
attrs.update(tdict)
# find a view callable
@@ -201,7 +199,7 @@ class PViewsCommand(object):
if not IMultiView.providedBy(view_wrapper):
# single view for this route, so repeat call without route data
del request_attrs['matched_route']
- self.output_view_info(view_wrapper, level+1)
+ self.output_view_info(view_wrapper, level + 1)
else:
self.out("%sView:" % indent)
self.out("%s-----" % indent)
diff --git a/pyramid/static.py b/pyramid/static.py
index 4ff02f798..cb78feb9b 100644
--- a/pyramid/static.py
+++ b/pyramid/static.py
@@ -107,12 +107,14 @@ class static_view(object):
raise HTTPNotFound('Out of bounds: %s' % request.url)
if self.package_name: # package resource
-
- resource_path ='%s/%s' % (self.docroot.rstrip('/'), path)
+ resource_path = '%s/%s' % (self.docroot.rstrip('/'), path)
if resource_isdir(self.package_name, resource_path):
if not request.path_url.endswith('/'):
self.add_slash_redirect(request)
- resource_path = '%s/%s' % (resource_path.rstrip('/'),self.index)
+ resource_path = '%s/%s' % (
+ resource_path.rstrip('/'), self.index
+ )
+
if not resource_exists(self.package_name, resource_path):
raise HTTPNotFound(request.url)
filepath = resource_filename(self.package_name, resource_path)
diff --git a/pyramid/testing.py b/pyramid/testing.py
index 667e6af4e..fd24934ac 100644
--- a/pyramid/testing.py
+++ b/pyramid/testing.py
@@ -21,7 +21,7 @@ from pyramid.compat import (
from pyramid.config import Configurator
from pyramid.decorator import reify
from pyramid.path import caller_package
-from pyramid.response import Response, _get_response_factory
+from pyramid.response import _get_response_factory
from pyramid.registry import Registry
from pyramid.security import (
@@ -154,9 +154,10 @@ class DummyTemplateRenderer(object):
if myval != v:
raise AssertionError(
'\nasserted value for %s: %r\nactual value: %r' % (
- k, v, myval))
+ k, v, myval))
return True
+
class DummyResource:
""" A dummy :app:`Pyramid` :term:`resource` object."""
def __init__(self, __name__=None, __parent__=None, __provides__=None,
@@ -383,11 +384,12 @@ class DummyRequest(
@reify
def response(self):
- f = _get_response_factory(self.registry)
+ f = _get_response_factory(self.registry)
return f(self)
have_zca = True
+
def setUp(registry=None, request=None, hook_zca=True, autocommit=True,
settings=None, package=None):
"""
@@ -577,10 +579,13 @@ def skip_on(*platforms): # pragma: no cover
skip = True
if platform == 'py3' and PY3:
skip = True
+
def decorator(func):
if isinstance(func, class_types):
- if skip: return None
- else: return func
+ if skip:
+ return None
+ else:
+ return func
else:
def wrapper(*args, **kw):
if skip:
diff --git a/pyramid/traversal.py b/pyramid/traversal.py
index a38cf271e..db73d13fc 100644
--- a/pyramid/traversal.py
+++ b/pyramid/traversal.py
@@ -14,10 +14,6 @@ from pyramid.interfaces import (
VH_ROOT_KEY,
)
-with warnings.catch_warnings():
- warnings.filterwarnings('ignore')
- from pyramid.interfaces import IContextURL
-
from pyramid.compat import (
PY3,
native_,
@@ -35,6 +31,10 @@ from pyramid.exceptions import URLDecodeError
from pyramid.location import lineage
from pyramid.threadlocal import get_current_registry
+with warnings.catch_warnings():
+ warnings.filterwarnings('ignore')
+ from pyramid.interfaces import IContextURL
+
empty = text_('')
def find_root(resource):
@@ -664,10 +664,10 @@ class ResourceTreeTraverser(object):
if VH_ROOT_KEY in environ:
# HTTP_X_VHM_ROOT
- vroot_path = decode_path_info(environ[VH_ROOT_KEY])
+ vroot_path = decode_path_info(environ[VH_ROOT_KEY])
vroot_tuple = split_path_info(vroot_path)
vpath = vroot_path + path # both will (must) be unicode or asciistr
- vroot_idx = len(vroot_tuple) -1
+ vroot_idx = len(vroot_tuple) - 1
else:
vroot_tuple = ()
vpath = path
@@ -689,34 +689,34 @@ class ResourceTreeTraverser(object):
vpath_tuple = split_path_info(vpath)
for segment in vpath_tuple:
if segment[:2] == view_selector:
- return {'context':ob,
- 'view_name':segment[2:],
- 'subpath':vpath_tuple[i+1:],
- 'traversed':vpath_tuple[:vroot_idx+i+1],
- 'virtual_root':vroot,
- 'virtual_root_path':vroot_tuple,
- 'root':root}
+ return {'context': ob,
+ 'view_name': segment[2:],
+ 'subpath': vpath_tuple[i + 1:],
+ 'traversed': vpath_tuple[:vroot_idx + i + 1],
+ 'virtual_root': vroot,
+ 'virtual_root_path': vroot_tuple,
+ 'root': root}
try:
getitem = ob.__getitem__
except AttributeError:
- return {'context':ob,
- 'view_name':segment,
- 'subpath':vpath_tuple[i+1:],
- 'traversed':vpath_tuple[:vroot_idx+i+1],
- 'virtual_root':vroot,
- 'virtual_root_path':vroot_tuple,
- 'root':root}
+ return {'context': ob,
+ 'view_name': segment,
+ 'subpath': vpath_tuple[i + 1:],
+ 'traversed': vpath_tuple[:vroot_idx + i + 1],
+ 'virtual_root': vroot,
+ 'virtual_root_path': vroot_tuple,
+ 'root': root}
try:
next = getitem(segment)
except KeyError:
- return {'context':ob,
- 'view_name':segment,
- 'subpath':vpath_tuple[i+1:],
- 'traversed':vpath_tuple[:vroot_idx+i+1],
- 'virtual_root':vroot,
- 'virtual_root_path':vroot_tuple,
- 'root':root}
+ return {'context': ob,
+ 'view_name': segment,
+ 'subpath': vpath_tuple[i + 1:],
+ 'traversed': vpath_tuple[:vroot_idx + i + 1],
+ 'virtual_root': vroot,
+ 'virtual_root_path': vroot_tuple,
+ 'root': root}
if i == vroot_idx:
vroot = next
ob = next
diff --git a/pyramid/url.py b/pyramid/url.py
index a0f3d7f2f..b004c40ec 100644
--- a/pyramid/url.py
+++ b/pyramid/url.py
@@ -606,10 +606,11 @@ class URLMethodsMixin(object):
if local_url is not None:
# the resource handles its own url generation
d = dict(
- virtual_path = virtual_path,
- physical_path = url_adapter.physical_path,
- app_url = app_url,
- )
+ virtual_path=virtual_path,
+ physical_path=url_adapter.physical_path,
+ app_url=app_url,
+ )
+
# allow __resource_url__ to punt by returning None
resource_url = local_url(self, d)
@@ -698,7 +699,7 @@ class URLMethodsMixin(object):
"""
if not os.path.isabs(path):
- if not ':' in path:
+ if ':' not in path:
# if it's not a package:relative/name and it's not an
# /absolute/path it's a relative/path; this means its relative
# to the package in which the caller's module is defined.
@@ -743,7 +744,7 @@ class URLMethodsMixin(object):
to ``static_path`` will be ignored.
"""
if not os.path.isabs(path):
- if not ':' in path:
+ if ':' not in path:
# if it's not a package:relative/name and it's not an
# /absolute/path it's a relative/path; this means its relative
# to the package in which the caller's module is defined.
@@ -884,6 +885,7 @@ def resource_url(resource, request, *elements, **kw):
model_url = resource_url # b/w compat (forever)
+
def static_url(path, request, **kw):
"""
This is a backwards compatibility function. Its result is the same as
@@ -894,7 +896,7 @@ def static_url(path, request, **kw):
See :meth:`pyramid.request.Request.static_url` for more information.
"""
if not os.path.isabs(path):
- if not ':' in path:
+ if ':' not in path:
# if it's not a package:relative/name and it's not an
# /absolute/path it's a relative/path; this means its relative
# to the package in which the caller's module is defined.
@@ -902,6 +904,7 @@ def static_url(path, request, **kw):
path = '%s:%s' % (package.__name__, path)
return request.static_url(path, **kw)
+
def static_path(path, request, **kw):
"""
This is a backwards compatibility function. Its result is the same as
@@ -912,7 +915,7 @@ def static_path(path, request, **kw):
See :meth:`pyramid.request.Request.static_path` for more information.
"""
if not os.path.isabs(path):
- if not ':' in path:
+ if ':' not in path:
# if it's not a package:relative/name and it's not an
# /absolute/path it's a relative/path; this means its relative
# to the package in which the caller's module is defined.
diff --git a/pyramid/util.py b/pyramid/util.py
index 7a8af4899..de8ca34cf 100644
--- a/pyramid/util.py
+++ b/pyramid/util.py
@@ -16,7 +16,6 @@ from pyramid.exceptions import (
)
from pyramid.compat import (
- iteritems_,
is_nonstr_iter,
integer_types,
string_types,
@@ -28,12 +27,14 @@ from pyramid.compat import (
from pyramid.interfaces import IActionInfo
from pyramid.path import DottedNameResolver as _DottedNameResolver
+
class DottedNameResolver(_DottedNameResolver):
def __init__(self, package=None): # default to package = None for bw compat
return _DottedNameResolver.__init__(self, package)
_marker = object()
+
class InstancePropertyHelper(object):
"""A helper object for assigning properties and descriptors to instances.
It is not normally possible to do this because descriptors must be
@@ -446,7 +447,7 @@ class TopologicalSorter(object):
order.append((a, b))
def add_node(node):
- if not node in graph:
+ if node not in graph:
roots.append(node)
graph[node] = [0] # 0 = number of arcs coming into this node
@@ -519,7 +520,7 @@ def viewdefaults(wrapped):
view = self.maybe_dotted(view)
if inspect.isclass(view):
defaults = getattr(view, '__view_defaults__', {}).copy()
- if not '_backframes' in kw:
+ if '_backframes' not in kw:
kw['_backframes'] = 1 # for action_method
defaults.update(kw)
return wrapped(self, *arg, **defaults)
diff --git a/pyramid/view.py b/pyramid/view.py
index 02ac8849f..1dd10e2ed 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -268,7 +268,7 @@ class AppendSlashNotFoundViewFactory(object):
qs = request.query_string
if qs:
qs = '?' + qs
- return HTTPFound(location=request.path+'/'+qs)
+ return HTTPFound(location=request.path + '/' + qs)
return self.notfound_view(context, request)
append_slash_notfound_view = AppendSlashNotFoundViewFactory()
diff --git a/setup.cfg b/setup.cfg
index 875480594..3ef28451f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -13,3 +13,7 @@ docs = develop easy_install pyramid[docs]
[bdist_wheel]
universal = 1
+[flake8]
+ignore = E301,E302,E731,E261,E123,E121,E128,E129,E125,W291,E501,W293,E303,W391,E266,E231,E201,E202,E127,E262
+exclude = pyramid/tests/,pyramid/compat.py,pyramid/resource.py
+show-source = True
diff --git a/tox.ini b/tox.ini
index e0f99e7f6..b52eac67e 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
[tox]
envlist =
- py26,py27,py32,py33,py34,pypy,pypy3,
+ py26,py27,py32,py33,py34,pypy,pypy3,pep8,
{py2,py3}-docs,
{py2,py3}-cover,coverage
@@ -22,6 +22,16 @@ commands =
pip install pyramid[testing]
nosetests --with-xunit --xunit-file=nosetests-{envname}.xml {posargs:}
+[testenv:pep8]
+basepython = python3.4
+commands =
+ flake8 pyramid/
+deps =
+ flake8
+
+# we separate coverage into its own testenv because a) "last run wins" wrt
+# cobertura jenkins reporting and b) pypy and jython can't handle any
+# combination of versions of coverage and nosexcover that i can find.
[testenv:py2-cover]
commands =
pip install pyramid[testing]
@@ -52,7 +62,7 @@ commands =
[testenv:coverage]
basepython = python3.4
-commands =
+commands =
coverage erase
coverage combine
coverage xml