Group parameter and its handling logic is added. fixed #3

master
Иванов Денис 4 years ago
parent 31f40fb589
commit ae7f6f620d

@ -20,6 +20,7 @@ from ..utils.files import join_paths, check_directory_link, check_command,\
from calculate.variables.datavars import HashType, NamespaceNode,\
VariableNode, IniType, IntegerType,\
FloatType, ListType
from calculate.variables.loader import Datavars
# Типы шаблона: директория или файл.
@ -51,40 +52,45 @@ class Variables(MutableMapping):
iterator = iter(self.__attrs)
return next(iterator)
def __getattribute__(self, name):
def __getattribute__(self, name: str):
if name == '_Variables__attrs':
return super().__getattribute__(name)
if name == 'available_packages':
return super().__getattribute__(name)
if name == 'variables':
return self.__attrs
try:
return self.__attrs[name]
except KeyError:
raise AttributeError(name)
@property
def available_packages(self):
def available_packages(self) -> set:
packages = set(self.__attrs.keys())
packages.update({'custom'})
return packages
def __getitem__(self, name):
def __getitem__(self, name: str):
return self.__attrs[name]
def __setitem__(self, name, value):
def __setitem__(self, name: str, value) -> None:
self.__attrs[name] = value
def __delitem__(self, name):
def __delitem__(self, name: str) -> None:
del self.__attrs[name]
def __iter__(self):
return iter(self.__attrs)
def __len__(self):
def __len__(self) -> int:
return len(self.__attrs)
def __repr__(self):
def __repr__(self) -> str:
return '<Variables {}>'.format(self.__attrs)
def __contains__(self, name: str) -> bool:
return name in self.__attrs
class ParametersProcessor:
'''Класс для проверки и разбора параметров шаблона.'''
@ -93,10 +99,10 @@ class ParametersProcessor:
'unbound', 'mirror', 'run', 'exec', 'env',
'package', 'merge', 'postmerge', 'action',
'rebuild', 'restart', 'stop', 'start', 'handler',
'notify'}
'notify', 'group'}
inheritable_parameters = {'chmod', 'chown', 'autoupdate', 'env',
'package', 'action', 'handler'}
'package', 'action', 'handler', 'group'}
# Параметры по умолчанию для файлов --
# будут заполняться из __datavars__
@ -129,6 +135,20 @@ class ParametersProcessor:
self.package_atom_parser = PackageAtomParser(chroot_path=chroot_path)
self._groups = {}
try:
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(
).get_table()
else:
packages = datavars_module.main.cl.groups[group]
self._groups.update({group: packages})
except Exception:
pass
pprint(self._groups)
self._inspect_formats_package()
self._for_package = None
@ -137,6 +157,7 @@ class ParametersProcessor:
# метод для проверки.
self.checkers_list = OrderedDict({
'package': self.check_package_parameter,
'group': self.check_group_parameter,
'append': self.check_append_parameter,
'rebuild': self.check_rebuild_parameter,
'restart': self.check_restart_parameter,
@ -158,19 +179,23 @@ class ParametersProcessor:
# будет закончен парсинг всех других параметров -- добавляем сюда метод
# для проверки.
self.postparse_checkers_list = OrderedDict({
'package': self.check_postparse_package,
'append': self.check_postparse_append,
'source': self.check_postparse_source,
'autoupdate': self.check_postparse_autoupdate,
'run': self.check_postparse_run,
'exec': self.check_postparse_exec,
'handler': self.check_postparse_handler})
'handler': self.check_postparse_handler
})
# Если параметр является наследуемым только при некоторых условиях --
# указываем здесь эти условия.
self.inherit_conditions = {'chmod': self.is_chmod_inheritable}
def set_parameters_container(self, parameters_container):
'''Метод для установки текущего контейнера параметров.'''
self._parameters_container = parameters_container
self._added_parameters = set()
@property
def for_package(self):
@ -207,6 +232,8 @@ class ParametersProcessor:
if checked_value is None:
return
self._added_parameters.add(parameter_name)
if (parameter_name in self.inheritable_parameters and
self.template_type == DIR):
if parameter_name in self.inherit_conditions:
@ -227,11 +254,13 @@ class ParametersProcessor:
'''Метод, запускающий проверку параметров после их разбора.'''
for parameter, parameter_checker in\
self.postparse_checkers_list.items():
if parameter not in self._parameters_container:
if parameter not in self._added_parameters:
continue
parameter_value = self._parameters_container[parameter]
parameter_checker(parameter_value)
result = parameter_checker(parameter_value)
if result is not None:
self._parameters_container.change_parameter(parameter,
result)
def check_template_parameters(self, parameters, template_type, lineno):
'''Метод, запускающий проверку указанных параметров.'''
@ -268,24 +297,27 @@ class ParametersProcessor:
# Методы для проверки параметров во время разбора шаблона.
def check_package_parameter(self, parameter_value):
try:
if isinstance(parameter_value, str):
result = self.package_atom_parser.parse_package_parameter(
parameter_value)
elif isinstance(parameter_value, list):
result = []
for atom in parameter_value:
result.append(
self.package_atom_parser.parse_package_parameter(
atom)
)
except PackageAtomError as error:
if error.errno == NOTEXIST:
raise ConditionFailed(error.message, self.lineno)
else:
raise IncorrectParameter(error.message)
if not isinstance(parameter_value, str):
raise IncorrectParameter("'package' parameter must have value of"
" the 'str' type, not"
f" {type(parameter_value)}")
return parameter_value
def check_group_parameter(self, parameter_value):
if isinstance(parameter_value, str):
result = [group.strip() for group in parameter_value.split(',')]
elif isinstance(parameter_value, (list, tuple)):
result = parameter_value if isinstance(parameter_value, list) else\
list(parameter_value)
else:
raise IncorrectParameter("'package' parameter must have value of"
" the 'str', 'list' or 'tuple' type, not"
f" {type(parameter_value)}")
for group in result:
if group != "install" and group not in self._groups:
raise IncorrectParameter(f"'group' parameter value '{group}'"
" is not available. Available values:"
f" {', '.join(self._groups.keys())}")
return result
def check_append_parameter(self, parameter_value):
@ -529,7 +561,7 @@ class ParametersProcessor:
raise IncorrectParameter("'unbound' parameter is incompatible"
" with 'autoupdate' parameter")
def check_postparse_handler(self, parameter_rvalue):
def check_postparse_handler(self, parameter_value):
if self._parameters_container.merge:
raise IncorrectParameter("'merge' parameter is not available"
" in handler templates.")
@ -538,6 +570,52 @@ class ParametersProcessor:
raise IncorrectParameter("'package' parameter is not available"
" in handler templates.")
def check_postparse_package(self, parameter_value):
groups = []
package_atom = PackageAtomParser.parse_atom_name(parameter_value)
if (self._parameters_container is None
or not self._parameters_container.group):
# Если параметр group не задан или метод используется для проверки
# отдельного параметра package -- делаем только проверку install.
# Предполагающую проверку существования пакета.
groups.append('install')
else:
groups = self._parameters_container.group
for group in groups:
if group == 'install':
try:
result = self.package_atom_parser.parse_package_parameter(
package_atom)
return result
except PackageAtomError as error:
if error.errno != NOTEXIST:
raise IncorrectParameter(error.message)
elif self._check_package_group(package_atom,
self._groups[group]):
self._parameters_container.remove_parameter('package')
return
raise ConditionFailed(f"package '{parameter_value}'"
" does not template condition", self.lineno)
def _check_package_group(self, package: dict, group_packages: list):
for group_package in group_packages:
for parameter in ['category', 'name', 'version', 'slot']:
if package[parameter] is not None:
if (group_package[parameter] is None
or group_package[parameter] != package[parameter]):
return False
if package['use_flags'] is not None:
if group_package['use_flags'] is None:
return False
else:
for use_flag in package['use_flags']:
if use_flag not in group_package['use_flags']:
return False
return True
# Методы для проверки того, являются ли параметры наследуемыми.
def is_chmod_inheritable(self, parameter_value):
@ -574,7 +652,6 @@ class ParametersProcessor:
if self.chroot_path == '/':
gid = grp.getgrnam(group_name).gr_gid
else:
print("using get_gid_from_group")
gid = self.get_gid_from_group(group_name)
except (FilesError, KeyError, TypeError) as error:
raise IncorrectParameter(
@ -767,6 +844,18 @@ class ParametersContainer(MutableMapping):
return (parameter_name not in self.__parameters
and parameter_name in self.__inheritable)
def remove_parameter(self, parameter_name):
if parameter_name in self.__parameters:
self.__parameters.pop(parameter_name)
elif parameter_name in self.__inheritable:
self.__inheritable.pop(parameter_name)
def change_parameter(self, parameter, value):
if parameter in self.__parameters:
self.__parameters.update({parameter: value})
elif parameter in self.__inheritable:
self.__inheritable.update({parameter: value})
def _clear_container(self):
self.__parameters.clear()
self.__inheritable.clear()
@ -920,6 +1009,7 @@ class CalculateExtension(Extension):
lineno=lineno)
expect_comma_flag = False
conditions = []
while self.stream.current.type != 'block_end':
if expect_comma_flag:
@ -953,10 +1043,11 @@ class CalculateExtension(Extension):
or self.stream.current.type == 'lparen'
or self.stream.current.type == 'integer'):
# разбираем условие. Если условие False -- кидаем исключение.
condition_result = self.get_condition_result()
if not condition_result:
raise ConditionFailed('Condition is failed',
lineno=self.stream.current.lineno)
# condition_result = self.get_condition_result()
# if not condition_result:
# raise ConditionFailed('Condition is failed',
# lineno=self.stream.current.lineno)
conditions.append(self.parse_condition())
elif self.stream.current.type == 'name':
raise TemplateSyntaxError(
f"Unknown identifier '{self.stream.current.value}'"
@ -969,12 +1060,8 @@ class CalculateExtension(Extension):
lineno=self.stream.current.lineno)
expect_comma_flag = True
# dictionary_node = nodes.Dict(pairs_list)
# save_node = self.call_method('save_parameters',
# [dictionary_node,
# nodes.ContextReference()],
# lineno=lineno)
# return nodes.Output([save_node], lineno=lineno)
self.parameters_processor.check_postparse_parameters()
self.check_conditions(conditions)
self.calculate_parsed = True
return nodes.Output([nodes.Const('')], lineno=lineno)
@ -998,11 +1085,42 @@ class CalculateExtension(Extension):
self.stream.current.lineno)
return ''
def parse_condition(self):
try:
condition_node = self.parser.parse_expression(with_condexpr=True)
condition_node = self.call_method(
'set_condition_result',
[condition_node],
lineno=self.stream.current.lineno)
condition_template = nodes.Template(
[nodes.Output([condition_node])])
condition_template = condition_template.set_environment(
self.environment)
template = self.environment.from_string(condition_template)
return template
except Exception as error:
raise ConditionFailed('Error during parsing condition:{}'
.format(str(error)),
lineno=self.stream.current.lineno)
def check_conditions(self, conditions: list):
for condition in conditions:
self.condition_result = False
try:
condition.render(__datavars__=self._datavars)
except Exception as error:
raise ConditionFailed('Error during handling condition: {}'
.format(str(error)),
lineno=self.stream.current.lineno)
if not self.condition_result:
raise ConditionFailed('Condition is failed',
lineno=self.stream.current.lineno)
# DEPRECATED
def get_condition_result(self):
'''Метод для разбора условий из тега calculate.'''
# лучший способ -- парсим в AST дерево, после чего компилируем и
# выполняем его.
print('GET CONDITION')
self.condition_result = False
try:
@ -1019,43 +1137,11 @@ class CalculateExtension(Extension):
template = self.environment.from_string(condition_template)
template.render(__datavars__=self._datavars)
except Exception as error:
print('Error during running condition:', str(error))
except Exception:
return False
print('condition result:', self.condition_result)
return self.condition_result
# собираем исходный код условия из токенов.
# вероятно, следует придумать лучший способ.
# while (self.stream.current.type != 'block_end' and
# self.stream.current.type != 'comma'):
# if self.stream.current.type == 'string':
# condition_list.append("'{}'".format(
# self.stream.current.value
# ))
# elif self.stream.current.type == 'dot':
# self.stream.skip(1)
# if self.stream.current.type == 'name':
# next_name = '.' + self.stream.current.value
# else:
# raise TemplateSyntaxError(
# 'Variable name is not correct.',
# lineno=self.stream.current.lineno
# )
# condition_list[-1] = condition_list[-1] + next_name
# else:
# condition_list.append(str(self.stream.current.value))
# self.stream.skip(1)
# condition = ' '.join(condition_list)
# компилируем исходный код условия и получаем результат его вычисления.
# cond_expr = self.environment.compile_expression(condition)
# condition_result = cond_expr(__datavars__=self._datavars)
# return condition_result
def set_condition_result(self, condition_result):
'''Метод для сохранения результата вычисления условия.'''
self.condition_result = condition_result
@ -1402,14 +1488,13 @@ class TemplateEngine:
else:
CalculateContext._env_set = set()
self.parameters_processor._parameters_container =\
self._parameters_object
self.parameters_processor.set_parameters_container(
self._parameters_object)
self.calculate_extension.template_type = template_type
self.calculate_extension.calculate_parsed = False
template = self.environment.get_template(template_path)
self.parameters_processor.check_postparse_parameters()
self._template_text = template.render(
__datavars__=self._datavars_module,
@ -1430,14 +1515,13 @@ class TemplateEngine:
else:
CalculateContext._env_set = set()
self.parameters_processor._parameters_container =\
self._parameters_object
self.parameters_processor.set_parameters_container(
self._parameters_object)
self.calculate_extension.template_type = template_type
self.calculate_extension.calculate_parsed = False
template = self.environment.from_string(string)
self.parameters_processor.check_postparse_parameters()
self._template_text = template.render(
__datavars__=self._datavars_module,

@ -9,7 +9,8 @@ from ..utils.files import join_paths, write_file, read_file_lines, FilesError,\
from .template_engine import TemplateEngine, Variables, ConditionFailed,\
ParametersProcessor, DIR, FILE,\
ParametersContainer
from calculate.variables.datavars import StringType, ListType, NamespaceNode
from calculate.variables.datavars import StringType, ListType, NamespaceNode,\
VariableNode, TableType
from calculate.variables.loader import Datavars
from .format.base_format import Format
from ..utils.io_module import IOModule
@ -1598,7 +1599,7 @@ class DirectoryTree:
class DirectoryProcessor:
'''Класс обработчика директорий шаблонов.'''
def __init__(self, action: str, datavars_module=Variables(), package='',
output_module=IOModule(), dbpkg=True):
output_module=IOModule(), dbpkg=True, **groups):
if isinstance(action, list):
self.action = action
else:
@ -1651,6 +1652,11 @@ class DirectoryProcessor:
execute_archive_path=self.cl_exec_dir_path,
dbpkg=dbpkg)
# Разбираем atom имена пакетов, указанных для групп пакетов.
if groups:
for group_name, package_name in groups.items():
self._add_package_to_group(group_name, package_name)
# Инициализируем шаблонизатор.
self.template_engine = TemplateEngine(
datavars_module=self.datavars_module,
@ -1665,7 +1671,7 @@ class DirectoryProcessor:
elif isinstance(package, str):
try:
self.for_package = self.template_engine.\
parameters_processor.check_package_parameter(package)
parameters_processor.check_postparse_package(package)
except ConditionFailed as error:
# ConfitionFailed потому что для проверки значения пакета,
# используется тот же метод, что проверяет параметр package
@ -1732,6 +1738,40 @@ class DirectoryProcessor:
else:
return path_to_add
def _add_package_to_group(self, group_name: str,
package_atom: str) -> None:
try:
groups_namespace = self.datavars_module.main.cl.groups
except Exception:
namespaces = ['cl', 'groups']
groups_namespace = self.datavars_module.main
for namespace in namespaces:
if namespace in groups_namespace:
groups_namespace = groups_namespace[namespace]
else:
if isinstance(groups_namespace, NamespaceNode):
groups_namespace = NamespaceNode(
namespace,
parent=groups_namespace)
else:
groups_namespace[namespace] = Variables()
groups_namespace = groups_namespace[namespace]
atom_dict = PackageAtomParser.parse_atom_name(package_atom)
if isinstance(self.datavars_module, (Datavars, NamespaceNode)):
if group_name not in groups_namespace:
VariableNode(group_name, groups_namespace,
variable_type=TableType,
source=[atom_dict])
else:
group_var = groups_namespace[group_name]
group_var.source = group_var.get_table().append(atom_dict)
else:
if group_name not in groups_namespace:
groups_namespace[group_name] = [atom_dict]
else:
groups_namespace[group_name].append(atom_dict)
def process_template_directories(self) -> None:
'''Метод для обхода шаблонов, содержащихся в каталогах из
main.cl_template.path.'''
@ -2242,7 +2282,7 @@ class DirectoryProcessor:
template_path))
return False
except Exception as error:
self.output.set_error('Template error: {0} Template: {1}'.
self.output.set_error('Template error: {0}. Template: {1}'.
format(str(error),
template_path))
return False
@ -2363,7 +2403,6 @@ class DirectoryProcessor:
template_path)
)
return False
return True
@contextmanager

