Dependencies comparing was fixed #48

master
Иванов Денис 3 years ago
parent 1777f224b5
commit a852377198

@ -176,10 +176,10 @@ class ScriptLauncher:
args_vars = []
for arg in args:
if arg not in current_script.variables:
if arg not in current_script._variables:
args_vars.append(VariableNode(arg, current_script))
else:
args_vars.append(current_script.variables[arg])
args_vars.append(current_script._variables[arg])
return current_script, args_vars
@staticmethod

@ -83,7 +83,7 @@ class Variables(MutableMapping):
return super().__getattribute__(name)
if name == 'available_packages':
return super().__getattribute__(name)
if name == 'variables':
if name == '_variables':
return self.__attrs
try:
return self.__attrs[name]
@ -166,7 +166,7 @@ class ParametersProcessor:
self._groups = {}
try:
groups = list(datavars_module.main.cl.groups.variables.keys())
groups = list(datavars_module.main.cl.groups._variables.keys())
for group in groups:
if isinstance(datavars_module, (Datavars, NamespaceNode)):
packages = datavars_module.main.cl.groups[group].get_value(
@ -1261,11 +1261,11 @@ class CalculateExtension(Extension):
variable_path = variable[1:-1]
for section in variable_path:
if section in current_container.namespaces:
current_container = current_container.namespaces[section]
elif (section in current_container.variables and current_container.
variables[section].variable_type is HashType):
current_container = current_container.variables[section]
if section in current_container._namespaces:
current_container = current_container._namespaces[section]
elif (section in current_container._variables and current_container.
_variables[section].variable_type is HashType):
current_container = current_container._variables[section]
if section != variable_path[-1]:
# Если обнаружен хэш, но в пути к переменной кроме ключа
# хэша есть еще что-то далее -- значит путь к переменной
@ -1290,7 +1290,7 @@ class CalculateExtension(Extension):
'''Метод для модификации значения переменной.'''
variable_name = variable[-1]
if variable_name in namespace.variables:
if variable_name in namespace._variables:
variable_node = namespace[variable_name]
if optype == self.ASSIGN:
variable_node.set(new_value)
@ -1310,7 +1310,7 @@ class CalculateExtension(Extension):
" namespace".format('.'.join(variable)))
if target:
if namespace.variables[variable_name].variable_type is HashType:
if namespace._variables[variable_name].variable_type is HashType:
for key, value in new_value.items():
self._save_to_target(variable, key, value, target)
else:

@ -966,7 +966,6 @@ class TemplateExecutor:
join_before=False, replace=False) -> None:
'''Метод описывающий действия при append = "join", если шаблон -- файл.
Объединяет шаблон с целевым файлом.'''
input_path = template_object.input_path
output_path = template_object.output_path
input_file_md5 = None
@ -2110,9 +2109,8 @@ class DirectoryProcessor:
if 'current_template' not in namespace:
if isinstance(self.datavars_module, (Datavars, NamespaceNode)):
variable = VariableNode('current_template', namespace,
variable_type=StringType,
source="")
VariableNode('current_template', namespace,
variable_type=StringType, source="")
else:
namespace['current_template'] = ""

