Fix style errors and add to automated checks

Adds a "stylecheck" to the Tox build config to automatically run flake8 checks.
Fixes existing flake8 issues.
This commit is contained in:
Matt Good
2015-04-17 14:23:58 -07:00
parent f087311f7c
commit 14cd912df7
13 changed files with 74 additions and 48 deletions

View File

@@ -4,7 +4,6 @@ import warnings
from flask import Blueprint, current_app, request, g, send_from_directory
from flask.globals import _request_ctx_stack
from jinja2 import Environment, PackageLoader
from werkzeug.exceptions import HTTPException
from werkzeug.urls import url_quote_plus
from flask_debugtoolbar.compat import iteritems
@@ -148,7 +147,9 @@ class DebugToolbarExtension(object):
real_request = request._get_current_object()
self.debug_toolbars[real_request] = DebugToolbar(real_request, self.jinja_env)
self.debug_toolbars[real_request] = (
DebugToolbar(real_request, self.jinja_env))
for panel in self.debug_toolbars[real_request].panels:
panel.process_request(real_request)
@@ -157,11 +158,16 @@ class DebugToolbarExtension(object):
This is done by the dispatch_request method.
"""
real_request = request._get_current_object()
if real_request in self.debug_toolbars:
for panel in self.debug_toolbars[real_request].panels:
new_view = panel.process_view(real_request, view_func, view_kwargs)
if new_view:
view_func = new_view
try:
toolbar = self.debug_toolbars[real_request]
except KeyError:
return view_func
for panel in toolbar.panels:
new_view = panel.process_view(real_request, view_func, view_kwargs)
if new_view:
view_func = new_view
return view_func
def process_response(self, response):
@@ -205,7 +211,8 @@ class DebugToolbarExtension(object):
before = response_html
after = ''
else:
warnings.warn('Could not insert debug toolbar. </body> tag not found in response.')
warnings.warn('Could not insert debug toolbar.'
' </body> tag not found in response.')
return response
toolbar = self.debug_toolbars[real_request]

View File

@@ -6,7 +6,9 @@ class DebugPanel(object):
Base class for debug panels.
"""
# name = Base
has_content = False # If content returns something, set to true in subclass
# If content returns something, set to true in subclass
has_content = False
# If the client is able to activate/de-activate the panel
user_enable = False

View File

@@ -26,8 +26,8 @@ class ThreadTrackingHandler(logging.Handler):
def get_records(self, thread=None):
"""
Returns a list of records for the provided thread, of if none is provided,
returns a list for the current thread.
Returns a list of records for the provided thread, of if none is
provided, returns a list for the current thread.
"""
if thread is None:
thread = threading.currentThread()
@@ -57,8 +57,8 @@ def _init_once():
# Call werkzeug's internal logging to make sure it gets configured
# before we add our handler. Otherwise werkzeug will see our handler
# and not configure console logging for the request log.
# Werkzeug's default log level is INFO so this message probably won't be
# seen.
# Werkzeug's default log level is INFO so this message probably won't
# be seen.
try:
from werkzeug._internal import _log
except ImportError:
@@ -88,8 +88,8 @@ class LoggingPanel(DebugPanel):
def nav_subtitle(self):
# FIXME l10n: use ngettext
return "%s message%s" % \
(len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's')
num_records = len(handler.get_records())
return '%s message%s' % (num_records, '' if num_records == 1 else 's')
def title(self):
return _('Log Messages')

View File

@@ -1,10 +1,8 @@
import sys
try:
import cProfile as profile
except ImportError:
import profile
import functools
import os.path
import pstats
from flask import current_app

View File

