From 0fdcf89c321f983c20ce62bc7c555eb6800a89d0 Mon Sep 17 00:00:00 2001 From: Vincent Le Goff Date: Tue, 25 Jul 2017 14:28:54 +0200 Subject: [PATCH] Update the generator module with new method names --- evennia/contrib/generator.py | 198 +++++++++++++++++------------------ evennia/contrib/tests.py | 4 +- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/evennia/contrib/generator.py b/evennia/contrib/generator.py index 84d6401dcf..91cfa77c7b 100644 --- a/evennia/contrib/generator.py +++ b/evennia/contrib/generator.py @@ -15,12 +15,12 @@ from evennia.contrib.generator import Generator # Create a generator for phone numbers phone_generator = Generator("phone number", r"555-\d{3}-\d{4}") # Generate a phone number (555-XXX-XXXX with X as numbers) -number = phone_generator.generate() +number = phone_generator.get() # `number` will contain something like: "555-981-2207" -# If you call `phone_generator.generate`, it won't give the same anymore. +# If you call `phone_generator.get`, it won't give the same anymore. phone_generator.all() # Will return a list of all currently-used phone numbers -phone_generator.free("555-981-2207") +phone_generator.remove("555-981-2207") # The number can be generated again ``` @@ -30,7 +30,7 @@ To use it, you will need to: 2. Create an instance of this class taking two arguments: - Tje name of tje gemerator (like "phone number", "license plate"...). - The regular expression representing the expected results. -3. Use the generator's `all`, `generate` and `free` methods as shown above. +3. Use the generator's `all`, `get` and `remove` methods as shown above. Some examples of regular expressions you could use: @@ -103,7 +103,7 @@ class Generator(object): The "rule" defining what the generator should provide in terms of string is given as a regular expression when creating instances of this class. You can use the `all` method to get all generated strings, - the `generate` method to generate a new string, the `free` method + the `get` method to generate a new string, the `remove` method to remove a generated string, or the `clear` method to remove all generated strings. @@ -155,100 +155,6 @@ class Generator(object): def __repr__(self): return "".format(self.name) - def all(self): - """ - Return all generated strings for this generator. - - Returns: - strings (list of strr): the list of strings that are already - used. The strings that were generated first come first in the list. - - """ - script = self._get_script() - generated = list(script.db.generated.get(self.name, [])) - return generated - - def generate(self, store=True, keep_trying=True): - """ - Generate a pseudo-random string according to the regular expression. - - Args: - store (bool, optional): store the generated string in the script. - keep_trying (bool, optional): keep on trying if the string is already used. - - Returns: - The newly-generated string. - - Raises: - ExhaustedGenerator: if there's no available string in this generator. - - Note: - Unless asked explicitly, the returned string can't repeat itself. - - """ - script = self._get_script() - generated = script.db.generated.get(self.name) - if generated is None: - script.db.generated[self.name] = [] - generated = script.db.generated[self.name] - - if len(generated) >= self.total: - raise ExhaustedGenerator - - # Generate a pseudo-random string that might be used already - result = "" - for element in self.elements: - number = randint(element["min"], element["max"]) - chars = element["chars"] - for index in range(number): - char = choice(chars) - result += char - - # If the string has already been generated, try again - if result in generated and keep_trying: - # Change the random seed, incrementing it slowly - epoch = time.time() - while result in generated: - epoch += 1 - seed(epoch) - result = self.generate(store=False, keep_trying=False) - - if store: - generated.append(result) - - return result - - def free(self, element): - """ - Remove a generated string from the list of stored strings. - - Args: - element (str): the string to remove from the list of generated strings. - - Note: - The specified string has to be present in the script (so - has to have been generated). It will remove this entry - from the script, so this string could be generated again by - calling the `generate` method. - - """ - script = self._get_script() - generated = script.db.generated.get(self.name, []) - if element not in generated: - raise ValueError("the string {} isn't stored as generated by the generator {}".format( - element, self.name)) - - generated.remove(element) - - def clear(self): - """ - Clear the generator of all generated strings. - - """ - script = self._get_script() - generated = script.db.generated.get(self.name, []) - generated[:] = [] - def _get_script(self): """Get or create the script.""" if type(self).script: @@ -338,3 +244,97 @@ class Generator(object): raise RejectedRegex("cannot find the literal: {}".format(element[0])) return chars + + def all(self): + """ + Return all generated strings for this generator. + + Returns: + strings (list of strr): the list of strings that are already + used. The strings that were generated first come first in the list. + + """ + script = self._get_script() + generated = list(script.db.generated.get(self.name, [])) + return generated + + def get(self, store=True, keep_trying=True): + """ + Generate a pseudo-random string according to the regular expression. + + Args: + store (bool, optional): store the generated string in the script. + keep_trying (bool, optional): keep on trying if the string is already used. + + Returns: + The newly-generated string. + + Raises: + ExhaustedGenerator: if there's no available string in this generator. + + Note: + Unless asked explicitly, the returned string can't repeat itself. + + """ + script = self._get_script() + generated = script.db.generated.get(self.name) + if generated is None: + script.db.generated[self.name] = [] + generated = script.db.generated[self.name] + + if len(generated) >= self.total: + raise ExhaustedGenerator + + # Generate a pseudo-random string that might be used already + result = "" + for element in self.elements: + number = randint(element["min"], element["max"]) + chars = element["chars"] + for index in range(number): + char = choice(chars) + result += char + + # If the string has already been generated, try again + if result in generated and keep_trying: + # Change the random seed, incrementing it slowly + epoch = time.time() + while result in generated: + epoch += 1 + seed(epoch) + result = self.get(store=False, keep_trying=False) + + if store: + generated.append(result) + + return result + + def remove(self, element): + """ + Remove a generated string from the list of stored strings. + + Args: + element (str): the string to remove from the list of generated strings. + + Note: + The specified string has to be present in the script (so + has to have been generated). It will remove this entry + from the script, so this string could be generated again by + calling the `get` method. + + """ + script = self._get_script() + generated = script.db.generated.get(self.name, []) + if element not in generated: + raise ValueError("the string {} isn't stored as generated by the generator {}".format( + element, self.name)) + + generated.remove(element) + + def clear(self): + """ + Clear the generator of all generated strings. + + """ + script = self._get_script() + generated = script.db.generated.get(self.name, []) + generated[:] = [] diff --git a/evennia/contrib/tests.py b/evennia/contrib/tests.py index d89ac6c7b6..6add0571a4 100644 --- a/evennia/contrib/tests.py +++ b/evennia/contrib/tests.py @@ -997,7 +997,7 @@ class TestGenerator(EvenniaTest): """Generate and fail when exhausted.""" generated = [] for i in range(4): - generated.append(SIMPLE_GENERATOR.generate()) + generated.append(SIMPLE_GENERATOR.get()) generated.sort() self.assertEqual(generated, ["00", "01", "10", "11"]) @@ -1005,4 +1005,4 @@ class TestGenerator(EvenniaTest): # At this point, we have generated 4 strings. # We can't generate one more with self.assertRaises(generator.ExhaustedGenerator): - SIMPLE_GENERATOR.generate() + SIMPLE_GENERATOR.get()