Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/websdk/hatta/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'websdk/hatta/config.py')
-rw-r--r--websdk/hatta/config.py224
1 files changed, 224 insertions, 0 deletions
diff --git a/websdk/hatta/config.py b/websdk/hatta/config.py
new file mode 100644
index 0000000..bcdc9a8
--- /dev/null
+++ b/websdk/hatta/config.py
@@ -0,0 +1,224 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+
+
+OPTIONS = []
+VALID_NAMES = set()
+
+
+def _add(short, long, dest, help, default=None, metavar=None,
+ action=None, type=None):
+ """Helper for building the list of options."""
+
+ OPTIONS.append((short, long, dest, help, default, metavar, action, type))
+ VALID_NAMES.add(dest)
+
+_add('-V', '--version', dest='show_version', default=False,
+ help='Display version and exit', action="store_true")
+_add('-d', '--pages-dir', dest='pages_path',
+ help='Store pages in DIR', metavar='DIR')
+_add('-t', '--cache-dir', dest='cache_path',
+ help='Store cache in DIR', metavar='DIR')
+_add('-i', '--interface', dest='interface',
+ help='Listen on interface INT', metavar='INT')
+_add('-p', '--port', dest='port', type='int',
+ help='Listen on port PORT', metavar='PORT')
+_add('-s', '--script-name', dest='script_name',
+ help='Override SCRIPT_NAME to NAME', metavar='NAME')
+_add('-n', '--site-name', dest='site_name',
+ help='Set the name of the site to NAME', metavar='NAME')
+_add('-m', '--front-page', dest='front_page',
+ help='Use PAGE as the front page', metavar='PAGE')
+_add('-e', '--encoding', dest='page_charset',
+ help='Use encoding ENC to read and write pages', metavar='ENC')
+_add('-c', '--config-file', dest='config_file',
+ help='Read configuration from FILE', metavar='FILE')
+_add('-l', '--language', dest='language',
+ help='Translate interface to LANG', metavar='LANG')
+_add('-r', '--read-only', dest='read_only',
+ help='Whether the wiki should be read-only', action="store_true")
+_add('-g', '--icon-page', dest='icon_page', metavar="PAGE",
+ help='Read icons graphics from PAGE.')
+_add('-w', '--hgweb', dest='hgweb',
+ help='Enable hgweb access to the repository', action="store_true")
+_add('-W', '--wiki-words', dest='wiki_words',
+ help='Enable WikiWord links', action="store_true")
+_add('-I', '--ignore-indent', dest='ignore_indent',
+ help='Treat indented lines as normal text', action="store_true")
+_add('-P', '--pygments-style', dest='pygments_style',
+ help='Use the STYLE pygments style for highlighting',
+ metavar='STYLE')
+_add('-D', '--subdirectories', dest='subdirectories',
+ action="store_true",
+ help='Store subpages as subdirectories in the filesystem')
+_add('-E', '--extension', dest='extension',
+ help='Extension to add to wiki page files')
+_add('-U', '--unix-eol', dest='unix_eol',
+ action="store_true",
+ help='Convert all text pages to UNIX-style CR newlines')
+
+
+class WikiConfig(object):
+ """
+ Responsible for reading and storing site configuration. Contains the
+ default settings.
+
+ >>> config = WikiConfig(port='2080')
+ >>> config.sanitize()
+ >>> config.get('port')
+ 2080
+ """
+
+ default_filename = u'hatta.conf'
+
+ def __init__(self, **kw):
+ self.config = dict(kw)
+ self.valid_names = set(VALID_NAMES)
+ self.parse_environ()
+ self.options = list(OPTIONS)
+
+ def sanitize(self):
+ """
+ Convert options to their required types.
+ """
+
+ try:
+ self.config['port'] = int(self.get('port', 0))
+ except ValueError:
+ self.config['port'] = 8080
+
+ def parse_environ(self):
+ """Check the environment variables for options."""
+
+ prefix = 'HATTA_'
+ for key, value in os.environ.iteritems():
+ if key.startswith(prefix):
+ name = key[len(prefix):].lower()
+ if name in self.valid_names:
+ self.config[name] = value
+
+ def parse_args(self):
+ """Check the commandline arguments for options."""
+
+ import optparse
+
+ parser = optparse.OptionParser()
+ for (short, long, dest, help, default, metavar, action,
+ type) in self.options:
+ parser.add_option(short, long, dest=dest, help=help, type=type,
+ default=default, metavar=metavar, action=action)
+
+ options, args = parser.parse_args()
+ for option, value in options.__dict__.iteritems():
+ if value is not None:
+ self.config[option] = value
+ if args:
+ self.config['pages_path'] = args[0]
+
+ def parse_files(self, files=None):
+ """Check the config files for options."""
+
+ import ConfigParser
+
+ if files is None:
+ files = [self.get('config_file', self.default_filename)]
+ parser = ConfigParser.SafeConfigParser()
+ parser.read(files)
+ section = 'hatta'
+ try:
+ options = parser.items(section)
+ except ConfigParser.NoSectionError:
+ return
+ for option, value in options:
+ if option not in self.valid_names:
+ raise ValueError('Invalid option name "%s".' % option)
+ self.config[option] = value
+
+ def save_config(self, filename=None):
+ """Saves configuration to a given file."""
+ if filename is None:
+ filename = self.default_filename
+
+ import ConfigParser
+ parser = ConfigParser.RawConfigParser()
+ section = 'hatta'
+ parser.add_section(section)
+ for key, value in self.config.iteritems():
+ parser.set(section, str(key), str(value))
+
+ configfile = open(filename, 'wb')
+ try:
+ parser.write(configfile)
+ finally:
+ configfile.close()
+
+ def get(self, option, default_value=None):
+ """
+ Get the value of a config option or default if not set.
+
+ >>> config = WikiConfig(option=4)
+ >>> config.get("ziew", 3)
+ 3
+ >>> config.get("ziew")
+ >>> config.get("ziew", "ziew")
+ 'ziew'
+ >>> config.get("option")
+ 4
+ """
+
+ return self.config.get(option, default_value)
+
+ def get_bool(self, option, default_value=False):
+ """
+ Like get, only convert the value to True or False.
+ """
+
+ value = self.get(option, default_value)
+ if value in (
+ 1, True,
+ 'True', 'true', 'TRUE',
+ '1',
+ 'on', 'On', 'ON',
+ 'yes', 'Yes', 'YES',
+ 'enable', 'Enable', 'ENABLE',
+ 'enabled', 'Enabled', 'ENABLED',
+ ):
+ return True
+ elif value in (
+ None, 0, False,
+ 'False', 'false', 'FALSE',
+ '0',
+ 'off', 'Off', 'OFF',
+ 'no', 'No', 'NO',
+ 'disable', 'Disable', 'DISABLE',
+ 'disabled', 'Disabled', 'DISABLED',
+ ):
+ return False
+ else:
+ raise ValueError("expected boolean value")
+
+ def set(self, key, value):
+ self.config[key] = value
+
+
+def read_config():
+ """Read and parse the config."""
+
+ config = WikiConfig(
+ # Here you can modify the configuration: uncomment and change the ones
+ # you need. Note that it's better use environment variables or command
+ # line switches.
+
+ # interface='',
+ # port=8080,
+ # pages_path = 'docs',
+ # front_page = 'Home',
+ # site_name = 'Hatta Wiki',
+ # page_charset = 'UTF-8',
+ )
+ config.parse_args()
+ config.parse_files()
+ # config.sanitize()
+ return config