73 - "{get(extras, key)}" |
73 - "{get(extras, key)}" |
74 - "{files|json}" |
74 - "{files|json}" |
75 """ |
75 """ |
76 |
76 |
77 def __init__(self, gen, values, makemap, joinfmt, keytype=None): |
77 def __init__(self, gen, values, makemap, joinfmt, keytype=None): |
78 if gen is not None: |
78 self._gen = gen # generator or function returning generator |
79 self._gen = gen # generator or function returning generator |
|
80 self._values = values |
79 self._values = values |
81 self._makemap = makemap |
80 self._makemap = makemap |
82 self.joinfmt = joinfmt |
81 self.joinfmt = joinfmt |
83 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved |
82 self.keytype = keytype # hint for 'x in y' where type(x) is unresolved |
84 |
83 |
85 def _gen(self): |
|
86 """Default generator to stringify this as {join(self, ' ')}""" |
|
87 for i, x in enumerate(self._values): |
|
88 if i > 0: |
|
89 yield ' ' |
|
90 yield self.joinfmt(x) |
|
91 def itermaps(self, context): |
84 def itermaps(self, context): |
92 makemap = self._makemap |
85 makemap = self._makemap |
93 for x in self._values: |
86 for x in self._values: |
94 yield makemap(x) |
87 yield makemap(x) |
95 |
88 |
96 def show(self, context, mapping): |
89 def show(self, context, mapping): |
97 # TODO: switch gen to (context, mapping) API? |
90 # TODO: switch gen to (context, mapping) API? |
98 gen = self._gen |
91 gen = self._gen |
|
92 if gen is None: |
|
93 return joinitems((self.joinfmt(x) for x in self._values), ' ') |
99 if callable(gen): |
94 if callable(gen): |
100 return gen() |
95 return gen() |
101 return gen |
96 return gen |
102 |
97 |
103 def tovalue(self, context, mapping): |
98 def tovalue(self, context, mapping): |
554 def getdictitem(dictarg, key): |
549 def getdictitem(dictarg, key): |
555 val = dictarg.get(key) |
550 val = dictarg.get(key) |
556 if val is None: |
551 if val is None: |
557 return |
552 return |
558 return wraphybridvalue(dictarg, key, val) |
553 return wraphybridvalue(dictarg, key, val) |
|
554 |
|
555 def joinitems(itemiter, sep): |
|
556 """Join items with the separator; Returns generator of bytes""" |
|
557 first = True |
|
558 for x in itemiter: |
|
559 if first: |
|
560 first = False |
|
561 else: |
|
562 yield sep |
|
563 yield x |