home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / xdg / IniFile.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  11.1 KB  |  428 lines

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