@ -533,8 +533,11 @@ class DependenceSource:
if l_var != r_var:
return False
if not self._compare_depend_functions(self.depend_function,
other.depend_function):
if self.depend_function == other.depend_function:
return True
if (self.depend_function is None or other.depend_function is None
or not self._compare_depend_functions(self.depend_function,
other.depend_function)):
return False
return True
@ -677,6 +680,9 @@ class VariableNode:
# Если источники не совпадают или текущее значение переменной было
# установлено пользователем, то инвалидируем переменную и меняем
# источник.
if self.name == "machine":
print('self.source =', self.source)
print('source =', source)
if self._source != source or self.set_by_user:
self.set_by_user = False
self._invalidate()
@ -760,57 +766,57 @@ class NamespaceNode:
'''Класс ноды соответствующей пространству имен в дереве переменных.'''
def __init__(self, name='', parent=None):
self._name = name
self.variables = dict()
self.namespaces = dict()
self.parent = parent
self._variables = dict()
self._namespaces = dict()
self._parent = parent
def add_variable(self, variable: VariableNode) -> None:
'''Метод для добавления переменной в пространство имен.'''
if variable.name in self.namespaces:
if variable.name in self._namespaces:
raise VariableError("namespace with the name '{}' is already in"
" the namespace '{}'".format(
variable.name,
self.get_fullname()))
self.variables.update({variable.name: variable})
self._variables.update({variable.name: variable})
variable.namespace = self
def add_namespace(self, namespace) -> None:
'''Метод для добавления пространства имен в пространство имен.'''
if namespace._name in self.variables:
if namespace._name in self._variables:
raise VariableError("variable with the name '{}' is already in"
" the namespace '{}'".format(
namespace._name,
self.get_fullname()))
self.namespaces.update({namespace._name: namespace})
namespace.parent = self
self._namespaces.update({namespace._name: namespace})
namespace._parent = self
def clear(self):
'''Метод для очистки пространства имен. Очищает и пространства имен
и переменные. Предназначен только для использования в calculate.ini.'''
for namespace_name in self.namespaces.keys():
self.namespaces[namespace_name].clear()
self.variables.clear()
self.namespaces.clear()
for namespace_name in self._namespaces.keys():
self._namespaces[namespace_name].clear()
self._variables.clear()
self._namespaces.clear()
def get_fullname(self) -> str:
'''Метод для получения полного имени пространства имен.'''
if self.parent is not None and self.parent._name != '<root>':
return '{}.{}'.format(self.parent.get_fullname(), self._name)
if self._parent is not None and self._parent._name != '<root>':
return '{}.{}'.format(self._parent.get_fullname(), self._name)
else:
return self._name
def get_package_name(self) -> str:
if self.parent._name == '<root>':
if self._parent._name == '<root>':
return self._name
else:
return self.parent.get_package_name()
return self._parent.get_package_name()
def __getattr__(self, name: str):
'''Метод возвращает ноду пространства имен или значение переменной.'''
if name in self.namespaces:
return self.namespaces[name]
elif name in self.variables:
variable = self.variables[name]
if name in self._namespaces:
return self._namespaces[name]
elif name in self._variables:
variable = self._variables[name]
if variable.variable_type is TableType:
return variable.get_value().get_table()
return variable.get_value()
@ -824,10 +830,10 @@ class NamespaceNode:
def __getitem__(self, name: str) -> None:
'''Метод возвращает ноду пространства имен или ноду переменной.'''
if name in self.namespaces:
return self.namespaces[name]
elif name in self.variables:
return self.variables[name]
if name in self._namespaces:
return self._namespaces[name]
elif name in self._variables:
return self._variables[name]
else:
if self.get_package_name() == "custom":
return None
@ -837,7 +843,7 @@ class NamespaceNode:
namespace_name=self._name))
def __contains__(self, name):
return name in self.namespaces or name in self.variables
return name in self._namespaces or name in self._variables
def __repr__(self):
return '<Namespace: {}>'.format(self.get_fullname())
@ -880,7 +886,7 @@ class DependenceAPI(metaclass=Singleton):
namespace = current_namespace
for index in range(1, len(name_parts)):
if not name_parts[index]:
namespace = namespace.parent
namespace = namespace._parent
else:
name_parts = name_parts[index:]
break
@ -945,11 +951,17 @@ class VariableAPI(metaclass=Singleton):
def __call__(self, name: str, source=None, type=VariableType,
readonly=False, fixed=False, force=False):
'''Метод для создания переменных внутри with Namespace('name').'''
if name not in self.current_namespace.variables:
if name == "machine":
print("creating var...")
if name not in self.current_namespace._variables:
variable = VariableNode(name, self.current_namespace)
else:
variable = self.current_namespace[name]
if name == "machine":
print('using dependence')
if isinstance(source, DependenceSource):
try:
source.check()
@ -1021,11 +1033,11 @@ class NamespaceAPI(metaclass=Singleton):
@contextmanager
def __call__(self, namespace_name):
'''Метод для создания пространств имен с помощью with.'''
if namespace_name not in self.current_namespace.namespaces:
if namespace_name not in self.current_namespace._namespaces:
namespace = NamespaceNode(namespace_name,
parent=self.current_namespace)
else:
namespace = self.current_namespace.namespaces[namespace_name]
namespace = self.current_namespace._namespaces[namespace_name]
self.current_namespace.add_namespace(namespace)
self.current_namespace = namespace
@ -1039,7 +1051,7 @@ class NamespaceAPI(metaclass=Singleton):
try:
yield self
finally:
self.current_namespace = self.current_namespace.parent
self.current_namespace = self.current_namespace._parent
self._variables_fabric.current_namespace = self.current_namespace
self._dependence_fabric.current_namespace = self.current_namespace

