def generate_empty_desktop_entry( cls, instance_name: str, ) -> None: new_dot_desktop = IniFile.IniFile() new_dot_desktop.addGroup('Desktop Entry') new_dot_desktop.set( key='Exec', value=f"bubblejail run {instance_name}", group='Desktop Entry' ) # Modify name new_dot_desktop.set( key="Name", group='Desktop Entry', value=f"{instance_name} bubble", ) # Add type new_dot_desktop.set( key='Type', group='Desktop Entry', value='Application', ) new_dot_desktop_path_str = str( cls.desktop_entries_dir_get() / f"bubble_{instance_name}.desktop") new_dot_desktop.write(filename=new_dot_desktop_path_str)
def test_modify(self): i = IniFile.IniFile() i.addGroup('foo') i.set('bar', u('wallöby'), group='foo') self.assertEqual(i.get('bar', group='foo'), u('wallöby')) self.assertEqual(list(i.groups()), ['foo']) i.removeKey('bar', group='foo') i.removeGroup('foo')
def test_value_types(self): i = IniFile.IniFile() i.addGroup('foo') i.defaultGroup = 'foo' # Numeric i.errors = [] i.set('num', '12.3') i.checkValue('num', '12.3', type='numeric') self.assertEqual(i.errors, []) i.checkValue('num', '12.a', type='numeric') self.assertEqual(len(i.errors), 1) self.assertEqual(i.get('num', type='numeric'), 12.3) # Regex i.errors = [] i.set('re', '[1-9]+') i.checkValue('re', '[1-9]+', type='regex') self.assertEqual(i.errors, []) i.checkValue('re', '[1-9+', type='regex') self.assertEqual(len(i.errors), 1) r = i.get('re', type='regex') assert r.match('123') # Point i.errors = [] i.set('pt', '3,12') i.checkValue('pt', '3,12', type='point') self.assertEqual(i.errors, []) i.checkValue('pt', '3,12,5', type='point') self.assertEqual(len(i.errors), 1) x, y = i.get('pt', type='point') # Boolean i.errors = [] i.warnings = [] i.set('boo', 'true') i.checkValue('boo', 'true', type='boolean') self.assertEqual(i.errors, []) i.checkValue('boo', '1', type='boolean') self.assertEqual(len(i.warnings), 1) self.assertEqual(i.errors, []) i.checkValue('boo', 'verily', type='boolean') self.assertEqual(len(i.errors), 1) boo = i.get('boo', type='boolean') assert boo is True, boo # Integer i.errors = [] i.set('int', '44') i.checkValue('int', '44', type='integer') self.assertEqual(i.errors, []) i.checkValue('int', 'A4', type='integer') self.assertEqual(len(i.errors), 1) self.assertEqual(i.get('int', type='integer'), 44)
def __init__(self, path: str): """Construct a UserConfigLoader.""" super(UserConfigLoader, self).__init__() self.ini = IniFile.IniFile() try: self.ini.parse(path) except (IniFile.ParsingError) as e: raise ValueError("Current user's config file could not be parsed.") else: vs = self.ini.get(key='Version', group='User Config', type='numeric') assert (vs == USERCFG_VERSION), ("Error: User config file version " "mismatch: expected %f, was %f" % (USERCFG_VERSION, vs or -1.0))
def overwrite_desktop_entry_for_profile( cls, instance_name: str, profile_object: Optional[BubblejailProfile] = None, profile_name: Optional[str] = None, desktop_entry_name: Optional[str] = None, new_name: Optional[str] = None, ) -> None: instance = cls.instance_get(instance_name) # Five ways to figure out desktop entry path if desktop_entry_name is not None: # 1. Desktop entry path was passed. # 2. Desktop entry name was passed dot_desktop_path = cls.desktop_entry_name_to_path( desktop_entry_name) elif profile_object is not None: # 3. Profile was passed directly profile = profile_object dot_desktop_path = profile.dot_desktop_path elif profile_name is not None: # 4. Profile name was passed profile = cls.profile_get(profile_name) dot_desktop_path = profile.dot_desktop_path elif instance.metadata_creation_profile_name is not None: # 5. Use the profile name saved in meta data profile = cls.profile_get(instance.metadata_creation_profile_name) dot_desktop_path = profile.dot_desktop_path else: raise RuntimeError('No profile or desktop entry specified') if dot_desktop_path is None: raise TypeError('Desktop entry path can\'t be None.', dot_desktop_path) new_dot_desktop = IniFile.IniFile(filename=str(dot_desktop_path)) for group_name in new_dot_desktop.groups(): # Modify Exec old_exec = new_dot_desktop.get(key='Exec', group=group_name) if not old_exec: continue new_dot_desktop.set(key='Exec', value=(f"bubblejail run {instance_name} " f"{' '.join(old_exec.split())}"), group=group_name) # Modify name new_dot_desktop.set( key="Name", group='Desktop Entry', value=f"{instance_name} bubble", ) # Three ways to resolve what file to write to new_dot_desktop_path = (cls.desktop_entries_dir_get() / dot_desktop_path.name) if not new_dot_desktop_path.exists(): # 1. If the entry under same name as the one # we are overwriting does not exist use the same name # and write meta data instance.metadata_desktop_entry_name = dot_desktop_path.name elif instance.metadata_desktop_entry_name == dot_desktop_path.name: # 2. If the instance already occupies the same name # keep the name ... else: # 3. Use the generic name new_dot_desktop_path = (cls.desktop_entries_dir_get() / f"bubble_{instance_name}.desktop") new_dot_desktop.write(filename=new_dot_desktop_path) # Update desktop MIME database # Requires `update-desktop-database` binary # Arch package desktop-file-utils print('Updating desktop MIME database') try: subprocess_run(args=('/usr/bin/update-desktop-database', str(cls.desktop_entries_dir_get()))) except FileNotFoundError: from warnings import warn warn(('Could not find update-desktop-database binary.' 'Do you have correct dependencies installed?'))
def test_check_string(self): i = IniFile.IniFile() self.assertEqual(i.checkString(u('abc')), 0) self.assertEqual(i.checkString('abc'), 0) self.assertEqual(i.checkString(u('abcö')), 1) self.assertEqual(i.checkString('abcö'), 1)