Branch: refs/heads/master Author: Frank Lanitz frank@frank.uvena.de Committer: GitHub noreply@github.com Date: Sun, 19 Feb 2017 19:35:54 UTC Commit: 59e74092d60efcd9006006ae82819757868e6502 https://github.com/geany/geany-plugins/commit/59e74092d60efcd9006006ae828197...
Log Message: ----------- Merge pull request #527 from codebrainz/upstream-sync
Sync with latest upstream
Modified Paths: -------------- geanypy/geany/Makefile.am geanypy/geany/__init__.py geanypy/geany/logger.py geanypy/geany/plugin.py geanypy/src/Makefile.am geanypy/src/geanypy-app.c geanypy/src/geanypy-document.c geanypy/src/geanypy-editor.c geanypy/src/geanypy-glog.c geanypy/src/geanypy-plugin.c geanypy/src/makefile.win32
Modified: geanypy/geany/Makefile.am 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -1,5 +1,6 @@ geanypy_sources = __init__.py \ console.py \ + logger.py \ plugin.py \ signalmanager.py geanypy_objects = $(geanypy_sources:.py=.pyc)
Modified: geanypy/geany/__init__.py 2 lines changed, 2 insertions(+), 0 deletions(-) =================================================================== @@ -15,6 +15,7 @@ import encoding import filetypes import highlighting +import glog import main import msgwindow import navqueue @@ -42,6 +43,7 @@ "main_widgets", "interface_prefs", "app", + "glog", "keybindings", "general_prefs", "search_prefs",
Modified: geanypy/geany/logger.py 74 lines changed, 74 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +from geany import glog +from traceback import format_exception +import logging +import sys + + +GLIB_LOG_LEVEL_MAP = { + logging.DEBUG: glog.LOG_LEVEL_DEBUG, + logging.INFO: glog.LOG_LEVEL_INFO, + logging.WARNING: glog.LOG_LEVEL_WARNING, + # error and critical levels are swapped on purpose because + # GLib interprets CRITICAL less fatal than Python and additionally + # GLib abort()s the program on G_LOG_LEVEL_ERROR which is uncommon + # in Python + logging.ERROR: glog.LOG_LEVEL_CRITICAL, + logging.CRITICAL: glog.LOG_LEVEL_ERROR, +} + + +class PluginLogger(object): + """ + Convenience wrapper softly emulating Python's logging interface. + Any log messages are passed to the GLib log system using g_log() + and the LOG_DOMAIN is set automatically to the plugin's name for convenience. + """ + + def __init__(self, plugin_name): + self._log_domain = u'geanypy-%s' % plugin_name + + def debug(self, msg_format, *args, **kwargs): + self.log(logging.DEBUG, msg_format, *args, **kwargs) + + def info(self, msg_format, *args, **kwargs): + self.log(logging.INFO, msg_format, *args, **kwargs) + + def message(self, msg_format, *args, **kwargs): + self.log(glog.LOG_LEVEL_MESSAGE, msg_format, *args, **kwargs) + + def warning(self, msg_format, *args, **kwargs): + self.log(logging.WARNING, msg_format, *args, **kwargs) + + def error(self, msg_format, *args, **kwargs): + self.log(logging.ERROR, msg_format, *args, **kwargs) + + def exception(self, msg_format, *args, **kwargs): + kwargs['exc_info'] = True + self.error(msg_format, *args, **kwargs) + + def critical(self, msg_format, *args, **kwargs): + self.log(logging.CRITICAL, msg_format, *args, **kwargs) + + warn = warning + fatal = critical + + def log(self, level, msg_format, *args, **kwargs): + # map log level from Python to GLib + glib_log_level = GLIB_LOG_LEVEL_MAP.get(level, glog.LOG_LEVEL_MESSAGE) + # format message + log_message = msg_format % args + # log exception information if requested + exc_info = kwargs.get('exc_info', False) + if exc_info: + traceback_text = self._format_exception(exc_info) + log_message = '%s\n%s' % (log_message, traceback_text) + + glog.glog(self._log_domain, glib_log_level, log_message) + + def _format_exception(self, exc_info): + if not isinstance(exc_info, tuple): + exc_info = sys.exc_info() + exc_text_lines = format_exception(*exc_info) + return ''.join(exc_text_lines)
Modified: geanypy/geany/plugin.py 4 lines changed, 3 insertions(+), 1 deletions(-) =================================================================== @@ -35,6 +35,8 @@ def cleanup(self): ~/.config/geany/plugins). Only files with a `.py` extension will be loaded. """
+ +from geany.logger import PluginLogger import keybindings
class Plugin(object): @@ -60,7 +62,7 @@ def __init__(self): When the plugin is loaded its __init__() function will be called so that's a good place to put plugin initialization code. """ - + self.logger = PluginLogger(self.name)
def cleanup(self):
Modified: geanypy/src/Makefile.am 7 lines changed, 4 insertions(+), 3 deletions(-) =================================================================== @@ -5,11 +5,11 @@ geanyplugin_LTLIBRARIES = geanypy.la geanyplugindir = $(libdir)/geany
geanypy_la_LDFLAGS = -module -avoid-version -Wl,--export-dynamic -geanypy_la_CPPFLAGS = @GEANY_CFLAGS@ @PYGTK_CFLAGS@ @PYTHON_CPPFLAGS@ \ +geanypy_la_CPPFLAGS = @PYTHON_CPPFLAGS@ \ -DGEANYPY_PYTHON_DIR=""$(libdir)/geany/geanypy"" \ -DGEANYPY_PLUGIN_DIR=""$(libdir)/geany"" \ -DG_LOG_DOMAIN="GeanyPy" -geanypy_la_CFLAGS = @GEANYPY_CFLAGS@ @GMODULE_CFLAGS@ +geanypy_la_CFLAGS = @PYGTK_CFLAGS@ @GEANY_CFLAGS@ @GEANYPY_CFLAGS@ @GMODULE_CFLAGS@ geanypy_la_LIBADD = @GEANY_LIBS@ @PYGTK_LIBS@ \ $(PYTHON_LDFLAGS) $(PYTHON_LIBS) \ @PYTHON_EXTRA_LIBS@ @PYTHON_EXTRA_LDFLAGS@ \ @@ -20,11 +20,12 @@ geanypy_la_SOURCES = geanypy-app.c \ geanypy-editor.c geanypy-editor.h \ geanypy-encoding.c geanypy-encoding.h \ geanypy-filetypes.c geanypy-filetypes.h \ + geanypy-glog.c \ geanypy.h \ geanypy-highlighting.c \ geanypy-indentprefs.c \ geanypy-interfaceprefs.c \ - geanypy-keybindings.c geanypy-keybindings.h\ + geanypy-keybindings.c geanypy-keybindings.h \ geanypy-main.c \ geanypy-mainwidgets.c \ geanypy-msgwindow.c \
Modified: geanypy/src/geanypy-app.c 1 lines changed, 0 insertions(+), 1 deletions(-) =================================================================== @@ -4,7 +4,6 @@
#include "geanypy.h"
- typedef struct { PyObject_HEAD
Modified: geanypy/src/geanypy-document.c 4 lines changed, 2 insertions(+), 2 deletions(-) =================================================================== @@ -118,9 +118,9 @@ Document_get_property(Document *self, const gchar *prop_name) else if (g_str_equal(prop_name, "text_changed")) { if (self->doc->changed) - Py_RETURN_NONE; + Py_RETURN_TRUE; else - Py_RETURN_NONE; + Py_RETURN_FALSE; }
Py_RETURN_NONE;
Modified: geanypy/src/geanypy-editor.c 4 lines changed, 2 insertions(+), 2 deletions(-) =================================================================== @@ -62,7 +62,7 @@ Editor_get_property(Editor *self, const gchar *prop_name) PyObject *py_doc; py_doc = (PyObject *) Document_create_new_from_geany_document( self->editor->document); - if (py_doc && py_doc != Py_None) + if (!py_doc || py_doc == Py_None) Py_RETURN_NONE; return py_doc; } @@ -296,7 +296,7 @@ static PyMethodDef Editor_methods[] = { { "indicator_set_on_range", (PyCFunction) Editor_indicator_set_on_range, METH_KEYWORDS, "Sets an indicator on the range specified." }, { "insert_snippet", (PyCFunction) Editor_insert_snippet, METH_KEYWORDS, - "Replces all special sequences in snippet and inserts it at " + "Replaces all special sequences in snippet and inserts it at " "the specified position." }, { "insert_text_block", (PyCFunction) Editor_insert_text_block, METH_KEYWORDS, "Inserts text, replacing tab chars and newline chars accordingly "
Modified: geanypy/src/geanypy-glog.c 45 lines changed, 45 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,45 @@ +#if defined(HAVE_CONFIG_H) && !defined(GEANYPY_WINDOWS) +# include "config.h" +#endif + +#include "geanypy.h" + + +static PyObject * +Glog_glog(PyObject *module, PyObject *args, PyObject *kwargs) +{ + static gchar *kwlist[] = { "log_domain", "log_level", "message", NULL }; + gchar *log_domain, *message; + GLogLevelFlags log_level; + + if (PyArg_ParseTupleAndKeywords(args, kwargs, "sis", kwlist, &log_domain, &log_level, &message)) + { + g_log(log_domain, log_level, "%s", message); + } + Py_RETURN_NONE; +} + + +static +PyMethodDef GlogModule_methods[] = { + { "glog", (PyCFunction) Glog_glog, METH_KEYWORDS, "Wrapper around g_log()." }, + { NULL } +}; + + +PyMODINIT_FUNC initglog(void) +{ + PyObject *m; + + m = Py_InitModule3("glog", GlogModule_methods, "GLib Log utility functions."); + + /* TODO: These constants are for the geany.logger.GLIB_LOG_LEVEL_MAP mapping. + * It would be better to build this mapping on the C layer but how to + * access the Python logging.* level constants here? */ + PyModule_AddIntConstant(m, "LOG_LEVEL_DEBUG", G_LOG_LEVEL_DEBUG); + PyModule_AddIntConstant(m, "LOG_LEVEL_INFO", G_LOG_LEVEL_INFO); + PyModule_AddIntConstant(m, "LOG_LEVEL_MESSAGE", G_LOG_LEVEL_MESSAGE); + PyModule_AddIntConstant(m, "LOG_LEVEL_WARNING", G_LOG_LEVEL_WARNING); + PyModule_AddIntConstant(m, "LOG_LEVEL_ERROR", G_LOG_LEVEL_ERROR); + PyModule_AddIntConstant(m, "LOG_LEVEL_CRITICAL", G_LOG_LEVEL_CRITICAL); +}
Modified: geanypy/src/geanypy-plugin.c 2 lines changed, 2 insertions(+), 0 deletions(-) =================================================================== @@ -40,6 +40,7 @@ PyMODINIT_FUNC initdocument(void); PyMODINIT_FUNC initeditor(void); PyMODINIT_FUNC initencoding(void); PyMODINIT_FUNC initfiletypes(void); +PyMODINIT_FUNC initglog(void); PyMODINIT_FUNC inithighlighting(void); PyMODINIT_FUNC initmain(void); PyMODINIT_FUNC initmsgwin(void); @@ -81,6 +82,7 @@ GeanyPy_start_interpreter(void) initeditor(); initencoding(); initfiletypes(); + initglog(); inithighlighting(); initmain(); initmsgwin();
Modified: geanypy/src/makefile.win32 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -10,6 +10,7 @@ SOURCES = \ geanypy-highlighting.c \ geanypy-indentprefs.c \ geanypy-interfaceprefs.c \ + geanypy-glog.c \ geanypy-main.c \ geanypy-mainwidgets.c \ geanypy-msgwindow.c \
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
plugins-commits@lists.geany.org