Skip to content

Commit caae5cf

Browse files
committed
Update QueryStringTransformer to raise KeyError for non-existent parameters instead of AttributeError
1 parent 9328ad5 commit caae5cf

3 files changed

Lines changed: 22 additions & 16 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515

1616
### Changed
1717

18+
- Transformations to non-existent keys in `QueryStringTransformer` now throw `KeyError` rather than `AttributeError`
19+
1820
### Deprecated
1921

2022
### Removed

tests/test_url.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ def lists(self):
3535
self.assertEqual(manipulator.add_parameter("foo", "bar"), manipulator)
3636
self.assertEqual(manipulator.get_query_string(), "?a=1&b=2&b=3&foo=bar")
3737

38+
def test_unhappy_init(self):
39+
with self.assertRaises(AttributeError):
40+
QueryStringTransformer(0)
41+
3842
def test_parameter_values(self):
3943
manipulator = QueryStringTransformer(self.test_query)
4044
self.assertEqual(manipulator.parameter_values("a"), ["1"])
4145
self.assertEqual(manipulator.parameter_values("b"), ["2", "3"])
42-
with self.assertRaises(AttributeError):
46+
with self.assertRaises(KeyError):
4347
manipulator.parameter_values("c")
4448

4549
def test_add_parameter(self):
@@ -89,7 +93,7 @@ def test_remove_parameter(self):
8993
self.assertFalse(manipulator.parameter_exists("a"))
9094
self.assertEqual(manipulator.remove_parameter("b"), manipulator)
9195
self.assertFalse(manipulator.parameter_exists("b"))
92-
with self.assertRaises(AttributeError):
96+
with self.assertRaises(KeyError):
9397
self.assertEqual(manipulator.remove_parameter("c"), manipulator)
9498
self.assertEqual(manipulator.get_query_string(), "?")
9599

@@ -99,7 +103,7 @@ def test_is_value_in_parameter(self):
99103
self.assertTrue(manipulator.is_value_in_parameter("b", "2"))
100104
self.assertTrue(manipulator.is_value_in_parameter("b", "3"))
101105
self.assertFalse(manipulator.is_value_in_parameter("b", "4"))
102-
with self.assertRaises(AttributeError):
106+
with self.assertRaises(KeyError):
103107
self.assertFalse(manipulator.is_value_in_parameter("c", "5"))
104108

105109
def test_toggle_parameter_value(self):

tna_utilities/url.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, args=None) -> None:
1818
try:
1919
args_lists = args.lists()
2020
except AttributeError:
21-
raise TypeError(
21+
raise AttributeError(
2222
"args must be an ImmutableMultiDict (Django), a QueryDict (Flask) object or an iterable of (key, [values]) tuples"
2323
)
2424
self.args = list(args_lists)
@@ -38,13 +38,13 @@ def parameter_exists(self, parameter) -> bool:
3838
def parameter_values(self, parameter: str) -> list:
3939
"""
4040
Get the values associated with a parameter in the query parameters.
41-
Raises an AttributeError if the parameter does not exist.
41+
Raises an KeyError if the parameter does not exist.
4242
"""
4343

4444
for key, values in self.args:
4545
if key == parameter:
4646
return values
47-
raise AttributeError(f"Parameter '{parameter}' does not exist")
47+
raise KeyError(f"Parameter '{parameter}' does not exist")
4848

4949
def add_parameter(
5050
self, parameter: str, values: str | int | list | None = None
@@ -80,48 +80,48 @@ def update_parameter(
8080
def remove_parameter(self, parameter: str) -> "QueryStringTransformer":
8181
"""
8282
Remove a parameter from the query parameters.
83-
Raises an AttributeError if the parameter does not exist.
83+
Raises an KeyError if the parameter does not exist.
8484
"""
8585

8686
for key, vals in self.args:
8787
if key == parameter:
8888
self.args.remove((key, vals))
8989
return self
90-
raise AttributeError(f"Parameter '{parameter}' does not exist")
90+
raise KeyError(f"Parameter '{parameter}' does not exist")
9191

9292
def is_value_in_parameter(self, parameter: str, value: str | int) -> bool:
9393
"""
9494
Check if a specific value exists within a parameter's values.
95-
Raises an AttributeError if the parameter does not exist.
95+
Raises an KeyError if the parameter does not exist.
9696
"""
9797

9898
for key, values in self.args:
9999
if key == parameter:
100100
return str(value) in values
101-
raise AttributeError(f"Parameter '{parameter}' does not exist")
101+
raise KeyError(f"Parameter '{parameter}' does not exist")
102102

103103
def add_parameter_value(
104104
self, parameter: str, value: str | int
105105
) -> "QueryStringTransformer":
106106
"""
107107
Add a specific value to a parameter's values.
108-
Raises an AttributeError if the parameter does not exist.
108+
Raises an KeyError if the parameter does not exist.
109109
"""
110110

111111
for key, values in self.args:
112112
if key == parameter:
113113
if str(value) not in values:
114114
values.append(str(value))
115115
return self
116-
raise AttributeError(f"Parameter '{parameter}' does not exist")
116+
raise KeyError(f"Parameter '{parameter}' does not exist")
117117

118118
def toggle_parameter_value(
119119
self, parameter: str, value: str | int
120120
) -> "QueryStringTransformer":
121121
"""
122122
Toggle a value within a parameter's values.
123123
If the value exists, it will be removed; if it does not exist, it will be added.
124-
Raises an AttributeError if the parameter does not exist.
124+
Raises an KeyError if the parameter does not exist.
125125
"""
126126

127127
for key, values in self.args:
@@ -131,22 +131,22 @@ def toggle_parameter_value(
131131
else:
132132
self.add_parameter_value(parameter, value)
133133
return self
134-
raise AttributeError(f"Parameter '{parameter}' does not exist")
134+
raise KeyError(f"Parameter '{parameter}' does not exist")
135135

136136
def remove_parameter_value(
137137
self, parameter: str, value: str | int
138138
) -> "QueryStringTransformer":
139139
"""
140140
Remove a specific value from a parameter's values.
141-
Raises an AttributeError if the parameter does not exist.
141+
Raises an KeyError if the parameter does not exist.
142142
"""
143143

144144
for key, values in self.args:
145145
if key == parameter:
146146
if str(value) in values:
147147
values.remove(str(value))
148148
return self
149-
raise AttributeError(f"Parameter '{parameter}' does not exist")
149+
raise KeyError(f"Parameter '{parameter}' does not exist")
150150

151151
def get_query_string(self) -> str:
152152
"""

0 commit comments

Comments
 (0)