@ -225,13 +225,13 @@ class NamespaceIniFiller:
self.current_namespace = None
return
elif isinstance(self.current_namespace, NamespaceNode):
if section not in self.current_namespace.namespaces:
if (section in self.current_namespace.variables and
if section not in self.current_namespace._namespaces:
if (section in self.current_namespace._variables and
self.current_namespace[section].variable_type
is HashType):
# Если секция является хэшем, используем ее.
self.current_namespace = self.current_namespace.\
variables[section]
_variables[section]
return
elif not self.modify_only:
self.current_namespace.add_namespace(
@ -245,7 +245,7 @@ class NamespaceIniFiller:
self.current_namespace = None
return
self.current_namespace = self.current_namespace.namespaces[section]
self.current_namespace = self.current_namespace._namespaces[section]
def clear_section(self, sections: list, lineno) -> None:
'''Метод для очистки пространства имен.'''
@ -265,12 +265,12 @@ class NamespaceIniFiller:
section))
return
elif isinstance(current_namespace, NamespaceNode):
if section in current_namespace.namespaces:
if section in current_namespace._namespaces:
current_namespace = current_namespace[section]
elif (section in current_namespace.variables and
current_namespace.variables[section].variable_type
elif (section in current_namespace._variables and
current_namespace._variables[section].variable_type
is TableType):
table_variable = current_namespace.variables[section]
table_variable = current_namespace._variables[section]
table_to_clear = table_variable.get_value()
table_to_clear.clear()
table_variable.source = table_to_clear
@ -298,7 +298,7 @@ class NamespaceIniFiller:
row_index = int(sections.pop())
table_name = sections.pop()
for section in sections:
if section not in self.current_namespace.namespaces:
if section not in self.current_namespace._namespaces:
if not self.modify_only:
self.current_namespace.add_namespace(
NamespaceNode(section))
@ -310,9 +310,9 @@ class NamespaceIniFiller:
table_name, section))
self.current_namespace = None
return
self.current_namespace = self.current_namespace.namespaces[section]
self.current_namespace = self.current_namespace._namespaces[section]
if table_name not in self.current_namespace.variables:
if table_name not in self.current_namespace._variables:
if not self.modify_only:
table_variable = VariableNode(table_name,
self.current_namespace,
@ -325,7 +325,7 @@ class NamespaceIniFiller:
get_fullname(),
table_name))
else:
table_variable = self.current_namespace.variables[table_name]
table_variable = self.current_namespace._variables[table_name]
table = table_variable.get_value()
if row_index < len(table):
table.change_row(row, row_index)
@ -795,7 +795,7 @@ class Datavars:
def __getattr__(self, package_name: str):
'''Метод возвращает ноду пространства имен, соответствующего искомому
пакету.'''
if package_name in self.root.namespaces:
if package_name in self.root._namespaces:
return self.root[package_name]
elif package_name == 'custom':
custom_namespace = NamespaceNode('custom')
@ -828,7 +828,7 @@ class Datavars:
return self.root[package_name]
def __contains__(self, package_name):
if package_name in self.root.namespaces:
if package_name in self.root._namespaces:
return True
elif package_name == 'custom':
custom_namespace = NamespaceNode('custom')
@ -859,8 +859,8 @@ class Datavars:
env.add_namespace('loop')
@property
def namespaces(self):
return self.root.namespaces
def _namespaces(self):
return self.root._namespaces
def save_variables(self):
'''Метод для сохранения значений переменных в calculate.ini файлах.'''

@ -1,16 +1,25 @@
from calculate.variables.datavars import Variable, Namespace, Dependence, \
StringType, BooleanType, HashType, ListType, Calculate, Copy
from calculate.variables.datavars import (Variable, Namespace, Dependence,
StringType, BooleanType, HashType,
ListType, Calculate, Copy)
from calculate.vars.main.os.func import get_arch_gentoo
from calculate.vars.install.os.func import *
from calculate.vars.install.os.func import (get_audio_selected,
get_available_audio_system)
with Namespace("arch"):
# Variable("machine", type=StringType,
# source=Calculate(lambda x: x.value, "main.os.arch.machine"))
print('var: machine')
Variable("machine", type=StringType,
source=Calculate(lambda x: x.value, "main.os.arch.machine"))
source=Copy("main.os.arch.machine"))
Variable("gentoo", type=StringType,
source=Calculate(get_arch_gentoo, ".machine"))
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"))
source=Calculate(
get_available_audio_system))
Variable("selected", type=StringType,
source=Calculate(
get_audio_selected,
".available",
"main.cl.cmdline.calculate.audio"))

