diff --git a/boltons/_bench_omd.py b/boltons/tests/_bench_omd.py
similarity index 100%
rename from boltons/_bench_omd.py
rename to boltons/tests/_bench_omd.py
diff --git a/boltons/tests/table_html_app.py b/boltons/tests/table_html_app.py
new file mode 100644
index 0000000..c94c028
--- /dev/null
+++ b/boltons/tests/table_html_app.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+import json
+from os.path import expanduser
+
+sys.path.append(expanduser('~/projects/clastic'))
+import clastic
+from clastic import Application
+from clastic.render import JSONRender
+from clastic.middleware import GetParamMiddleware
+from clastic import Response
+from clastic.sinter import getargspec
+
+from tableutils import Table
+
+_DATA = json.load(open('meta_stats.json'))
+
+_CUR_PATH = os.path.dirname(os.path.abspath(clastic.__file__))
+_CA_PATH = _CUR_PATH + '/_clastic_assets'
+_CSS_PATH = _CA_PATH + '/common.css'
+_STYLE = open(_CSS_PATH).read()
+
+
+def fetch_json(url):
+ import urllib2
+ response = urllib2.urlopen(url)
+ content = response.read()
+ data = json.loads(content)
+ return data
+
+
+class AutoTableRenderer(object):
+ _html_doctype = ''
+ _html_wrapper, _html_wrapper_close = '', ''
+ _html_table_tag = '
'
+ _html_style_content = _STYLE
+
+ def __init__(self, max_depth=4, orientation='auto'):
+ self.max_depth = max_depth
+ self.orientation = orientation
+
+ def _html_format_ep(self, route):
+ # TODO: callable object endpoints?
+ module_name = route.endpoint.__module__
+ try:
+ func_name = route.endpoint.func_name
+ except:
+ func_name = repr(route.endpoint)
+ args, _, _, _ = getargspec(route.endpoint)
+ argstr = ', '.join(args)
+ title = ('%s
%s(%s)
'
+ % (module_name, func_name, argstr))
+ return title
+
+ def __call__(self, context, _route):
+ content_parts = [self._html_wrapper]
+ if self._html_style_content:
+ content_parts.extend([''])
+ content_parts.append('')
+ title = self._html_format_ep(_route)
+ content_parts.append(title)
+ table = Table.from_data(context, max_depth=self.max_depth)
+ table._html_table_tag = self._html_table_tag
+ content = table.to_html(max_depth=self.max_depth,
+ orientation=self.orientation)
+ content_parts.append(content)
+ content_parts.append('')
+ content_parts.append(self._html_wrapper_close)
+ return Response('\n'.join(content_parts), mimetype='text/html')
+
+
+class BasicRender(object):
+ _default_mime = 'application/json'
+ _format_mime_map = {'html': 'text/html',
+ 'json': 'application/json'}
+
+ def __init__(self, dev_mode=True, qp_name='format'):
+ self.qp_name = qp_name
+ self.json_render = JSONRender(dev_mode=dev_mode)
+ self.autotable_render = AutoTableRenderer()
+
+ def render_response(self, request, context, _route):
+ from collections import Sized
+ if isinstance(context, basestring): # already serialized
+ if self._guess_json(context):
+ return Response(context, mimetype="application/json")
+ elif '