@@ -35,10 +35,11 @@ class RequestVarsDebugPanel(DebugPanel):
def content(self):
context = self.context.copy()
context.update({
'get': [(k, self.request.args.getlist(k)) for k in self.request.args],
'post': [(k, self.request.form.getlist(k)) for k in self.request.form],
'cookies': [(k, self.request.cookies.get(k)) for k in self.request.cookies],
'view_func': ('%s.%s' % (self.view_func.__module__, self.view_func.__name__)
'get': self.request.args.lists(),
'post': self.request.form.lists(),
'cookies': self.request.cookies.items(),
'view_func': ('%s.%s' % (self.view_func.__module__,
self.view_func.__name__)
if self.view_func else '[unknown]'),
'view_args': self.view_args,
'view_kwargs': self.view_kwargs or {},

View File

@@ -54,11 +54,13 @@ def extension_used():
def recording_enabled():
return current_app.debug or current_app.config.get('SQLALCHEMY_RECORD_QUERIES')
return (current_app.debug
or current_app.config.get('SQLALCHEMY_RECORD_QUERIES'))
def is_available():
return json_available and sqlalchemy_available and extension_used() and recording_enabled()
return (json_available and sqlalchemy_available
and extension_used() and recording_enabled())
def get_queries():
@@ -145,4 +147,4 @@ def sql_select(explain=False):
'headers': result.keys(),
'sql': format_sql(statement, params),
'duration': float(request.args['duration']),
})
})

View File

