Пример #1
0
    def test_read_installed__internet_not_available(self, read_installed: Mock):
        result = self.controller.read_installed(disk_loader=None, pkg_types=None, internet_available=False)
        read_installed.assert_called_once()

        self.assertIsNone(result.new)

        expected = [DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1', latest_version='2.34.1-0distro0.20.04.1',
                                  maintainer='Distro Developers', update=False, installed=True,
                                  description='JavaScript engine library from WebKitGTK - GObject introspection data'),
                    DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2', latest_version='2:1.20.13-1distro1~20.04.2',
                                  maintainer='Distro X-SWAT', update=False, installed=True,
                                  description='Xwayland X server')
                    ]

        self.assertEqual(expected, result.installed)
Пример #2
0
    def test_search__returned_packages_should_be_associated_with_apps_if_appliable(self, search: Mock):
        app = DebianApplication(name='myapp', exe_path='myapp', icon_path='myapp',
                                                                  categories=('app',))
        self.controller._apps_index = {'myapp': app}

        words = 'test'
        res = self.controller.search(words=words, disk_loader=None, limit=-1, is_url=False)
        search.assert_called_once_with(words)

        self.assertEqual([DebianPackage(name='xpto', version='1.0', latest_version='1.0', installed=True, update=False, description=''),
                          DebianPackage(name='myapp', version='1.0', latest_version='1.0', installed=True, update=False,
                                        description='', app=app)
                          ], res.installed)

        self.assertEqual([DebianPackage(name='test', version='1.0', latest_version='1.0', installed=False, update=False, description='')],
                         res.new)
Пример #3
0
    def revert_ignored_update(self, pkg: DebianPackage):
        ignored_packages = set()
        self._fill_ignored_updates(ignored_packages)

        if pkg.name in ignored_packages:
            pkg.updates_ignored = False
            ignored_packages.remove(pkg.name)
            self._write_ignored_updates(ignored_packages)
Пример #4
0
    def ignore_update(self, pkg: DebianPackage):
        ignored_packages = set()
        self._fill_ignored_updates(ignored_packages)

        if pkg.name not in ignored_packages:
            pkg.updates_ignored = True
            ignored_packages.add(pkg.name)
            self._write_ignored_updates(ignored_packages)
Пример #5
0
    def test_read_installed__must_associated_packages_found_to_applications_if_appliable(self, read_installed: Mock):
        app = DebianApplication(name='xwayland', exe_path='xwayland', icon_path='xwayland', categories=('app',))

        self.controller.__apps_index = {'xwayland': app}

        result = self.controller.read_installed(disk_loader=None, pkg_types=None, internet_available=False)
        read_installed.assert_called_once()

        self.assertIsNone(result.new)

        expected = [DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1', latest_version='2.34.1-0distro0.20.04.1',
                                  maintainer='Distro Developers', update=False, installed=True,
                                  description='JavaScript engine library from WebKitGTK - GObject introspection data'),
                    DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2', latest_version='2:1.20.13-1distro1~20.04.2',
                                  maintainer='Distro X-SWAT', update=False, installed=True,
                                  description='Xwayland X server', app=app)
                    ]

        self.assertEqual(expected, result.installed)
Пример #6
0
    def test_search__must_return_installed_and_not_installed_packages_with_updates(
            self, execute: Mock):
        query = 'gimp'
        res = [p for p in self.aptitude.search(query=query)]

        execute.assert_called_once_with(
            f"aptitude search {query} -q -F '%p^%v^%V^%m^%s^%d' --disable-columns",
            shell=True)

        exp = [
            DebianPackage(
                name='gimp-cbmplugs',
                version='1.2.2-1build1',
                latest_version='1.2.2-1build1',
                maintainer='Distro Developers',
                description=
                'plugins for The GIMP to import/export Commodore 64 files',
                categories=('graphics', ),
                installed=False,
                update=False),
            DebianPackage(
                name='gimp-gmic',
                version='2.4.5-1.0',
                latest_version='2.4.5-1.1',
                maintainer='Distro Developers',
                description="GREYC's Magic for Image Computing - GIMP Plugin",
                categories=('plugin', ),
                installed=True,
                update=True),
            DebianPackage(name='gimp-gutenprint',
                          version='5.3.3-4',
                          latest_version='5.3.3-4',
                          maintainer='Distro Developers',
                          description="print plugin for the GIMP",
                          categories=('plugin', ),
                          installed=True,
                          update=False),
        ]

        self.assertEqual([p.__dict__ for p in exp], [p.__dict__ for p in res])
