def masterinit(self, plugin, webapp, *args, **kwargs): """Call back function during plugin instantiation, from :class:`pluggdapps.plugin.PluginMeta` class. ``plugin``, Instantiated plugin. ``plugin`` is automatically populated with configuration settings and ``webapp`` attribute. ``args`` and ``kwargs``, are received from query_plugin's ``args`` and ``kwargs``. """ from pluggdapps.web.webapp import WebApp caname = plugin.caname if isinstance(plugin, WebApp): # Ought to be IWebApp plugin appsec, netpath, config = webapp plugin._settngx.update(args[0][appsec]) plugin.webapp = plugin args = args[1:] elif webapp: # Not a IWebApp plugin plugin._settngx.update(webapp.appsettings[h.plugin2sec(caname)]) plugin.webapp = webapp else: # plugin not under a webapp plugin._settngx.update(self.settings[h.plugin2sec(caname)]) plugin.webapp = None plugin.pa = self plugin.query_plugins = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugins, self, plugin.webapp) plugin.query_pluginr = h.hitch_method(plugin, plugin.__class__, Webapps.query_pluginr, self, plugin.webapp) plugin.query_plugin = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugin, self, plugin.webapp) plugin.qps = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugins, self, plugin.webapp) plugin.qpr = h.hitch_method(plugin, plugin.__class__, Webapps.query_pluginr, self, plugin.webapp) plugin.qp = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugin, self, plugin.webapp) # Plugin settings plugin._settngx.update(kwargs.pop('settings', {})) return args, kwargs
def _defaultsettings(self): """By now it is expected that all interface specs and plugin definitions would have been loaded by loading packages implementing them and pluggdapps' plugin meta-classing. This function will collect their default settings and return them as settings dictionary,:: { "plugin:<pkgname>.<pluginname>" : default_settings, ... } """ from pluggdapps.plugin import PluginMeta # Default settings for plugins. default = dict(DEFAULT().items()) defaultsett = {"DEFAULT": deepcopy(default)} defaultsett["pluggdapps"] = deepcopy(default) defaultsett["pluggdapps"].update(dict(pluggdapps_defaultsett().items())) # Fetch all the default-settings for loaded plugins using `ISettings` # interface. Plugin inheriting from other plugins will override its # base's default_settings() in cls.mro() order. for name, info in PluginMeta._pluginmap.items(): bases = reversed(info["cls"].mro()) sett = deepcopy(default) for b in bases: if hasattr(b, "default_settings"): sett.update(dict(b.default_settings().items())) sett = b.normalize_settings(sett) defaultsett[h.plugin2sec(name)] = sett return defaultsett
def masterinit(self, plugin, *args, **kwargs): """Call back function during plugin instantiation, from :class:`pluggdapps.plugin.PluginMeta` class. ``plugin``, Instantiated plugin. ``plugin`` is automatically populated with configuration settings. ``args`` and ``kwargs``, are received from query_plugin's ``args`` and ``kwargs``. """ plugin._settngx.update(self.settings[h.plugin2sec(plugin.caname)]) plugin.pa = self plugin.query_plugins = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugins, self) plugin.query_pluginr = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_pluginr, self) plugin.query_plugin = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugin, self) plugin.qps = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugins, self) plugin.qpr = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_pluginr, self) plugin.qp = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugin, self) # Plugin settings plugin._settngx.update(kwargs.pop("settings", {})) return args, kwargs
def _defaultsettings(self): """By now it is expected that all interface specs and plugin definitions would have been loaded by loading packages implementing them and pluggdapps' plugin meta-classing. This function will collect their default settings and return them as settings dictionary,:: { "plugin:<pkgname>.<pluginname>" : default_settings, ... } """ from pluggdapps.plugin import PluginMeta # Default settings for plugins. default = dict(DEFAULT().items()) defaultsett = {'DEFAULT': deepcopy(default)} defaultsett['pluggdapps'] = deepcopy(default) defaultsett['pluggdapps'].update(dict( pluggdapps_defaultsett().items())) # Fetch all the default-settings for loaded plugins using `ISettings` # interface. Plugin inheriting from other plugins will override its # base's default_settings() in cls.mro() order. for name, info in PluginMeta._pluginmap.items(): bases = reversed(info['cls'].mro()) sett = deepcopy(default) for b in bases: if hasattr(b, 'default_settings'): sett.update(dict(b.default_settings().items())) sett = b.normalize_settings(sett) defaultsett[h.plugin2sec(name)] = sett return defaultsett
def masterinit(self, plugin, *args, **kwargs): """Call back function during plugin instantiation, from :class:`pluggdapps.plugin.PluginMeta` class. ``plugin``, Instantiated plugin. ``plugin`` is automatically populated with configuration settings. ``args`` and ``kwargs``, are received from query_plugin's ``args`` and ``kwargs``. """ plugin._settngx.update(self.settings[h.plugin2sec(plugin.caname)]) plugin.pa = self plugin.query_plugins = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugins, self) plugin.query_pluginr = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_pluginr, self) plugin.query_plugin = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugin, self) plugin.qps = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugins, self) plugin.qpr = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_pluginr, self) plugin.qp = h.hitch_method(plugin, plugin.__class__, Pluggdapps.query_plugin, self) # Plugin settings plugin._settngx.update(kwargs.pop('settings', {})) return args, kwargs
def findapp(self, appname=None, appsec=None): appsec = appsec or (h.plugin2sec(appname) if appname else None) if appsec: for asec, netpath, config in self.webapps.keys(): if appsec == asec: return self.webapps[(asec, netpath, config)] else: return None return None
def masterinit(self, plugin, webapp, *args, **kwargs): """Call back function during plugin instantiation, from :class:`pluggdapps.plugin.PluginMeta` class. ``plugin``, Instantiated plugin. ``plugin`` is automatically populated with configuration settings and ``webapp`` attribute. ``args`` and ``kwargs``, are received from query_plugin's ``args`` and ``kwargs``. """ from pluggdapps.web.webapp import WebApp caname = plugin.caname if isinstance(plugin, WebApp): # Ought to be IWebApp plugin appsec, netpath, config = webapp plugin._settngx.update(args[0][appsec]) plugin.webapp = plugin args = args[1:] elif webapp: # Not a IWebApp plugin plugin._settngx.update(webapp.appsettings[h.plugin2sec(caname)]) plugin.webapp = webapp else: # plugin not under a webapp plugin._settngx.update(self.settings[h.plugin2sec(caname)]) plugin.webapp = None plugin.pa = self plugin.query_plugins = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugins, self, plugin.webapp) plugin.query_pluginr = h.hitch_method(plugin, plugin.__class__, Webapps.query_pluginr, self, plugin.webapp) plugin.query_plugin = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugin, self, plugin.webapp) plugin.qps = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugins, self, plugin.webapp) plugin.qpr = h.hitch_method(plugin, plugin.__class__, Webapps.query_pluginr, self, plugin.webapp) plugin.qp = h.hitch_method(plugin, plugin.__class__, Webapps.query_plugin, self, plugin.webapp) # Plugin settings plugin._settngx.update(kwargs.pop("settings", {})) return args, kwargs
def _mountapps(self): """Create application wise settings, using special section [mountloc], if any. Also parse referred configuration files.""" from pluggdapps.plugin import pluginnames, webapps settings = self.settings # context for parsing ini files. _vars = {"here": abspath(dirname(self.inifile))} # Fetch special section [mountloc]. And override them with [DEFAULT] # settings. cp = SafeConfigParser() cp.read(self.inifile) if cp.has_section("mountloc"): mountloc = cp.items("mountloc", vars=_vars) else: mountloc = [] settings["mountloc"] = dict(mountloc) settings.pop("here", None) # TODO : how `here` gets populated. # Parse mount configuration. appsecs = list(map(h.plugin2sec, webapps())) mountls = [] _skipopts = list(_vars.keys()) + list(settings["DEFAULT"].keys()) for netpath, mounton in mountloc: if netpath in _skipopts: continue parts = [x.strip() for x in mounton.split(",", 1)] appname = parts.pop(0) configini = parts.pop(0) if parts else None appsec = h.plugin2sec(appname) if appsec not in appsecs: raise Exception("%r application not found." % appname) if not configini: raise Exception("configuration file %r not supplied" % configini) if not isfile(configini): raise Exception("configuration file %r not valid" % configini) mountls.append((appsec, netpath, configini)) # Load application configuration from instance configuration file. appsettings = {} for appsec, netpath, instconfig in mountls: appsett = deepcopy(settings) [appsett.pop(k) for k in SPECIAL_SECS] if instconfig: self._loadinstance(appsett, instconfig) appsettings[(appsec, netpath, instconfig)] = appsett return appsettings
def _mountapps(self): """Create application wise settings, using special section [mountloc], if any. Also parse referred configuration files.""" from pluggdapps.plugin import pluginnames, webapps settings = self.settings # context for parsing ini files. _vars = {'here': abspath(dirname(self.inifile))} # Fetch special section [mountloc]. And override them with [DEFAULT] # settings. cp = SafeConfigParser() cp.read(self.inifile) if cp.has_section('mountloc'): mountloc = cp.items('mountloc', vars=_vars) else: mountloc = [] settings['mountloc'] = dict(mountloc) settings.pop('here', None) # TODO : how `here` gets populated. # Parse mount configuration. appsecs = list(map(h.plugin2sec, webapps())) mountls = [] _skipopts = list(_vars.keys()) + list(settings['DEFAULT'].keys()) for netpath, mounton in mountloc: if netpath in _skipopts: continue parts = [x.strip() for x in mounton.split(',', 1)] appname = parts.pop(0) configini = parts.pop(0) if parts else None appsec = h.plugin2sec(appname) if appsec not in appsecs: raise Exception("%r application not found." % appname) if not configini: raise Exception("configuration file %r not supplied" % configini) if not isfile(configini): raise Exception("configuration file %r not valid" % configini) mountls.append((appsec, netpath, configini)) # Load application configuration from instance configuration file. appsettings = {} for appsec, netpath, instconfig in mountls: appsett = deepcopy(settings) [appsett.pop(k) for k in SPECIAL_SECS] if instconfig: self._loadinstance(appsett, instconfig) appsettings[(appsec, netpath, instconfig)] = appsett return appsettings
def get_html_config( request, c ): """Full page to configure application -> sections for all loaded applications.""" response = request.response common_context( request, c ) netpath = request.matchdict['netpath'] section = request.matchdict['section'] c['pluginname'] = plugin = h.sec2plugin( section ) # URL. c['url_putconfig'] = \ request.pathfor( 'updateconfig', netpath=netpath, section=section ) #Context c['describe'] = h.conf_descriptionfor( plugin ) # Gather ConfigDict for DEFAULT section, as a fall back in .ttl file. c['DEFAULT'] = DEFAULT() # Section settings, TODO : What to do about `here` variables in section. setts = deepcopy( h.section_settings( request.pa, netpath, section )) c['secsetts'] = ( c['describe'].__doc__, setts ) # Breadcrumbs c['navigate'] = [ (netpath, None), (section, None) ] appmenu = [ ( 'platform', request.pathfor('htmlconfig1', netpath='platform', section='DEFAULT') ) ] for s in request.pa.netpaths : appmenu.append( ( s, request.pathfor('htmlconfig1', netpath=s, section='DEFAULT') )) secmenu = [] for pn in h.netpath_settings( request.pa, netpath ).keys() : if pn in ['mountloc'] : continue name = h.plugin2sec( pn ) secmenu.append( ( name, request.pathfor( 'htmlconfig1', netpath=netpath, section=name ) )) c['crumbsmenu'] = { netpath : appmenu, section : secmenu } html = response.render( request, c, file='pluggdapps:webadmin/templates/config.ttl' ) response.write( html ) response.flush( finishing=True )
def _ls_settings(self, args): sett = deepcopy(self.pa.settings) if args._ls_settings.startswith('spec'): print("Special sections") pprint({k: sett.pop(k, {}) for k in SPECIAL_SECS + ['DEFAULT']}, indent=2) elif args._ls_settings.startswith('plug'): print("Plugin sections") pprint({k: sett[k] for k in sett if h.is_plugin_section(k)}, indent=2) elif args._ls_settings.startswith('wa') and args.plugin: for instkey, webapp in getattr(self.pa, 'webapps', {}).items(): appsec, netpath, instconfig = instkey if h.sec2plugin(appsec) == args.plugin: print("Settings for %r" % (instkey, )) pprint(webapp.appsettings, indent=2) print() elif args._ls_settings.startswith('def') and args.plugin: print("Default settings for plugin %r" % args.plugin) defaultsett = pa.defaultsettings() pprint(defaultsett().get(h.plugin2sec(args.plugin), {}), indent=2)