diff options
Diffstat (limited to 'nikola/plugins/command/auto.py')
| -rw-r--r-- | nikola/plugins/command/auto.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/nikola/plugins/command/auto.py b/nikola/plugins/command/auto.py new file mode 100644 index 0000000..cb726d9 --- /dev/null +++ b/nikola/plugins/command/auto.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +# Copyright © 2012-2013 Roberto Alsina and others. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import print_function, unicode_literals + +import codecs +import json +import os +import subprocess + +from nikola.plugin_categories import Command +from nikola.utils import req_missing + +GUARDFILE = """#!/usr/bin/env python +# -*- coding: utf-8 -*- +from livereload.task import Task +import json +import subprocess + +def f(): + import subprocess + subprocess.call(("nikola", "build")) + +fdata = json.loads('''{0}''') + +for watch in fdata: + Task.add(watch, f) +""" + + +class Auto(Command): + """Start debugging console.""" + name = "auto" + doc_purpose = "automatically detect site changes, rebuild and optionally refresh a browser" + cmd_options = [ + { + 'name': 'browser', + 'short': 'b', + 'type': bool, + 'help': 'Start a web browser.', + 'default': False, + }, + { + 'name': 'port', + 'short': 'p', + 'long': 'port', + 'default': 8000, + 'type': int, + 'help': 'Port nummber (default: 8000)', + }, + ] + + def _execute(self, options, args): + """Start the watcher.""" + try: + from livereload.server import start + except ImportError: + req_missing(['livereload'], 'use the "auto" command') + return + + # Run an initial build so we are uptodate + subprocess.call(("nikola", "build")) + + port = options and options.get('port') + + # Create a Guardfile + with codecs.open("Guardfile", "wb+", "utf8") as guardfile: + l = ["conf.py", "themes", "templates", self.site.config['GALLERY_PATH']] + for item in self.site.config['post_pages']: + l.append(os.path.dirname(item[0])) + for item in self.site.config['FILES_FOLDERS']: + l.append(os.path.dirname(item)) + data = GUARDFILE.format(json.dumps(l)) + guardfile.write(data) + + out_folder = self.site.config['OUTPUT_FOLDER'] + + os.chmod("Guardfile", 0o755) + + start(port, out_folder, options and options.get('browser')) |