@ -389,39 +389,43 @@ class PackageAtomParser:
'''Метод для разбора значения package, после разбора инициирует
проверку полученных значений. Возвращает объект PackageAtomName.'''
self.package_atom = package_atom
self._atom_dictionary = {}
# self._atom_dictionary = {}
if isinstance(package_atom, str):
self._atom_dictionary = self.parse_atom_name(package_atom)
elif isinstance(package_atom, dict):
self._atom_dictionary = package_atom
parsing_result = self.atom_regex.search(package_atom)
# parsing_result = self.atom_regex.search(package_atom)
if (not parsing_result or parsing_result.string != package_atom or
not parsing_result.groupdict()['category'] or
not parsing_result.groupdict()['name']):
raise PackageAtomError("'package' parameter value '{}' is not"
" correct".format(package_atom),
errno=NOTCORRECT)
# if (not parsing_result or parsing_result.string != package_atom or
# not parsing_result.groupdict()['category'] or
# not parsing_result.groupdict()['name']):
# raise PackageAtomError("'package' parameter value '{}' is not"
# " correct".format(package_atom),
# errno=NOTCORRECT)
self._atom_dictionary['category'] = parsing_result.groupdict(
)['category']
# self._atom_dictionary['category'] = parsing_result.groupdict(
# )['category']
self._atom_dictionary['name'] = parsing_result.groupdict()['name']
# self._atom_dictionary['name'] = parsing_result.groupdict()['name']
if parsing_result.groupdict()['version']:
version_value = parsing_result.groupdict()['version'].strip('-')
# if parsing_result.groupdict()['version']:
# version_value = parsing_result.groupdict()['version'].strip('-')
self._atom_dictionary['version'] = Version(version_value)
# self._atom_dictionary['version'] = Version(version_value)
if (parsing_result.groupdict()['slot'] and
parsing_result.groupdict()['slot'] != ':'):
self._atom_dictionary['slot'] = parsing_result.groupdict(
)['slot'][1:]
# if (parsing_result.groupdict()['slot'] and
# parsing_result.groupdict()['slot'] != ':'):
# self._atom_dictionary['slot'] = parsing_result.groupdict(
# )['slot'][1:]
if parsing_result.groupdict()['use_flags']:
self._atom_dictionary['use_flags'] = []
use_flags = parsing_result.groupdict()['use_flags'].strip().\
rstrip(']').lstrip('[')
# if parsing_result.groupdict()['use_flags']:
# self._atom_dictionary['use_flags'] = []
# use_flags = parsing_result.groupdict()['use_flags'].strip().\
# rstrip(']').lstrip('[')
for use_flag in use_flags.split(','):
self._atom_dictionary['use_flags'].append(use_flag.strip())
# for use_flag in use_flags.split(','):
# self._atom_dictionary['use_flags'].append(use_flag.strip())
self._check_package_existance()
@ -437,13 +441,13 @@ class PackageAtomParser:
return True
else:
# Используем glob-паттерн для поиска.
if 'version' in self._atom_dictionary:
if self._atom_dictionary['version'] is not None:
full_name = self._atom_dictionary['name'] + '-' +\
self._atom_dictionary['version']._version_string
else:
full_name = self._atom_dictionary['name']
if 'version' not in self._atom_dictionary:
if self._atom_dictionary['version'] is None:
glob_result = glob.glob(
r'{0}/{1}/{2}-[0-9]*/CONTENTS'.format(
self.pkg_path,
@ -513,7 +517,7 @@ class PackageAtomParser:
def _check_slot_value(self, pkg_path):
'''Метод для проверки полученного из параметра package значения slot.
'''
if 'slot' in self._atom_dictionary:
if self._atom_dictionary['slot']:
slot = self._get_slot_value(pkg_path)
if slot != self._atom_dictionary['slot']:
@ -525,10 +529,8 @@ class PackageAtomParser:
def _check_use_flags_value(self, pkg_path):
'''Метод для проверки полученных из параметра package значений
use-флагов.'''
if 'use_flags' in self._atom_dictionary:
if self._atom_dictionary['use_flags']:
use_flags = self._get_use_flags_value(pkg_path)
print('current use flags:', use_flags)
print('atom use flags:', self._atom_dictionary['use_flags'])
for use_flag in self._atom_dictionary['use_flags']:
if use_flag not in use_flags:
@ -646,6 +648,46 @@ class PackageAtomParser:
else:
return False
@classmethod
def parse_atom_name(cls, atom_name: str) -> dict:
parsing_result = cls.atom_regex.search(atom_name)
if (not parsing_result or parsing_result.string != atom_name or
not parsing_result.groupdict()['category'] or
not parsing_result.groupdict()['name']):
raise PackageAtomError("'package' parameter value '{}' is not"
" correct".format(atom_name),
errno=NOTCORRECT)
parsing_result = parsing_result.groupdict()
category = parsing_result['category']
name = parsing_result['name']
if parsing_result['version'] is not None:
version = Version(parsing_result['version'].strip('-'))
else:
version = None
if (parsing_result['slot'] is not None
and parsing_result['slot'] != ':'):
slot = parsing_result['slot'].strip(':')
else:
slot = None
if parsing_result['use_flags'] is not None:
use_flags = [use.strip() for use in
parsing_result['use_flags'].strip().
strip('[]').split(',')]
else:
use_flags = None
atom_dict = {'category': category,
'name': name,
'version': version,
'slot': slot,
'use_flags': use_flags}
return atom_dict
class Package:
'''Класс для работы с принадлежностью файлов пакетам.'''
@ -762,7 +804,6 @@ class Package:
def add_dir(self, file_name):
'''Метод для добавления в CONTENTS директорий.'''
print('ADD DIR')
file_name = self.remove_chroot_path(file_name)
if (file_name != '/' and
@ -774,7 +815,6 @@ class Package:
def add_sym(self, file_name, target_path=None, mtime=None):
'''Метод для добавления в CONTENTS символьных ссылок.'''
print('ADD SYM')
file_name = self.remove_cfg_prefix(file_name)
real_path = file_name
@ -800,7 +840,6 @@ class Package:
def add_obj(self, file_name, file_md5=None, mtime=None):
'''Метод для добавления в CONTENTS обычных файлов как obj.'''
print('ADD OBJ')
real_path = file_name
file_name = self.remove_chroot_path(file_name)
file_name = self.remove_cfg_prefix(file_name)
@ -826,7 +865,6 @@ class Package:
def add_file(self, file_name):
'''Метод для добавления в CONTENTS файла любого типа.'''
print('ADD FILE:')
if file_name != '/':
real_path = file_name
if file_name.startswith(self.chroot_path):

@ -1,9 +1,9 @@
import os
import pytest
import shutil
from collections import OrderedDict
from calculate.templates.format.contents_format import ContentsFormat
from calculate.utils.package import PackageAtomName, Version, Package
from calculate.utils.files import join_paths
TESTFILES_PATH = os.path.join(os.getcwd(),
@ -41,13 +41,18 @@ class TestExecutingFormat:
result_contents = '''dir /etc
dir /etc/dir_0
obj /etc/dir_0/file_0 c585be6f171462940b44af994a54040d 1593525253
obj /etc/dir_0/file_1 b4ff15ea7028891a83392b490d676622 1601987083
obj /etc/dir_0/file_1 b4ff15ea7028891a83392b490d676622 {0}
dir /etc/dir_1
obj /etc/dir_1/file_0 b4ff15ea7028891a83392b490d676622 1601982062
obj /etc/dir_1/file_0 b4ff15ea7028891a83392b490d676622 {1}
dir /etc/dir_2
dir /etc/dir_3
sym /etc/dir_3/link_0 -> ../dir_1/file_0 1601991426
'''
sym /etc/dir_3/link_0 -> ../dir_1/file_0 {2}
'''.format(int(os.lstat(join_paths(chroot_path,
'/etc/dir_0/file_1')).st_mtime),
int(os.lstat(join_paths(chroot_path,
'/etc/dir_1/file_0')).st_mtime),
int(os.lstat(join_paths(chroot_path,
'/etc/dir_3/link_0')).st_mtime))
contents_format = ContentsFormat(template_text, '/path/to/template')
contents_format.execute_format('target/path', chroot_path=chroot_path)

@ -1,15 +1,18 @@
import os
import pytest
import shutil
import hashlib
import os
from pprint import pprint
from calculate.templates.template_processor import DirectoryProcessor,\
TemplateWrapper
from calculate.utils.package import PackageAtomName, Version, Package
from calculate.utils.package import PackageAtomName, Version, Package,\
PackageAtomParser
from calculate.utils.files import join_paths
from calculate.utils.io_module import IOModule
from calculate.templates.template_engine import Variables
from collections import OrderedDict
from pprint import pprint
from calculate.variables.datavars import Namespace, Variable, TableType,\
StringType, ListType
CHROOT_PATH = os.path.join(os.getcwd(),
@ -42,9 +45,9 @@ new_package_name = PackageAtomName(
group = Variables({'bool': True,
'list': [1, 2, 3]})
variables = Variables({'variable_1': 'value_1',
'variable_2': 'value_2',
'group': group})
ns = Variables({'variable_1': 'value_1',
'variable_2': 'value_2',
'group': group})
install = Variables({'os_disk_dev': 'os_disk_dev_value',
'version': 1.5,
@ -74,7 +77,7 @@ test = ({'test_root': CHROOT_PATH})
datavars = Variables({'install': install,
'merge': merge,
'variables': variables,
'ns': ns,
'main': main,
'test': test,
'custom': Variables()})
@ -127,9 +130,9 @@ class TestDirectoryProcessor:
'templates_1/root/file_0')]))
output_text = '{0}{1}'.format(header,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/file_0'))
@ -179,9 +182,9 @@ class TestDirectoryProcessor:
'templates_3/root/dir_2/file_0')]))
output_text = '{0}{1}'.format(header,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_2'))
@ -212,9 +215,9 @@ class TestDirectoryProcessor:
'templates_5/root/dir_4/file_0')]))
output_text_1 = '{0}{1}'.format(header_1,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
header_2 = header.format('\n# '.join(
[join_paths(
@ -222,9 +225,9 @@ class TestDirectoryProcessor:
'templates_5/root/dir_5/file_0')]))
output_text_2 = '{0}{1}'.format(header_2,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_4'))
@ -270,9 +273,9 @@ class TestDirectoryProcessor:
output_text = '{0}{1}'.format(header,
("options {\n parameter-0 yes;"
+ "\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
test_package = Package(new_package_name, chroot_path=CHROOT_PATH)
@ -305,9 +308,9 @@ class TestDirectoryProcessor:
output_text = '{0}{1}'.format(header,
("options {\n parameter-0 yes;"
+ "\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_6'))
@ -342,9 +345,9 @@ class TestDirectoryProcessor:
output_text = '{0}{1}'.format(header,
("options {\n parameter-0 yes;"
+ "\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/file_2'))
@ -378,9 +381,9 @@ class TestDirectoryProcessor:
'templates_9/root/etc/file_3')]))
output_text = '{0}{1}'.format(header,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert not os.path.exists(join_paths(CHROOT_PATH, '/etc/file_3'))
@ -415,9 +418,9 @@ class TestDirectoryProcessor:
output_text_1 = '{0}{1}'.format(header_1,
("options {\n parameter-0 no;"
+ "\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
header_2 = header.format('\n# '.join(
[join_paths(
@ -425,9 +428,9 @@ class TestDirectoryProcessor:
'templates_10/root/etc/file_5')]))
output_text_2 = '{0}{1}'.format(header_2,
("options {\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
header_3 = header.format('\n# '.join(
@ -437,9 +440,9 @@ class TestDirectoryProcessor:
output_text_3 = '{0}{1}'.format(header_3,
("options {\n parameter-0 no;"
+ "\n parameter-1 "
+ datavars.variables.variable_1
+ datavars.ns.variable_1
+ ";\n parameter-2 "
+ datavars.variables.variable_2
+ datavars.ns.variable_2
+ ";\n};\n"))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/file_4'))
@ -978,32 +981,78 @@ class TestDirectoryProcessor:
assert False
def test_merge_order(self):
try:
datavars.main['cl_template_path'] = os.path.join(CHROOT_PATH,
'templates_36')
directory_processor = DirectoryProcessor(
'install',
datavars_module=datavars,
package='test-category/test-package'
)
directory_processor.process_template_directories()
datavars.main['cl_template_path'] = os.path.join(CHROOT_PATH,
'templates_36')
directory_processor = DirectoryProcessor(
'install',
datavars_module=datavars,
package='test-category/test-package'
)
directory_processor.process_template_directories()
expected_output = {}
real_output = {}
expected_output = {}
real_output = {}
for number in range(0, 3):
expected_output.update({'file_{}'.format(number):
'from script_{}'.format(number)})
output_path = os.path.join(CHROOT_PATH,
'etc/dir_50/file_{}'
.format(number))
with open(output_path, 'r') as output_file:
output_text = output_file.read()
real_output.update({'file_{}'.format(number): output_text})
for number in range(0, 3):
expected_output.update({'file_{}'.format(number):
'from script_{}'.format(number)})
output_path = os.path.join(CHROOT_PATH,
'etc/dir_50/file_{}'
.format(number))
with open(output_path, 'r') as output_file:
output_text = output_file.read()
real_output.update({'file_{}'.format(number): output_text})
assert real_output == expected_output
except KeyboardInterrupt:
assert False
assert real_output == expected_output
def test_group_parameter_without_merge(self):
datavars.main['cl_template_path'] = os.path.join(CHROOT_PATH,
'templates_37')
directory_processor = DirectoryProcessor(
'install',
datavars_module=datavars,
package='test-category/test-package',
build='test-category/build-package-2.1:0[use_1,use_2]',
uninstall='test-category/unmerged-package-1.0.1:1[use_1,use_2]'
)
assert 'build' in datavars.main.cl.groups
assert 'uninstall' in datavars.main.cl.groups
print('ATOMS:')
pprint(datavars.main.cl.groups.build)
pprint(datavars.main.cl.groups.uninstall)
directory_processor.process_template_directories()
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_51'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_51/file_0'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_52'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_52/file_0'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_53'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_53/file_0'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_54'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_54/file_0'))
def test_group_parameter_with_merge_parameter(self):
datavars.main['cl_template_path'] = os.path.join(CHROOT_PATH,
'templates_38')
directory_processor = DirectoryProcessor(
'install',
datavars_module=datavars,
package='test-category/test-package',
build='test-category/build-package-2.1:0[use_1,use_2]',
uninstall='test-category/unmerged-package-1.0.1:1[use_1,use_2]'
)
assert 'build' in datavars.main.cl.groups
assert 'uninstall' in datavars.main.cl.groups
directory_processor.process_template_directories()
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_55'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_55/file_0'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_56'))
assert os.path.exists(join_paths(CHROOT_PATH, '/etc/dir_56/file_0'))
def test_view_tree(self):
list_path = join_paths(CHROOT_PATH, '/etc')

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc', action = 'install' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', merge = 'test-category/test-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind',
merge = 'test-category/test-package, test-category/new-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind',
merge = 'test-category/new-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind',
merge = 'test-category/test-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind',
merge = 'test-category/test-package' %}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind',
package = 'test-category/test-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind', path = '/etc',
install.number > 100 -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
{% calculate install.number < 100 -%}
{% calculate append = 'join', format = 'bind', path = '/etc', install.number < 100 -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1 +1 @@
{% calculate append = 'join', 2 in variables.group.list %}
{% calculate append = 'join', 2 in ns.group.list %}

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,2 +1,2 @@
{% calculate append = 'skip', action = 'install', package = 'test-category/test-package' %}
{% calculate path = '/etc' %}
{% calculate append = 'skip', action = 'install',
package = 'test-category/test-package', path = '/etc' %}

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', merge = 'test-category/new-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', package = 'test-category/new-package' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,6 +1,6 @@
{% calculate append = 'join', format = 'bind', notify = ['handler_0',
'handler_1'] %}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate handler = 'handler_3', append = 'join', path = '/etc/dir_41/',
name = 'file_0', format = 'samba', notify = 'handler_2, handler_4' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate handler = 'handler_9', append = 'join', path = '/etc/dir_48/',
name = 'file_0', format = 'samba' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate handler = 'handler_1', append = 'join', path = '/etc/dir_39/',
name = 'file_0', format = 'samba', notify = 'handler_2' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'samba',
notify = 'handler_6, handler_7' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate handler = 'handler_7', append = 'join', path = '/etc/dir_45/',
name = 'file_0', format = 'samba', package = 'test-category/test-package' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate handler = 'handler_8', append = 'join', path = '/etc/dir_46/',
name = 'file_0', format = 'samba', merge = 'test-category/test-package' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -1,5 +1,5 @@
{% calculate handler = 'handler_9', append = 'join', path = '/etc/dir_48/',
name = 'file_0', format = 'samba' %}
[section 1]
parameter 1 = {{ variables.variable_1 }}
parameter 2 = {{ variables.variable_2 }}
parameter 1 = {{ ns.variable_1 }}
parameter 2 = {{ ns.variable_2 }}

@ -4,6 +4,7 @@ import os
print('IN script_0')
print('current dir:', os.getcwd())
files_list = os.listdir('./')
files_list.remove('test')
if not files_list:
with open('./file_0', 'w') as new_file:
new_file.write('from script_0')

@ -2,6 +2,7 @@
merge = 'test-category/new-package' %}
import os
files_list = os.listdir('./')
files_list.remove('test')
if not files_list:
with open('./file_0', 'w') as new_file:
new_file.write('from script_1')

@ -1,6 +1,7 @@
{% calculate run = '/usr/bin/python', package = 'test-category/new-package' %}
import os
files_list = os.listdir('./')
files_list.remove('test')
if not files_list:
with open('./file_0', 'w') as new_file:
new_file.write('from script_2')

@ -0,0 +1 @@
{% calculate append = 'skip', path = '/etc', action = 'install' %}

@ -0,0 +1 @@
{% calculate append = 'join', package = "test-category/test-package", group = "install" %}

@ -0,0 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -0,0 +1,2 @@
{% calculate append = 'skip', group = "build",
package = 'test-category/build-package' %}

@ -0,0 +1,5 @@
{% calculate run = '/usr/bin/python' %}
import os
os.mkdir('./dir_52')
with open('./dir_52/file_0', 'w') as output_file:
output_file.write('Made for build-package')

@ -0,0 +1,2 @@
{% calculate append = 'skip', group = "uninstall",
package = 'test-category/unmerged-package' %}

@ -0,0 +1,5 @@
{% calculate run = '/usr/bin/python' %}
import os
os.mkdir('./dir_53')
with open('./dir_53/file_0', 'w') as output_file:
output_file.write('Made for build-package')

@ -0,0 +1,2 @@
{% calculate append = "skip", group = 'install, uninstall',
package = 'test-category/unmerged-package' %}

@ -0,0 +1,2 @@
{% calculate append = 'join', name = 'dir_54', group = ['install'],
package = 'test-category/unmerged-package' %}

@ -0,0 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -0,0 +1,2 @@
{% calculate append = "skip", group = 'uninstall',
package = 'test-category/unmerged-package' %}

@ -0,0 +1,5 @@
{% calculate run = '/usr/bin/python' %}
import os
os.mkdir('./dir_54')
with open('./dir_54/file_0', 'w') as output_file:
output_file.write('Made for uninstalled-package')

@ -0,0 +1 @@
{% calculate append = 'skip', path = '/etc', action = 'install' %}

@ -0,0 +1,2 @@
{% calculate append = 'join', package = "test-category/test-package",
group = "install", merge = "test-category/other-package" %}

@ -0,0 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -0,0 +1,2 @@
{% calculate append = 'skip', group = "uninstall",
package = 'test-category/unmerged-package' %}

@ -0,0 +1,5 @@
{% calculate run = '/usr/bin/python' %}
import os
os.mkdir('./dir_56')
with open('./dir_56/file_0', 'w') as output_file:
output_file.write('Made for build-package')

@ -0,0 +1,2 @@
{% calculate append = "skip", group = 'install, uninstall',
package = 'test-category/other-package' %}

@ -0,0 +1,2 @@
{% calculate append = 'join', name = 'dir_57', group = ['install'],
package = 'test-category/other-package' %}

@ -0,0 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -0,0 +1,2 @@
{% calculate append = "skip", group = 'uninstall',
package = 'test-category/other-package' %}

@ -0,0 +1,5 @@
{% calculate run = '/usr/bin/python' %}
import os
os.mkdir('./dir_57')
with open('./dir_57/file_0', 'w') as output_file:
output_file.write('Made for uninstalled-package')

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind', path = '/etc' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -1,5 +1,5 @@
{% calculate append = 'join', format = 'bind' -%}
options {
parameter-1 {{ variables.variable_1 }};
parameter-2 {{ variables.variable_2 }};
parameter-1 {{ ns.variable_1 }};
parameter-2 {{ ns.variable_2 }};
};

@ -6,6 +6,6 @@ obj /etc/dir/deleted.json 11e3a79fe51cce828d973dba8702adaa 1591356795
dir /etc/dir/subdir
obj /etc/dir/subdir/config.json 506649cf099878124deda2c2452c3693 1591605050
obj /etc/dir/subdir/file 84bcceb2c8e6de79849ea5f3304f2411 1591343236
obj /etc/dir/file.conf 0b87fea7f5b65cac5012baa2bf647e72 1601363686
obj /etc/dir/file.conf 0b87fea7f5b65cac5012baa2bf647e72 1602168237
dir /etc/dir/dir_1
obj /etc/dir/dir_1/config.json 506649cf099878124deda2c2452c3693 1601363686
obj /etc/dir/dir_1/config.json 506649cf099878124deda2c2452c3693 1602168237

Loading…
Cancel
Save