#160 Be more permissive in voting commands syntax
Merged 3 years ago by kparal. Opened 3 years ago by lbrabec.

@@ -18,7 +18,9 @@ 

  

  

  VOTE_KEYWORDS = [' '.join(v) for v in

-                  itertools.product(TRACKER_KEYWORDS, ['-1', '0', '+1'])]

+                  itertools.product(TRACKER_KEYWORDS, ['-1', '0', '+1'])] + \

+                 [' '.join(v) for v in

+                  itertools.product(['-1', '0', '+1'], TRACKER_KEYWORDS)]

  

  OUTCOME_KEYWORDS = [''.join(r) for r in

                     itertools.product(['accepted', 'rejected'], TRACKER_KEYWORDS)]
@@ -80,7 +82,7 @@ 

      def keywords(self):

          out = []

          for line in self.text.lower().split('\n'):

-             line = line.rstrip()

+             line = line.strip()

              line = re.sub(' +', ' ', line)

              if line in VOTE_KEYWORDS:

                  out.append(line)
@@ -114,7 +116,8 @@ 

          self.votes = {}

  

      def _filter_relevant(self, keywords):

-         accepted_votes = [self.accepted_keyword + v for v in [' +1', ' 0', ' -1']]

+         accepted_votes = [self.accepted_keyword + v for v in [' +1', ' 0', ' -1']] + \

+                          [v + self.accepted_keyword for v in ['+1 ', '0 ', '-1 ']]

          accepted_agreed = ['agreed ' + o + self.accepted_keyword for o in ['accepted', 'rejected']]

          accepted_revote = ['revote ' + self.accepted_keyword]

          accepted_keywords = accepted_votes + accepted_agreed + accepted_revote
@@ -143,6 +146,11 @@ 

                              'vote': vote,

                              'comment_id': comment.id

                          }

+                     elif keyword.startswith(vote + ' '):

+                         self.votes[comment.user] = {

+                             'vote': vote,

+                             'comment_id': comment.id

+                         }

          return keywords

  

      def enumerate_votes(self):

file modified
+114 -31
@@ -38,13 +38,14 @@ 

  

  

  class TestPagureBotBasics(object):

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

-     def test_basic_vote(self, vote, keyword):

+     def test_basic_vote(self, vote, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s" % (keyword, vote),

+                 'comment': "%s %s" % ((vote, keyword) if inversed else (keyword, vote)),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -109,13 +110,14 @@ 

  

  

  class TestPagureBotGotchas(object):

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '–'])  # these chars are not + or -

-     def test_unicode_plus(self, sign, keyword):

