#48: make the tag matching smarter
This commit is contained in:
		
							parent
							
								
									99be40a433
								
							
						
					
					
						commit
						ec88ea73f6
					
				@ -105,21 +105,21 @@ class Tag(SluggedModel):
 | 
			
		||||
 | 
			
		||||
        if self.matching_algorithm == self.MATCH_ALL:
 | 
			
		||||
            for word in self.match.split(" "):
 | 
			
		||||
                if word not in text:
 | 
			
		||||
                if not re.search(r"\b{}\b".format(word), text):
 | 
			
		||||
                    return False
 | 
			
		||||
            return True
 | 
			
		||||
 | 
			
		||||
        if self.matching_algorithm == self.MATCH_ANY:
 | 
			
		||||
            for word in self.match.split(" "):
 | 
			
		||||
                if word in text:
 | 
			
		||||
                if re.search(r"\b{}\b".format(word), text):
 | 
			
		||||
                    return True
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        if self.matching_algorithm == self.MATCH_LITERAL:
 | 
			
		||||
            return self.match in text
 | 
			
		||||
            return bool(re.search(r"\b{}\b".format(self.match), text))
 | 
			
		||||
 | 
			
		||||
        if self.matching_algorithm == self.MATCH_REGEX:
 | 
			
		||||
            return re.search(re.compile(self.match), text)
 | 
			
		||||
            return bool(re.search(re.compile(self.match), text))
 | 
			
		||||
 | 
			
		||||
        raise NotImplementedError("Unsupported matching algorithm")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										120
									
								
								src/documents/tests/test_tags.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/documents/tests/test_tags.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,120 @@
 | 
			
		||||
from django.test import TestCase
 | 
			
		||||
 | 
			
		||||
from ..models import Tag
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestTagMatching(TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_match_all(self):
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 0",
 | 
			
		||||
            match="alpha charlie gamma",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_ALL
 | 
			
		||||
        )
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have charlie in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha and charlie in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have alpha, charlie, and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas, charlie, and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have bravo in me"))
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 1",
 | 
			
		||||
            match="12 34 56",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_ALL
 | 
			
		||||
        )
 | 
			
		||||
        self.assertFalse(t.matches("I have 12 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 34 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 56 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 12 and 34 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 12 34, and 56 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 120, 34, and 56 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 123456 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 01234567 in me"))
 | 
			
		||||
 | 
			
		||||
    def test_match_any(self):
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 0",
 | 
			
		||||
            match="alpha charlie gamma",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_ANY
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(t.matches("I have alpha in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have charlie in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have gamma in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have alpha and charlie in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have bravo in me"))
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 1",
 | 
			
		||||
            match="12 34 56",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_ANY
 | 
			
		||||
        )
 | 
			
		||||
        self.assertTrue(t.matches("I have 12 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 34 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 56 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 12 and 34 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 12 34, and 56 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 120, 34, and 560 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 120, 340, and 560 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 123456 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 01234567 in me"))
 | 
			
		||||
 | 
			
		||||
    def test_match_literal(self):
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 0",
 | 
			
		||||
            match="alpha charlie gamma",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_LITERAL
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have charlie in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha and charlie in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha, charlie, and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas, charlie, and gamma in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 'alpha charlie gamma' in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have bravo in me"))
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 1",
 | 
			
		||||
            match="12 34 56",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_LITERAL
 | 
			
		||||
        )
 | 
			
		||||
        self.assertFalse(t.matches("I have 12 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 34 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 56 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 12 and 34 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 12 34, and 56 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 120, 34, and 560 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 120, 340, and 560 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 123456 in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have 01234567 in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have 12 34 56 in me"))
 | 
			
		||||
 | 
			
		||||
    def test_match_regex(self):
 | 
			
		||||
 | 
			
		||||
        t = Tag.objects.create(
 | 
			
		||||
            name="Test 0",
 | 
			
		||||
            match="alpha\w+gamma",
 | 
			
		||||
            matching_algorithm=Tag.MATCH_REGEX
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha and charlie in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have alpha_and_gamma in me"))
 | 
			
		||||
        self.assertTrue(t.matches("I have alphas_and_gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha,and,gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alpha, charlie, and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas, charlie, and gamma in me"))
 | 
			
		||||
        self.assertFalse(t.matches("I have alphas in me"))
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user