def generate(amt: int) -> None : rs = Rstr(SystemRandom()) codes = dict() if os.path.exists(codes_path) : with open(codes_path, 'r') as fp : codes = json.load(fp)['codes'] count = 0 new_codes = [] while count < amt : cd = rs.xeger(pattern) if cd not in codes : new_codes.append(cd) codes[cd] = True count += 1 # separate JSON of most recently generated codes with open(os.path.join(path, 'obj/new-codes.json'), 'w') as fp : json.dump({'codes' : {cd : True for cd in new_codes}}, fp, indent=INDENT) else : codes = {rs.xeger(pattern) : True for _ in range(amt)} with open(codes_path, 'w') as fp : json.dump({'codes' : codes}, fp, indent=INDENT)
class Regex(Generator): def __init__(self, regex, seed=None): self.gen = Rstr(Random(seed)) self.regex = regex def get_single(self): return self.gen.xeger(self.regex)
class TestXeger(unittest.TestCase): def setUp(self) -> None: self.rs = Rstr() def test_literals(self) -> None: pattern = r'foo' assert re.match(pattern, self.rs.xeger(pattern)) def test_dot(self) -> None: ''' Verify that the dot character doesn't produce newlines. See: https://bitbucket.org/leapfrogdevelopment/rstr/issue/1/ ''' pattern = r'.+' for i in range(100): assert re.match(pattern, self.rs.xeger(pattern)) def test_digit(self) -> None: pattern = r'\d' assert re.match(pattern, self.rs.xeger(pattern)) def test_nondigits(self) -> None: pattern = r'\D' assert re.match(pattern, self.rs.xeger(pattern)) def test_literal_with_repeat(self) -> None: pattern = r'A{3}' assert re.match(pattern, self.rs.xeger(pattern)) def test_literal_with_range_repeat(self) -> None: pattern = r'A{2, 5}' assert re.match(pattern, self.rs.xeger(pattern)) def test_word(self) -> None: pattern = r'\w' assert re.match(pattern, self.rs.xeger(pattern)) def test_nonword(self) -> None: pattern = r'\W' assert re.match(pattern, self.rs.xeger(pattern)) def test_or(self) -> None: pattern = r'foo|bar' assert re.match(pattern, self.rs.xeger(pattern)) def test_or_with_subpattern(self) -> None: pattern = r'(foo|bar)' assert re.match(pattern, self.rs.xeger(pattern)) def test_range(self) -> None: pattern = r'[A-F]' assert re.match(pattern, self.rs.xeger(pattern)) def test_character_group(self) -> None: pattern = r'[ABC]' assert re.match(pattern, self.rs.xeger(pattern)) def test_carot(self) -> None: pattern = r'^foo' assert re.match(pattern, self.rs.xeger(pattern)) def test_dollarsign(self) -> None: pattern = r'foo$' assert re.match(pattern, self.rs.xeger(pattern)) def test_not_literal(self) -> None: pattern = r'[^a]' assert re.match(pattern, self.rs.xeger(pattern)) def test_negation_group(self) -> None: pattern = r'[^AEIOU]' assert re.match(pattern, self.rs.xeger(pattern)) def test_lookahead(self) -> None: pattern = r'foo(?=bar)' assert re.match(pattern, self.rs.xeger(pattern)) def test_lookbehind(self) -> None: pattern = r'(?<=foo)bar' assert re.search(pattern, self.rs.xeger(pattern)) def test_backreference(self) -> None: pattern = r'(foo|bar)baz\1' assert re.match(pattern, self.rs.xeger(pattern)) def test_zero_or_more_greedy(self) -> None: pattern = r'a*' assert re.match(pattern, self.rs.xeger(pattern)) def test_zero_or_more_non_greedy(self) -> None: pattern = r'a*?' assert re.match(pattern, self.rs.xeger(pattern))
def gen_access_key(self): rs = Rstr(SystemRandom()) self.access_key = rs.xeger(r'[A-Z]\d[A-Z]-\d[A-Z]\d') return self.access_key