changeset 48:028a98983e46

core: avoid kivy arguments hijacking so QuickApp arguments parsing can be used
author Goffi <goffi@goffi.org>
date Sat, 10 Sep 2016 15:52:30 +0200
parents abb81efef3bb
children fd9cbf6ae663
files src/cagou/core/cagou_main.py src/cagou/core/kivy_hack.py src/cagou/core/logging_setter.py
diffstat 3 files changed, 74 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/src/cagou/core/cagou_main.py	Sat Sep 10 00:05:46 2016 +0200
+++ b/src/cagou/core/cagou_main.py	Sat Sep 10 15:52:30 2016 +0200
@@ -19,8 +19,8 @@
 
 
 from sat.core.i18n import _
-import logging_setter
-logging_setter.set_logging()
+import kivy_hack
+kivy_hack.do_hack()
 from constants import Const as C
 from sat.core import log as logging
 log = logging.getLogger(__name__)
@@ -28,6 +28,7 @@
 from sat_frontends.quick_frontend.quick_app import QuickApp
 from sat_frontends.quick_frontend import quick_widgets
 from sat_frontends.quick_frontend import quick_chat
+from sat_frontends.quick_frontend import quick_utils
 from sat_frontends.bridge.DBus import DBusBridgeFrontend
 import kivy
 kivy.require('1.9.1')
@@ -200,7 +201,7 @@
     MB_HANDLE = False
 
     def __init__(self):
-        super(Cagou, self).__init__(create_bridge=DBusBridgeFrontend, xmlui=xmlui)
+        super(Cagou, self).__init__(create_bridge=DBusBridgeFrontend, xmlui=xmlui, check_options=quick_utils.check_options)
         self._import_kv()
         self.app = CagouApp()
         self.app.host = self
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cagou/core/kivy_hack.py	Sat Sep 10 15:52:30 2016 +0200
@@ -0,0 +1,70 @@
+#!/usr//bin/env python2
+# -*- coding: utf-8 -*-
+
+# Cagou: desktop/mobile frontend for Salut à Toi XMPP client
+# Copyright (C) 2016 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+CONF_KIVY_LEVEL = 'log_kivy_level'
+
+
+def do_hack():
+    """work around Kivy hijacking of logs and arguments"""
+    # we remove args so kivy doesn't use them
+    # this is need to avoid kivy breaking QuickApp args handling
+    import sys
+    ori_argv = sys.argv[:]
+    sys.argv = sys.argv[:1]
+    from constants import Const as C
+    from sat.core import log_config
+    log_config.satConfigure(C.LOG_BACKEND_STANDARD, C)
+
+    import config
+    kivy_level = config.getConfig(C.CONFIG_SECTION, CONF_KIVY_LEVEL, 'follow').upper()
+
+    # kivy handles its own loggers, we don't want that!
+    import logging
+    root_logger = logging.root
+    kivy_logger = logging.getLogger('kivy')
+    ori_addHandler = kivy_logger.addHandler
+    kivy_logger.addHandler = lambda dummy: None
+    ori_setLevel = kivy_logger.setLevel
+    if kivy_level == 'FOLLOW':
+        # level is following SàT level
+        kivy_logger.setLevel = lambda level: None
+    elif kivy_level == 'KIVY':
+        # level will be set by Kivy according to its own conf
+        pass
+    elif kivy_level in C.LOG_LEVELS:
+        kivy_logger.setLevel(kivy_level)
+        kivy_logger.setLevel = lambda level: None
+    else:
+        raise ValueError(u"Unknown value for {name}: {value}".format(name=CONF_KIVY_LEVEL, value=kivy_level))
+
+    # during import kivy set its logging stuff
+    import kivy
+    kivy # to avoid pyflakes warning
+
+    # we want to separate kivy logs from other logs
+    logging.root = root_logger
+    from kivy import logger
+    sys.stderr = logger.previous_stderr
+
+    # we restore original methods
+    kivy_logger.addHandler = ori_addHandler
+    kivy_logger.setLevel = ori_setLevel
+
+    # we restore original arguments
+    sys.argv = ori_argv
--- a/src/cagou/core/logging_setter.py	Sat Sep 10 00:05:46 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-#!/usr//bin/env python2
-# -*- coding: utf-8 -*-
-
-# Cagou: desktop/mobile frontend for Salut à Toi XMPP client
-# Copyright (C) 2016 Jérôme Poisson (goffi@goffi.org)
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-CONF_KIVY_LEVEL = 'log_kivy_level'
-
-def set_logging():
-    from constants import Const as C
-    from sat.core import log_config
-    log_config.satConfigure(C.LOG_BACKEND_STANDARD, C)
-
-    import config
-    kivy_level = config.getConfig(C.CONFIG_SECTION, CONF_KIVY_LEVEL, 'follow').upper()
-
-    # kivy handles its own loggers, we don't want that!
-    import logging
-    root_logger = logging.root
-    kivy_logger = logging.getLogger('kivy')
-    ori_addHandler = kivy_logger.addHandler
-    kivy_logger.addHandler = lambda dummy: None
-    ori_setLevel = kivy_logger.setLevel
-    if kivy_level == 'FOLLOW':
-        # level is following SàT level
-        kivy_logger.setLevel = lambda level: None
-    elif kivy_level == 'KIVY':
-        # level will be set by Kivy according to its own conf
-        pass
-    elif kivy_level in C.LOG_LEVELS:
-        kivy_logger.setLevel(kivy_level)
-        kivy_logger.setLevel = lambda level: None
-    else:
-        raise ValueError(u"Unknown value for {name}: {value}".format(name=CONF_KIVY_LEVEL, value=kivy_level))
-
-    # during import kivy set its logging stuff
-    import kivy
-    kivy # to avoid pyflakes warning
-
-    # we want to separate kivy logs from other logs
-    logging.root = root_logger
-    import sys
-    from kivy import logger
-    sys.stderr = logger.previous_stderr
-
-    # we restore original methods
-    kivy_logger.addHandler = ori_addHandler
-    kivy_logger.setLevel = ori_setLevel