@@ -1,12 +1,10 @@
import collections
import json
import sys
import traceback
import uuid
from jinja2.exceptions import TemplateSyntaxError
from flask import (
template_rendered, request, g, render_template_string,
template_rendered, request, g,
Response, current_app, abort, url_for
)
from flask_debugtoolbar import module
@@ -95,7 +93,8 @@ def template_editor(key):
require_enabled()
# TODO set up special loader that caches templates it loads
# and can override template contents
templates = [t['template'] for t in TemplateDebugPanel.get_cache_for_key(key)]
templates = [t['template'] for t in
TemplateDebugPanel.get_cache_for_key(key)]
return g.debug_toolbar.render('panels/template_editor.html', {
'static_path': url_for('_debug_toolbar.static', filename=''),
'request': request,
@@ -131,6 +130,7 @@ def template_preview(key):
while tb.tb_next:
tb = tb.tb_next
msg = {'lineno': tb.tb_lineno, 'error': str(e)}
return Response(json.dumps(msg), status=400, mimetype='application/json')
return Response(json.dumps(msg), status=400,
mimetype='application/json')
finally:
del tb

View File

@@ -37,13 +37,14 @@ class TimerDebugPanel(DebugPanel):
def nav_subtitle(self):
# TODO l10n
if self.has_resource:
utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime
stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime
return 'CPU: %0.2fms (%0.2fms)' % ((utime + stime) * 1000.0, self.total_time)
else:
if not self.has_resource:
return 'TOTAL: %0.2fms' % (self.total_time)
utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime
stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime
return 'CPU: %0.2fms (%0.2fms)' % (
(utime + stime) * 1000.0, self.total_time)
def title(self):
return _('Resource Usage')
@@ -51,7 +52,8 @@ class TimerDebugPanel(DebugPanel):
return ''
def _elapsed_ru(self, name):
return getattr(self._end_rusage, name) - getattr(self._start_rusage, name)
return (getattr(self._end_rusage, name)
- getattr(self._start_rusage, name))
def content(self):
@@ -59,8 +61,8 @@ class TimerDebugPanel(DebugPanel):
stime = 1000 * self._elapsed_ru('ru_stime')
vcsw = self._elapsed_ru('ru_nvcsw')
ivcsw = self._elapsed_ru('ru_nivcsw')
minflt = self._elapsed_ru('ru_minflt')
majflt = self._elapsed_ru('ru_majflt')
# minflt = self._elapsed_ru('ru_minflt')
# majflt = self._elapsed_ru('ru_majflt')
# these are documented as not meaningful under Linux. If you're running BSD
# feel free to enable them, and add any others that I hadn't gotten to before
@@ -81,9 +83,9 @@ class TimerDebugPanel(DebugPanel):
(_('Total CPU time'), '%0.3f msec' % (utime + stime)),
(_('Elapsed time'), '%0.3f msec' % self.total_time),
(_('Context switches'), '%d voluntary, %d involuntary' % (vcsw, ivcsw)),
# ('Memory use', '%d max RSS, %d shared, %d unshared' % (rss, srss, urss + usrss)),
# ('Page faults', '%d no i/o, %d requiring i/o' % (minflt, majflt)),
# ('Disk operations', '%d in, %d out, %d swapout' % (blkin, blkout, swap)),
# ('Memory use', '%d max RSS, %d shared, %d unshared' % (rss, srss, urss + usrss)),
# ('Page faults', '%d no i/o, %d requiring i/o' % (minflt, majflt)),
# ('Disk operations', '%d in, %d out, %d swapout' % (blkin, blkout, swap)),
)
context = self.context.copy()

View File

@@ -6,6 +6,7 @@ from flask_debugtoolbar.panels import DebugPanel
_ = lambda x: x
def relpath(location, python_lib):
location = os.path.normpath(location)
relative = os.path.relpath(location, python_lib)

View File

@@ -30,7 +30,8 @@ class DebugToolbar(object):
activated = unquote(activated).split(';')
for panel_class in self._iter_panels(current_app):
panel_instance = panel_class(jinja_env=self.jinja_env, context=self.template_context)
panel_instance = panel_class(jinja_env=self.jinja_env,
context=self.template_context)
if panel_instance.dom_id() in activated:
panel_instance.is_active = True

View File

@@ -27,4 +27,4 @@ def index():
if __name__ == '__main__':
app.run()
app.run()

View File

@@ -6,7 +6,7 @@ import ntpath
from flask import Markup
from flask_debugtoolbar.utils import (_relative_paths, _shortest_relative_path,
format_sql, decode_text, HAVE_PYGMENTS)
format_sql, decode_text, HAVE_PYGMENTS)
@pytest.mark.parametrize('value,paths,expected,path_module', [
@@ -24,7 +24,8 @@ from flask_debugtoolbar.utils import (_relative_paths, _shortest_relative_path,
# should yield all results when multiple parents match
('/foo/bar/baz', ['/foo', '/foo/bar'], ['bar/baz', 'baz'], posixpath),
('c:\\foo\\bar\\baz', ['c:\\foo', 'c:\\foo\\bar'], ['bar\\baz', 'baz'], ntpath),
('c:\\foo\\bar\\baz', ['c:\\foo', 'c:\\foo\\bar'],
['bar\\baz', 'baz'], ntpath),
# should ignore case differences on windows
('c:\\Foo\\bar', ['c:\\foo'], ['bar'], ntpath),
@@ -41,7 +42,7 @@ def test_relative_paths(value, paths, expected, path_module):
# should yield relative path to the parent directory
('/foo/bar', ['/foo'], 'bar', posixpath),
('c:\\foo\\bar', ['c:\\foo'], 'bar', ntpath),
# should return the original value if no path is a parent directory
('/foo/bar', ['/baz'], '/foo/bar', posixpath),
('c:\\foo\\bar', ['c:\\baz'], 'c:\\foo\\bar', ntpath),
@@ -99,7 +100,8 @@ def test_format_sql_no_pygments_escape_html(no_pygments):
assert Markup('%s') % formatted == 'select x &lt; 1'
@pytest.mark.skipif(not HAVE_PYGMENTS, reason='test requires the "Pygments" library')
@pytest.mark.skipif(not HAVE_PYGMENTS,
reason='test requires the "Pygments" library')
def test_format_sql_pygments():
sql = 'select 1'
html = format_sql(sql, {})
@@ -109,7 +111,8 @@ def test_format_sql_pygments():
assert '1' in html
@pytest.mark.skipif(not HAVE_PYGMENTS, reason='test requires the "Pygments" library')
@pytest.mark.skipif(not HAVE_PYGMENTS,
reason='test requires the "Pygments" library')
def test_format_sql_pygments_non_ascii():
sql = b"select 'abc \xff xyz'"
html = format_sql(sql, {})

11
tox.ini
View File

@@ -1,5 +1,5 @@
[tox]
envlist = py26,py27,py34
envlist = py26,py27,py34,stylecheck
[testenv]
deps =
@@ -8,3 +8,12 @@ deps =
Pygments
commands =
py.test
[testenv:stylecheck]
deps =
flake8
commands =
flake8 flask_debugtoolbar test
[flake8]
max-line-length = 100