# Copyright (C) 2018 Avatao.com Innovative Learning Kft. # All Rights Reserved. See LICENSE file for details. from shlex import split from re import search from tfw.decorators.lazy_property import lazy_property class CommandsEqual: def __init__(self, command_1, command_2, fuzzyness=1, must_begin_similarly=True, must_contain_patterns=None): self.command_1 = split(command_1) self.command_2 = split(command_2) self.fuzzyness = fuzzyness self.must_begin_similarly = must_begin_similarly self.must_contain_patterns = must_contain_patterns def __bool__(self): if self.must_begin_similarly and not self.beginnings_are_equal: return False if self.must_contain_patterns is not None and not self.commands_contain_necessary_parts: return False return self.similarity >= self.fuzzyness @lazy_property def beginnings_are_equal(self): return self.command_1[0] == self.command_2[0] @lazy_property def commands_contain_necessary_parts(self): return all(( self.contains_neccessary_parts(self.command_1), self.contains_neccessary_parts(self.command_2) )) def contains_neccessary_parts(self, command): command = ' '.join(command) for pattern in self.must_contain_patterns: if not search(pattern, command): return False return True @lazy_property def similarity(self): parts_1 = set(self.command_1) parts_2 = set(self.command_2) difference = parts_1 - parts_2 deviance = len(difference) / len(max(parts_1, parts_2)) return 1 - deviance