Fix for reference check in core
Reference sentinel was hardcoded in core, replaced it with
proper counting of actual sentinels that are present in
settings.
diff --git a/reclass/core.py b/reclass/core.py
index e3142af..3e0ab34 100644
--- a/reclass/core.py
+++ b/reclass/core.py
@@ -114,7 +114,9 @@
for klass in entity.classes.as_list():
# class name contain reference
- if klass.count('$') > 0:
+ num_references = klass.count(self._settings.reference_sentinels[0]) +\
+ klass.count(self._settings.export_sentinels[0])
+ if num_references > 0:
try:
klass = str(self._parser.parse(klass, self._settings).render(merge_base.parameters.as_dict(), {}))
except ResolveError as e:
diff --git a/reclass/values/parser.py b/reclass/values/parser.py
index 4d4e12c..255e477 100644
--- a/reclass/values/parser.py
+++ b/reclass/values/parser.py
@@ -29,14 +29,12 @@
raise ParseError(e.msg, e.line, e.col, e.lineno)
self._settings = settings
- parser_settings = (settings.escape_character,
- settings.reference_sentinels,
- settings.export_sentinels)
- ref_parser = parsers.get_ref_parser(*parser_settings)
- simple_ref_parser = parsers.get_simple_ref_parser(*parser_settings)
+ ref_parser = parsers.get_ref_parser(settings)
+ simple_ref_parser = parsers.get_simple_ref_parser(settings)
sentinel_count = (value.count(settings.reference_sentinels[0]) +
value.count(settings.export_sentinels[0]))
+
if sentinel_count == 0:
# speed up: only use pyparsing if there are sentinels in the value
return ScaItem(value, self._settings)
@@ -68,5 +66,4 @@
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)
+ return InvItem(CompItem(items), self._settings)
diff --git a/reclass/values/parser_funcs.py b/reclass/values/parser_funcs.py
index 3c24b40..f702910 100644
--- a/reclass/values/parser_funcs.py
+++ b/reclass/values/parser_funcs.py
@@ -34,6 +34,8 @@
ALL_ENVS = '+AllEnvs'
+s_end = pp.StringEnd()
+
def _tag_with(tag, transform=lambda x:x):
def inner(tag, string, location, tokens):
token = transform(tokens[0])
@@ -41,8 +43,6 @@
return functools.partial(inner, tag)
def get_expression_parser():
-
- s_end = pp.StringEnd()
sign = pp.Optional(pp.Literal('-'))
number = pp.Word(pp.nums)
dpoint = pp.Literal('.')
@@ -80,12 +80,11 @@
line = options + expr + s_end
return line
-def get_ref_parser(escape_character, reference_sentinels, export_sentinels):
- _ESCAPE = escape_character
+def get_ref_parser(settings):
+ _ESCAPE = settings.escape_character
_DOUBLE_ESCAPE = _ESCAPE + _ESCAPE
- _REF_OPEN = reference_sentinels[0]
- _REF_CLOSE = reference_sentinels[1]
+ _REF_OPEN, _REF_CLOSE = settings.reference_sentinels
_REF_CLOSE_FIRST = _REF_CLOSE[0]
_REF_ESCAPE_OPEN = _ESCAPE + _REF_OPEN
_REF_ESCAPE_CLOSE = _ESCAPE + _REF_CLOSE
@@ -93,8 +92,7 @@
_REF_DOUBLE_ESCAPE_CLOSE = _DOUBLE_ESCAPE + _REF_CLOSE
_REF_EXCLUDES = _ESCAPE + _REF_OPEN + _REF_CLOSE
- _INV_OPEN = export_sentinels[0]
- _INV_CLOSE = export_sentinels[1]
+ _INV_OPEN, _INV_CLOSE = settings.export_sentinels
_INV_CLOSE_FIRST = _INV_CLOSE[0]
_INV_ESCAPE_OPEN = _ESCAPE + _INV_OPEN
_INV_ESCAPE_CLOSE = _ESCAPE + _INV_CLOSE
@@ -142,20 +140,20 @@
string = pp.MatchFirst([double_escape, ref_escape_open, inv_escape_open, content]).setParseAction(_tag_with(STR))
item = reference | export | string
- line = pp.OneOrMore(item) + pp.StringEnd()
+ line = pp.OneOrMore(item) + s_end
return line.leaveWhitespace()
-def get_simple_ref_parser(escape_character, reference_sentinels, export_sentinels):
- _ESCAPE = escape_character
- _REF_OPEN = reference_sentinels[0]
- _REF_CLOSE = reference_sentinels[1]
- _INV_OPEN = export_sentinels[0]
- _INV_CLOSE = export_sentinels[1]
- _EXCLUDES = _ESCAPE + _REF_OPEN + _REF_CLOSE + _INV_OPEN + _INV_CLOSE
- string = pp.CharsNotIn(_EXCLUDES).setParseAction(_tag_with(STR))
- ref_open = pp.Literal(_REF_OPEN).suppress()
- ref_close = pp.Literal(_REF_CLOSE).suppress()
+def get_simple_ref_parser(settings):
+
+ ESCAPE = settings.escape_character
+ REF_OPEN, REF_CLOSE = settings.reference_sentinels
+ INV_OPEN, INV_CLOSE = settings.export_sentinels
+ EXCLUDES = ESCAPE + REF_OPEN + REF_CLOSE + INV_OPEN + INV_CLOSE
+
+ string = pp.CharsNotIn(EXCLUDES).setParseAction(_tag_with(STR))
+ ref_open = pp.Literal(REF_OPEN).suppress()
+ ref_close = pp.Literal(REF_CLOSE).suppress()
reference = (ref_open + pp.Group(string) + ref_close).setParseAction(_tag_with(REF))
- line = pp.StringStart() + pp.Optional(string) + reference + pp.Optional(string) + pp.StringEnd()
+ line = pp.StringStart() + pp.Optional(string) + reference + pp.Optional(string) + s_end
return line.leaveWhitespace()