+     def test_unicode_plus(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s1" % (keyword, sign),

+                 'comment': "%s1 %s" % (sign, keyword) if inversed else "%s %s1" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -125,13 +127,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_eleven(self, sign, keyword):

+     def test_plusminus_eleven(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s11" % (keyword, sign),

+                 'comment': "%s11 %s" % (sign, keyword) if inversed else "%s %s11" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -141,13 +144,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_two(self, sign, keyword):

+     def test_plusminus_two(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s2" % (keyword, sign),

+                 'comment': "%s2 %s" % (sign, keyword) if inversed else "%s %s2" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -157,13 +161,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_typo(self, sign, keyword):

+     def test_plusminus_typo(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s!" % (keyword, sign),

+                 'comment': "%s! %s" % (sign, keyword) if inversed else "%s %s!" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -173,13 +178,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_float(self, sign, keyword):

+     def test_plusminus_float(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s0.5" % (keyword, sign),

+                 'comment': "%s0.5 %s" % (sign, keyword) if inversed else "%s %s0.5" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -189,13 +195,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_emoji(self, sign, keyword):

+     def test_plusminus_emoji(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s👎" % (keyword, sign),

+                 'comment': "%s👎 %s" % (sign, keyword) if inversed else "%s %s👎" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -205,13 +212,14 @@ 

          trackers = pagure_bot.parse_comments_to_trackers(comments)

          assert trackers[keyword].votes == {}

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_plusminus_backtick(self, sign, keyword):

+     def test_plusminus_backtick(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "`%s %s1`" % (keyword, sign),

+                 'comment': "`%s1 %s`" % (sign, keyword) if inversed else "`%s %s1`" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -223,13 +231,14 @@ 

  

  

  class TestPagureBotMultiline(object):

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("sign", ['+', '-'])

-     def test_multiline_singlevote(self, sign, keyword):

+     def test_multiline_singlevote(self, sign, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "foobar\n%s %s1\nbarbaz" % (keyword, sign),

+                 'comment': "foobar\n%s1 %s\nbarbaz" % (sign, keyword) if inversed else "foobar\n%s %s1\nbarbaz" % (keyword, sign),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -244,17 +253,19 @@ 

              }

          }

  

+     @pytest.mark.parametrize("inversed", itertools.product([False, True], [False, True]))

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("vote", [('+1', '-1'), ('-1', '+1'), ('+1', '0'),

                                        ('-1', '0'), ('0', '-1'), ('0', '+1')])

-     def test_multiline_multivote_same(self, vote, keyword):

+     def test_multiline_multivote_same(self, vote, keyword, inversed):

          vote_first = vote[0]

          vote_second = vote[1]

+         first = (vote_first, keyword) if inversed[0] else (keyword, vote_first)

+         second = (vote_second, keyword) if inversed[1] else (keyword, vote_second)

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "foobar\n%s %s\nbarbaz\n%s %s" % (keyword, vote_first,

-                                                              keyword, vote_second),

+                 'comment': "foobar\n%s %s\nbarbaz\n%s %s" % (first + second),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -269,20 +280,22 @@ 

              }

          }

  

+     @pytest.mark.parametrize("inversed", itertools.product([False, True], [False, True]))

      @pytest.mark.parametrize("keyword", itertools.permutations(pagure_bot.TRACKER_KEYWORDS, 2))

      @pytest.mark.parametrize("vote", [('+1', '-1'), ('-1', '+1'), ('+1', '0'),

                                        ('-1', '0'), ('0', '-1'), ('0', '+1'),

                                        ('0', '0'), ('-1', '-1'), ('+1', '+1')])

-     def test_multiline_multivote_different(self, vote, keyword):

+     def test_multiline_multivote_different(self, vote, keyword, inversed):

          keyword_first = keyword[0]

          keyword_second = keyword[1]

          vote_first = vote[0]

          vote_second = vote[1]

+         first = (vote_first, keyword_first) if inversed[0] else (keyword_first, vote_first)

+         second = (vote_second, keyword_second) if inversed[1] else (keyword_second, vote_second)

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "foobar\n%s %s\nbarbaz\n%s %s" % (keyword_first, vote_first,

-                                                              keyword_second, vote_second),

+                 'comment': "foobar\n%s %s\nbarbaz\n%s %s" % (first + second),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -541,13 +554,14 @@ 

  

  

  class TestPagureBotWhitespaces(object):

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

-     def test_trailing_whitespace(self, vote, keyword):

+     def test_trailing_whitespace(self, vote, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s %s " % (keyword, vote),

+                 'comment': "%s %s " % ((vote, keyword) if inversed else (keyword, vote)),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -562,13 +576,14 @@ 

              }

          }

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

-     def test_whitespaces_inside_vote(self, vote, keyword):

+     def test_leading_whitespace(self, vote, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s    %s" % (keyword, vote),

+                 'comment': "   %s %s" % ((vote, keyword) if inversed else (keyword, vote)),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -583,13 +598,58 @@ 

              }

          }

  

+     @pytest.mark.parametrize("inversed", [False, True])

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

-     def test_newline_inside_vote_ignored(self, vote, keyword):

+     def test_whitespaces_inside_vote(self, vote, keyword, inversed):

          comments = [pagure_bot.Comment(c) for c in [

              {

                  'id': 1,

-                 'comment': "%s\n%s" % (keyword, vote),

+                 'comment': "%s    %s" % ((vote, keyword) if inversed else (keyword, vote)),

+                 'user': {

+                     'name': stub_admin_user1

+                 }

+             }

+         ]]

+ 

+         trackers = pagure_bot.parse_comments_to_trackers(comments)

+         assert trackers[keyword].votes == {

+             stub_admin_user1: {

+                 'vote': '%s' % vote,

+                 'comment_id': 1

+             }

+         }

+ 

+     @pytest.mark.parametrize("inversed", [False, True])

+     @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

+     @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

+     def test_trailing_leading_inside_whitespace(self, vote, keyword, inversed):

+         comments = [pagure_bot.Comment(c) for c in [

+             {

+                 'id': 1,

+                 'comment': "   %s   %s  " % ((vote, keyword) if inversed else (keyword, vote)),

+                 'user': {

+                     'name': stub_admin_user1

+                 }

+             }

+         ]]

+ 

+         trackers = pagure_bot.parse_comments_to_trackers(comments)

+         assert trackers[keyword].votes == {

+             stub_admin_user1: {

+                 'vote': '%s' % vote,

+                 'comment_id': 1

+             }

+         }

+ 

+     @pytest.mark.parametrize("inversed", [False, True])

+     @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

+     @pytest.mark.parametrize("vote", ['+1', '-1', '0'])

+     def test_newline_inside_vote_ignored(self, vote, keyword, inversed):

+         comments = [pagure_bot.Comment(c) for c in [

+             {

+                 'id': 1,

+                 'comment': "%s\n%s" % ((vote, keyword) if inversed else (keyword, vote)),

                  'user': {

                      'name': stub_admin_user1

                  }
@@ -601,6 +661,29 @@ 

  

      @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

      @pytest.mark.parametrize("outcome", ['Accepted', 'Rejected'])

+     def test_agreed_single_acceptedrejected_leading_wspace_needs_summary(self, outcome, keyword, setup_stubs):

+         comments = [pagure_bot.Comment(c) for c in [

+             {

+                 'id': 1,

+                 'comment': "%s +1" % keyword,

+                 'user': {

+                     'name': stub_admin_user1

+                 }

+             },

+             {

+                 'id': 2,

+                 'comment': "   AGREED %s%s foo bar" % (outcome, keyword),

+                 'user': {

+                     'name': stub_admin_user1

+                 }

+             }

+         ]]

+ 

+         trackers = pagure_bot.parse_comments_to_trackers(comments)

+         assert trackers[keyword].need_summary_post

+ 

+     @pytest.mark.parametrize("keyword", pagure_bot.TRACKER_KEYWORDS)

+     @pytest.mark.parametrize("outcome", ['Accepted', 'Rejected'])

      def test_agreed_single_acceptedrejected_trailing_wspace_needs_summary(self, outcome, keyword, setup_stubs):

          comments = [pagure_bot.Comment(c) for c in [

              {
@@ -635,7 +718,7 @@ 

              },

              {

                  'id': 2,

-                 'comment': "AGREED     %s%s foo bar   " % (outcome, keyword),

+                 'comment': "   AGREED     %s%s   foo bar   " % (outcome, keyword),

                  'user': {

                      'name': stub_admin_user1

                  }

TRACKER VOTE command was too strict, bot now accepts all of these:

TRACKER VOTE
TRACKER   VOTE
TRACKER VOTE...
   TRACKER VOTE
VOTE TRACKER
VOTE   TRACKER
VOTE TRACKER...
   VOTE TRACKER

where ... (three dots) shows a trailing whitespace

Fixes https://pagure.io/fedora-qa/blockerbugs/issue/153

Build succeeded.

I set out to review this, but wound up doing an alternative instead :D

https://pagure.io/fedora-qa/blockerbugs/pull-request/161 - also accepts multiple votes on a single line, and accepts "freezeexception" as well as "fe".

Metadata Update from @kparal:
- Request assigned

3 years ago

Pull-Request has been closed by kparal

3 years ago

Commit 74721fc fixes this pull-request

Pull-Request has been merged by kparal

3 years ago