@ -45,8 +45,8 @@ class TestDatavars:
def test_if_NamespaceNode_just_initialized_with_its_name__the_NamespaceNode_object_contains_empty_namespaces_and_variables_dictionaries_and_fullname_method_returns_only_the_namespace_s_name(self):
namespace_1 = NamespaceNode('namespace_1')
assert namespace_1.namespaces == dict()
assert namespace_1.variables == dict()
assert namespace_1._namespaces == dict()
assert namespace_1._variables == dict()
assert namespace_1.get_fullname() == 'namespace_1'
def test_if_namespace_node_added_in_an_other_namespace_node__a_parent_namespace_node_contains_child_namespace_in_its_namespaces_dictionary_and_child_namespace_object_has_parent_namespace_in_its_parent_attribute_and_its_fullname_method_returns_names_of_both_namespaces(self):
@ -54,26 +54,28 @@ class TestDatavars:
namespace_2 = NamespaceNode('namespace_2')
namespace_1.add_namespace(namespace_2)
assert namespace_1.namespaces == {'namespace_2': namespace_2}
assert namespace_1.variables == dict()
assert namespace_1._namespaces == {'namespace_2': namespace_2}
assert namespace_1._variables == dict()
assert namespace_1.get_fullname() == 'namespace_1'
assert namespace_1.namespace_2 == namespace_2
assert namespace_1['namespace_2'] == namespace_2
assert namespace_2.namespaces == dict()
assert namespace_2.variables == dict()
assert namespace_2.parent == namespace_1
assert namespace_2._namespaces == dict()
assert namespace_2._variables == dict()
assert namespace_2._parent == namespace_1
assert namespace_2.get_fullname() == 'namespace_1.namespace_2'
def test_if_two_VariableNode_objects_are_initialized_and_added_to_a_namespace__the_NamespaceNode_object_contains_this_variables_and_can_be_used_to_get_variables_values_and_variables_have_namespace_name_in_their_fullnames(self):
namespace_1 = NamespaceNode('namespace_1')
variable_1 = VariableNode('var_1', namespace_1, source='value_1')
variable_2 = VariableNode('var_2', namespace_1, source='value_2')
variable_3 = VariableNode('name', namespace_1, source='name_value')
assert namespace_1.namespaces == dict()
assert namespace_1.variables == {'var_1': variable_1,
'var_2': variable_2}
assert namespace_1._namespaces == dict()
assert namespace_1._variables == {'var_1': variable_1,
'var_2': variable_2,
'name': variable_3}
assert namespace_1.get_fullname() == 'namespace_1'
assert namespace_1.var_1 == 'value_1'
@ -82,8 +84,12 @@ class TestDatavars:
assert namespace_1.var_2 == 'value_2'
assert namespace_1['var_2'] == variable_2
assert namespace_1.name == 'name_value'
assert namespace_1['name'] == variable_3
assert namespace_1['var_1'].get_fullname() == 'namespace_1.var_1'
assert namespace_1['var_2'].get_fullname() == 'namespace_1.var_2'
assert namespace_1['name'].get_fullname() == 'namespace_1.name'
def test_if_two_dependencies_is_created_with_the_same_variables_and_their_depend_functions_are_equivalent_lambdas__the_dependencies_are_equal(self):
namespace_1 = NamespaceNode('namespace_1')
@ -878,8 +884,8 @@ var_2 = value_2
namespace_filler.fill(datavars, second_ini_text)
assert datavars.os.var_1 == 'value_1'
assert datavars.os.var_2 == 'value_2'
assert 'var_1' not in datavars.custom.test.variables
assert 'var_2' not in datavars.custom.test.variables
assert 'var_1' not in datavars.custom.test._variables
assert 'var_2' not in datavars.custom.test._variables
def test_if_calculate_ini_file_contains_some_errors__the_NamespaceIniFiller_object_collect_all_error_messages_to_the_error_attribute(self):
Namespace.reset()

Loading…
Cancel
Save