diff --git a/.gitignore b/.gitignore index e43b0f9..2b8c779 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ .DS_Store +*.pyc +*.py~ +*.log + diff --git a/app.py b/app.py new file mode 100644 index 0000000..4806628 --- /dev/null +++ b/app.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from server import create_app +app = create_app() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1965d5b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +Werkzeug==0.9.4 +argparse==1.2.1 +ashes==0.7.4 +boltons==0.6.2 +clastic==0.4.2 +oursql==0.9.3.1 +wsgiref==0.1.2 diff --git a/server.py b/server.py index 54019a4..27f153a 100644 --- a/server.py +++ b/server.py @@ -3,13 +3,14 @@ import sys from os.path import join as pjoin -from flup.server.fcgi import WSGIServer -from clastic import Application, render_json, render_basic +from clastic import Application, render_json, render_basic, Middleware from clastic.meta import MetaApplication from clastic.render import AshesRenderFactory from clastic.static import StaticApplication import oursql +from boltons.strutils import find_hashtags +from boltons.tbutils import ExceptionInfo DB_CONFIG_PATH = os.path.expanduser('~/replica.my.cnf') FLUP_LOG_DIR = os.path.expanduser('~') @@ -21,7 +22,20 @@ _CUR_PATH = os.path.dirname(__file__) -def get_hashtags(tag, lang=DEFAULT_LANG, days=DEFAULT_DAYS): +class ExceptionPrinter(Middleware): + def request(self, next, request, _route): + try: + return next() + except: + formatted_tb = ExceptionInfo.from_current().get_formatted() + print formatted_tb + import pdb;pdb.post_mortem() + return render_basic(request=request, + context=formatted_tb, + _route=_route) + + +def get_hashtags(tag=None, lang=DEFAULT_LANG, days=DEFAULT_DAYS): query = ''' SELECT * FROM recentchanges @@ -29,36 +43,40 @@ def get_hashtags(tag, lang=DEFAULT_LANG, days=DEFAULT_DAYS): AND rc_timestamp > DATE_FORMAT(DATE_SUB(NOW(), INTERVAL ? DAY), '%Y%m%d%H%i%s') - AND rc_comment REGEXP ?''' + AND rc_comment REGEXP ? ORDER BY rc_timestamp DESC''' db_title = lang + 'wiki_p' db_host = lang + 'wiki.labsdb' connection = oursql.connect(db=db_title, host=db_host, read_default_file=DB_CONFIG_PATH, - charset=None) + charset=None, + use_unicode=True) cursor = connection.cursor(oursql.DictCursor) if tag is None: tag_pattern = '(^| )#[[:alpha:]]{1}[[:alnum:]]*[[:>:]]' else: - tag_pattern = '(^| )[#]{1}%s[[:>:]]' % tag + tag_pattern = '(^| )#%s[[:>:]]' % tag cursor.execute(query, (days, tag_pattern)) ret = cursor.fetchall() return ret def process_revs(rev, lang): - url_str = '%s.wikipedia.org/wiki/?diff=%s&oldid=%s' + url_str = 'https://%s.wikipedia.org/wiki/?diff=%s&oldid=%s' rev['diff_size'] = rev['rc_new_len'] - rev['rc_old_len'] rev['date'] = rev['rc_timestamp'] # TODO rev['diff_url'] = url_str % (lang, rev['rc_this_oldid'], rev['rc_last_oldid']) + rev['tags'] = find_hashtags(rev['rc_comment']) return rev def generate_report(tag=None, lang=DEFAULT_LANG, days=DEFAULT_DAYS): revs = get_hashtags(tag, lang, days) ret = [process_revs(rev, lang) for rev in revs] + ret = [r for r in ret if not all(tag.lower() == 'redirect' for tag + in r['tags'])] if tag is None: tag = 'all tags' return {'revisions': ret, 'tag': tag} @@ -68,21 +86,18 @@ def create_app(): _template_dir = os.path.join(_CUR_PATH, TEMPLATES_PATH) _static_dir = os.path.join(_CUR_PATH, STATIC_PATH) templater = AshesRenderFactory(_template_dir) - routes = [('/', generate_report, 'design.html'), + routes = [('/all', generate_report, 'design.html'), ('/', generate_report, 'design.html'), ('/get/', get_hashtags, render_json), ('/get//', get_hashtags, render_json), ('/get///', get_hashtags, render_json), ('/static', StaticApplication(_static_dir)), - ('/meta', MetaApplication())] - return Application(routes, render_factory=templater) + ('/meta/', MetaApplication())] + return Application(routes, + middlewares=[ExceptionPrinter()], + render_factory=templater) if __name__ == '__main__': - wsgi_app = create_app() - # we have to redirect stdout and stderr, otherwise we see no - # errors beyond this point. - sys.stdout = open(pjoin(FLUP_LOG_DIR, 'flup-stdout.log'), 'a') - sys.stderr = open(pjoin(FLUP_LOG_DIR, 'flup-stderr.log'), 'a') - wsgi_server = WSGIServer(wsgi_app) - wsgi_server.run() + app = create_app() + app.serve() diff --git a/templates/design.html b/templates/design.html index 60258e6..82356de 100644 --- a/templates/design.html +++ b/templates/design.html @@ -61,7 +61,7 @@

Showing {tag}

{rc_user_text} {rc_title} - #test + {#tags}{.}{@sep}, {/sep}{/tags} {rc_comment} {diff_size} {date}