diff --git a/mixins/menuitemmixin.py b/mixins/menuitemmixin.py
index b4f69f4..f429a44 100644
--- a/mixins/menuitemmixin.py
+++ b/mixins/menuitemmixin.py
@@ -7,30 +7,29 @@ class MenuItemMixin(MessageMixin):
menu_label = None
menu_parent = None
url = "index.html"
-
+
menu_items = None
def process_message(self, message):
other_messages = super(MenuItemMixin, self).process_message(message)
-
+
if message == None:
- return other_messages + [{'type': 'menu_add_item',
- 'title' : self.menu_title,
+ self.menu_items = {}
+ return other_messages + [{'type': 'menu_add_item',
+ 'title' : self.menu_title,
'parent' : self.menu_parent,
'label' : self.menu_label,
'url' : self.url}]
- elif message['type'] == 'menu_add_item':
- if self.menu_items == None:
- self.menu_items = {}
-
+ elif message['type'] == 'menu_add_item':
+
label = message['label']
if label in self.menu_items.keys():
print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label)
return other_messages
-
+
self.menu_items[label] = {}
-
+
for key in ['title', 'parent', 'label', 'url']:
self.menu_items[label][key] = message[key]
@@ -41,14 +40,14 @@ class MenuItemMixin(MessageMixin):
path = [self.menu_label]
while self.menu_items[path[0]]['parent'] != None:
path = [self.menu_items[path[0]]['parent']] + path
-
+
return path
-
+
def get_menu_level(self, parent):
return filter(lambda x: x['parent'] == parent, self.menu_items.values())
-
+
def generate_levels(self, path):
level = path[0]
next_level = None
@@ -69,16 +68,16 @@ class MenuItemMixin(MessageMixin):
res += ''
else:
res += '
%s' % (item['url'], item['title'])
-
+
res += ''
return res
def generate_menu(self):
-
+
path = self.get_menu_path()
-
- return self.generate_levels([None] + path)
+
+ return self.generate_levels([None] + path)
def get_context(self):
@@ -87,4 +86,3 @@ class MenuItemMixin(MessageMixin):
context['menu'] = self.generate_menu()
return context
-
diff --git a/modules/newsfeed.py b/modules/newsfeed.py
index b50e256..f4891e3 100644
--- a/modules/newsfeed.py
+++ b/modules/newsfeed.py
@@ -29,7 +29,9 @@ class NewsFeed(MenuItemMixin, TemplateMixin, AssetsMixin):
def process_message(self, message):
other_messages = super(NewsFeed, self).process_message(message)
- if message != None and message['type'] == 'news_feed_item':
+ if message == None:
+ self.items = []
+ elif message['type'] == 'news_feed_item':
if message['feed_id'] == self.news_feed_id:
self.items += [message['item']]
diff --git a/requirements.txt b/requirements.txt
index 3a11ca9..5f84310 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
+inotify==0.2.4
Jinja2==2.7.3
Markdown==2.6
MarkupSafe==0.23
Pillow==3.1.0
python-dateutil==2.4.2
six==1.10.0
-wheel==0.24.0
diff --git a/verdandi.py b/verdandi.py
index 91b9b53..6670b13 100644
--- a/verdandi.py
+++ b/verdandi.py
@@ -3,23 +3,22 @@
import os
import sys
import SocketServer
+import inotify.adapters
from jinja2 import Environment, FileSystemLoader
from SimpleHTTPServer import SimpleHTTPRequestHandler
+from multiprocessing import Process
-
-
-from constants import OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS
+from constants import CONTENT_DIRECTORY, OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS
class Verdandi(object):
- template_directory = TEMPLATE_DIRECTORY
output_directory = OUTPUT_DIRECTORY
modules = []
def __init__(self):
- self.jinja_env = Environment(loader=FileSystemLoader(self.template_directory))
+ self.jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRECTORY))
def send_message(self, message):
@@ -52,12 +51,46 @@ class Verdandi(object):
def run(self):
+ self.generate_output()
+
+ if len(sys.argv) > 1 and sys.argv[1] == 'serve':
+ self.serve()
+
+
+ def generate_output(self):
self.pass_messages()
self.collect_assets()
self.render()
- if len(sys.argv) > 1 and sys.argv[1] == 'serve':
+
+ def serve(self):
+
+ def has_create_or_modify(watch):
+ result = False
+ for event in watch.event_gen():
+ if event == None:
+ break
+
+ result = result or ('IN_CREATE' in event[1])
+ result = result or ('IN_DELETE' in event[1])
+ result = result or ('IN_MODIFY' in event[1])
+
+ return result
+
+ content_watch = inotify.adapters.InotifyTree(CONTENT_DIRECTORY)
+ template_watch = inotify.adapters.InotifyTree(TEMPLATE_DIRECTORY)
+
+
+ def serve():
os.chdir(self.output_directory)
httpd = SocketServer.TCPServer((SERVE_BIND_ADDRESS, SERVE_PORT), SimpleHTTPRequestHandler)
print "Serving under %s:%d" % (SERVE_BIND_ADDRESS, SERVE_PORT)
httpd.serve_forever()
+
+
+ server_process = Process(target=serve)
+ server_process.start()
+
+ while True:
+ if has_create_or_modify(content_watch) or has_create_or_modify(template_watch):
+ self.generate_output()