changeset 164:a4a64d6b66cb

Fixed various bugs: - Encode in UTF-8 before doing URL-quoting. - Don't depend on the Celery app if using synchronous updates. - The config for synchronous updates is now in the `wikirc`. - Ability to define ignored directories/files in the `wikirc`.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 12 Jan 2014 00:24:24 -0800
parents cba3a31595c7
children 3b23fe46b1a1
files backend.py wikked/fs.py wikked/resolver.py wikked/resources/defaults.cfg wikked/scm/mercurial.py wikked/tasks.py wikked/utils.py wikked/views/__init__.py wikked/views/edit.py wikked/views/read.py wikked/wiki.py
diffstat 11 files changed, 49 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/backend.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/backend.py	Sun Jan 12 00:24:24 2014 -0800
@@ -1,15 +1,4 @@
-import logging
-from celery import Celery
-
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-app = Celery(
-        'wikked',
-        broker='amqp://',
-        backend='amqp://',
-        include=['wikked.tasks'])
+from wikked.tasks import app
 
 if __name__ == '__main__':
     app.start()
--- a/wikked/fs.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/fs.py	Sun Jan 12 00:24:24 2014 -0800
@@ -37,7 +37,7 @@
     def __init__(self, root):
         self.root = unicode(root)
 
-        self.excluded = []
+        self.excluded = None
         self.page_extensions = None
         self.default_extension = '.txt'
 
@@ -45,8 +45,10 @@
         self.page_extensions = list(set(
             itertools.chain(*wiki.formatters.itervalues())))
 
-        self.excluded += wiki.getSpecialFilenames()
-        self.excluded += wiki.scm.getSpecialFilenames()
+        excluded = []
+        excluded += wiki.getSpecialFilenames()
+        excluded += wiki.scm.getSpecialFilenames()
+        self.excluded = [os.path.join(self.root, e) for e in excluded]
 
         self.default_extension = wiki.config.get('wiki', 'default_extension')
 
@@ -56,7 +58,15 @@
             basepath = self.getPhysicalNamespacePath(subdir)
 
         for dirpath, dirnames, filenames in os.walk(basepath):
-            dirnames[:] = [d for d in dirnames if os.path.join(dirpath, d) not in self.excluded]
+            incl_dirnames = []
+            for d in dirnames:
+                full_d = os.path.join(dirpath, d)
+                for e in self.excluded:
+                    if fnmatch.fnmatch(full_d, e):
+                        break
+                else:
+                    incl_dirnames.append(d)
+            dirnames[:] = incl_dirnames
             for filename in filenames:
                 path = os.path.join(dirpath, filename)
                 page_info = self.getPageInfo(path)
--- a/wikked/resolver.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/resolver.py	Sun Jan 12 00:24:24 2014 -0800
@@ -196,7 +196,7 @@
                 raw_url = unicode(m.group('url'))
                 url = self.ctx.getAbsoluteUrl(raw_url)
                 self.output.out_links.append(url)
-                quoted_url = urllib.quote(url)
+                quoted_url = urllib.quote(url.encode('utf-8'))
                 if self.wiki.pageExists(url):
                     return '<a class="wiki-link" data-wiki-url="%s">' % quoted_url
                 return '<a class="wiki-link missing" data-wiki-url="%s">' % quoted_url
--- a/wikked/resources/defaults.cfg	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/resources/defaults.cfg	Sun Jan 12 00:24:24 2014 -0800
@@ -7,4 +7,5 @@
 indexer=whoosh
 database=sql
 database_url=sqlite:///%(root)s/.wiki/wiki.db
+async_updates=False
 
--- a/wikked/scm/mercurial.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/scm/mercurial.py	Sun Jan 12 00:24:24 2014 -0800
@@ -41,8 +41,7 @@
             self.commit([ignore_path], "Created `.hgignore`.")
 
     def getSpecialFilenames(self):
-        specials = ['.hg', '.hgignore', '.hgtags']
-        return [os.path.join(self.root, d) for d in specials]
+        return ['.hg*']
 
 
 class MercurialSourceControl(MercurialBaseSourceControl):
@@ -217,7 +216,7 @@
         if status[0] == 'M':
             return STATE_MODIFIED
         raise Exception("Unsupported status: %s" % status)
-            
+
     def getRevision(self, path, rev):
         return self.client.cat([path], rev=rev)
 
--- a/wikked/tasks.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/tasks.py	Sun Jan 12 00:24:24 2014 -0800
@@ -1,11 +1,19 @@
 import logging
-from backend import app
+from celery import Celery
 from wiki import Wiki, WikiParameters
 
 
 logger = logging.getLogger(__name__)
 
 
