diff --git a/calculate/utils/package.py b/calculate/utils/package.py index bb72580..73df82f 100644 --- a/calculate/utils/package.py +++ b/calculate/utils/package.py @@ -493,6 +493,15 @@ class PackageAtomParser: self._atom_dictionary.clear() return atom_name_object + def is_package_exists(self, package_atom): + try: + self.parse_package_parameter(package_atom) + return True + except PackageAtomError as e: + if e.errno == NOTEXIST: + return False + raise + def _check_package_existance(self, package_atom=''): '''Метод для проверки существования пакета. Существование пакета определяется наличием соответствующего CONTENTS файла.''' diff --git a/calculate/vars/install/os/__init__.py b/calculate/vars/install/os/__init__.py index b977023..c2a8fa1 100644 --- a/calculate/vars/install/os/__init__.py +++ b/calculate/vars/install/os/__init__.py @@ -1,10 +1,40 @@ -import os from calculate.variables.datavars import Variable, Namespace, Dependence, \ - StringType, BooleanType, HashType, Calculate, Copy + StringType, BooleanType, HashType, ListType, Calculate, Copy from calculate.vars.main.os.func import get_arch_gentoo +from calculate.utils.package import PackageAtomParser + +def get_available_audio_system(): + audio_systems = ( + ('alsa', None), + ('pulseaudio', 'media-sound/pulseaudio') + ) + package_db = PackageAtomParser() + return [ + audio_system + for audio_system, pkg in audio_systems + if pkg is None or package_db.is_package_exists(pkg) + ] + +def get_audio_selected(available_systems, cmdline_audio): + available_systems = available_systems.value + + if 'pulseaudio' in available_systems: + cmdline_audio = cmdline_audio.value + if cmdline_audio and cmdline_audio == 'alsa': + return 'alsa' + else: + return 'pulseaudio' + return 'alsa' + with Namespace("arch"): Variable("machine", type=StringType, source=Copy("main.os.arch.machine")) Variable("gentoo", type=StringType, source=Calculate(get_arch_gentoo, ".machine")) + +with Namespace("audio"): + Variable("available", type=ListType, + source=Calculate(get_available_audio_system)) + Variable("selected", type=StringType, + source=Calculate(get_audio_selected, ".available", "main.cl.cmdline.calculate.audio")) diff --git a/calculate/vars/install/os/func.py b/calculate/vars/install/os/func.py new file mode 100644 index 0000000..362495e --- /dev/null +++ b/calculate/vars/install/os/func.py @@ -0,0 +1,24 @@ +from calculate.utils.package import PackageAtomParser + +def get_available_audio_system(): + audio_systems = ( + ('alsa', None), + ('pulseaudio', 'media-sound/pulseaudio') + ) + package_db = PackageAtomParser() + return [ + audio_system + for audio_system, pkg in audio_systems + if pkg is None or package_db.is_package_exists(pkg) + ] + +def get_audio_selected(available_systems, cmdline_audio): + available_systems = available_systems.value + + if 'pulseaudio' in available_systems: + cmdline_audio = cmdline_audio.value + if cmdline_audio and cmdline_audio == 'alsa': + return 'alsa' + else: + return 'pulseaudio' + return 'alsa' diff --git a/tests/vars/test_vars.py b/tests/vars/test_vars.py index 46e87e8..40b9043 100644 --- a/tests/vars/test_vars.py +++ b/tests/vars/test_vars.py @@ -1,7 +1,7 @@ import pytest -import calculate.vars.main.os.x11 as main_os_x11 -import calculate.vars.main.cl as main_cl import calculate.vars.main.os as main_os +import calculate.vars.main.cl as main_cl +import calculate.vars.main.os.x11 as main_os_x11 from calculate.vars.main.cl import CmdlineParams import mock from itertools import chain @@ -13,8 +13,7 @@ from itertools import chain "failed": True, "data": "", "result": "" - }, - { + }, { "name": "worked xdpyinfo", "failed": False, "data": open('tests/vars/xdpyinfo.output','r').read(), @@ -115,3 +114,48 @@ def test_main_os_get_arch_gentoo(case): def __init__(self, value): self.value = value assert main_os.get_arch_gentoo(Var(case["source"])) == case["result"] + + +import calculate.vars.install.os.func as install_os +@pytest.mark.parametrize('case', + [ + { + "name": "pulseaudio exists", + "exists": True, + "result": ["alsa","pulseaudio"] + }, + { + "name": "pulseaudio not exists", + "exists": False, + "result": ["alsa"] + }, + ], + ids=lambda x:x["name"]) +@pytest.mark.calculate_vars +def test_install_os_get_available_audio_system(case): + with mock.patch('calculate.vars.install.os.func.PackageAtomParser.is_package_exists') as exists: + exists.return_value = case["exists"] + assert install_os.get_available_audio_system() == case["result"] + +#def get_available_audio_system(): +# audio_systems = ( +# ('alsa', None), +# ('pulseaudio', 'media-sound/pulseaudio') +# ) +# package_db = PackageAtomParser() +# return [ +# audio_system +# for audio_system, pkg in audio_systems +# if pkg is None or package_db.is_package_exists(pkg) +# ] +# +#def get_audio_selected(available_systems, cmdline_audio): +# available_systems = available_systems.value +# +# if 'pulseaudio' in available_systems: +# cmdline_audio = cmdline_audio.value +# if cmdline_audio and cmdline_audio == 'alsa': +# return 'alsa' +# else: +# return 'pulseaudio' +# return 'alsa'