home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / var / lib / python-support / python2.4 / xdg / IniFile.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  10.2 KB  |  440 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''
  5. Base Class for DesktopEntry, IconTheme and IconData
  6. '''
  7. import re
  8. import os.path as os
  9. import codecs
  10. from Exceptions import *
  11. import xdg.Locale as xdg
  12. import gettext
  13.  
  14. class IniFile:
  15.     defaultGroup = ''
  16.     fileExtension = ''
  17.     filename = ''
  18.     gettext_domain = None
  19.     tainted = False
  20.     
  21.     def __init__(self, filename = None):
  22.         self.content = dict()
  23.         if filename:
  24.             self.parse(filename)
  25.         
  26.  
  27.     
  28.     def parse(self, filename, headers):
  29.         content = self.content
  30.         if not os.path.isfile(filename):
  31.             raise ParsingError('File not found', filename)
  32.         
  33.         
  34.         try:
  35.             file(filename, 'r')
  36.         except IOError:
  37.             return None
  38.  
  39.         for line in file(filename, 'r'):
  40.             line = line.strip()
  41.             if not line:
  42.                 continue
  43.                 continue
  44.             if line[0] == '#':
  45.                 continue
  46.                 continue
  47.             if line[0] == '[':
  48.                 currentGroup = line.lstrip('[').rstrip(']')
  49.                 if debug and self.hasGroup(currentGroup):
  50.                     raise DuplicateGroupError(currentGroup, filename)
  51.                 else:
  52.                     content[currentGroup] = { }
  53.             self.hasGroup(currentGroup)
  54.             index = line.find('=')
  55.             key = line[0:index].strip()
  56.             value = line[index + 1:].strip()
  57.             
  58.             try:
  59.                 if debug and self.hasKey(key, currentGroup):
  60.                     raise DuplicateKeyError(key, currentGroup, filename)
  61.                 else:
  62.                     content[currentGroup][key] = value
  63.             continue
  64.             except (IndexError, UnboundLocalError):
  65.                 raise ParsingError('[%s]-Header missing' % headers[0], filename)
  66.                 continue
  67.             
  68.  
  69.         
  70.         self.filename = filename
  71.         self.tainted = False
  72.         for header in headers:
  73.             if content.has_key(header):
  74.                 self.defaultGroup = header
  75.                 break
  76.                 continue
  77.             None<EXCEPTION MATCH>(IndexError, UnboundLocalError)
  78.         else:
  79.             raise ParsingError('[%s]-Header missing' % headers[0], filename)
  80.         self.gettext_domain = self.get('X-Ubuntu-Gettext-Domain', 'Desktop Entry')
  81.  
  82.     
  83.     def get(self, key, group = None, locale = False, type = 'string', list = False):
  84.         if not group:
  85.             group = self.defaultGroup
  86.         
  87.         if self.content.has_key(group) and self.content[group].has_key(key):
  88.             if locale:
  89.                 value = None
  90.                 if self.gettext_domain:
  91.                     
  92.                     try:
  93.                         value = gettext.dgettext(self.gettext_domain, self.content[group][key])
  94.  
  95.                 
  96.                 if not value or value == self.content[group][key]:
  97.                     value = self.content[group][self._IniFile__addLocale(key, group)]
  98.                 
  99.             else:
  100.                 value = self.content[group][key]
  101.         elif debug:
  102.             if not self.content.has_key(group):
  103.                 raise NoGroupError(group, self.filename)
  104.             elif not self.content[group].has_key(key):
  105.                 raise NoKeyError(key, group, self.filename)
  106.             
  107.         else:
  108.             value = ''
  109.         if list == True:
  110.             values = self.getList(value)
  111.             result = []
  112.         else:
  113.             values = [
  114.                 value]
  115.         for value in values:
  116.             if type == 'string' and locale == True:
  117.                 value = value.decode('utf-8', 'ignore')
  118.             elif type == 'boolean':
  119.                 value = self._IniFile__getBoolean(value)
  120.             elif type == 'integer':
  121.                 
  122.                 try:
  123.                     value = int(value)
  124.                 except ValueError:
  125.                     value = 0
  126.                 except:
  127.                     None<EXCEPTION MATCH>ValueError
  128.                 
  129.  
  130.             None<EXCEPTION MATCH>ValueError
  131.             if type == 'numeric':
  132.                 
  133.                 try:
  134.                     value = float(value)
  135.                 except ValueError:
  136.                     value = 0.0
  137.                 except:
  138.                     None<EXCEPTION MATCH>ValueError
  139.                 
  140.  
  141.             None<EXCEPTION MATCH>ValueError
  142.             if type == 'regex':
  143.                 value = re.compile(value)
  144.             elif type == 'point':
  145.                 value = value.split(',')
  146.             
  147.             if list == True:
  148.                 result.append(value)
  149.                 continue
  150.             result = value
  151.         
  152.         return result
  153.  
  154.     
  155.     def getList(self, string):
  156.         if re.search('(?<!\\\\)\\;', string):
  157.             list = re.split('(?<!\\\\);', string)
  158.         elif re.search('(?<!\\\\)\\|', string):
  159.             list = re.split('(?<!\\\\)\\|', string)
  160.         elif re.search('(?<!\\\\),', string):
  161.             list = re.split('(?<!\\\\),', string)
  162.         else:
  163.             list = [
  164.                 string]
  165.         if list[-1] == '':
  166.             list.pop()
  167.         
  168.         return list
  169.  
  170.     
  171.     def __getBoolean(self, boolean):
  172.         if boolean == 1 and boolean == 'true' or boolean == 'True':
  173.             return True
  174.         elif boolean == 0 and boolean == 'false' or boolean == 'False':
  175.             return False
  176.         
  177.         return False
  178.  
  179.     
  180.     def __addLocale(self, key, group = None):
  181.         '''add locale to key according the current lc_messages'''
  182.         if not group:
  183.             group = self.defaultGroup
  184.         
  185.         for lang in xdg.Locale.langs:
  186.             if self.content[group].has_key(key + '[' + lang + ']'):
  187.                 return key + '[' + lang + ']'
  188.                 continue
  189.         
  190.         return key
  191.  
  192.     
  193.     def validate(self, report = 'All'):
  194.         '''validate ... report = All / Warnings / Errors'''
  195.         self.warnings = []
  196.         self.errors = []
  197.         self.fileExtension = os.path.splitext(self.filename)[1]
  198.         self.checkExtras()
  199.         for group in self.content:
  200.             self.checkGroup(group)
  201.             for key in self.content[group]:
  202.                 self.checkKey(key, self.content[group][key], group)
  203.                 if self.content[group][key] == '':
  204.                     self.warnings.append("Value of Key '%s' is empty" % key)
  205.                     continue
  206.             
  207.         
  208.         msg = ''
  209.         if report == 'All' or report == 'Warnings':
  210.             for line in self.warnings:
  211.                 msg += '\n- ' + line
  212.             
  213.         
  214.         if report == 'All' or report == 'Errors':
  215.             for line in self.errors:
  216.                 msg += '\n- ' + line
  217.             
  218.         
  219.         if msg:
  220.             raise ValidationError(msg, self.filename)
  221.         
  222.  
  223.     
  224.     def checkGroup(self, group):
  225.         pass
  226.  
  227.     
  228.     def checkKey(self, key, value, group):
  229.         pass
  230.  
  231.     
  232.     def checkValue(self, key, value, type = 'string', list = False):
  233.         if list == True:
  234.             values = self.getList(value)
  235.         else:
  236.             values = [
  237.                 value]
  238.         for value in values:
  239.             if type == 'string':
  240.                 code = self.checkString(value)
  241.             elif type == 'boolean':
  242.                 code = self.checkBoolean(value)
  243.             elif type == 'number':
  244.                 code = self.checkNumber(value)
  245.             elif type == 'integer':
  246.                 code = self.checkInteger(value)
  247.             elif type == 'regex':
  248.                 code = self.checkRegex(value)
  249.             elif type == 'point':
  250.                 code = self.checkPoint(value)
  251.             
  252.             if code == 1:
  253.                 self.errors.append("'%s' is not a valid %s" % (value, type))
  254.                 continue
  255.             if code == 2:
  256.                 self.warnings.append("Value of key '%s' is deprecated" % key)
  257.                 continue
  258.         
  259.  
  260.     
  261.     def checkExtras(self):
  262.         pass
  263.  
  264.     
  265.     def checkBoolean(self, value):
  266.         if value == '1' or value == '0':
  267.             return 2
  268.         elif not value == 'true' or value == 'false':
  269.             return 1
  270.         
  271.  
  272.     
  273.     def checkNumber(self, value):
  274.         
  275.         try:
  276.             float(value)
  277.         except:
  278.             return 1
  279.  
  280.  
  281.     
  282.     def checkInteger(self, value):
  283.         
  284.         try:
  285.             int(value)
  286.         except:
  287.             return 1
  288.  
  289.  
  290.     
  291.     def checkPoint(self, value):
  292.         if not re.match('^[0-9]+,[0-9]+$', value):
  293.             return 1
  294.         
  295.  
  296.     
  297.     def checkString(self, value):
  298.         if not value.decode('utf-8', 'ignore').encode('ascii', 'ignore') == value:
  299.             return 1
  300.         
  301.  
  302.     
  303.     def checkRegex(self, value):
  304.         
  305.         try:
  306.             re.compile(value)
  307.         except:
  308.             return 1
  309.  
  310.  
  311.     
  312.     def write(self, filename = None):
  313.         if not filename and not (self.filename):
  314.             raise ParsingError('File not found', '')
  315.         
  316.         if filename:
  317.             self.filename = filename
  318.         else:
  319.             filename = self.filename
  320.         if not os.path.isdir(os.path.dirname(filename)):
  321.             os.makedirs(os.path.dirname(filename))
  322.         
  323.         fp = codecs.open(filename, 'w')
  324.         if self.defaultGroup:
  325.             fp.write('[%s]\n' % self.defaultGroup)
  326.             for key, value in self.content[self.defaultGroup].items():
  327.                 fp.write('%s=%s\n' % (key, value))
  328.             
  329.             fp.write('\n')
  330.         
  331.         for name, group in self.content.items():
  332.             if name != self.defaultGroup:
  333.                 fp.write('[%s]\n' % name)
  334.                 for key, value in group.items():
  335.                     fp.write('%s=%s\n' % (key, value))
  336.                 
  337.                 fp.write('\n')
  338.                 continue
  339.         
  340.         self.tainted = False
  341.  
  342.     
  343.     def set(self, key, value, group = None, locale = False):
  344.         if not group:
  345.             group = self.defaultGroup
  346.         
  347.         if locale == True and len(xdg.Locale.langs) > 0:
  348.             key = key + '[' + xdg.Locale.langs[0] + ']'
  349.         
  350.         
  351.         try:
  352.             if isinstance(value, unicode):
  353.                 self.content[group][key] = value.encode('utf-8', 'ignore')
  354.             else:
  355.                 self.content[group][key] = value
  356.         except KeyError:
  357.             raise NoGroupError(group, self.filename)
  358.  
  359.         self.tainted = value == self.get(key, group)
  360.  
  361.     
  362.     def addGroup(self, group):
  363.         if self.hasGroup(group):
  364.             if debug:
  365.                 raise DuplicateGroupError(group, self.filename)
  366.             
  367.         else:
  368.             self.content[group] = { }
  369.             self.tainted = True
  370.  
  371.     
  372.     def removeGroup(self, group):
  373.         existed = group in self.content
  374.         if existed:
  375.             del self.content[group]
  376.             self.tainted = True
  377.         elif debug:
  378.             raise NoGroupError(group, self.filename)
  379.         
  380.         return existed
  381.  
  382.     
  383.     def removeKey(self, key, group = None, locales = True):
  384.         if not group:
  385.             group = self.defaultGroup
  386.         
  387.         
  388.         try:
  389.             if locales:
  390.                 for name, value in self.content[group].items():
  391.                     if re.match('^' + key + xdg.Locale.regex + '$', name) and name != key:
  392.                         value = self.content[group][name]
  393.                         del self.content[group][name]
  394.                         continue
  395.                 
  396.             
  397.             value = self.content[group][key]
  398.             del self.content[group][key]
  399.             self.tainted = True
  400.             return value
  401.         except KeyError:
  402.             e = None
  403.             if debug:
  404.                 if e == group:
  405.                     raise NoGroupError(group, self.filename)
  406.                 else:
  407.                     raise NoKeyError(key, group, self.filename)
  408.             else:
  409.                 return ''
  410.         except:
  411.             debug
  412.  
  413.  
  414.     
  415.     def groups(self):
  416.         return self.content.keys()
  417.  
  418.     
  419.     def hasGroup(self, group):
  420.         if self.content.has_key(group):
  421.             return True
  422.         else:
  423.             return False
  424.  
  425.     
  426.     def hasKey(self, key, group = None):
  427.         if not group:
  428.             group = self.defaultGroup
  429.         
  430.         if self.content[group].has_key(key):
  431.             return True
  432.         else:
  433.             return False
  434.  
  435.     
  436.     def getFileName(self):
  437.         return self.filename
  438.  
  439.  
  440.