class Hello(core.Tag): options = core.Options( arguments.Argument('name', required=False, default='world'), 'as', arguments.Argument('varname', required=False, resolve=False)) def render_tag(self, context, name, varname): output = 'hello %s' % name if varname: context[varname] = output return '' return output
def test_optional_given(self): options = core.Options( arguments.Argument('myarg'), arguments.Argument('optarg', required=False, default=None), ) dummy_tokens = DummyTokens('myval', 'optval') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 2) dummy_context = {} self.assertEqual(kwargs['myarg'].resolve(dummy_context), 'myval') self.assertEqual(kwargs['optarg'].resolve(dummy_context), 'optval')
def test_partial_breakpoints_both(self): options = core.Options( arguments.Argument('first'), 'also', 'using', arguments.Argument('second', required=False), ) # check only using the first breakpoint dummy_tokens = DummyTokens('firstval', 'also', 'secondval') # should raise an exception self.assertRaises(exceptions.BreakpointExpected, options.parse, dummy_parser, dummy_tokens)
def test_06_complex(self): """ test a complex tag option parser """ options = core.Options( arguments.Argument('singlearg'), arguments.MultiValueArgument('multiarg', required=False), 'as', arguments.Argument('varname', required=False), 'safe', arguments.Flag('safe', true_values=['on', 'true'], default=False) ) # test simple 'all arguments given' dummy_tokens = DummyTokens(1, 2, 3, 'as', 4, 'safe', 'true') dummy_context = {} kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 4) expected = [ ('singlearg', 1), ('multiarg', [2, 3]), ('varname', 4), ('safe', True) ] for key, value in expected: self.assertEqual(kwargs[key].resolve(dummy_context), value) # test 'only first argument given' dummy_tokens = DummyTokens(1) kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 4) expected = [ ('singlearg', 1), ('multiarg', []), ('varname', None), ('safe', False) ] for key, value in expected: self.assertEqual(kwargs[key].resolve(dummy_context), value) # test first argument and last argument given dummy_tokens = DummyTokens(2, 'safe', 'false') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 4) expected = [ ('singlearg', 2), ('multiarg', []), ('varname', None), ('safe', False) ] for key, value in expected: self.assertEqual(kwargs[key].resolve(dummy_context), value)
def test_breakpoints_not_enough_arguments(self): """ Test parsing with breakpoints """ options = core.Options( arguments.Argument('myarg'), 'as', arguments.Argument('varname'), 'using', arguments.Argument('using'), ) dummy_tokens = DummyTokens('myval') self.assertRaises(exceptions.ArgumentRequiredError, options.parse, dummy_parser, dummy_tokens)
def test_optional_firstonly(self): options = core.Options( arguments.Argument('first'), 'also', 'using', arguments.Argument('second', required=False), ) # check only using the first argument dummy_tokens = DummyTokens('firstval') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 2) dummy_context = {} self.assertEqual(kwargs['first'].resolve(dummy_context), 'firstval') self.assertEqual(kwargs['second'].resolve(dummy_context), None)
class SuppressException(helpers.AsTag): options = core.Options( arguments.Argument('name'), 'as', arguments.Argument('var', resolve=False, required=False), ) def get_value(self, context, name): raise MyException(name) def get_value_for_context(self, context, name): try: return self.get_value(context, name) except MyException: return message
def test_optional_both(self): options = core.Options( arguments.Argument('first'), 'also', 'using', arguments.Argument('second', required=False), ) # check using both arguments and both breakpoints dummy_tokens = DummyTokens('firstval', 'also', 'using', 'secondval') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 2) dummy_context = {} self.assertEqual(kwargs['first'].resolve(dummy_context), 'firstval') self.assertEqual(kwargs['second'].resolve(dummy_context), 'secondval')
def test_complex_only_first_argument(self): options = core.Options( arguments.Argument('singlearg'), arguments.MultiValueArgument('multiarg', required=False), 'as', arguments.Argument('varname', required=False), 'safe', arguments.Flag('safe', true_values=['on', 'true'], default=False)) # test 'only first argument given' dummy_tokens = DummyTokens(1) dummy_context = {} kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 4) expected = [('singlearg', 1), ('multiarg', []), ('varname', None), ('safe', False)] for key, value in expected: self.assertEqual(kwargs[key].resolve(dummy_context), value)
class With(core.Tag): name = 'ct_with' options = core.Options( arguments.Argument('value'), 'as', arguments.Argument('varname', resolve=False), blocks=['endwith'], ) def render_tag(self, context, value, varname, endwith): context.push() context[varname] = value output = endwith.render(context) context.pop() return output
class Inc(helpers.InclusionTag): template = 'test.html' options = core.Options(arguments.Argument('var'), ) def get_context(self, context, var): return {'var': var}
def test_breakpoint_okay(self): options = core.Options( arguments.Argument('myarg'), 'as', arguments.Argument('varname'), 'using', arguments.Argument('using'), ) dummy_tokens = DummyTokens('myval', 'as', 'myname', 'using', 'something') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 3) dummy_context = {} self.assertEqual(kwargs['myarg'].resolve(dummy_context), 'myval') self.assertEqual(kwargs['varname'].resolve(dummy_context), 'myname') self.assertEqual(kwargs['using'].resolve(dummy_context), 'something')
class Dummy(helpers.AsTag): options = core.Options( 'as', arguments.Argument('varname', resolve=False, required=False), ) def get_value(self, context): return "dummy"
class IncPollute(helpers.InclusionTag): template = 'test.html' options = core.Options(arguments.Argument('var')) def get_context(self, context, var): context.update({'var': 'polluted'}) return context
class For(core.Tag): name = 'ct_for' options = core.Options( CommaSeperatableMultiValueArgument('loopvars', resolve=False), 'in', arguments.Argument('values'), blocks=[('empty', 'pre_empty'), ('endfor', 'post_empty')], ) def render_tag(self, context, loopvars, values, pre_empty, post_empty): if 'forloop' in context: parentloop = context['forloop'] else: parentloop = {} context.push() if not hasattr(values, '__len__'): values = list(values) len_values = len(values) if len_values < 1: context.pop() return post_empty.render(context) nodelist = template.NodeList() unpack = len(loopvars) > 1 # Create a forloop value in the context. We'll update counters on each # iteration just below. loop_dict = context['forloop'] = {'parentloop': parentloop} for i, item in enumerate(values): # Shortcuts for current loop iteration number. loop_dict['counter0'] = i loop_dict['counter'] = i+1 # Reverse counter iteration numbers. loop_dict['revcounter'] = len_values - i loop_dict['revcounter0'] = len_values - i - 1 # Boolean values designating first and last times through loop. loop_dict['first'] = (i == 0) loop_dict['last'] = (i == len_values - 1) if unpack: # If there are multiple loop variables, unpack the item into # them. context.update(dict(zip(loopvars, item))) else: context[loopvars[0]] = item for node in pre_empty: nodelist.append(node.render(context)) if unpack: # The loop variables were pushed on to the context so pop them # off again. This is necessary because the tag lets the length # of loopvars differ to the length of each set of items and we # don't want to leave any vars from the previous loop on the # context. context.pop() context.pop() return nodelist.render(context)
def test_simple_parsing(self): """ Test very basic single argument parsing """ options = core.Options(arguments.Argument('myarg'), ) dummy_tokens = DummyTokens('myval') kwargs, blocks = options.parse(dummy_parser, dummy_tokens) self.assertEqual(blocks, {}) self.assertEqual(len(kwargs), 1) dummy_context = {} self.assertEqual(kwargs['myarg'].resolve(dummy_context), 'myval')
class Now(core.Tag): name = 'ct_now' options = core.Options( arguments.Argument('format_string'), ) def render_tag(self, context, format_string): from datetime import datetime from django.utils.dateformat import DateFormat df = DateFormat(datetime.now()) return df.format(format_string)
class StartBlock(core.Tag): options = core.Options(arguments.Argument("myarg", resolve=False), blocks=[ BlockDefinition( "nodelist", VariableBlockName( "end_block %(value)s", 'myarg'), "end_block") ]) def render_tag(self, context, myarg, nodelist): return "nodelist:%s;myarg:%s" % (nodelist.render(context), myarg)
class Cycle(core.Tag): name = 'classy_cycle' options = core.Options( arguments.MultiValueArgument('values'), 'as', arguments.Argument('varname', required=False, resolve=False), ) def render_tag(self, context, values, varname): if self not in context.render_context: context.render_context[self] = itertools_cycle(values) cycle_iter = context.render_context[self] value = cycle_iter.next() if varname: context[varname] = value return value
class Fail4(helpers.AsTag): options = core.Options( 'as', arguments.Argument('varname', resolve=False), )
def test_simple_parsing_too_many_arguments(self): options = core.Options(arguments.Argument('myarg'), ) dummy_tokens = DummyTokens('myval', 'myval2') self.assertRaises(exceptions.TooManyArguments, options.parse, dummy_parser, dummy_tokens)