def test_translate_exclude(self): """Test exclusion in translation.""" results = fnmatch.translate('*', exclude='test') self.assertTrue(len(results[0]) == 1 and len(results[1]) == 1) results = fnmatch.translate(b'*', exclude=b'test') self.assertTrue(len(results[0]) == 1 and len(results[1]) == 1)
def test_posix_range(self): """Test posix range.""" p = fnmatch.translate(r'[[:ascii:]-z]', flags=self.flags | fnmatch.U | fnmatch.C) self.assertEqual(p, (['^(?s:[\x00-\x7f\\-z])$'], [])) p = fnmatch.translate(r'[a-[:ascii:]-z]', flags=self.flags | fnmatch.U | fnmatch.C) self.assertEqual(p, (['^(?s:[a\\-\x00-\x7f\\-z])$'], []))
def test_default_translate(self): """Test default with exclusion in translation.""" self.assertTrue( len(fnmatch.translate('!test', flags=fnmatch.N | fnmatch.A)[0]) == 1) self.assertTrue( len(fnmatch.translate(b'!test', flags=fnmatch.N | fnmatch.A)[0]) == 1)
def test_posix_range(self): """Test posix range.""" p = fnmatch.translate(r'[[:ascii:]-z]', flags=self.flags | fnmatch.F) if util.PY36: self.assertEqual(p, (['^(?s:[\x00-\x7f\\-z])$'], [])) else: self.assertEqual(p, (['(?s)^(?:[\x00-\x7f\\-z])$'], [])) p = fnmatch.translate(r'[a-[:ascii:]-z]', flags=self.flags | fnmatch.F) if util.PY36: self.assertEqual(p, (['^(?s:[a\\-\x00-\x7f\\-z])$'], [])) else: self.assertEqual(p, (['(?s)^(?:[a\\-\x00-\x7f\\-z])$'], []))
def test_list_groups(self): """Test capture groups with lists.""" gpat = fnmatch.translate("+(f|i|l|e)+([[:digit:]])@(.*)", flags=fnmatch.E) pat = re.compile(gpat[0][0]) match = pat.match('file33.test.txt') self.assertEqual(('file', '33', '.test.txt'), match.groups())
def test_nested_capture_groups(self): """Test nested capture groups.""" gpat = fnmatch.translate("@(file)@(+([[:digit:]]))@(.*)", flags=fnmatch.E) pat = re.compile(gpat[0][0]) match = pat.match('file33.test.txt') self.assertEqual(('file', '33', '33', '.test.txt'), match.groups())
def test_capture_groups(self): """Test capture groups.""" gpat = fnmatch.translate("test @(this) +(many) ?(meh)*(!) !(not this)@(.md)", flags=fnmatch.E) pat = re.compile(gpat[0][0]) match = pat.match('test this manymanymany meh!!!!! okay.md') self.assertEqual(('this', 'manymanymany', 'meh', '!!!!!', 'okay', '.md'), match.groups())
def test_translate_exclude_mix(self): """ Test translate exclude mix. If both are given, flags are ignored. """ results = fnmatch.translate(['*', '!test'], exclude=b'test', flags=fnmatch.N | fnmatch.A) self.assertTrue(len(results[0]) == 2 and len(results[1]) == 1)
def test_special_escapes(self, mock__iscase_sensitive): """Test wildcard character notations.""" mock__iscase_sensitive.return_value = True _wcparse._compile.cache_clear() p1, p2 = fnmatch.translate( r'test\x70\u0070\U00000070\160\N{LATIN SMALL LETTER P}', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:testppppp)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:testppppp)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate( r'test[\x70][\u0070][\U00000070][\160][\N{LATIN SMALL LETTER P}]', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:test[p][p][p][p][p])$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test[p][p][p][p][p])$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate(r'test\t\m', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:test\ m)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test\ m)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate(r'test[\\]test', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:test[\\]test)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test[\\]test)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate('test[\\', flags=self.flags) if util.PY36: self.assertEqual(p1, [r'^(?s:test\[\\)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test\[\\)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate(r'test\44test', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:test\$test)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test\$test)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate(r'test\44', flags=self.flags | fnmatch.R) if util.PY36: self.assertEqual(p1, [r'^(?s:test\$)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test\$)$']) self.assertEqual(p2, []) p1, p2 = fnmatch.translate(r'test\400', flags=self.flags | fnmatch.R) if util.PY37: self.assertEqual(p1, [r'^(?s:testĀ)$']) self.assertEqual(p2, []) elif util.PY36: self.assertEqual(p1, [r'^(?s:test\Ā)$']) self.assertEqual(p2, []) else: self.assertEqual(p1, [r'(?s)^(?:test\Ā)$']) self.assertEqual(p2, []) with pytest.raises(SyntaxError): fnmatch.translate(r'test\N', flags=self.flags | fnmatch.R) with pytest.raises(SyntaxError): fnmatch.translate(r'test\Nx', flags=self.flags | fnmatch.R) with pytest.raises(SyntaxError): fnmatch.translate(r'test\N{', flags=self.flags | fnmatch.R)
def split_translate(self, pattern, flags): """Translate pattern to regex after splitting.""" return fnmatch.translate(fnmatch.fnsplit(pattern, flags=flags), flags=flags)
def test_limit_translate(self): """Test expansion limit of `translate`.""" with self.assertRaises(_wcparse.PatternLimitException): fnmatch.translate('{1..11}', flags=fnmatch.BRACE, limit=10)