+#TODO: Make those settings configurable!
+app = Celery(
+        'wikked',
+        broker='amqp://',
+        backend='amqp://',
+        include=['wikked.tasks'])
+
+
 class wiki_session(object):
     def __init__(self, wiki_root):
         self.wiki_root = wiki_root
--- a/wikked/utils.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/utils.py	Sun Jan 12 00:24:24 2014 -0800
@@ -62,7 +62,7 @@
         raw_abs_url = os.path.join(urldir, url)
         abs_url = os.path.normpath(raw_abs_url).replace('\\', '/')
     if quote:
-        abs_url = urllib.quote(abs_url)
+        abs_url = urllib.quote(abs_url.encode('utf-8'))
     return abs_url
 
 
--- a/wikked/views/__init__.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/views/__init__.py	Sun Jan 12 00:24:24 2014 -0800
@@ -71,7 +71,7 @@
     else:
         meta = dict(page.meta)
     meta['title'] = page.title
-    meta['url'] = urllib.quote(page.url)
+    meta['url'] = urllib.quote(page.url.encode('utf-8'))
     for name in COERCE_META:
         if name in meta:
             meta[name] = COERCE_META[name](meta[name])
@@ -82,7 +82,7 @@
     result = []
     for item in category:
         result.append({
-            'url': urllib.quote(item),
+            'url': urllib.quote(item.encode('utf-8')),
             'name': item
             })
     return result
--- a/wikked/views/edit.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/views/edit.py	Sun Jan 12 00:24:24 2014 -0800
@@ -3,7 +3,6 @@
 from flask.ext.login import current_user
 from wikked.page import Page, PageData
 from wikked.formatter import PageFormatter, FormattingContext
-from wikked.tasks import update_wiki
 from wikked.views import (make_page_title, make_auth_response, get_page_or_none,
         is_page_writable, get_page_meta, url_from_viewarg,
         split_url_from_viewarg)
@@ -41,7 +40,7 @@
     if page is None:
         result = {
                 'meta': {
-                    'url': urllib.quote(url),
+                    'url': urllib.quote(url.encode('utf-8')),
                     'title': default_title or make_page_title(url)
                     },
                 'text': ''
@@ -83,10 +82,7 @@
             'author': author,
             'message': message
             }
-    do_sync_update = app.config['SYNCHRONOUS_UPDATE']
-    g.wiki.setPage(url, page_fields, do_update=do_sync_update)
-    if not do_sync_update:
-        update_wiki.delay(g.wiki.root)
+    g.wiki.setPage(url, page_fields)
 
     result = {'saved': 1}
     return make_auth_response(result)
--- a/wikked/views/read.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/views/read.py	Sun Jan 12 00:24:24 2014 -0800
@@ -80,7 +80,7 @@
     tpl_data = {
             'name': endpoint,
             'value': value,
-            'safe_value': urllib.quote(value),
+            'safe_value': urllib.quote(value.encode('utf-8')),
             'pages': [get_page_meta(p) for p in pages]
             # TODO: skip pages that are forbidden for the current user
         }
@@ -95,7 +95,7 @@
             'meta_value': value,
             'query': query,
             'meta': {
-                    'url': urllib.quote(meta_page_url),
+                    'url': urllib.quote(meta_page_url.encode('utf-8')),
                     'title': value
                 },
             'text': text
--- a/wikked/wiki.py	Sun Jan 12 00:22:59 2014 -0800
+++ b/wikked/wiki.py	Sun Jan 12 00:24:24 2014 -0800
@@ -119,6 +119,14 @@
 
         self.auth = UserManager(self.config)
 
+        if self.config.getboolean('wiki', 'async_updates'):
+            logger.debug("Setting up asynchronous updater.")
+            from tasks import update_wiki
+            self._updateSetPage = lambda url: update_wiki.delay(self.root)
+        else:
+            logger.debug("Setting up simple updater.")
+            self._updateSetPage = lambda url: self.update(url, cache_ext_data=False)
+
     @property
     def root(self):
         return self.fs.root
@@ -210,7 +218,7 @@
 
         # Update the DB and index with the new/modified page.
         if do_update:
-            self.update(url, cache_ext_data=False)
+            self._updateSetPage(url)
 
     def revertPage(self, url, page_fields):
         """ Reverts the page with the given URL to an older revision.
@@ -254,8 +262,11 @@
         return self.scm.getHistory(limit=limit)
 
     def getSpecialFilenames(self):
-        yield os.path.join(self.root, '.wikirc')
-        yield os.path.join(self.root, '.wiki')
+        yield '.wikirc'
+        yield '.wiki'
+        if self.config.has_section('ignore'):
+            for name, val in self.config.items('ignore'):
+                yield val
 
     def _cachePages(self, only_urls=None):
         logger.debug("Caching extended page data...")