TW-1472: Syntactic sugar morphs into regex expressions, even if turned off

- Tthanks to Richard Boß.
This commit is contained in:
Paul Beckingham 2015-07-20 00:28:05 -04:00
parent 3cdb58b75e
commit c4cd855876
3 changed files with 58 additions and 2 deletions

View file

@ -25,6 +25,8 @@
one with apostrophes (thanks to Tomas Babej).
- TW-1466 UDA with type duration is stored as text/string (thanks to Thomas
Sullivan).
- TW-1472 Syntactic sugar morphs into regex expressions, even if turned off
(thanks to Richard Boß).
- TW-1475 task config expands values with unnecessary spaces (thanks to Tomas
Babej).
- TW-1478 due:easter sets the easter of the current year regardless of the date

View file

@ -937,7 +937,25 @@ bool Variant::operator_match (const Variant& other, const Task& task) const
}
else
{
if (find (left._string, pattern, searchCaseSensitive) != std::string::npos)
// If pattern starts with '^', look for a leftmost compare only.
if (pattern[0] == '^' &&
find (left._string,
pattern.substr (1),
searchCaseSensitive) == 0)
{
return true;
}
// If pattern ends with '$', look for a rightmost compare only.
else if (pattern[pattern.length () - 1] == '$' &&
find (left._string,
pattern.substr (0, pattern.length () - 1),
searchCaseSensitive) == (left._string.length () - pattern.length () + 1))
{
return true;
}
else if (find (left._string, pattern, searchCaseSensitive) != std::string::npos)
return true;
// If the above did not match, and the left source is "description", then

View file

@ -65,7 +65,43 @@ class TestSearch(TestCase):
self.assertIn("one", out)
self.assertNotIn("two", out)
# TODO Search with rc.regex on and off
class TestBug1472(TestCase):
@classmethod
def setUpClass(cls):
"""Executed once before any test in the class"""
cls.t = Task()
cls.t.config("verbose", "nothing")
cls.t("add A to Z")
cls.t("add Z to A")
def setUp(self):
"""Executed before each test in the class"""
def test_startswith_regex(self):
"""Verify .startswith works with regexes"""
code, out, err = self.t("rc.regex:on rc.debug.parser=3 description.startswith:A ls")
self.assertIn("A to Z", out)
self.assertNotIn("Z to A", out)
def test_endswith_regex(self):
"""Verify .endswith works with regexes"""
code, out, err = self.t("rc.regex:on description.endswith:Z ls")
self.assertIn("A to Z", out)
self.assertNotIn("Z to A", out)
def test_startswith_no_regex(self):
"""Verify .startswith works without regexes"""
code, out, err = self.t("rc.regex:off description.startswith:A ls")
self.assertIn("A to Z", out)
self.assertNotIn("Z to A", out)
def test_endswith_no_regex(self):
"""Verify .endswith works without regexes"""
code, out, err = self.t("rc.regex:off description.endswith:Z ls")
self.assertIn("A to Z", out)
self.assertNotIn("Z to A", out)
# TODO Search with patterns