95 lines
2.8 KiB
Python
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)
|