def readMetadata(metaplugin, plugins_local): metafile = metaplugin + '/plugin.yaml' plg_dict = {} plugin_yaml = {} if metaplugin in plugins_local: # pluginsyaml_local if os.path.isfile(metafile): plugin_yaml = shyaml.yaml_load(metafile, ordered=True) else: print("There is no plugin named '" + metaplugin + "'") print() return None return plugin_yaml
def write_configfile(plg, configfile_dir, language='de'): """ Create a .rst file with configuration information for the passed plugin """ plgname = plg['name'] # --------------------------------- # read metadata for plugin # --------------------------------- metafile = plgname + '/plugin.yaml' if os.path.isfile(metafile): meta_yaml = shyaml.yaml_load(metafile) plugin_yaml = meta_yaml.get('plugin', {}) parameter_yaml = meta_yaml.get('parameters', {}) iattributes_yaml = meta_yaml.get('item_attributes', {}) if parameter_yaml is None: parameter_yaml = {} if iattributes_yaml is None: iattributes_yaml = {} else: plugin_yaml = {} parameter_yaml = {} iattributes_yaml = {} # --------------------------------- # Create rST file # --------------------------------- outf_name = os.path.join(configfile_dir, plgname + '.rst') fh = open(outf_name, "w") write_heading(fh, 'Plugin ' + plgname, 1) # -------------------------------------------- # write image for plugin-type and generic text # -------------------------------------------- plgtype = plugin_yaml.get('type', '').lower() if plgtype != '': fh.write('.. image:: /_static/img/' + plgtype + '.svg\n') fh.write(' :width: 70px\n') fh.write(' :height: 70px\n') fh.write(' :scale: 50 %\n') fh.write(' :alt: protocol plugin\n') fh.write(' :align: left\n') fh.write('\n') fh.write('.. |br| raw:: html\n') fh.write('\n') fh.write(' <br />\n') fh.write('\n') fh.write( 'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin **' + plgname + '** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n' ) fh.write('\n') fh.write('\n') write_heading(fh, 'Beschreibung', 2) write_formatted(fh, get_doc_description(plugin_yaml, language)) # --------------------------------- # write Requirements section # --------------------------------- requirements = get_description(plugin_yaml, 768, language, 'requirements') min_version = str(plugin_yaml.get('sh_minversion', '')) max_version = str(plugin_yaml.get('sh_maxversion', '')) if requirements[0] != '' or min_version != '' or max_version != '': write_heading(fh, 'Anforderungen', 2) fh.write('\n') write_formatted( fh, get_doc_description(plugin_yaml, language, 'requirements')) if min_version != '': fh.write(' - Minimum SmartHomeNG Version: **' + min_version + '**\n') if max_version != '': fh.write(' - Maximum SmartHomeNG Version: **' + max_version + '**\n') # --------------------------------- # write supported hardware section # --------------------------------- hardware = get_description(plugin_yaml, 768, language, 'hardware') if hardware[0] != '': write_heading(fh, 'Unterstützte Hardware', 2) fh.write('\n') write_formatted(fh, get_doc_description(plugin_yaml, language, 'hardware')) # --------------------------------- # write Konfiguration section # --------------------------------- write_heading(fh, 'Konfiguration', 2) fh.write('\n') fh.write( 'Im folgenden ist beschrieben, wie das Plugin **' + plgname + '** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n' ) fh.write('\n') # --------------------------------- # write Parameter section # --------------------------------- write_heading(fh, 'Parameter', 2) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende Parameter, die in der Datei **../etc/plugin.yaml** konfiguriert werden:\n' ) fh.write('\n') if len(parameter_yaml) == 0: fh.write( '**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n' ) for p in sorted(parameter_yaml): # --------------------------------- # write info for one parameter # --------------------------------- write_heading(fh, p, 3) fh.write('\n') # desc = get_description(parameter_yaml[p], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(parameter_yaml[p], language)) datatype = parameter_yaml[p].get('type', '').lower() default = str(parameter_yaml[p].get('default', '')) validlist = parameter_yaml[p].get('valid_list', []) fh.write(' - Datentyp: **' + datatype + '**\n') if default != '': fh.write(' - Standardwert: **' + default + '**\n') fh.write('\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for v in validlist: fh.write(' - **' + str(v) + '**\n') fh.write('\n') # --------------------------------- # write item_attribute section # --------------------------------- write_heading(fh, 'Item Attribute', 2) fh.write('\n') fh.write( 'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis **../items** verwendet werden:\n' ) fh.write('\n') if len(iattributes_yaml) == 0: fh.write( '**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n' ) for a in sorted(iattributes_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, a, 3) fh.write('\n') # desc = get_description(iattributes_yaml[a], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(iattributes_yaml[a], language)) datatype = iattributes_yaml[a].get('type', '').lower() default = str(iattributes_yaml[a].get('default', '')) validlist = iattributes_yaml[a].get('valid_list', []) fh.write(' - Datentyp: **' + datatype + '**\n') if default != '': fh.write(' - Standardwert: **' + default + '**\n') fh.write('\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for v in validlist: fh.write(' - **' + str(v) + '**\n') fh.write('\n') fh.write('\n') fh.write( '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/' + plgname + '/README>` des Plugins zugreifen.\n') fh.close() return
def build_pluginlist(plugin_type='all'): """ Return a list of dicts with a dict for each plugin of the requested type The dict contains the plugin name, type and description """ result = [] plugin_type = plugin_type.lower() for metaplugin in plugins_git: metafile = metaplugin + '/plugin.yaml' plg_dict = {} if metaplugin in plugins_git: #pluginsyaml_git if os.path.isfile(metafile): plugin_yaml = shyaml.yaml_load(metafile) else: plugin_yaml = '' if plugin_yaml != '': section_dict = plugin_yaml.get('plugin') if section_dict != None: if section_dict.get('type') != None: if section_dict.get('type').lower() in plugin_types: plgtype = section_dict.get('type').lower() plg_dict['name'] = metaplugin.lower() plg_dict['type'] = plgtype plg_dict['desc'] = get_description( section_dict, 85, language) plg_dict['maint'] = get_maintainer( section_dict, 15) plg_dict['test'] = get_tester(section_dict, 15) plg_dict['doc'] = html_escape( section_dict.get('documentation', '')) plg_dict['sup'] = html_escape( section_dict.get('support', '')) else: plgtype = type_unclassified else: plgtype = type_unclassified if plugin_type == type_unclassified: print( "not found: plugin type '{}' defined in plugin '{}'" .format(section_dict.get('type'), metaplugin)) else: plgtype = type_unclassified if (plgtype == type_unclassified) and (plugin_yaml != ''): plg_dict['name'] = metaplugin.lower() plg_dict['type'] = type_unclassified plg_dict['desc'] = get_description(section_dict, 85, language) plg_dict['maint'] = get_maintainer(section_dict, 15) plg_dict['test'] = get_tester(section_dict, 15) plg_dict['doc'] = html_escape( section_dict.get('documentation', '')) plg_dict['sup'] = html_escape( section_dict.get('support', '')) print("unclassified: metafile = {}, plg_dict = {}".format( metafile, str(plg_dict))) plg_dict['desc'].append('') else: plgtype = type_unclassified plg_dict['name'] = metaplugin.lower() plg_dict['type'] = type_unclassified plg_dict['desc'] = [ 'No metadata (plugin.yaml) was provided for this plugin!' ] plg_dict['maint'] = [''] plg_dict['test'] = [''] plg_dict['doc'] = '' plg_dict['sup'] = '' # Adjust list lengths maxlen = max(len(plg_dict['desc']), len(plg_dict['maint']), len(plg_dict['test'])) while len(plg_dict['desc']) < maxlen: plg_dict['desc'].append('') while len(plg_dict['maint']) < maxlen: plg_dict['maint'].append('') while len(plg_dict['test']) < maxlen: plg_dict['test'].append('') if (plgtype == plugin_type) or (plugin_type == 'all'): # result.append(metaplugin) result.append(plg_dict) return result
def write_configfile(plg, configfile_dir, language='de'): """ Create a .rst file with configuration information for the passed plugin """ plgname = plg['name'] # --------------------------------- # read metadata for plugin # --------------------------------- metafile = plgname + '/plugin.yaml' if os.path.isfile(metafile): meta_yaml = shyaml.yaml_load(metafile, ordered=True) plugin_yaml = meta_yaml.get('plugin', {}) parameter_yaml = meta_yaml.get('parameters', {}) iattributes_yaml = meta_yaml.get('item_attributes', {}) lparameter_yaml = meta_yaml.get('logic_parameter', {}) functions_yaml = meta_yaml.get('plugin_functions', {}) no_parameters = (parameter_yaml == 'NONE') if no_parameters or parameter_yaml is None: parameter_yaml = {} no_attributes = (iattributes_yaml == 'NONE') if no_attributes or iattributes_yaml is None: iattributes_yaml = {} no_lparameters = (lparameter_yaml == 'NONE') if no_lparameters or lparameter_yaml is None: lparameter_yaml = {} no_functions = (functions_yaml == 'NONE') if no_functions or functions_yaml is None: functions_yaml = {} else: plugin_yaml = {} no_parameters = False parameter_yaml = {} no_attributes = False iattributes_yaml = {} no_functions = False functions_yaml = {} # --------------------------------- # Create rST file # --------------------------------- outf_name = os.path.join(configfile_dir, plgname + '.rst') fh = open(outf_name, "w") fh.write('.. |_| unicode:: 0xA0\n') fh.write('\n') write_heading(fh, 'Plugin ' + plgname, 1) # -------------------------------------------- # write image for plugin-type and generic text # -------------------------------------------- plgtype = plugin_yaml.get('type', '').lower() if plgtype != '': fh.write('.. image:: /_static/img/' + plgtype + '.svg\n') fh.write(' :width: 70px\n') fh.write(' :height: 70px\n') fh.write(' :scale: 50 %\n') fh.write(' :alt: protocol plugin\n') fh.write(' :align: left\n') fh.write('\n') fh.write('.. |br| raw:: html\n') fh.write('\n') fh.write(' <br />\n') fh.write('\n') fh.write( 'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin ' + bold(plgname) + ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n' ) fh.write('\n') fh.write('\n') write_heading(fh, 'Beschreibung', 2) write_formatted(fh, get_doc_description(plugin_yaml, language)) # --------------------------------- # write Requirements section # --------------------------------- requirements = get_description(plugin_yaml, 768, language, 'requirements') min_version = str(plugin_yaml.get('sh_minversion', '')) max_version = str(plugin_yaml.get('sh_maxversion', '')) if requirements[0] != '' or min_version != '' or max_version != '': write_heading(fh, 'Anforderungen', 2) fh.write('\n') write_formatted( fh, get_doc_description(plugin_yaml, language, 'requirements')) if min_version != '': fh.write(' - Minimum SmartHomeNG Version: ' + bold(min_version) + '\n') if max_version != '': fh.write(' - Maximum SmartHomeNG Version: ' + bold(max_version) + '\n') # --------------------------------- # write supported hardware section # --------------------------------- hardware = get_description(plugin_yaml, 768, language, 'hardware') if hardware[0] != '': write_heading(fh, 'Unterstützte Hardware', 2) fh.write('\n') write_formatted(fh, get_doc_description(plugin_yaml, language, 'hardware')) # --------------------------------- # write Konfiguration section # --------------------------------- write_heading(fh, 'Konfiguration', 2) fh.write('\n') fh.write( 'Im folgenden ist beschrieben, wie das Plugin ' + bold(plgname) + ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n' ) fh.write('\n') # --------------------------------- # write Parameter section # --------------------------------- write_heading(fh, 'Parameter', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/plugin.yaml`` konfiguriert werden:\n' ) fh.write('\n') if len(parameter_yaml) == 0: if no_parameters: fh.write('**Keine**\n') else: fh.write( 'Keine Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for p in sorted(parameter_yaml): # --------------------------------- # write info for one parameter # --------------------------------- write_heading(fh, p, 2) fh.write('\n') write_formatted(fh, get_doc_description(parameter_yaml[p], language)) datatype = parameter_yaml[p].get('type', '').lower() default = str(parameter_yaml[p].get('default', '')) validlist = parameter_yaml[p].get('valid_list', []) validmin = parameter_yaml[p].get('valid_min', '') validmax = parameter_yaml[p].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': fh.write(' - Standardwert: ' + bold(default) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(parameter_yaml[p], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write item_attribute section # --------------------------------- write_heading(fh, 'Item Attribute', 1) fh.write('\n') fh.write( 'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis ``../items`` verwendet werden:\n' ) fh.write('\n') if len(iattributes_yaml) == 0: if no_attributes: fh.write('**Keine**\n') else: fh.write( 'Keine Item Attribute in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for a in sorted(iattributes_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, a, 2) fh.write('\n') write_formatted(fh, get_doc_description(iattributes_yaml[a], language)) datatype = iattributes_yaml[a].get('type', '').lower() default = str(iattributes_yaml[a].get('default', '')) validlist = iattributes_yaml[a].get('valid_list', []) validmin = iattributes_yaml[a].get('valid_min', '') validmax = iattributes_yaml[a].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': fh.write(' - Standardwert: ' + bold(default) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(iattributes_yaml[a], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write logic_parameter section # --------------------------------- write_heading(fh, 'Logik Parameter', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/logic.yaml`` konfiguriert werden:\n' ) fh.write('\n') if len(lparameter_yaml) == 0: if no_lparameters: fh.write('**Keine**\n') else: fh.write( 'Keine Logik Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for l in sorted(lparameter_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, l, 2) fh.write('\n') write_formatted(fh, get_doc_description(lparameter_yaml[l], language)) datatype = lparameter_yaml[l].get('type', '').lower() default = str(lparameter_yaml[l].get('default', '')) validlist = lparameter_yaml[l].get('valid_list', []) validmin = lparameter_yaml[l].get('valid_min', '') validmax = lparameter_yaml[l].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': fh.write(' - Standardwert: ' + bold(default) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(lparameter_yaml[l], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write plugin-function section # --------------------------------- write_heading(fh, 'Plugin Functions', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende öffentliche Funktionen, die z.B. in Logiken aufgerufen werden können.\n' ) fh.write('\n') if len(functions_yaml) == 0: if no_functions: fh.write('**Keine**\n') else: fh.write( 'Keine Funktionen in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for f in sorted(functions_yaml): # --------------------------------- # write info for one function # --------------------------------- fp = '' func_param_yaml = functions_yaml[f].get('parameters', None) if func_param_yaml != None: for par in func_param_yaml: if fp != '': fp += ', ' fp += par if func_param_yaml[par].get('default', None) != None: default = str(func_param_yaml[par].get('default', None)) if func_param_yaml[par].get('type', 'foo') == 'str': default = " '" + default + "'" fp += '=' + default write_heading(fh, f + '(' + fp + ')', 2) fh.write('\n') # desc = get_description(parameter_yaml[f], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(functions_yaml[f], language)) datatype = functions_yaml[f].get('type', '').lower() default = str(functions_yaml[f].get('default', '')) validlist = functions_yaml[f].get('valid_list', []) validmin = functions_yaml[f].get('valid_min', '') validmax = functions_yaml[f].get('valid_max', '') if datatype == 'void': fh.write(' - Die Funktion liefert kein Ergebnis\n') else: fh.write(' - Ergebnistyp der Funktion: ' + bold(datatype) + '\n') if default != '': fh.write(' - Standardwert: ' + bold(default) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(functions_yaml[f], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # func_param_yaml = functions_yaml[f].get('parameters', None) if func_param_yaml != None: for par in func_param_yaml: write_heading(fh, par, 3) write_formatted( fh, get_doc_description(func_param_yaml[par], language)) datatype = func_param_yaml[par].get('type', '').lower() default = str(func_param_yaml[par].get('default', '')) validlist = func_param_yaml[par].get('valid_list', []) validmin = func_param_yaml[par].get('valid_min', '') validmax = func_param_yaml[par].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': fh.write(' - Standardwert: ' + bold(default) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description( func_param_yaml[par], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') fh.write('\n') if os.path.isfile(plg['name'] + '/README.md'): fh.write( '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/' + plgname + '/README>` des Plugins zugreifen.\n') else: fh.write( '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt.\n' ) fh.close() return
def build_pluginlist( plugin_type='all' ): """ Return a list of dicts with a dict for each plugin of the requested type The dict contains the plugin name, type and description """ result = [] plugin_type = plugin_type.lower() for metaplugin in plugins_git: metafile = metaplugin + '/plugin.yaml' plg_dict = {} if metaplugin in plugins_git: #pluginsyaml_git if os.path.isfile(metafile): plugin_yaml = shyaml.yaml_load(metafile) else: plugin_yaml = '' if plugin_yaml != '': section_dict = plugin_yaml.get('plugin') if section_dict != None: if section_dict.get('type') != None: if section_dict.get('type').lower() in plugin_types: plgtype = section_dict.get('type').lower() plg_dict['name'] = metaplugin.lower() plg_dict['type'] = plgtype plg_dict['desc'] = get_description(section_dict, 85, language) plg_dict['maint'] = get_maintainer(section_dict, 15) plg_dict['test'] = get_tester(section_dict, 15) plg_dict['doc'] = html_escape(section_dict.get('documentation', '')) plg_dict['sup'] = html_escape(section_dict.get('support', '')) else: plgtype = type_unclassified else: plgtype = type_unclassified if plugin_type == type_unclassified: print("not found: plugin type '{}' defined in plugin '{}'".format(section_dict.get('type'),metaplugin)) else: plgtype = type_unclassified if (plgtype == type_unclassified) and (plugin_yaml != ''): plg_dict['name'] = metaplugin.lower() plg_dict['type'] = type_unclassified plg_dict['desc'] = get_description(section_dict, 85, language) plg_dict['maint'] = get_maintainer(section_dict, 15) plg_dict['test'] = get_tester(section_dict, 15) plg_dict['doc'] = html_escape(section_dict.get('documentation', '')) plg_dict['sup'] = html_escape(section_dict.get('support', '')) print("") print("> unclassified plugin: metafile = {}, plg_dict = {}".format(metafile, str(plg_dict))) plg_dict['desc'].append('') else: plgtype = type_unclassified plg_dict['name'] = metaplugin.lower() plg_dict['type'] = type_unclassified plg_dict['desc'] = ['No metadata (plugin.yaml) was provided for this plugin!'] plg_dict['maint'] = [''] plg_dict['test'] = [''] plg_dict['doc'] = '' plg_dict['sup'] = '' # Adjust list lengths maxlen = max( len(plg_dict['desc']), len(plg_dict['maint']), len(plg_dict['test']) ) while len(plg_dict['desc']) < maxlen: plg_dict['desc'].append('') while len(plg_dict['maint']) < maxlen: plg_dict['maint'].append('') while len(plg_dict['test']) < maxlen: plg_dict['test'].append('') if (plgtype == plugin_type) or (plugin_type == 'all'): # result.append(metaplugin) result.append(plg_dict) return result
def write_configfile(plg, configfile_dir, language='de'): """ Create a .rst file with configuration information for the passed plugin """ plgname = plg['name'] # --------------------------------- # read metadata for plugin # --------------------------------- metafile = plgname + '/plugin.yaml' if os.path.isfile(metafile): meta_yaml = shyaml.yaml_load(metafile) plugin_yaml = meta_yaml.get('plugin', {}) parameter_yaml = meta_yaml.get('parameters', {}) iattributes_yaml = meta_yaml.get('item_attributes', {}) if parameter_yaml is None: parameter_yaml = {} if iattributes_yaml is None: iattributes_yaml = {} else: plugin_yaml = {} parameter_yaml = {} iattributes_yaml = {} # --------------------------------- # Create rST file # --------------------------------- outf_name = os.path.join(configfile_dir, plgname+'.rst') fh = open(outf_name, "w") write_heading(fh, 'Plugin ' + plgname, 1) # -------------------------------------------- # write image for plugin-type and generic text # -------------------------------------------- plgtype = plugin_yaml.get('type', '').lower() if plgtype != '': fh.write('.. image:: /_static/img/'+plgtype+'.svg\n') fh.write(' :width: 70px\n') fh.write(' :height: 70px\n') fh.write(' :scale: 50 %\n') fh.write(' :alt: protocol plugin\n') fh.write(' :align: left\n') fh.write('\n') fh.write('.. |br| raw:: html\n') fh.write('\n') fh.write(' <br />\n') fh.write('\n') fh.write('Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die Beschreibung, wie das Plugin **'+plgname+'** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n') fh.write('\n') fh.write('\n') write_heading(fh, 'Beschreibung', 2) write_formatted(fh, get_doc_description(plugin_yaml, language)) # --------------------------------- # write Requirements section # --------------------------------- requirements = get_description(plugin_yaml, 768, language, 'requirements') min_version = str(plugin_yaml.get('sh_minversion', '')) max_version = str(plugin_yaml.get('sh_maxversion', '')) if requirements[0] != '' or min_version != '' or max_version != '': write_heading(fh, 'Anforderungen', 2) fh.write('\n') write_formatted(fh, get_doc_description(plugin_yaml, language, 'requirements')) if min_version != '': fh.write(' - Minimum SmartHomeNG Version: **'+min_version+'**\n') if max_version != '': fh.write(' - Maximum SmartHomeNG Version: **'+max_version+'**\n') # --------------------------------- # write supported hardware section # --------------------------------- hardware = get_description(plugin_yaml, 768, language, 'hardware') if hardware[0] != '': write_heading(fh, 'Unterstützte Hardware', 2) fh.write('\n') write_formatted(fh, get_doc_description(plugin_yaml, language, 'hardware')) # --------------------------------- # write Konfiguration section # --------------------------------- write_heading(fh, 'Konfiguration', 2) fh.write('\n') fh.write('Im folgenden ist beschrieben, wie das Plugin **'+plgname+'** konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n') fh.write('\n') # --------------------------------- # write Parameter section # --------------------------------- write_heading(fh, 'Parameter', 2) fh.write('\n') fh.write('Das Plugin verfügt über folgende Parameter, die in der Datei **../etc/plugin.yaml** konfiguriert werden:\n') fh.write('\n') if len(parameter_yaml) == 0: fh.write('**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n') for p in sorted(parameter_yaml): # --------------------------------- # write info for one parameter # --------------------------------- write_heading(fh, p, 3) fh.write('\n') # desc = get_description(parameter_yaml[p], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(parameter_yaml[p], language)) datatype = parameter_yaml[p].get('type', '').lower() default = str(parameter_yaml[p].get('default', '')) validlist = parameter_yaml[p].get('valid_list', []) fh.write(' - Datentyp: **'+datatype+'**\n') if default != '': fh.write(' - Standardwert: **'+default+'**\n') fh.write('\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for v in validlist: fh.write(' - **'+str(v)+'**\n') fh.write('\n') # --------------------------------- # write item_attribute section # --------------------------------- write_heading(fh, 'Item Attribute', 2) fh.write('\n') fh.write('Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis **../items** verwendet werden:\n') fh.write('\n') if len(iattributes_yaml) == 0: fh.write('**Keine** - zur Sicherheit in der README nachsehen (siehe Fußnote)\n') for a in sorted(iattributes_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, a, 3) fh.write('\n') # desc = get_description(iattributes_yaml[a], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(iattributes_yaml[a], language)) datatype = iattributes_yaml[a].get('type', '').lower() default = str(iattributes_yaml[a].get('default', '')) validlist = iattributes_yaml[a].get('valid_list', []) fh.write(' - Datentyp: **'+datatype+'**\n') if default != '': fh.write(' - Standardwert: **'+default+'**\n') fh.write('\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for v in validlist: fh.write(' - **'+str(v)+'**\n') fh.write('\n') fh.write('\n') fh.write('.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/'+plgname+'/README>` des Plugins zugreifen.\n') fh.close() return
def write_configfile(plg, configfile_dir, language='de'): """ Create a .rst file with configuration information for the passed plugin """ lparameter_yaml = [] no_lparameters = (lparameter_yaml == 'NONE') plgname = plg['name'] # --------------------------------- # read metadata for plugin # --------------------------------- metafile = plgname + '/plugin.yaml' if os.path.isfile(metafile): meta_yaml = shyaml.yaml_load(metafile, ordered=True) plugin_yaml = meta_yaml.get('plugin', {}) parameter_yaml = meta_yaml.get('parameters', {}) iattributes_yaml = meta_yaml.get('item_attributes', {}) lparameter_yaml = meta_yaml.get('logic_parameter', {}) functions_yaml = meta_yaml.get('plugin_functions', {}) no_parameters = (parameter_yaml == 'NONE') if no_parameters or parameter_yaml is None: parameter_yaml = {} no_attributes = (iattributes_yaml == 'NONE') if no_attributes or iattributes_yaml is None: iattributes_yaml = {} no_lparameters = (lparameter_yaml == 'NONE') if no_lparameters or lparameter_yaml is None: lparameter_yaml = {} no_functions = (functions_yaml == 'NONE') if no_functions or functions_yaml is None: functions_yaml = {} else: plugin_yaml = {} no_parameters = False parameter_yaml = {} no_attributes = False iattributes_yaml = {} no_functions = False functions_yaml = {} # --------------------------------- # Create rST file # --------------------------------- outf_name = os.path.join(configfile_dir, plgname + '.rst') fh = open(outf_name, "w", encoding='UTF-8') fh.write('.. |_| unicode:: 0xA0\n') fh.write('\n') write_heading(fh, f"Plugin '{plgname}' Konfiguration", 1) fh.write('\n') fh.write(f".. index:: Plugins; {plgname} Konfiguration\n") fh.write('\n') # -------------------------------------------- # write image for plugin-type and generic text # -------------------------------------------- plgtype = plugin_yaml.get('type', '').lower() plgstate = plugin_yaml.get('state', '').lower() if plgtype != '': cwd = os.getcwd() plglogo = plgname + '/webif/static/img/plugin_logo' if os.path.isfile(plglogo + '.png'): ext = '.png' elif os.path.isfile(plglogo + '.jpg'): ext = '.jpg' elif os.path.isfile(plglogo + '.svg'): ext = '.svg' else: ext = '.???' if os.path.isfile(plglogo + ext): fh.write(".. image:: /plugins/" + plglogo + ext + "\n") fh.write(' :alt: plugin logo\n') else: print( f"Plugin {plgname}: Kein Plugin-Logo gefunden, Typ-Logo verwendet." ) fh.write('.. image:: /_static/img/' + plgtype + '.svg\n') fh.write(' :alt: plugin type logo\n') fh.write(' :width: 300px\n') fh.write(' :height: 300px\n') fh.write(' :scale: 50 %\n') fh.write(' :align: left\n') fh.write('\n') fh.write('.. |br| raw:: html\n') fh.write('\n') fh.write(' <br />\n') fh.write('\n') fh.write( 'Im folgenden sind etwaige Anforderungen und unterstützte Hardware beschrieben. Danach folgt die \ Beschreibung, wie das Plugin ' + bold(plgname) + ' konfiguriert wird. Außerdem ist im folgenden \ beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann. [#f1]_ \n' ) fh.write('\n') fh.write( f"Es handelt sich bei diesem Plugin um ein **{plgtype} Plugin**.\n") if plgstate == 'deprecated': fh.write('\n') fh.write( f"**ACHTUNG**: Dieses Plugin ist als {plgstate} gekennzeichnet. Es wird empfohlen auf eine \ Nachfolgelösung umzusteigen.\n") if plgstate == 'develop': fh.write('\n') fh.write( f"**ACHTUNG**: Dieses Plugin ist als {plgstate} gekennzeichnet. Es kann daher sein, dass es \ noch nicht Feature-Complete oder noch fehlerhaft ist.\n") fh.write('\n') fh.write('\n') write_heading(fh, 'Beschreibung', 2) write_formatted(fh, get_doc_description(plugin_yaml, language)) # --------------------------------- # write a note block if special requirements exist # --------------------------------- py_versioncomment = str(plugin_yaml.get('py_versioncomment', '')) if py_versioncomment != '': fh.write('.. attention::\n') fh.write('\n') fh.write(f" {py_versioncomment}\n") fh.write('\n') fh.write('\n') # --------------------------------- # write Requirements section # --------------------------------- requirements = get_description(plugin_yaml, 768, language, 'requirements') min_version = str(plugin_yaml.get('sh_minversion', '')) max_version = str(plugin_yaml.get('sh_maxversion', '')) min_py_version = str(plugin_yaml.get('py_minversion', '')) max_py_version = str(plugin_yaml.get('py_maxversion', '')) if requirements[ 0] != '' or min_version != '' or max_version != '' or min_py_version != '' or max_py_version != '': write_heading(fh, 'Anforderungen', 2) fh.write('\n') write_formatted( fh, get_doc_description(plugin_yaml, language, 'requirements')) if min_version != '': fh.write(' - Minimum SmartHomeNG Version: ' + bold(min_version) + '\n') if max_version != '': fh.write(' - Maximum SmartHomeNG Version: ' + bold(max_version) + '\n') if min_py_version != '': fh.write(' - Minimum Python Version: ' + bold(min_py_version) + '\n') if max_py_version != '': fh.write(' - Maximum Python Version: ' + bold(max_py_version) + '\n') # --------------------------------- # write supported hardware section # --------------------------------- hardware = get_description(plugin_yaml, 768, language, 'hardware') if hardware[0] != '': write_heading(fh, 'Unterstützte Hardware', 2) fh.write('\n') write_formatted(fh, get_doc_description(plugin_yaml, language, 'hardware')) # --------------------------------- # write Konfiguration section # --------------------------------- write_heading(fh, 'Konfiguration', 2) fh.write('\n') fh.write( 'Im folgenden ist beschrieben, wie das Plugin ' + bold(plgname) + ' konfiguriert wird. Außerdem ist im folgenden beschrieben, wie das Plugin in den Item Definitionen genutzt werden kann.\n' ) fh.write('\n') # --------------------------------- # write Parameter section # --------------------------------- write_heading(fh, 'Parameter', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/plugin.yaml`` konfiguriert werden:\n' ) fh.write('\n') if len(parameter_yaml) == 0: if no_parameters: fh.write('**Keine**\n') else: fh.write( 'Keine Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for p in sorted(parameter_yaml): # --------------------------------- # write info for one parameter # --------------------------------- write_heading(fh, p, 2) fh.write('\n') write_formatted(fh, get_doc_description(parameter_yaml[p], language)) datatype = parameter_yaml[p].get('type', '').lower() default = str(parameter_yaml[p].get('default', '')) validlist = parameter_yaml[p].get('valid_list', []) validmin = parameter_yaml[p].get('valid_min', '') validmax = parameter_yaml[p].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': default_printable = default.replace('\r', '\\r') default_printable = default_printable.replace('\n', '\\n') fh.write(' - Standardwert: ' + bold(default_printable) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(parameter_yaml[p], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write item_attribute section # --------------------------------- write_heading(fh, 'Item Attribute', 1) fh.write('\n') fh.write( 'Das Plugin unterstützt folgende Item Attribute, die in den Dateien im Verzeichnis ``../items`` verwendet werden:\n' ) fh.write('\n') if len(iattributes_yaml) == 0: if no_attributes: fh.write('**Keine**\n') else: fh.write( 'Keine Item Attribute in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for a in sorted(iattributes_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, a, 2) fh.write('\n') write_formatted(fh, get_doc_description(iattributes_yaml[a], language)) datatype = iattributes_yaml[a].get('type', '').lower() default = str(iattributes_yaml[a].get('default', '')) validlist = iattributes_yaml[a].get('valid_list', []) validmin = iattributes_yaml[a].get('valid_min', '') validmax = iattributes_yaml[a].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': default_printable = default.replace('\r', '\\r') default_printable = default_printable.replace('\n', '\\n') fh.write(' - Standardwert: ' + bold(default_printable) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(iattributes_yaml[a], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write logic_parameter section # --------------------------------- write_heading(fh, 'Logik Parameter', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende Parameter, die in der Datei ``../etc/logic.yaml`` konfiguriert werden:\n' ) fh.write('\n') if len(lparameter_yaml) == 0: if no_lparameters: fh.write('**Keine**\n') else: fh.write( 'Keine Logik Parameter in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for l in sorted(lparameter_yaml): # --------------------------------- # write info for one attribute # --------------------------------- write_heading(fh, l, 2) fh.write('\n') write_formatted(fh, get_doc_description(lparameter_yaml[l], language)) datatype = lparameter_yaml[l].get('type', '').lower() default = str(lparameter_yaml[l].get('default', '')) validlist = lparameter_yaml[l].get('valid_list', []) validmin = lparameter_yaml[l].get('valid_min', '') validmax = lparameter_yaml[l].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': default_printable = default.replace('\r', '\\r') default_printable = default_printable.replace('\n', '\\n') fh.write(' - Standardwert: ' + bold(default_printable) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(lparameter_yaml[l], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # --------------------------------- # write plugin-function section # --------------------------------- write_heading(fh, 'Plugin Functions', 1) fh.write('\n') fh.write( 'Das Plugin verfügt über folgende öffentliche Funktionen, die z.B. in Logiken aufgerufen werden können.\n' ) fh.write('\n') if len(functions_yaml) == 0: if no_functions: fh.write('**Keine**\n') else: fh.write( 'Keine Funktionen in den Metadaten beschrieben - **Bitte in der README nachsehen** (siehe Fußnote)\n' ) for f in sorted(functions_yaml): # --------------------------------- # write info for one function # --------------------------------- fp = '' func_param_yaml = functions_yaml[f].get('parameters', None) if func_param_yaml != None: for par in func_param_yaml: if fp != '': fp += ', ' fp += par if func_param_yaml[par] != None and isinstance( func_param_yaml[par], dict): if func_param_yaml[par].get('default', None) != None: default = str(func_param_yaml[par].get( 'default', None)) if func_param_yaml[par].get('type', 'foo') == 'str': default = " '" + default + "'" fp += '=' + default else: print(f"\n\nFEHLER: Ungültige Plugin-Funktion:") print(f"Plugin: {plgname}") print(f"par : {par}\n") print(f"func_param_yaml: {func_param_yaml}\n") write_heading(fh, f + '(' + fp + ')', 2) fh.write('\n') # desc = get_description(parameter_yaml[f], 768, language) # fh.write(desc[0]+'\n') # fh.write('\n') write_formatted(fh, get_doc_description(functions_yaml[f], language)) datatype = functions_yaml[f].get('type', '').lower() default = str(functions_yaml[f].get('default', '')) validlist = functions_yaml[f].get('valid_list', []) validmin = functions_yaml[f].get('valid_min', '') validmax = functions_yaml[f].get('valid_max', '') if datatype == 'void': fh.write(' - Die Funktion liefert kein Ergebnis\n') else: fh.write(' - Ergebnistyp der Funktion: ' + bold(datatype) + '\n') if default != '': default_printable = default.replace('\r', '\\r') default_printable = default_printable.replace('\n', '\\n') fh.write(' - Standardwert: ' + bold(default_printable) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description(functions_yaml[f], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') # func_param_yaml = functions_yaml[f].get('parameters', None) if func_param_yaml != None: for par in func_param_yaml: write_heading(fh, par, 3) write_formatted( fh, get_doc_description(func_param_yaml[par], language)) datatype = func_param_yaml[par].get('type', '').lower() default = str(func_param_yaml[par].get('default', '')) validlist = func_param_yaml[par].get('valid_list', []) validmin = func_param_yaml[par].get('valid_min', '') validmax = func_param_yaml[par].get('valid_max', '') fh.write(' - Datentyp: ' + bold(datatype) + '\n') if default != '': default_printable = default.replace('\r', '\\r') default_printable = default_printable.replace('\n', '\\n') fh.write(' - Standardwert: ' + bold(default_printable) + '\n') fh.write('\n') if validmin != '': fh.write(' - Minimalwert: ' + bold(str(validmin)) + '\n') if validmax != '': fh.write(' - Maximalwert: ' + bold(str(validmax)) + '\n') if len(validlist) > 0: fh.write(' - Mögliche Werte:\n') fh.write('\n') for index, v in enumerate(validlist): desc = get_doc_description( func_param_yaml[par], language, key='valid_list_description', index=index) if desc != '': desc = ' |_| - |_| ' + desc fh.write(' - ' + bold(str(v)) + desc + '\n') fh.write('\n') fh.write('\n') if os.path.isfile(plg['name'] + '/README.md'): fh.write( '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt. Für den Fall, dass diese Seite nicht alle benötigten Informationen enthält, bitte auf die englischsprachige :doc:`README Datei <../../plugins/' + plgname + '/README>` des Plugins zugreifen.\n') else: fh.write( '.. [#f1] Diese Seite wurde aus den Metadaten des Plugins erzeugt.\n' ) fh.close() return