Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/validate-description.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ jobs:
validate_description:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Check PR description for work item link
run: |
echo "Checking PR description for work item link"
python .global-checks-tooling/checks/check_pr_description.py "${{ github.event.pull_request.body }}"
python checks/check_pr_description.py "${{ github.event.pull_request.body }}"
11 changes: 9 additions & 2 deletions checks/check_pr_description.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@
def check_description(description):
"""
Checks if the PR description contains a work item link.
Returns True if valid, False otherwise.
"""
regex = r"(^|\s)(https:\/\/app\.devrev\.ai\/devrev\/works\/)?(ISS|TKT|TASK)-\d+\b"
if not re.search(regex, description):
return bool(re.search(regex, description))

def check_description_cli(description):
"""
CLI version that prints messages and exits.
"""
if not check_description(description):
print("PR description must include a link to the work item (e.g., ISS-123, TKT-456, TASK-789, or a full https://app.devrev.ai/devrev/works/ISS-123 link).")
sys.exit(1)
print("PR description contains a valid work item link.")
Expand All @@ -18,4 +25,4 @@ def check_description(description):
sys.exit(1)

pr_description = sys.argv[1]
check_description(pr_description)
check_description_cli(pr_description)
6 changes: 6 additions & 0 deletions checks/fixtures/pr_description/invalid/no_link.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
This PR adds a new feature to the application.

## Changes
- Added new functionality
- Updated tests
- Fixed styling issues
3 changes: 3 additions & 0 deletions checks/fixtures/pr_description/invalid/wrong_format.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This PR addresses issue ISSUE-123 and ticket TICKET-456.

The work items don't follow the correct format.
7 changes: 7 additions & 0 deletions checks/fixtures/pr_description/valid/full_url.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Fixes bug reported in https://app.devrev.ai/devrev/works/ISS-999.

## Bug Description
The application was crashing when handling large datasets.

## Solution
Implemented pagination to handle large data efficiently.
5 changes: 5 additions & 0 deletions checks/fixtures/pr_description/valid/iss_link.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
This PR fixes the login issue described in ISS-123.

## Changes
- Updated authentication flow
- Fixed token validation
3 changes: 3 additions & 0 deletions checks/fixtures/pr_description/valid/task_link.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Refactoring code structure for TASK-789.

This refactoring improves maintainability and performance.
4 changes: 4 additions & 0 deletions checks/fixtures/pr_description/valid/tkt_link.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Implements new feature as requested in TKT-456.

- Added new API endpoint
- Updated documentation
34 changes: 32 additions & 2 deletions checks/test_checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import checks.check_commit_emails
import checks.check_repo_yml
import checks.check_trufflehog
import checks.check_pr_description

import unittest
import os
Expand Down Expand Up @@ -71,7 +72,36 @@ def test_bad(self):
with change_dir("checks/fixtures/emails/bad"):
self.assertFalse(checks.check_commit_emails.check_commit_emails())


class TestPRDescription(unittest.TestCase):
def test_valid_iss_link(self):
with open("checks/fixtures/pr_description/valid/iss_link.txt", "r") as f:
description = f.read()
self.assertTrue(checks.check_pr_description.check_description(description))

def test_valid_tkt_link(self):
with open("checks/fixtures/pr_description/valid/tkt_link.txt", "r") as f:
description = f.read()
self.assertTrue(checks.check_pr_description.check_description(description))

def test_valid_task_link(self):
with open("checks/fixtures/pr_description/valid/task_link.txt", "r") as f:
description = f.read()
self.assertTrue(checks.check_pr_description.check_description(description))

def test_valid_full_url(self):
with open("checks/fixtures/pr_description/valid/full_url.txt", "r") as f:
description = f.read()
self.assertTrue(checks.check_pr_description.check_description(description))

def test_invalid_no_link(self):
with open("checks/fixtures/pr_description/invalid/no_link.txt", "r") as f:
description = f.read()
self.assertFalse(checks.check_pr_description.check_description(description))

def test_invalid_wrong_format(self):
with open("checks/fixtures/pr_description/invalid/wrong_format.txt", "r") as f:
description = f.read()
self.assertFalse(checks.check_pr_description.check_description(description))

if __name__ == '__main__':
unittest.main()
unittest.main()