# -*- coding: utf-8 -*- import tempfile import attest from datetime import datetime from acrylamid import log from acrylamid.errors import AcrylamidException from acrylamid.readers import Entry from acrylamid.helpers import safe from acrylamid.defaults import conf log.init('acrylamid', level=40) conf['entry_permalink'] = '/:year/:slug/' def create(path, **kwargs): with open(path, 'w') as fp: fp.write('---\n') for k, v in kwargs.iteritems(): fp.write('%s: %s\n' % (k, v)) fp.write('---\n') class TestEntry(attest.TestBase): def __context__(self): fd, self.path = tempfile.mkstemp(suffix='.txt') yield
# -*- coding: utf-8 -*- import os import attest from os.path import join, isfile from acrylamid import utils, log, helpers from acrylamid.commands import compile from acrylamid.defaults import conf # supress warnings log.init('acrylamid', 40) options = type('Options', (object, ), {'ignore': False}) def entry(**kw): L = [('title', 'Hänsel and Gretel!'), ('date', '12.02.2012 15:46')] res = ['---'] for k, v in L: if k not in kw: res.append('%s: %s' % (k, v)) for k, v in kw.iteritems(): res.append('%s: %s' % (k, v)) res.append('---') res.append('')
import unittest2 as unittest except ImportError: import unittest import tempfile from datetime import datetime from acrylamid import log, errors from acrylamid.errors import AcrylamidException from acrylamid.readers import Entry from acrylamid.helpers import safe from acrylamid.defaults import conf log.init('acrylamid', level=40) def create(path, **kwargs): with open(path, 'w') as fp: fp.write('---\n') for k, v in kwargs.iteritems(): if isinstance(v, basestring): v = safe(v) fp.write('%s: %s\n' % (k, v)) fp.write('---\n') class TestEntry(unittest.TestCase): @classmethod
def setup_class(self): log.init('acrylamid', level=40) cache.init()
# -*- coding: utf-8 -*- import os import attest from os.path import join, isfile from acrylamid import core, log, utils, helpers from acrylamid.commands import compile from acrylamid.defaults import conf # supress warnings log.init("acrylamid", 40) options = type("Options", (object,), {"ignore": False, "force": False}) def entry(**kw): L = [("title", "Hänsel and Gretel!"), ("date", "12.02.2012 15:46")] res = ["---"] for k, v in L: if k not in kw: res.append("%s: %s" % (k, v)) for k, v in kw.iteritems(): res.append("%s: %s" % (k, v)) res.append("---") res.append("") res.append("# Test")
# -*- coding: utf-8 -*- import unittest from acrylamid import log, defaults, Environment from acrylamid.filters import initialize, get_filters log.init('foo', 35) conf = {'lang': 'en'} env = Environment({'path': '', 'options': type('X', (), {'ignore': False})}) initialize([], conf, env) # now we have filters in path from acrylamid.filters.hyphenation import build class Entry(object): permalink = '/foo/' def __init__(self, lang='en'): self.lang = lang class Hyphenation(unittest.TestCase): def test_hyphenate(self): hyph = get_filters()['Hyphenate'](conf, env, 'Hyphenate')
# -*- encoding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") try: import unittest2 as unittest except ImportError: import unittest # NOQA from acrylamid.lib import importer from acrylamid import log log.init("acrylamid", 20) class TestUtils(unittest.TestCase): def test_unescape(self): self.assertEquals(importer.unescape("<p>Foo</p>"), "<p>Foo</p>") self.assertEquals(importer.unescape("Some Text/"), "Some Text/") def test_convert(self): md = "Hello *[World](http://example.com/)!*" rst = "Hello *`World <http://example.com/>`_!*" html = '<p>Hello <em><a href="http://example.com/">World</a>!</em></p>' self.assertEquals(importer.convert(html, fmt="Markdown"), (md, "markdown"))
# -*- coding: utf-8 -*- from acrylamid import log, utils, core from acrylamid.filters import initialize, get_filters import attest tt = attest.Tests() log.init('foo', 35) conf = core.Configuration({'lang': 'en', 'theme': ''}) env = utils.Struct({ 'path': '', 'engine': None, 'options': type('X', (), {'ignore': False}) }) initialize([], conf, env) # now we have filters in path from acrylamid.filters.hyphenation import build class Entry(object): permalink = '/foo/' def __init__(self, lang='en'): self.lang = lang
def __init__(self, conf=None): """Sets configuration and environment and creates the Request object""" global sys usage = "usage: %prog <subcommand> [options] [args]" epilog = None options, constants = ( [], [ make_option("-h", "--help", action="store_true", help=SUPPRESS_HELP), make_option( "-v", "--verbose", action="store_const", dest="verbosity", help=SUPPRESS_HELP, const=log.SKIP ), make_option( "-q", "--quit", action="store_const", dest="verbosity", help=SUPPRESS_HELP, const=log.WARN, default=log.INFO, ), make_option("-C", "--no-color", action="store_false", dest="colors", default=True, help=SUPPRESS_HELP), make_option("--version", action="store_true", dest="version", help=SUPPRESS_HELP, default=False), ], ) # reorder `prog help foo` and `prog --help foo` if len(sys.argv) > 2 and sys.argv[1] in ("--help", "help"): sys.argv[1], sys.argv[2] = sys.argv[2], "--help" if len(sys.argv) <= 1 or sys.argv[1] in ("-h", "--help", "help"): options, constants = ( [], [ make_option( "-q", "--quiet", action="store_const", dest="verbosity", help="less verbose", const=log.WARN, default=log.INFO, ), make_option( "-v", "--verbose", action="store_const", dest="verbosity", help="more verbose", const=log.SKIP ), make_option( "-C", "--no-color", action="store_false", dest="colors", default=True, help="disable color" ), make_option("-h", "--help", action="store_true", help="show this help message and exit"), make_option( "--version", action="store_true", dest="version", help="print version details", default=False ), ], ) epilog = ( "Commands:\n" " init initializes base structure in DIR\n" " create (new) creates a new entry\n" " compile (co) compile blog\n" " view fire up built-in webserver\n" " autocompile automatic compilation and serving (short aco)\n" " clean (rm) remove abandoned files\n" " import import content from URL\n" " deploy run a given TASK\n" "\nAll subcommands except `init` require a conf.py file.\n" ) # --- init params --- # elif sys.argv[1] in ("init", "initialize"): usage = "%prog " + sys.argv[1] + " [DEST|FILE] [-p]" options = [ make_option( "-f", "--force", action="store_true", dest="force", help="don't ask, just overwrite", default=False ), make_option( "--xhtml", action="store_const", dest="theme", const="xhtml", help="use XHTML theme", default="html5", ), make_option("--html5", action="store_const", dest="theme", const="html5", help="use HTML5 theme"), ] # --- init params --- # elif sys.argv[1] in ("new",): usage = "%prog " + sys.argv[1] + " [args]" epilog = ( "Takes all leading [args] as title or prompt if none given. creates " "a new entry based on your PERMALINK_FORMAT and opens it with your " "favourite EDITOR." ) epilog = fill(epilog) + "\n" # --- gen params --- # elif sys.argv[1] in ("compile", "co", "generate", "gen"): usage = "%prog " + sys.argv[1] + " [-fn]" options = [ make_option( "-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False, ), make_option( "-n", "--dry-run", dest="dryrun", action="store_true", default=False, help="show what would have been compiled", ), make_option( "-i", "--ignore", dest="ignore", action="store_true", default=False, help="ignore critical errors" ), ] # --- webserver params --- # elif sys.argv[1] in ("view", "serve", "srv"): usage = "%prog " + sys.argv[1] + " [-p]" options = [make_option("-p", "--port", dest="port", type=int, default=8000, help="webserver port")] # --- autocompile params --- # elif sys.argv[1] in ("autocompile", "aco"): usage = "%prog " + sys.argv[1] + " [-pf]" options = [ make_option( "-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False, ), make_option( "-i", "--ignore", dest="ignore", action="store_true", default=False, help="ignore critical errors" ), make_option("-p", "--port", dest="port", type=int, default=8000, help="webserver port"), ] # --- import params --- # elif sys.argv[1] in ("import",): usage = "%prog " + sys.argv[1] + " [-mk]" options = [ make_option("-m", dest="import_fmt", default="Markdown", help="reconvert HTML to MARKUP"), make_option("-k", "--keep-links", dest="keep_links", action="store_true", help="keep permanent links"), ] else: tasks = get_tasks() if sys.argv[1] in tasks: usage = tasks[sys.argv[1]].usage options = tasks[sys.argv[1]].options class AcrylParser(OptionParser): # -- http://stackoverflow.com/q/1857346 def format_epilog(self, formatter): if epilog is None: return "" return "\n" + self.epilog parser = AcrylParser(option_list=options + constants, usage=usage, add_help_option=False, epilog=epilog) (options, args) = parser.parse_args() if len(sys.argv) <= 1 or sys.argv[1] == "help" or options.help: parser.print_help() sys.exit(0) # initialize colored logger log.init("acrylamid", level=options.verbosity, colors=options.colors) env = Environment({"version": __version__, "author": __author__, "url": __url__}) env["options"] = options if options.version: print "acrylamid " + env.version sys.exit(0) # -- init -- # # TODO: acrylamid init --layout_dir=somedir to overwrite defaults if "init" in args: if len(args) == 2: defaults.init(args[1], options.theme, options.force) else: defaults.init(".", options.theme, options.force) sys.exit(0) # -- teh real thing -- # conf = defaults.conf try: ns = dict([(k.upper(), v) for k, v in defaults.conf.iteritems()]) execfile("conf.py", ns) conf.update(dict([(k.lower(), ns[k]) for k in ns if k.upper() == k])) except OSError: log.critical('no config file found: %s. Try "acrylamid init".', options.conf) sys.exit(1) except Exception, e: log.critical("%s in `conf.py`" % e.__class__.__name__) traceback.print_exc(file=sys.stdout) sys.exit(1)
def setUp(self): log.init('acrylamid', level=40) cache.init()
# -*- coding: utf-8 -*- import os import attest from os.path import join, isfile from acrylamid import core, log, utils, helpers from acrylamid.compat import iteritems from acrylamid.commands import compile from acrylamid.defaults import conf # supress warnings log.init('acrylamid', 40) options = type('Options', (object, ), { 'ignore': False, 'force': False, 'dryrun': False, 'parser': 'compile'}) def entry(**kw): L = [('title', 'Hänsel and Gretel!'), ('date', '12.02.2012 15:46')] res = ['---'] for k, v in L: if k not in kw: res.append('%s: %s' % (k, v)) for k, v in iteritems(kw): res.append('%s: %s' % (k, v))
def Acryl(): """The main function that dispatches the CLI. We use :class:`AcrylFormatter` as custom help formatter that ommits the useless list of available subcommands and their aliases. All flags from acrylamid --help are also available in subcommands altough not explicitely printed in their help.""" parser = argparse.ArgumentParser( parents=[], formatter_class=AcrylFormatter ) parser.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help="more verbose", const=log.SKIP, default=log.INFO) parser.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help="less verbose", const=log.WARN) parser.add_argument("-C", "--no-color", action="store_false", dest="colors", help="disable color", default=True) parser.add_argument("--version", action="version", version=colors.blue('acrylamid ') + __version__) subparsers = parser.add_subparsers(dest="parser") # a repeat yourself of default arguments but not visible on subcommand --help default = argparse.ArgumentParser(add_help=False) default.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.SKIP, default=log.INFO) default.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.WARN) default.add_argument("-C", "--no-color", action="store_false", dest="colors", help=argparse.SUPPRESS, default=True) # --- init params --- # init = subparsers.add_parser('init', help='initializes base structure in DIR', parents=[default, ]) init.add_argument("dest", metavar="DEST|FILE", nargs="?") init.add_argument("-f", "--force", action="store_true", dest="force", help="don't ask, just overwrite", default=False) init.add_argument("--xhtml", action="store_const", dest="theme", const="xhtml", help="use XHTML theme", default="html5") init.add_argument("--html5", action="store_const", dest="theme", const="html5", help="use HTML5 theme (default)") init.add_argument("--mako", action="store_const", dest="engine", const="mako", help="use the Mako template engine", default="jinja2") init.add_argument("--jinja2", action="store_const", dest="engine", const="jinja2", help="use the Jinja2 template engine (default)") # --- gen params --- # generate = subparsers.add_parser('compile', help='compile blog', parents=[default]) generate.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) generate.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) generate.add_argument("-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) # --- webserver params --- # view = subparsers.add_parser('view', help="fire up built-in webserver", parents=[default]) view.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") # --- aco params --- # autocompile = subparsers.add_parser('autocompile', help="automatic compilation and serving", parents=[default]) autocompile.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) autocompile.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) autocompile.add_argument("-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) autocompile.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") # --- import params --- # importer = subparsers.add_parser('import', help="import content from URL or FILE", parents=[default]) importer.add_argument("src", metavar="FILE|URL") importer.add_argument("-f", "--force", dest="force", action="store_true", help="overwrite existing entries", default=False) importer.add_argument("-m", dest="fmt", default="Markdown", help="reconvert HTML to FMT") importer.add_argument("-k", "--keep-links", dest="keep", action="store_true", help="keep permanent links", default=False) importer.add_argument("-p", "--pandoc", dest="pandoc", action="store_true", help="use pandoc first", default=False) importer.add_argument("-a", dest="args", nargs="+", action="store", type=str, help="add argument to header section", default=[]) for alias in ('co', 'gen', 'generate'): subparsers._name_parser_map[alias] = generate for alias in ('serve', 'srv'): subparsers._name_parser_map[alias] = view subparsers._name_parser_map['aco'] = autocompile new = subparsers.add_parser('new', help="create a new entry", parents=[default], epilog=("Takes all leading [args] as title or prompt if none given. creates " "a new entry based on your PERMALINK_FORMAT and opens it with your " "favourite $EDITOR.")) new.add_argument("title", nargs="*", default='') # initialize other tasks tasks.initialize(subparsers, default) # parse args options = parser.parse_args() # initialize colored logger log.init('acrylamid', level=options.verbosity, colors=options.colors) env = Struct({'version': __version__, 'author': __author__, 'url': __url__}) env['options'] = options env['globals'] = Struct() # -- init -- # # TODO: acrylamid init --layout_dir=somedir to overwrite defaults if options.parser in ('init', ): defaults.init(options.dest if options.dest else '.', options.theme, options.engine, options.force) sys.exit(0) # -- teh real thing -- # conf = Struct(defaults.conf) try: ns = dict([(k.upper(), v) for k, v in defaults.conf.iteritems()]) execfile('conf.py', ns) conf.update(dict([(k.lower(), ns[k]) for k in ns if k.upper() == k])) except OSError: log.critical('no config file found: %s. Try "acrylamid init".', options.conf) sys.exit(1) except Exception, e: log.critical("%s in `conf.py`" % e.__class__.__name__) traceback.print_exc(file=sys.stdout) sys.exit(1)
def Acryl(): """The main function that dispatches the CLI. We use :class:`AcrylFormatter` as custom help formatter that ommits the useless list of available subcommands and their aliases. All flags from acrylamid --help are also available in subcommands altough not explicitely printed in their help.""" parser = argparse.ArgumentParser(parents=[], formatter_class=AcrylFormatter) parser.add_argument( "-v", "--verbose", action="store_const", dest="verbosity", help="more verbose", const=log.SKIP, default=log.INFO ) parser.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help="less verbose", const=log.WARN) parser.add_argument("-C", "--no-color", action="store_false", dest="colors", help="disable color", default=True) parser.add_argument("--version", action="version", version=colors.blue("acrylamid ") + __version__) subparsers = parser.add_subparsers(dest="parser") # a repeat yourself of default arguments but not visible on subcommand --help default = argparse.ArgumentParser(add_help=False) default.add_argument( "-v", "--verbose", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.SKIP, default=log.INFO, ) default.add_argument( "-q", "--quiet", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.WARN ) default.add_argument("-C", "--no-color", action="store_false", dest="colors", help=argparse.SUPPRESS, default=True) # --- gen params --- # generate = subparsers.add_parser("compile", help="compile blog", parents=[default]) generate.add_argument( "-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False ) generate.add_argument( "-n", "--dry-run", dest="dryrun", action="store_true", help="show what would have been compiled", default=False ) generate.add_argument( "-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False ) # --- webserver params --- # view = subparsers.add_parser("view", help="fire up built-in webserver", parents=[default]) view.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") # --- aco params --- # autocompile = subparsers.add_parser("autocompile", help="automatic compilation and serving", parents=[default]) autocompile.add_argument( "-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False ) autocompile.add_argument( "-n", "--dry-run", dest="dryrun", action="store_true", help="show what would have been compiled", default=False ) autocompile.add_argument( "-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False ) autocompile.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") for alias in ("co", "gen", "generate"): subparsers._name_parser_map[alias] = generate for alias in ("serve", "srv"): subparsers._name_parser_map[alias] = view subparsers._name_parser_map["aco"] = autocompile # initialize other tasks tasks.initialize(subparsers, default) # parse args options = parser.parse_args() # initialize colored logger log.init("acrylamid", level=options.verbosity, colors=options.colors) env = Struct({"version": __version__, "author": __author__, "url": __url__}) env["options"] = options env["globals"] = Struct() # -- init -- # try: if options.parser in ("init",): tasks.collected[options.parser](env, options) sys.exit(0) except AcrylamidException as e: log.fatal(e.args[0]) sys.exit(1) # -- teh real thing -- # conf = Struct(defaults.conf) try: ns = dict([(k.upper(), v) for k, v in defaults.conf.iteritems()]) os.chdir(os.path.dirname(find("conf.py", os.getcwd()))) execfile("conf.py", ns) conf.update(dict([(k.lower(), ns[k]) for k in ns if k.upper() == k])) except IOError: log.critical('no conf.py found. Try "acrylamid init".') sys.exit(1) except Exception as e: log.critical("%s in `conf.py`" % e.__class__.__name__) traceback.print_exc(file=sys.stdout) sys.exit(1) # -- run -- # if options.parser in ("gen", "generate", "co", "compile"): log.setLevel(options.verbosity) try: commands.compile(conf, env, **options.__dict__) except AcrylamidException as e: log.fatal(e.args[0]) sys.exit(1) elif options.parser in ("srv", "serve", "view"): from acrylamid.lib.httpd import Webserver ws = partial(Webserver, options.port, conf["output_dir"]) ws = ws(log.info) if options.verbosity < 20 else ws() ws.start() log.info(" * Running on http://127.0.0.1:%i/" % options.port) try: while True: time.sleep(1) except (SystemExit, KeyboardInterrupt, Exception) as e: ws.kill_received = True sys.exit(0) elif options.parser in ("aco", "autocompile"): from acrylamid.lib.httpd import Webserver # XXX compile on request _or_ use inotify/fsevent ws = Webserver(options.port, conf["output_dir"]) ws.start() log.info(" * Running on http://127.0.0.1:%i/" % options.port) try: commands.autocompile(ws, conf, env, **options.__dict__) except (SystemExit, KeyboardInterrupt, Exception) as e: ws.kill_received = True log.error(e.args[0]) traceback.print_exc(file=sys.stdout) sys.exit(0) elif options.parser in tasks.collected: try: tasks.collected[options.parser](conf, env, options) except AcrylamidException as e: log.critical(e.args[0]) sys.exit(1) else: log.critical("No such command!") sys.exit(2) sys.exit(0)
# -*- encoding: utf-8 -*- import unittest from nose.exc import SkipTest import argparse from acrylamid import log, tasks, helpers log.init('acrylamid', 20) tasks.task = lambda x,y,z: lambda x: x from acrylamid.tasks import imprt class TestImport(unittest.TestCase): def test_unescape(self): assert imprt.unescape('<p>Foo</p>') == '<p>Foo</p>' assert imprt.unescape('Some Text/') == 'Some Text/' def test_conversion(self): md = 'Hello _[World](http://example.com/)!_' rst = 'Hello *`World <http://example.com/>`_!*' html = '<p>Hello <em><a href="http://example.com/">World</a>!</em></p>' try: import html2text except ImportError:
# -*- encoding: utf-8 -*- import unittest from nose.exc import SkipTest import argparse from acrylamid import log, tasks log.init('acrylamid', 20) tasks.task = lambda x, y, z: lambda x: x from acrylamid.tasks import imprt class TestImport(unittest.TestCase): def test_unescape(self): assert imprt.unescape('<p>Foo</p>') == '<p>Foo</p>' assert imprt.unescape('Some Text/') == 'Some Text/' def test_conversion(self): md = 'Hello _[World](http://example.com/)!_' rst = 'Hello *`World <http://example.com/>`_!*' html = '<p>Hello <em><a href="http://example.com/">World</a>!</em></p>' try: import html2text except ImportError: raise SkipTest
def Acryl(): """The main function that dispatches the CLI. We use :class:`AcrylFormatter` as custom help formatter that ommits the useless list of available subcommands and their aliases. All flags from acrylamid --help are also available in subcommands altough not explicitely printed in their help.""" parser = argparse.ArgumentParser( parents=[], formatter_class=AcrylFormatter ) parser.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help="more verbose", const=log.SKIP, default=log.INFO) parser.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help="less verbose", const=log.WARN) parser.add_argument("-C", "--no-color", action="store_false", dest="colors", help="disable color", default=True) parser.add_argument("--version", action="version", version=colors.blue('acrylamid ') + __version__) subparsers = parser.add_subparsers(dest="parser") # a repeat yourself of default arguments but not visible on subcommand --help default = argparse.ArgumentParser(add_help=False) default.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.SKIP, default=log.INFO) default.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.WARN) default.add_argument("-C", "--no-color", action="store_false", dest="colors", help=argparse.SUPPRESS, default=True) # --- gen params --- # generate = subparsers.add_parser('compile', help='compile blog', parents=[default]) generate.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) generate.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) generate.add_argument("-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) # --- webserver params --- # view = subparsers.add_parser('view', help="fire up built-in webserver", parents=[default]) view.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") # --- aco params --- # autocompile = subparsers.add_parser('autocompile', help="automatic compilation and serving", parents=[default]) autocompile.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) autocompile.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) autocompile.add_argument("-i", "--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) autocompile.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") for alias in ('co', 'gen', 'generate'): subparsers._name_parser_map[alias] = generate for alias in ('serve', 'srv'): subparsers._name_parser_map[alias] = view subparsers._name_parser_map['aco'] = autocompile new = subparsers.add_parser('new', help="create a new entry", parents=[default], epilog=("Takes all leading [args] as title or prompt if none given. creates " "a new entry based on your PERMALINK_FORMAT and opens it with your " "favourite $EDITOR.")) new.add_argument("title", nargs="*", default='') # initialize other tasks tasks.initialize(subparsers, default) # parse args options = parser.parse_args() # initialize colored logger log.init('acrylamid', level=options.verbosity, colors=options.colors) env = Struct({'version': __version__, 'author': __author__, 'url': __url__}) env['options'] = options env['globals'] = Struct() # -- init -- # # TODO: acrylamid init --layout_dir=somedir to overwrite defaults if options.parser in ('init', ): tasks.collected[options.parser](env, options) sys.exit(0) # -- teh real thing -- # conf = Struct(defaults.conf) try: ns = dict([(k.upper(), v) for k, v in defaults.conf.iteritems()]) os.chdir(os.path.dirname(find('conf.py', os.getcwd()))) execfile('conf.py', ns) conf.update(dict([(k.lower(), ns[k]) for k in ns if k.upper() == k])) except IOError: log.critical('no conf.py found. Try "acrylamid init".') sys.exit(1) except Exception as e: log.critical("%s in `conf.py`" % e.__class__.__name__) traceback.print_exc(file=sys.stdout) sys.exit(1) conf['output_dir'] = conf.get('output_dir', 'output/') conf['content_dir'] = conf.get('content_dir', 'content/') conf['layout_dir'] = conf.get('layout_dir', 'layouts/') # -- run -- # if options.parser in ('gen', 'generate', 'co', 'compile'): log.setLevel(options.verbosity) try: commands.compile(conf, env, **options.__dict__) except AcrylamidException as e: log.fatal(e.args[0]) sys.exit(1) elif options.parser in ('new', 'create'): try: commands.new(conf, env, title=' '.join(options.title), prompt=log.level()<log.WARN) except AcrylamidException as e: log.fatal(e.args[0]) sys.exit(1) elif options.parser in ('srv', 'serve', 'view'): from acrylamid.lib.httpd import Webserver ws = Webserver(options.port, conf['output_dir']); ws.start() log.info(' * Running on http://127.0.0.1:%i/' % options.port) try: while True: time.sleep(1) except (SystemExit, KeyboardInterrupt, Exception) as e: ws.kill_received = True sys.exit(0) elif options.parser in ('aco', 'autocompile'): from acrylamid.lib.httpd import Webserver # XXX compile on request _or_ use inotify/fsevent ws = Webserver(options.port, conf['output_dir']); ws.start() log.info(' * Running on http://127.0.0.1:%i/' % options.port) try: commands.autocompile(ws, conf, env, **options.__dict__) except (SystemExit, KeyboardInterrupt, Exception) as e: ws.kill_received = True log.error(e.args[0]) traceback.print_exc(file=sys.stdout) sys.exit(0) elif options.parser in tasks.collected: try: tasks.collected[options.parser](conf, env, options) except AcrylamidException as e: log.critical(e.args[0]) sys.exit(1) else: log.critical('No such command!') sys.exit(2) sys.exit(0)
def Acryl(): """The main function that dispatches the CLI. We use :class:`AcrylFormatter` as custom help formatter that ommits the useless list of available subcommands and their aliases. All flags from acrylamid --help are also available in subcommands altough not explicitely printed in their help.""" parser = argparse.ArgumentParser( parents=[], formatter_class=AcrylFormatter ) parser.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help="more verbose", const=log.SKIP, default=log.INFO) parser.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help="less verbose", const=log.WARN) parser.add_argument("-C", "--no-color", action="store_false", dest="colors", help="disable color", default=True) parser.add_argument("--conf", dest="conf", help="alternate conf.py", default="conf.py", metavar="/path/to/conf") parser.add_argument("--version", action="version", version=colors.blue('Acrylamid ') + dist.version) subparsers = parser.add_subparsers(dest="parser") # a repeat yourself of default arguments but not visible on subcommand --help default = argparse.ArgumentParser(add_help=False) default.add_argument("-v", "--verbose", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.SKIP, default=log.INFO) default.add_argument("-q", "--quiet", action="store_const", dest="verbosity", help=argparse.SUPPRESS, const=log.WARN) default.add_argument("-C", "--no-color", action="store_false", dest="colors", help=argparse.SUPPRESS, default=True) # --- gen params --- # generate = subparsers.add_parser('compile', help='compile blog', parents=[default]) generate.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) generate.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) generate.add_argument("--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) generate.add_argument("--search", dest="search", action="store_true", help="build search index", default=False) # --- webserver params --- # view = subparsers.add_parser('view', help="fire up built-in webserver", parents=[default]) view.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") # --- aco params --- # autocompile = subparsers.add_parser('autocompile', help="automatic compilation and serving", parents=[default]) autocompile.add_argument("-f", "--force", action="store_true", dest="force", help="clear cache before compilation", default=False) autocompile.add_argument("-n", "--dry-run", dest="dryrun", action='store_true', help="show what would have been compiled", default=False) autocompile.add_argument("--ignore", dest="ignore", action="store_true", help="ignore critical errors", default=False) autocompile.add_argument("--search", dest="search", action="store_true", help="build search index", default=False) autocompile.add_argument("-p", "--port", dest="port", type=int, default=8000, help="webserver port") for alias in ('co', 'gen', 'generate'): subparsers._name_parser_map[alias] = generate for alias in ('serve', 'srv'): subparsers._name_parser_map[alias] = view subparsers._name_parser_map['aco'] = autocompile # temporary log to catch issues during task initialization log.init('temporary', level=log.WARN, colors=False) # initialize other tasks tasks.initialize(subparsers, default) # parse args options = parser.parse_args() # initialize colored logger log.init('acrylamid', level=options.verbosity, colors=options.colors) env = core.Environment({'author': __author__, 'url': __url__, 'options': options, 'globals': Struct()}) try: conf = core.load(options.conf) except IOError: log.critical('no conf.py found. Are you inside your blog?') sys.exit(1) except Exception as e: log.critical("%s in `conf.py`" % e.__class__.__name__) traceback.print_exc(file=sys.stdout) sys.exit(1) # -- run -- # if options.parser in ('gen', 'generate', 'co', 'compile'): log.setLevel(options.verbosity) try: commands.compile(conf, env) except AcrylamidException as e: log.exception(e.args[0]) sys.exit(1) elif options.parser in ('srv', 'serve', 'view'): from acrylamid.lib.httpd import Webserver ws = partial(Webserver, options.port, conf['output_dir']) ws = ws(log.info) if options.verbosity < 20 else ws(); ws.start() log.info(' * Running on http://127.0.0.1:%i/' % options.port) try: while True: time.sleep(1) except (SystemExit, KeyboardInterrupt) as e: ws.kill_received = True sys.exit(0) elif options.parser in ('aco', 'autocompile'): from acrylamid.lib.httpd import Webserver # XXX compile on request _or_ use inotify/fsevent ws = Webserver(options.port, conf['output_dir']); ws.start() log.info(' * Running on http://127.0.0.1:%i/' % options.port) try: commands.autocompile(ws, conf, env) except (SystemExit, KeyboardInterrupt) as e: ws.kill_received = True log.error(e.args[0]) traceback.print_exc(file=sys.stdout) sys.exit(0) elif options.parser in tasks.collected: try: tasks.collected[options.parser](conf, env, options) except AcrylamidException as e: log.exception('uncaught exception') sys.exit(1) else: log.critical('No such command!') sys.exit(2) sys.exit(0)
# -*- coding: utf-8 -*- import tempfile import attest from datetime import datetime from acrylamid import log from acrylamid.errors import AcrylamidException from acrylamid.readers import Entry from acrylamid.defaults import conf log.init("acrylamid", level=40) conf["entry_permalink"] = "/:year/:slug/" def create(path, **kwargs): with open(path, "w") as fp: fp.write("---\n") for k, v in kwargs.iteritems(): fp.write("%s: %s\n" % (k, v)) fp.write("---\n") class TestEntry(attest.TestBase): def __context__(self): fd, self.path = tempfile.mkstemp(suffix=".txt") yield