Skip to content

Commit 143a4aa

Browse files
authored
Merge branch 'main' into pre-commit-ci-update-config
2 parents a1add7a + c45f117 commit 143a4aa

File tree

4 files changed

+130
-2
lines changed

4 files changed

+130
-2
lines changed

.github/workflows/update-doc-assets.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ on:
55
branches:
66
- main
77

8+
permissions:
9+
contents: write
10+
pull-requests: write
11+
812
jobs:
913
sync-doc-assets:
1014
runs-on: ubuntu-latest
@@ -39,7 +43,7 @@ jobs:
3943
branch: "chore/update-readme"
4044
commit-message: "Updated README.md"
4145
body: "Updated README.md"
42-
token: ${{ secrets.PAT_TOKEN }}
46+
token: ${{ secrets.GITHUB_TOKEN }}
4347

4448
- name: Copy doc assets
4549
run: |

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,11 @@ Support me with a :star:
221221
Thanks goes to these wonderful people:
222222

223223
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
224+
224225
<!-- prettier-ignore-start -->
226+
225227
<!-- markdownlint-disable -->
228+
226229
<table>
227230
<tbody>
228231
<tr>
@@ -244,6 +247,7 @@ Thanks goes to these wonderful people:
244247
</table>
245248

246249
<!-- markdownlint-restore -->
250+
247251
<!-- prettier-ignore-end -->
248252

249253
<!-- ALL-CONTRIBUTORS-LIST:END -->

model_clone/tests/test_utils.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from django.test import TestCase
2+
3+
from model_clone.utils import clean_value
4+
5+
6+
class CleanValueTestCase(TestCase):
7+
def test_clean_value_with_single_digit(self):
8+
"""Test cleaning value with single digit suffix."""
9+
result = clean_value("Test Copy 1", "Copy")
10+
self.assertEqual(result, "Test")
11+
12+
def test_clean_value_with_multi_digit(self):
13+
"""Test cleaning value with multi-digit suffix."""
14+
result = clean_value("Test Copy 10", "Copy")
15+
self.assertEqual(result, "Test")
16+
17+
result = clean_value("Test Copy 123", "Copy")
18+
self.assertEqual(result, "Test")
19+
20+
def test_clean_value_with_hyphen_separator(self):
21+
"""Test cleaning value with hyphen separator."""
22+
result = clean_value("test-copy-1", "copy")
23+
self.assertEqual(result, "test")
24+
25+
result = clean_value("test-copy-42", "copy")
26+
self.assertEqual(result, "test")
27+
28+
def test_clean_value_case_insensitive(self):
29+
"""Test that cleaning is case insensitive."""
30+
result = clean_value("Test COPY 1", "copy")
31+
self.assertEqual(result, "Test")
32+
33+
result = clean_value("test copy 1", "COPY")
34+
self.assertEqual(result, "test")
35+
36+
def test_clean_value_with_regex_special_characters(self):
37+
"""Test cleaning value when suffix contains regex special characters."""
38+
result = clean_value("Test (Copy) 1", "(Copy)")
39+
self.assertEqual(result, "Test")
40+
41+
result = clean_value("Test Copy+ 2", "Copy+")
42+
self.assertEqual(result, "Test")
43+
44+
result = clean_value("Test Copy* 5", "Copy*")
45+
self.assertEqual(result, "Test")
46+
47+
result = clean_value("Test Copy? 3", "Copy?")
48+
self.assertEqual(result, "Test")
49+
50+
result = clean_value("Test Copy[1] 4", "Copy[1]")
51+
self.assertEqual(result, "Test")
52+
53+
def test_clean_value_with_dots_and_brackets(self):
54+
"""Test cleaning with complex regex characters."""
55+
result = clean_value("Test Copy.exe 1", "Copy.exe")
56+
self.assertEqual(result, "Test")
57+
58+
result = clean_value("Test (v2.0) 15", "(v2.0)")
59+
self.assertEqual(result, "Test")
60+
61+
def test_clean_value_no_match(self):
62+
"""Test that value is unchanged when pattern doesn't match."""
63+
result = clean_value("Test Copy", "Copy")
64+
self.assertEqual(result, "Test Copy")
65+
66+
result = clean_value("Test Different 1", "Copy")
67+
self.assertEqual(result, "Test Different 1")
68+
69+
result = clean_value("Test Copy A", "Copy")
70+
self.assertEqual(result, "Test Copy A")
71+
72+
def test_clean_value_partial_match(self):
73+
"""Test that partial matches are not cleaned."""
74+
result = clean_value("Test Copying 1", "Copy")
75+
self.assertEqual(result, "Test Copying 1")
76+
77+
result = clean_value("Test Copy Something 1", "Copy")
78+
self.assertEqual(result, "Test Copy Something 1")
79+
80+
def test_clean_value_middle_of_string(self):
81+
"""Test that pattern in middle of string is not cleaned."""
82+
result = clean_value("Test Copy 1 More", "Copy")
83+
self.assertEqual(result, "Test Copy 1 More")
84+
85+
def test_clean_value_with_empty_suffix(self):
86+
"""Test behavior with empty suffix."""
87+
result = clean_value("Test 1", "")
88+
self.assertEqual(result, "Test")
89+
90+
def test_clean_value_with_space_before_suffix(self):
91+
"""Test cleaning when there's a space before suffix."""
92+
result = clean_value("Test Copy 25", "Copy")
93+
self.assertEqual(result, "Test")
94+
95+
def test_clean_value_with_hyphen_before_suffix(self):
96+
"""Test cleaning when there's a hyphen before suffix."""
97+
result = clean_value("test-copy-99", "copy")
98+
self.assertEqual(result, "test")
99+
100+
def test_clean_value_zero_digit(self):
101+
"""Test cleaning with zero as digit."""
102+
result = clean_value("Test Copy 0", "Copy")
103+
self.assertEqual(result, "Test")
104+
105+
def test_clean_value_leading_zeros(self):
106+
"""Test cleaning with leading zeros in digits."""
107+
result = clean_value("Test Copy 001", "Copy")
108+
self.assertEqual(result, "Test")
109+
110+
result = clean_value("Test Copy 010", "Copy")
111+
self.assertEqual(result, "Test")
112+
113+
def test_clean_value_complex_example(self):
114+
"""Test with a complex real-world example."""
115+
result = clean_value("my-awesome-slug-copy-42", "copy")
116+
self.assertEqual(result, "my-awesome-slug")
117+
118+
result = clean_value("Product (v1.0) Copy 123", "(v1.0) Copy")
119+
self.assertEqual(result, "Product")

model_clone/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ def clean_value(value, suffix):
149149
:rtype: `str`
150150
"""
151151
# type: (str, str) -> str
152-
return re.sub(r"([\s-]?){}[\s-][\d]$".format(suffix), "", value, flags=re.I)
152+
escaped_suffix = re.escape(suffix)
153+
return re.sub(r"([\s-]?){}[\s-]\d+$".format(escaped_suffix), "", value, flags=re.I)
153154

154155

155156
@contextlib.contextmanager

0 commit comments

Comments
 (0)