Source code for thoth.adviser.predictors.package_combinations

#!/usr/bin/env python3
# thoth-adviser
# Copyright(C) 2020 - 2021 Fridolin Pokorny
#
# This program is free software: you can redistribute it and / or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

"""Implementation of a predictor used for generating combinations of packages faster."""

from typing import Tuple
from typing import Set
import logging

import attr

from ..predictor import Predictor
from ..state import State

_LOGGER = logging.getLogger(__name__)


[docs]@attr.s(slots=True) class PackageCombinations(Predictor): """A predictor used for generating combinations of packages faster.""" package_combinations = attr.ib(type=Set[str], default=attr.Factory(set), kw_only=True, converter=set)
[docs] def pre_run(self) -> None: """Check attributes set up.""" if not self.package_combinations: raise ValueError("No package combinations supplied to the predictor")
[docs] def run(self) -> Tuple[State, Tuple[str, str, str]]: """Run the predictor.""" state = self.context.beam.get_last() if state is None: state = self.context.beam.get_random() # Expand while we do not have just all the package combinations to generate. for unresolved_dependency in state.unresolved_dependencies.keys(): if unresolved_dependency not in self.package_combinations: return state, state.get_random_unresolved_dependency(unresolved_dependency) return state, state.get_random_unresolved_dependency()