# Copyright 2016 OpenMarket Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Parent class for writing sections.""" import inspect import os class Sections(object): """A class which creates sections for each method starting with "render_". The key for the section is the text after "render_" e.g. "render_room_events" has the section key "room_events" """ def __init__(self, env, units, debug=False): self.env = env self.units = units self.debug = debug def log(self, text): if self.debug: print "batesian:sections: %s" % text def get_sections(self): render_list = inspect.getmembers(self, predicate=inspect.ismethod) section_dict = {} for (func_name, func) in render_list: if not func_name.startswith("render_"): continue section_key = func_name[len("render_"):] self.log("Generating section '%s'" % section_key) section = func() if isinstance(section, basestring): if section_key in section_dict: raise Exception( ("%s : Section %s already exists. It must have been " + "generated dynamically. Check which render_ methods " + "return a dict.") % (func_name, section_key) ) section_dict[section_key] = section self.log( " Generated. Snippet => %s" % section[:60].replace("\n","") ) elif isinstance(section, dict): self.log(" Generated multiple sections:") for (k, v) in section.iteritems(): if not isinstance(k, basestring) or not isinstance(v, basestring): raise Exception( ("Method %s returned multiple sections as a dict but " + "expected the dict elements to be strings but they aren't.") % (func_name, ) ) if k in section_dict: raise Exception( "%s tried to produce section %s which already exists." % (func_name, k) ) section_dict[k] = v self.log( " %s => %s" % (k, v[:60].replace("\n","")) ) else: raise Exception( "Section function '%s' didn't return a string/dict!" % func_name ) return section_dict