diff options
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() @@ -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 @@ -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 |
