Skip to content

Commit 57d20dd

Browse files
authored
Merge pull request #42 from deipfei/seeded_flatten
added a seed to grammar.flatten
2 parents 101915d + d2e7814 commit 57d20dd

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

tests/test_tracery.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,17 @@ def test_upper_and_lowercase(self):
386386
self.assertEqual("hello, WORLD!", grammar.flatten("#origin#"))
387387

388388

389+
class TestSeeds(TestPytracery):
390+
def test_seeds(self):
391+
src = "#origin#"
392+
allow_escape_chars = False
393+
seed = 1
394+
out1 = self.grammar.flatten(src, allow_escape_chars, seed)
395+
out2 = self.grammar.flatten(src, allow_escape_chars, seed)
396+
397+
self.assertEqual(out1, out2)
398+
399+
389400
class TestErrors(TestPytracery):
390401

391402
def test_plaintext_short(self):

tracery/__init__.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self, parent, child_index, settings):
2929
self.child_index = child_index
3030
self.raw = settings['raw']
3131
self.type = settings.get('type', None)
32+
self.seed=settings.get('seed', None)
3233
self.is_expanded = False
3334

3435
def expand_children(self, child_rule, prevent_recursion=False):
@@ -40,7 +41,7 @@ def expand_children(self, child_rule, prevent_recursion=False):
4041
sections, errors = parse(child_rule)
4142
self.errors.extend(errors)
4243
for i, section in enumerate(sections):
43-
node = Node(self, i, section)
44+
node = Node(self, i, {**section, 'seed': self.seed})
4445
self.children.append(node)
4546
if not prevent_recursion:
4647
node.expand(prevent_recursion)
@@ -138,14 +139,14 @@ def activate(self):
138139
self.finished_rules = []
139140
self.rule_nodes = []
140141
for rule_section in self.rule_sections:
141-
n = Node(grammar, 0, {'type': -1, 'raw': rule_section})
142+
n = Node(grammar, 0, {'type': -1, 'raw': rule_section, 'seed': self.node.seed})
142143
n.expand()
143144
self.finished_rules.append(n.finished_text)
144145
grammar.push_rules(self.target, self.finished_rules, self)
145146
elif self.type == 1:
146147
grammar.pop_rules(self.target)
147148
elif self.type == 2:
148-
grammar.flatten(self.target, True)
149+
grammar.flatten(self.target, True, self.node.seed)
149150

150151
def to_text(self): pass # FIXME
151152

@@ -230,19 +231,20 @@ def load_from_raw_obj(self, raw):
230231
self.symbols = dict(
231232
(k, Symbol(self, k, v)) for k, v in raw.items())
232233

233-
def create_root(self, rule):
234-
return Node(self, 0, {'type': -1, 'raw': rule})
234+
def create_root(self, rule, seed=None):
235+
return Node(self, 0, {'type': -1, 'raw': rule, 'seed': seed})
235236

236-
def expand(self, rule, allow_escape_chars=False):
237-
root = self.create_root(rule)
237+
def expand(self, rule, allow_escape_chars=False, seed=None):
238+
root = self.create_root(rule, seed)
238239
root.expand()
239240
if not allow_escape_chars:
240241
root.clear_escape_chars()
241242
self.errors.extend(root.errors)
242243
return root
243244

244-
def flatten(self, rule, allow_escape_chars=False):
245-
root = self.expand(rule, allow_escape_chars)
245+
def flatten(self, rule, allow_escape_chars=False, seed=None):
246+
random.seed(seed)
247+
root = self.expand(rule, allow_escape_chars, seed)
246248
return root.finished_text
247249

248250
def push_rules(self, key, raw_rules, source_action=None):

0 commit comments

Comments
 (0)