UTop/src/core/desktop_parsing/DesktopParser.py

95 lines
2.8 KiB
Python

# Python imports
import os
# Lib imports
# Application imports
class DesktopParser:
DESKTOP_SECTION = '[Desktop Entry]'
__property_list = None
def __init__(self, filename):
self.__property_list = []
self.set_filename(filename)
self.read()
super(DesktopParser, self).__init__()
def set_filename(self, filename):
self._filename = filename
def read(self):
"""
Read [Desktop Entry] section and save key=values pairs to __property_list
"""
with open(self._filename, 'r') as f:
is_desktop_section = False
for line in f.readlines():
line = line.strip(' ' + os.linesep)
if line == self.DESKTOP_SECTION:
is_desktop_section = True
continue
if line.startswith('['):
# another section begins
is_desktop_section = False
continue
if is_desktop_section and '=' in line:
(key, value) = line.split('=', 1)
self.set(key.strip(), value.strip())
def write(self):
"""
Write properties to the file...
"""
dir = os.path.dirname(self._filename)
if not os.path.exists(dir):
os.makedirs(dir)
with open(self._filename, 'w') as f:
f.write(os.linesep.join((self.DESKTOP_SECTION, os.linesep.join(['='.join((str(k), str(v).strip()))
for k, v in self.__property_list]))))
def get(self, name):
"""
Raises KeyError if name is not found
"""
for key, value in self.__property_list:
if key.lower() == name.lower():
return value
raise KeyError('%s' % name)
def set(self, name, value):
if not name:
raise ValueError("Invalid value for name: '%s'" % name)
for i, (key, _) in enumerate(self.__property_list):
if key.lower() == name.lower():
self.__property_list[i] = (key, value)
return
self.__property_list.append((name, value))
def get_boolean(self, name):
"""
Returns True if value is "1", "yes", "true", or "on"
Returns False if value is "0", "no", "false", or "off"
String values are checked in a case-insensitive manner.
Any other value will cause it to raise ValueError.
"""
value = self.get(name).lower()
if value in ("1", "yes", "true", "on"):
return True
if value in ("0", "no", "false", "off"):
return False
raise ValueError("Cannot coerce '%s' to boolean" % value)