Skip to content

Commit 0b6bd5e

Browse files
committed
Add repetitive case to overloaded type signature
This seems to be needed to make mypy happy. It can otherwise not deduce that the usage in _get_private_objects is correct.
1 parent f42dd91 commit 0b6bd5e

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

khard/carddav_object.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
def multi_property_key(item: str) -> Tuple[Literal[0], str]: ...
4040
@overload
4141
def multi_property_key(item: Dict[T, Any]) -> Tuple[Literal[1], T]: ...
42+
@overload
43+
def multi_property_key(item: Union[str, Dict[T, Any]]) -> Tuple[Union[Literal[0], Literal[1]], Union[str, T]]: ...
4244
def multi_property_key(item: Union[str, Dict[T, Any]]
4345
) -> Tuple[int, Union[T, str]]:
4446
"""Key function to pass to sorted(), allowing sorting of dicts with lists

test/test_carddav_object.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import unittest
77
from unittest import mock
88

9-
from khard.carddav_object import CarddavObject
9+
from khard.carddav_object import CarddavObject, multi_property_key
1010

1111

1212
class CarddavObjectFormatDateObject(unittest.TestCase):
@@ -57,3 +57,28 @@ def test_parsing_base64_ecoded_photo_vcard_v4(self):
5757
self.assertEqual(uri_stuff, 'data:image/png;base64')
5858
data = base64.decodebytes(data.encode())
5959
self.assertEqual(data[:8], self.PNG_HEADER)
60+
61+
62+
class MultiPropertyKey(unittest.TestCase):
63+
"""Test for the multi_property_key helper function"""
64+
65+
def test_strings_are_in_the_first_sort_group(self) -> None:
66+
group, _key = multi_property_key("some string")
67+
self.assertEqual(group, 0)
68+
69+
def test_dicts_are_in_the_second_sort_group(self) -> None:
70+
group, _key = multi_property_key({"some": "dict"})
71+
self.assertEqual(group, 1)
72+
73+
def test_strings_are_their_own_keys(self) -> None:
74+
_group, key = multi_property_key("some string")
75+
self.assertEqual(key, "some string")
76+
77+
def test_dicts_are_keyed_by_the_first_key(self) -> None:
78+
_group, key = multi_property_key({"some": "dict", "more": "stuff"})
79+
self.assertEqual(key, "some")
80+
81+
def test_all_strings_are_sorted_before_dicts(self) -> None:
82+
my_list = ["a", {"c": "d"}, "e", {"f": "g"}]
83+
my_list.sort(key=multi_property_key)
84+
self.assertEqual(my_list, ["a", "e", {"c": "d"}, {"f": "g"}])

test/test_yaml_editable.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,21 @@ def test_private_objects_can_have_an_ablabel(self) -> None:
9595
label.group = "1"
9696
result = ye._get_private_objects()
9797
self.assertEqual(result, {"foo": [{"baz": "bar"}]})
98+
99+
def test_private_objects_with_ablabels_are_sorted_by_ablabel(self) -> None:
100+
ye = TestYAMLEditable()
101+
ye.supported_private_objects = ["foo"]
102+
foo1 = ye.vcard.add("X-FOO")
103+
foo1.value = "AAA"
104+
foo1.group = "1"
105+
label1 = ye.vcard.add("X-ABLABEL")
106+
label1.value = "yyy"
107+
label1.group = "1"
108+
foo2 = ye.vcard.add("X-FOO")
109+
foo2.value = "BBB"
110+
foo2.group = "2"
111+
label2 = ye.vcard.add("X-ABLABEL")
112+
label2.value = "xxx"
113+
label2.group = "2"
114+
result = ye._get_private_objects()
115+
self.assertEqual(result, {"foo": [{"xxx": "BBB"}, {"yyy": "AAA"}]})

0 commit comments

Comments
 (0)