From 1e9e2112f73fc3f2e6552158e57d6a623749eb75 Mon Sep 17 00:00:00 2001 From: mathieui Date: Mon, 4 Mar 2013 00:23:58 +0100 Subject: [PATCH] Fix #2126 (per-server configuration sections) (also move replace_key_with_bound() to core.py, to prevent having common.py depending of config.py) --- doc/en/configure.txt | 9 +++++++++ src/common.py | 8 -------- src/config.py | 19 ++++++++++++++++++- src/core.py | 8 +++++++- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/doc/en/configure.txt b/doc/en/configure.txt index d4f385af..716d97a3 100644 --- a/doc/en/configure.txt +++ b/doc/en/configure.txt @@ -483,6 +483,13 @@ after a JID. These option will apply only for the given JID. For example if an option appears in a section named [user@example.com], it will apply only for the conversations with user@example.com. +If an option appears in a section named [@example.com], it will apply +for all the conversations with people @example.com, except when the option +is already defined in a [user@example.com] section. + +The priority of settings is thus like this: +user@example.com > @example.com > Poezio (more specific to less specific) + Note that some of these options can also appear in the global section, they will be used as a fallback value when no JID-specific option is found. @@ -495,6 +502,8 @@ found. foo = false [user@example.com] foo = true +[@example.com] +bar = false ------------- ============================================ diff --git a/src/common.py b/src/common.py index 3b80fa34..e4e3a52d 100644 --- a/src/common.py +++ b/src/common.py @@ -20,8 +20,6 @@ import time import string import shlex -from config import config - ROOM_STATE_NONE = 11 ROOM_STATE_CURRENT = 10 ROOM_STATE_PRIVATE = 15 @@ -188,12 +186,6 @@ def shell_split(st): except ValueError: return st.split(" ") -def replace_key_with_bound(key): - bind = config.get(key, key, 'bindings') - if not bind: - bind = key - return bind - def parse_str_to_secs(duration=''): """ Parse a string of with a number of d, h, m, s diff --git a/src/config.py b/src/config.py index 88ba38c9..e3c93f29 100644 --- a/src/config.py +++ b/src/config.py @@ -16,6 +16,7 @@ from configparser import RawConfigParser, NoOptionError, NoSectionError from os import environ, makedirs, path from shutil import copy2 from args import parse_args +from common import safeJID class Config(RawConfigParser): @@ -62,7 +63,7 @@ class Config(RawConfigParser): """ return self.get(option, default, section).lower() - def get_by_tabname(self, option, default, tabname, fallback=True): + def get_by_tabname(self, option, default, tabname, fallback=True, fallback_server=True): """ Try to get the value for the option. First we look in a section named `tabname`, if the option is not present @@ -73,11 +74,27 @@ class Config(RawConfigParser): if option in self.options(tabname): # We go the tab-specific option return self.get(option, default, tabname) + if fallback_server: + return self.get_by_servname(tabname, option, default, fallback) if fallback: # We fallback to the global option return self.get(option, default) return default + def get_by_servname(self, jid, option, default, fallback=True): + """ + Try to get the value of an option for a server + """ + server = safeJID(jid).server + if server: + server = '@' + server + if server in self.sections() and option in self.options(server): + return self.get(option, default, server) + if fallback: + return self.get(option, default) + return default + + def __get(self, option, section=DEFSECTION): """ facility for RawConfigParser.get diff --git a/src/core.py b/src/core.py index b8aaf18e..03f892b6 100644 --- a/src/core.py +++ b/src/core.py @@ -381,7 +381,7 @@ class Core(object): res.append(current) return res while self.running: - big_char_list = [common.replace_key_with_bound(key)\ + big_char_list = [replace_key_with_bound(key)\ for key in self.read_keyboard()] # whether to refresh after ALL keys have been handled for char_list in separate_chars_from_bindings(big_char_list): @@ -3175,4 +3175,10 @@ class KeyDict(dict): return lambda: dict.get(self, '_exc_')(k[5:]) return dict.get(self, k, d) +def replace_key_with_bound(key): + bind = config.get(key, key, 'bindings') + if not bind: + bind = key + return bind +