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)
Beispiel #4
0
    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)