1  from inca.Reporter import Reporter 
  2   
  4    """Usage - Module for creating simple usage reports:: 
  5   
  6         from inca.UsageReporter import UsageReporter 
  7         reporter = new UsageReporter( 
  8           name = 'My Reporter', 
  9           version = 0.1, 
 10           description = 'What my reporter does', 
 11           url = 'http://some.where/' 
 12         ) 
 13   
 14       This module is a subclass of inca.Reporter that provides a simple schema 
 15       for reporting usage data.  The reporter will return the following body if 
 16       the reporter is successful:: 
 17   
 18         <usage> 
 19           <entry> 
 20             <type>type1</type> 
 21             <name>foo</name> 
 22             <statistics> 
 23               <statistic> 
 24                 <name>count</name> 
 25                 <value>9</value> 
 26               </statistic> 
 27             </statistics> 
 28           </entry> 
 29           <entry> 
 30   
 31           . 
 32           . 
 33           . 
 34   
 35         </usage> 
 36    """ 
 37   
 39      """Class constructor that returns a new Usage object.  The constructor 
 40         accepts the parameters supported by inca.Reporter. 
 41      """ 
 42      Reporter.__init__(self, **attributes) 
 43      self.entries = [] 
 44      self.addDependency('inca.UsageReporter'); 
  45   
 46 -  def addEntry(self, entry): 
  47      """This method is used to add an entry to the usage report.  It takes a 
 48         dict containing the type and name of the entry as well as a dict of 
 49         statistics.  For example:: 
 50   
 51           addEntry({ 
 52             'type' : 'foo', 
 53             'name' : 'bar', 
 54             'stats' : { 
 55               'count' : 1, 
 56               'blort' : 'baz' 
 57             } 
 58           }) 
 59   
 60         Will create an entry of type 'foo', with a name of 'bar' and two 
 61         statistics, count with a value of 1 and 'blort' with a value of 'baz'. 
 62      """ 
 63      self.entries.append(entry) 
  64   
 65 -  def fail(self, error_msg): 
  66      """This method is used to indicate that the reporter failed.  It takes a 
 67         single arguement which is the error message which will be returned. 
 68      """ 
 69      self.setResult(0, error_msg) 
  70   
 72      """Returns a list of all entries that have been added to the reporter.""" 
 73      return self.entries 
  74   
 75 -  def reportBody(self): 
  76      """Constructs the body and returns it.""" 
 77      xml = [] 
 78      for entry in self.entries: 
 79        xml.append(self.xmlElement('entry', 0, *self._reportEntry(entry))) 
 80      return self.xmlElement('usage', 0, *xml) 
  81   
 83      """This method is called to indicate that the reporter has succeeded.""" 
 84      self.setResult(1) 
  85   
 87      xml = [] 
 88      for stat in stats.keys(): 
 89        xml.append(self.xmlElement('statistic', 0, 
 90          self.xmlElement('name', 1, stat), 
 91          self.xmlElement('value', 1, stats[stat]) 
 92        )) 
 93      return xml 
  94   
 95 -  def _reportEntry(self, entry): 
  96      return [ 
 97        self.xmlElement('type', 1, entry['type']), 
 98        self.xmlElement('name', 1, entry['name']), 
 99        self.xmlElement('statistics', 0, *self._reportStatistics(entry['stats'])) 
100      ] 
  101