Пример #7
0
    def map_transaction_output(self, output: str) -> DebianTransaction:
        to_install, to_upgrade, to_remove = None, None, None
        current_collection = None

        for line in output.split('\n'):
            if line.startswith(
                    'The following NEW packages will be installed:'):
                to_install = set()
                current_collection = to_install
            elif line.startswith('The following packages will be upgraded:'):
                to_upgrade = set()
                current_collection = to_upgrade
            elif line.startswith('The following packages will be REMOVED:'):
                to_remove = set()
                current_collection = to_remove
            elif line.startswith('Would download/install/remove packages'):
                break
            elif current_collection is not None and line.startswith(' '):
                for n, _, v, __, lv, ___, size in self.re_transaction_pkg.findall(
                        line):
                    pkg = DebianPackage(name=n,
                                        version=v,
                                        latest_version=lv if lv else v,
                                        transaction_size=0)

                    if size:
                        size_split = size.strip().split(' ')
                        unit = size_split[1][0].upper(
                        ) if len(size_split) >= 2 else 'B'
                        pkg.transaction_size = size_to_byte(
                            size_split[0], unit, self._log)

                    current_collection.add(pkg)

        return DebianTransaction(
            to_install=tuple(to_install) if to_install else tuple(),
            to_remove=tuple(to_remove) if to_remove else tuple(),
            to_upgrade=tuple(to_upgrade) if to_upgrade else tuple())
Пример #8
0
    def test_read_installed__with_updates_available(self, execute: Mock):
        returned = [p for p in self.aptitude.read_installed()]
        execute.assert_called_once()

        expected = [
            DebianPackage(
                name='gir1.2-javascriptcoregtk-4.0',
                version='2.34.1-0distro0.20.04.1',
                latest_version='2.34.4-0distro0.20.04.1',
                maintainer='Distro Developers',
                update=True,
                installed=True,
                categories=('library', ),
                description=
                'JavaScript engine library from WebKitGTK - GObject introspection data'
            ),
            DebianPackage(
                name='gir1.2-nm-1.0',
                version='1.22.10-1distro2.2',
                latest_version='1.22.10-1distro2.3',
                maintainer='Distro Developers',
                update=True,
                installed=True,
                categories=('library', ),
                description='GObject introspection data for the libnm library'
            ),
            DebianPackage(name='xwayland',
                          version='2:1.20.13-1distro1~20.04.2',
                          latest_version='2:1.20.13-1distro1~20.04.2',
                          maintainer='Distro X-SWAT',
                          update=False,
                          installed=True,
                          categories=('X11', ),
                          description='Xwayland X server')
        ]

        self.assertEqual([p.__dict__ for p in expected],
                         [p.__dict__ for p in returned])
Пример #9
0
    def search(
            self,
            query: str,
            fill_size: bool = False) -> Generator[DebianPackage, None, None]:
        attrs = f"%p^%v^%V^%m^%s^{'%I^' if fill_size else ''}%d"
        _, output = system.execute(
            f"aptitude search {query} -q -F '{attrs}' --disable-columns",
            shell=True)

        if output:
            no_attrs = 7 if fill_size else 6

            for line in output.split('\n'):
                line_split = line.strip().split('^', maxsplit=no_attrs - 1)

                if len(line_split) == no_attrs:
                    latest_version = line_split[2] if not self.re_none.match(
                        line_split[2]) else None

                    size = None

                    if fill_size:
                        size_split = line_split[no_attrs - 2].split(' ')
                        unit = size_split[1][0].upper(
                        ) if len(size_split) >= 2 else 'B'
                        size = size_to_byte(size_split[0], unit, self._log)

                    if latest_version is not None:
                        installed_version = line_split[
                            1] if not self.re_none.match(
                                line_split[1]) else None
                        section = strip_section(line_split[4])

                        yield DebianPackage(
                            name=line_split[0],
                            version=installed_version
                            if installed_version else latest_version,
                            latest_version=latest_version,
                            installed=bool(installed_version),
                            update=installed_version is not None
                            and installed_version != latest_version,
                            maintainer=strip_maintainer_email(line_split[3]),
                            categories=(section, ) if section else None,
                            uncompressed_size=size,
                            description=line_split[no_attrs - 1])
