def __init__(self, value, delimiter=PARAMETER_INTERPOLATION_DELIMITER): self._delimiter = delimiter if isinstance(value, str): self._item = self._parser.parse(value, delimiter) elif isinstance(value, list): self._item = ListItem(value) elif isinstance(value, dict): self._item = DictItem(value) else: self._item = ScaItem(value)
def __init__(self, value, settings, uri): self._settings = settings self._uri = uri if isinstance(value, str): try: self._item = self._parser.parse(value, self._settings) except InterpolationError as e: e.uri = self._uri raise elif isinstance(value, list): self._item = ListItem(value, self._settings) elif isinstance(value, dict): self._item = DictItem(value, self._settings) else: self._item = ScaItem(value, self._settings)
def parse(self, value, delimiter): self._delimiter = delimiter dollars = value.count('$') if dollars == 0: # speed up: only use pyparsing if there is a $ in the string return ScaItem(value) elif dollars == 1: # speed up: try a simple reference try: tokens = self._simple_ref_parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: # fall back on the full parser try: tokens = self._parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: raise ParseError(e.msg, e.line, e.col, e.lineno) else: # use the full parser try: tokens = self._parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: raise ParseError(e.msg, e.line, e.col, e.lineno) items = self._create_items(tokens) if len(items) == 1: return items[0] else: return CompItem(items)
class Parser(object): _parser = _get_parser() _simple_ref_parser = _get_simple_ref_parser() def parse(self, value, delimiter): self._delimiter = delimiter dollars = value.count('$') if dollars == 0: # speed up: only use pyparsing if there is a $ in the string return ScaItem(value) elif dollars == 1: # speed up: try a simple reference try: tokens = self._simple_ref_parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: # fall back on the full parser try: tokens = self._parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: raise ParseError(e.msg, e.line, e.col, e.lineno) else: # use the full parser try: tokens = self._parser.leaveWhitespace().parseString(value).asList() except pp.ParseException as e: raise ParseError(e.msg, e.line, e.col, e.lineno) items = self._create_items(tokens) if len(items) == 1: return items[0] else: return CompItem(items) _create_dict = { _STR: (lambda s, v: ScaItem(v)), _REF: (lambda s, v: s._create_ref(v)), _INV: (lambda s, v: s._create_inv(v)) } def _create_items(self, tokens): return [ self._create_dict[t](self, v) for t, v in tokens ] def _create_ref(self, tokens): items = [ self._create_dict[t](self, v) for t, v in tokens ] return RefItem(items, self._delimiter) def _create_inv(self, tokens): items = [ ScaItem(v) for t, v in tokens ] if len(items) == 1: return InvItem(items[0], self._delimiter) else: return InvItem(CompItem(items), self._delimiter)
def _create_inv(self, tokens): items = [ ScaItem(v) for t, v in tokens ] if len(items) == 1: return InvItem(items[0], self._delimiter) else: return InvItem(CompItem(items), self._delimiter)
class Value(object): _parser = Parser() def __init__(self, value, settings, uri): self._settings = settings self._uri = uri if isinstance(value, str): try: self._item = self._parser.parse(value, self._settings) except InterpolationError as e: e.uri = self._uri raise elif isinstance(value, list): self._item = ListItem(value, self._settings) elif isinstance(value, dict): self._item = DictItem(value, self._settings) else: self._item = ScaItem(value, self._settings) def uri(self): return self._uri def is_container(self): return self._item.is_container() def allRefs(self): return self._item.allRefs() def has_references(self): return self._item.has_references() def has_inv_query(self): return self._item.has_inv_query() def needs_all_envs(self): if self._item.has_inv_query(): return self._item.needs_all_envs() else: return False def ignore_failed_render(self): return self._item.ignore_failed_render() def is_complex(self): return self._item.is_complex() def get_references(self): return self._item.get_references() def get_inv_references(self): return self._item.get_inv_references() def assembleRefs(self, context): if self._item.has_references(): self._item.assembleRefs(context) def render(self, context, inventory): try: return self._item.render(context, inventory) except InterpolationError as e: e.uri = self._uri raise def contents(self): return self._item.contents() def merge_over(self, value): self._item = self._item.merge_over(value._item) return self def __repr__(self): return 'Value(%r)' % self._item
def _create_inv(self, tokens): items = [ ScaItem(v, self._settings) for t, v in tokens ] if len(items) == 1: return InvItem(items[0], self._settings) else: return InvItem(CompItem(items), self._settings)
class Value(object): _parser = Parser() def __init__(self, value, delimiter=PARAMETER_INTERPOLATION_DELIMITER): self._delimiter = delimiter if isinstance(value, str): self._item = self._parser.parse(value, delimiter) elif isinstance(value, list): self._item = ListItem(value) elif isinstance(value, dict): self._item = DictItem(value) else: self._item = ScaItem(value) def is_container(self): return self._item.is_container() def allRefs(self): return self._item.allRefs() def has_references(self): return self._item.has_references() def has_inv_query(self): return self._item.has_inv_query() def is_complex(self): return self._item.is_complex() def get_references(self): return self._item.get_references() def assembleRefs(self, context): if self._item.has_references(): self._item.assembleRefs(context) def render(self, context, inventory, options=None): return self._item.render(context, inventory) def contents(self): return self._item.contents() def merge_over(self, value, options): self._item = self._item.merge_over(value._item, options) return self def __repr__(self): return 'Value(%r)' % self._item