def test_single_subst_start(self): s = _var('favcolour') + ' is my favourite colour' tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual( tv.render(CONTEXT), _poor_mans_template(s, 'favcolour', CONTEXT['favcolour']))
def test_single_subst_end(self): s = 'I like ' + _var('favcolour') tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual( tv.render(CONTEXT), _poor_mans_template(s, 'favcolour', CONTEXT['favcolour']))
def test_single_subst_end(self): s = 'I like ' + _var('favcolour') tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual(tv.render(CONTEXT), _poor_mans_template(s, 'favcolour', CONTEXT['favcolour']))
def test_single_subst_start(self): s = _var('favcolour') + ' is my favourite colour' tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual(tv.render(CONTEXT), _poor_mans_template(s, 'favcolour', CONTEXT['favcolour']))
def test_deep_subst_solo(self): var = PARAMETER_INTERPOLATION_DELIMITER.join(('motd', 'greeting')) s = _var(var) tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual( tv.render(CONTEXT), _poor_mans_template(s, var, CONTEXT['motd']['greeting']))
def test_deep_subst_solo(self): var = PARAMETER_INTERPOLATION_DELIMITER.join(('motd', 'greeting')) s = _var(var) tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) self.assertEqual(tv.render(CONTEXT), _poor_mans_template(s, var, CONTEXT['motd']['greeting']))
def test_multiple_subst(self): greet = PARAMETER_INTERPOLATION_DELIMITER.join(('motd', 'greeting')) s = _var(greet) + ' I like ' + _var('favcolour') + '!' tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) want = _poor_mans_template(s, greet, CONTEXT['motd']['greeting']) want = _poor_mans_template(want, 'favcolour', CONTEXT['favcolour']) self.assertEqual(tv.render(CONTEXT), want)
def test_multiple_subst_flush(self): greet = PARAMETER_INTERPOLATION_DELIMITER.join(('motd', 'greeting')) s = _var(greet) + ' I like ' + _var('favcolour') tv = ReferenceStringParameter(s) self.assertTrue(tv.has_references()) want = _poor_mans_template(s, greet, CONTEXT['motd']['greeting']) want = _poor_mans_template(want, 'favcolour', CONTEXT['favcolour']) self.assertEqual(tv.render(CONTEXT), want)
def _update_scalar(self, cur, new, path): if isinstance(cur, ReferenceStringParameter) and path in self._occurrences: # If the current value already holds a ReferenceStringParameter, we better forget # the occurrence, or else interpolate() will later overwrite # unconditionally. If the new value is a ReferenceStringParameter, the occurrence # will be added again further on del self._occurrences[path] if self.delimiter is None or not isinstance( new, (types.StringTypes, ReferenceStringParameter)): # either there is no delimiter defined (and hence no references # are being used), or the new value is not a string (and hence # cannot be turned into a ReferenceStringParameter), and not a ReferenceStringParameter. We can # shortcut and just return the new scalar return new elif isinstance(new, ReferenceStringParameter): # the new value is (already) a ReferenceStringParameter, so we need not touch it # at all ret = new else: # the new value is a string, let's see if it contains references, # by way of wrapping it in a ReferenceStringParameter and querying the result ret = ReferenceStringParameter(new, self.delimiter) if not ret.has_references(): # do not replace with ReferenceStringParameter instance if there are no # references, i.e. discard the ReferenceStringParameter in ret, just return # the new value return new # So we now have a ReferenceStringParameter. Let's, keep a reference to the instance # we just created, in a dict indexed by the dictionary path, instead # of just a list. The keys are required to resolve dependencies during # interpolation self._occurrences[path] = ret return ret
def _update_scalar(self, cur, new, path): if isinstance(cur, ReferenceStringParameter) and path in self._occurrences: # If the current value already holds a ReferenceStringParameter, we better forget # the occurrence, or else interpolate() will later overwrite # unconditionally. If the new value is a ReferenceStringParameter, the occurrence # will be added again further on del self._occurrences[path] if self.delimiter is None or not isinstance(new, (types.StringTypes, ReferenceStringParameter)): # either there is no delimiter defined (and hence no references # are being used), or the new value is not a string (and hence # cannot be turned into a ReferenceStringParameter), and not a ReferenceStringParameter. We can # shortcut and just return the new scalar return new elif isinstance(new, ReferenceStringParameter): # the new value is (already) a ReferenceStringParameter, so we need not touch it # at all ret = new else: # the new value is a string, let's see if it contains references, # by way of wrapping it in a ReferenceStringParameter and querying the result ret = ReferenceStringParameter(new, self.delimiter) if not ret.has_references(): # do not replace with ReferenceStringParameter instance if there are no # references, i.e. discard the ReferenceStringParameter in ret, just return # the new value return new # So we now have a ReferenceStringParameter. Let's, keep a reference to the instance # we just created, in a dict indexed by the dictionary path, instead # of just a list. The keys are required to resolve dependencies during # interpolation self._occurrences[path] = ret return ret
def test_undefined_variable(self): s = _var('no_such_variable') tv = ReferenceStringParameter(s) with self.assertRaises(UndefinedVariableError): tv.render(CONTEXT)
def test_incomplete_variable(self): s = PARAMETER_INTERPOLATION_SENTINELS[0] + 'incomplete' with self.assertRaises(IncompleteInterpolationError): tv = ReferenceStringParameter(s)
def test_simple_string(self): s = 'my cat likes to hide in boxes' tv = ReferenceStringParameter(s) self.assertFalse(tv.has_references()) self.assertEquals(tv.render(CONTEXT), s)
def _test_solo_ref(self, key): s = _var(key) tv = ReferenceStringParameter(s) res = tv.render(CONTEXT) self.assertTrue(tv.has_references()) self.assertEqual(res, CONTEXT[key])