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)
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)
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)
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)
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)
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])
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())
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])
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])
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)