Пример #10
0
class DebianPackageManagerTest(TestCase):

    def setUp(self):
        self.controller = DebianPackageManager(MagicMock())
        self.controller._apps_index = {}

    @patch(f'{__app_name__}.gems.debian.controller.Aptitude.read_installed', return_value=iter((
            DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1',
                          latest_version='2.34.1-0distro0.20.04.1',
                          maintainer='Distro Developers', update=False, installed=True,
                          description='JavaScript engine library from WebKitGTK - GObject introspection data'),
            DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2',
                          latest_version='2:1.20.13-1distro1~20.04.2',
                          maintainer='Distro X-SWAT', update=False, installed=True,
                          description='Xwayland X server')
    )))
    def test_read_installed__must_associated_packages_found_to_applications_if_appliable(self, read_installed: Mock):
        app = DebianApplication(name='xwayland', exe_path='xwayland', icon_path='xwayland', categories=('app',))

        self.controller.__apps_index = {'xwayland': app}

        result = self.controller.read_installed(disk_loader=None, pkg_types=None, internet_available=False)
        read_installed.assert_called_once()

        self.assertIsNone(result.new)

        expected = [DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1', latest_version='2.34.1-0distro0.20.04.1',
                                  maintainer='Distro Developers', update=False, installed=True,
                                  description='JavaScript engine library from WebKitGTK - GObject introspection data'),
                    DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2', latest_version='2:1.20.13-1distro1~20.04.2',
                                  maintainer='Distro X-SWAT', update=False, installed=True,
                                  description='Xwayland X server', app=app)
                    ]

        self.assertEqual(expected, result.installed)

    @patch(f'{__app_name__}.gems.debian.controller.Aptitude.read_installed', return_value=iter((
            DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1',
                          latest_version='2.34.1-0distro0.20.04.1',
                          maintainer='Distro Developers', update=False, installed=True,
                          description='JavaScript engine library from WebKitGTK - GObject introspection data'),
            DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2',
                          latest_version='2:1.20.13-1distro1~20.04.2',
                          maintainer='Distro X-SWAT', update=False, installed=True,
                          description='Xwayland X server')
    )))
    def test_read_installed__internet_not_available(self, read_installed: Mock):
        result = self.controller.read_installed(disk_loader=None, pkg_types=None, internet_available=False)
        read_installed.assert_called_once()

        self.assertIsNone(result.new)

        expected = [DebianPackage(name='gir1.2-javascriptcoregtk-4.0', version='2.34.1-0distro0.20.04.1', latest_version='2.34.1-0distro0.20.04.1',
                                  maintainer='Distro Developers', update=False, installed=True,
                                  description='JavaScript engine library from WebKitGTK - GObject introspection data'),
                    DebianPackage(name='xwayland', version='2:1.20.13-1distro1~20.04.2', latest_version='2:1.20.13-1distro1~20.04.2',
                                  maintainer='Distro X-SWAT', update=False, installed=True,
                                  description='Xwayland X server')
                    ]

        self.assertEqual(expected, result.installed)

    @patch(f'{__app_name__}.gems.debian.controller.Aptitude.read_installed')
    def test_search__must_return_empty_result_when_url(self, read_installed: Mock):
        words = 'i'
        res = self.controller.search(words=words, disk_loader=None, limit=-1, is_url=True)
        read_installed.assert_not_called()
        self.assertEqual(SearchResult.empty(), res)

    @patch(f'{__app_name__}.gems.debian.controller.Aptitude.search', return_value=iter((
        DebianPackage(name='xpto', version='1.0', latest_version='1.0', installed=True, update=False, description=''),
        DebianPackage(name='test', version='1.0', latest_version='1.0', installed=False, update=False, description=''),
        DebianPackage(name='myapp', version='1.0', latest_version='1.0', installed=True, update=False, description=''),
    )))
    def test_search__returned_packages_should_be_associated_with_apps_if_appliable(self, search: Mock):
        app = DebianApplication(name='myapp', exe_path='myapp', icon_path='myapp',
                                                                  categories=('app',))
        self.controller._apps_index = {'myapp': app}

        words = 'test'
        res = self.controller.search(words=words, disk_loader=None, limit=-1, is_url=False)
        search.assert_called_once_with(words)

        self.assertEqual([DebianPackage(name='xpto', version='1.0', latest_version='1.0', installed=True, update=False, description=''),
                          DebianPackage(name='myapp', version='1.0', latest_version='1.0', installed=True, update=False,
                                        description='', app=app)
                          ], res.installed)

        self.assertEqual([DebianPackage(name='test', version='1.0', latest_version='1.0', installed=False, update=False, description='')],
                         res.new)