Skip to content

Commit 4ba4f71

Browse files
committed
feat: enhance caching logic with static method and coverage configuration
1 parent a2931e5 commit 4ba4f71

5 files changed

Lines changed: 66 additions & 5 deletions

File tree

py_cashier/_key_builders/_default.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ def __init__(
6161
delimiter=delimiter,
6262
)
6363

64-
def _build_key_prefix(self, func: Callable[..., Any], prefix: str | None) -> str:
64+
@staticmethod
65+
def _build_key_prefix(func: Callable[..., Any], prefix: str | None) -> str:
6566
"""Build the prefix for the cache key."""
6667
if not prefix:
6768
return f"{inspect.getfile(func)}:{func.__name__}"

py_cashier/_utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ def get_call_args(
122122
for name, info in by_name.items():
123123
if name in res:
124124
continue
125-
if info.default is NOT_SET:
125+
# Possible only if the function was called without one of the arguments
126+
if info.default is NOT_SET: # pragma: no cover
126127
msg = f"Default value for argument '{name}' is not set"
127128
raise RuntimeError(msg)
128129
res[name] = info.default

pyproject.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ color = true
6262
line-length = 120
6363
target-version = ['py39']
6464

65+
[tool.coverage.report]
66+
exclude_also = [
67+
"def __repr__",
68+
"if TYPE_CHECKING",
69+
"if typing.TYPE_CHECKING",
70+
]
71+
omit = [
72+
"tests/*",
73+
]
74+
6575
[tool.hatch.version]
6676
source = "uv-dynamic-versioning"
6777

tests/test__default_key_builder.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import inspect
24
from typing import Any, Callable
35

@@ -34,3 +36,22 @@ def test__default_key_builder__build_key(
3436
DefaultKeyBuilder(func=func, key_serializer=StrKeySerializer, delimiter=",").build_key(*args, **kwargs)
3537
== expected_key
3638
)
39+
40+
41+
def _func() -> None:
42+
return
43+
44+
45+
_TEST_FILE = inspect.getfile(_func)
46+
47+
48+
@pytest.mark.parametrize(
49+
("prefix", "expected"),
50+
[
51+
(None, f"{_TEST_FILE}:_func"),
52+
("", f"{_TEST_FILE}:_func"),
53+
("_prefix_", f"_prefix_:{_TEST_FILE}:_func"),
54+
],
55+
)
56+
def test__default_key_builder__build_key_prefix(prefix: str | None, expected: str):
57+
assert DefaultKeyBuilder._build_key_prefix(_func, prefix) == expected

tests/test__serializers.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime
1+
from datetime import datetime, timezone
22
from typing import Any
33
from unittest.mock import Mock, patch
44

@@ -17,15 +17,43 @@
1717
(StrKeySerializer, [1, 2, 3], "[1, 2, 3]"),
1818
(StrKeySerializer, {"a": 1, "b": 2}, "{'a': 1, 'b': 2}"),
1919
(StrKeySerializer, None, "None"),
20-
(StrKeySerializer, datetime(2000, 1, 1), "2000-01-01 00:00:00"),
20+
(
21+
StrKeySerializer,
22+
datetime(2000, 1, 1, tzinfo=None), # noqa: DTZ001
23+
"2000-01-01 00:00:00",
24+
),
25+
(
26+
StrKeySerializer,
27+
datetime(2000, 1, 1), # noqa: DTZ001
28+
"2000-01-01 00:00:00",
29+
),
30+
(
31+
StrKeySerializer,
32+
datetime(2000, 1, 1, tzinfo=timezone.utc),
33+
"2000-01-01 00:00:00+00:00",
34+
),
2135
# ReprKeySerializer tests
2236
(ReprKeySerializer, 123, "123"),
2337
(ReprKeySerializer, 123.45, "123.45"),
2438
(ReprKeySerializer, "hello", "'hello'"), # Note the quotes
2539
(ReprKeySerializer, [1, 2, 3], "[1, 2, 3]"),
2640
(ReprKeySerializer, {"a": 1, "b": 2}, "{'a': 1, 'b': 2}"),
2741
(ReprKeySerializer, None, "None"),
28-
(ReprKeySerializer, datetime(2000, 1, 1), "datetime.datetime(2000, 1, 1, 0, 0)"),
42+
(
43+
ReprKeySerializer,
44+
datetime(2000, 1, 1, tzinfo=None), # noqa: DTZ001
45+
"datetime.datetime(2000, 1, 1, 0, 0)",
46+
),
47+
(
48+
ReprKeySerializer,
49+
datetime(2000, 1, 1), # noqa: DTZ001
50+
"datetime.datetime(2000, 1, 1, 0, 0)",
51+
),
52+
(
53+
ReprKeySerializer,
54+
datetime(2000, 1, 1, tzinfo=timezone.utc),
55+
"datetime.datetime(2000, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)",
56+
),
2957
],
3058
)
3159
def test_basic_serializers(serializer_class: type[KeySerializer], value: Any, expected: str) -> None:

0 commit comments

Comments
 (0)