From 78d85314acce662e0ff2c5e77079e5206cdac108 Mon Sep 17 00:00:00 2001 From: Philipp Temminghoff Date: Tue, 5 Nov 2024 07:32:04 +0100 Subject: [PATCH] chore: cleanup --- src/jinjarope/decorators.py | 40 ------- tests/test_htmlfilters.py | 130 -------------------- tests/test_icons.py | 32 ----- tests/test_iterfilters.py | 68 ----------- tests/test_llmfilters.py | 148 ----------------------- tests/test_mdfilters.py | 81 ------------- tests/test_regexfilters.py | 63 ---------- tests/test_serializefilters.py | 212 --------------------------------- tests/test_textfilters.py | 66 ---------- 9 files changed, 840 deletions(-) delete mode 100644 tests/test_htmlfilters.py delete mode 100644 tests/test_icons.py delete mode 100644 tests/test_iterfilters.py delete mode 100644 tests/test_llmfilters.py delete mode 100644 tests/test_mdfilters.py delete mode 100644 tests/test_regexfilters.py delete mode 100644 tests/test_serializefilters.py delete mode 100644 tests/test_textfilters.py diff --git a/src/jinjarope/decorators.py b/src/jinjarope/decorators.py index 7850e75..f551be6 100644 --- a/src/jinjarope/decorators.py +++ b/src/jinjarope/decorators.py @@ -69,46 +69,6 @@ def cache_info() -> dict[str, int]: return decorator -# def path_cache( -# maxsize: int | None = None, -# typed: bool = False, -# args_index: int = 0, -# ) -> Callable[[Callable[P, R]], Callable[P, R]]: -# """Decorator that caches function results and normalizes PathLike arguments. - -# Caches the first argument by default. Can be changed via args_index argument. -# Also adds cache_info and cache_clear methods to the decorated function. - -# Args: -# maxsize: Maximum size of the cache. If None, cache is unbounded. -# typed: If True, arguments of different types are cached separately. -# args_index: Index of the argument to cache. Default is 0. - -# Returns: -# Decorated function with caching capability. -# """ - -# def decorator(func: Callable[P, R]) -> Callable[P, R]: -# # Create cached version of the original function -# cached_func = lru_cache(maxsize=maxsize, typed=typed)(func) - -# @wraps(func) -# def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: -# # Convert first argument if it's PathLike -# if args and isinstance(args[args_index], str | PathLike): -# normalized_args = (upath.UPath(args[0]).resolve(),) + args[1:] -# return cached_func(*normalized_args, **kwargs) # type: ignore[arg-type] -# return cached_func(*args, **kwargs) # type: ignore[arg-type] - -# # Add cache_info and cache_clear methods to the wrapper -# wrapper.cache_info = cached_func.cache_info # type: ignore -# wrapper.cache_clear = cached_func.cache_clear # type: ignore - -# return wrapper - -# return decorator - - if __name__ == "__main__": @cache_with_transforms(arg_transformers={0: lambda p: upath.UPath(p).resolve()}) diff --git a/tests/test_htmlfilters.py b/tests/test_htmlfilters.py deleted file mode 100644 index 2ce8cb7..0000000 --- a/tests/test_htmlfilters.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import annotations - -from xml.etree import ElementTree as ET - -import pytest - -from jinjarope import htmlfilters - - -def test_wrap_in_elem(): - assert htmlfilters.wrap_in_elem("Hello", "p") == "

Hello

" - assert ( - htmlfilters.wrap_in_elem("Hello", "p", add_linebreaks=True) == "

\nHello\n

" - ) - assert ( - htmlfilters.wrap_in_elem("Hello", "p", id="greeting", class_="greet") - == '

Hello

' - ) - assert htmlfilters.wrap_in_elem("", "p") == "" - assert htmlfilters.wrap_in_elem(None, "p") == "" - - -def test_html_link(): - assert ( - htmlfilters.html_link("Google", "http://google.com") - == "Google" - ) - assert htmlfilters.html_link("Google", "") == "Google" - assert htmlfilters.html_link("Google", None) == "Google" - assert ( - htmlfilters.html_link(None, "http://google.com") - == "http://google.com" - ) - assert htmlfilters.html_link(None, None) == "" - - -def test_format_js_map(): - assert htmlfilters.format_js_map({"key": "value"}) == "{\n key: 'value',\n}" - assert htmlfilters.format_js_map('{"key": "value"}') == "{\n key: 'value',\n}" - assert htmlfilters.format_js_map({"key": True}) == "{\n key: true,\n}" - assert htmlfilters.format_js_map({"key": None}) == "{\n key: null,\n}" - assert ( - htmlfilters.format_js_map({"key": {"nested_key": "nested_value"}}) - == "{\n key: {\n nested_key: 'nested_value',\n},\n}" - ) - - -def test_svg_to_data_uri(): - assert ( - htmlfilters.svg_to_data_uri("") - == "url('data:image/svg+xml;charset=utf-8,')" - ) - assert htmlfilters.svg_to_data_uri("") == "url('data:image/svg+xml;charset=utf-8,')" - with pytest.raises(TypeError): - htmlfilters.svg_to_data_uri(None) # type: ignore[arg-type] - - -def test_clean_svg(): - assert ( - htmlfilters.clean_svg( - '', - ) - == "" - ) - assert ( - htmlfilters.clean_svg( - '', - ) - == "" - ) - assert htmlfilters.clean_svg("") == "" - assert htmlfilters.clean_svg("") == "" - - -def test_format_css_rule(): - assert htmlfilters.format_css_rule({".a": {"b": "c"}}) == ".a {\n\tb: c;\n}\n\n" - assert ( - htmlfilters.format_css_rule({".a": {"b": "c", "d": "e"}}) - == ".a {\n\tb: c;\n\td: e;\n}\n\n" - ) - assert ( - htmlfilters.format_css_rule({".a": {"b": {"c": "d"}}}) == ".a b {\n\tc: d;\n}\n\n" - ) - assert htmlfilters.format_css_rule({}) == "" - - -def test_format_xml_with_str(): - xml_str = "text" - formatted_xml = htmlfilters.format_xml(xml_str) - expected_xml = "\n text\n" - assert formatted_xml == expected_xml - - -def test_format_xml_with_element(): - xml_elem = ET.Element("root") - child = ET.SubElement(xml_elem, "child") - child.text = "text" - formatted_xml = htmlfilters.format_xml(xml_elem) - expected_xml = "\n text\n" - assert formatted_xml == expected_xml - - -def test_format_xml_with_indent(): - xml_str = "text" - formatted_xml = htmlfilters.format_xml(xml_str, indent=4) - expected_xml = "\n text\n" - assert formatted_xml == expected_xml - - -def test_format_xml_with_level(): - xml_str = "text" - formatted_xml = htmlfilters.format_xml(xml_str, level=1) - # IMO missing indent at beginning this is unexpected, but thats what ET returns.. - expected_xml = "\n text\n " - assert formatted_xml == expected_xml - - -def test_get_relative_url_empty(): - for url in ["", ".", "/."]: - for other in ["", ".", "/", "/."]: - assert htmlfilters.relative_url_mkdocs(url, other) == "." - assert htmlfilters.relative_url_mkdocs("/", "") == "./" - assert htmlfilters.relative_url_mkdocs("/", "/") == "./" - assert htmlfilters.relative_url_mkdocs("/", ".") == "./" - assert htmlfilters.relative_url_mkdocs("/", "/.") == "./" - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_icons.py b/tests/test_icons.py deleted file mode 100644 index 4b9f66b..0000000 --- a/tests/test_icons.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -import pytest - -from jinjarope import iconfilters - - -def test_material_key_conversion(): - assert iconfilters.get_pyconify_key("file") == "mdi:file" - assert iconfilters.get_pyconify_key("mdi:file") == "mdi:file" - assert iconfilters.get_pyconify_key("material/file") == "mdi:file" - assert iconfilters.get_pyconify_key(":material-file:") == "mdi:file" - - -def test_noto_key_conversion(): - assert iconfilters.get_pyconify_key("noto:wrench") == "noto:wrench" - assert iconfilters.get_pyconify_key(":noto-wrench:") == "noto:wrench" - assert ( - iconfilters.get_pyconify_key("simple/shieldsdotio") == "simple-icons:shieldsdotio" - ) - assert ( - iconfilters.get_pyconify_key(":fontawesome-regular-keyboard:") - == "fa6-regular:keyboard" - ) - assert ( - iconfilters.get_pyconify_key("fontawesome/regular/keyboard") - == "fa6-regular:keyboard" - ) - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_iterfilters.py b/tests/test_iterfilters.py deleted file mode 100644 index b3d6c3d..0000000 --- a/tests/test_iterfilters.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -import pytest - -from jinjarope import iterfilters - - -def test_reduce_list(): - assert iterfilters.reduce_list([1, 2, 2, 3, 4, 4, 4, 5]) == [1, 2, 3, 4, 5] - assert iterfilters.reduce_list([]) == [] - assert iterfilters.reduce_list(["a", "b", "b", "c"]) == ["a", "b", "c"] - - -def test_flatten_dict(): - assert iterfilters.flatten_dict({"a": {"b": {"c": "d"}}}) == {"a/b/c": "d"} - assert iterfilters.flatten_dict({"a": {"b": "c"}, "d": "e"}) == {"a/b": "c", "d": "e"} - assert iterfilters.flatten_dict({}) == {} - - -def test_batched(): - assert list(iterfilters.batched("ABCDEFG", 3)) == [ - ("A", "B", "C"), - ("D", "E", "F"), - ("G",), - ] - assert list(iterfilters.batched([], 3)) == [] - assert list(iterfilters.batched([1, 2, 3, 4, 5], 2)) == [(1, 2), (3, 4), (5,)] - - -def test_natsort(): - assert iterfilters.natsort(["A1", "B1", "A2", "A10"], key=lambda x: x) == [ - "A1", - "A2", - "A10", - "B1", - ] - assert iterfilters.natsort([], key=lambda x: x) == [] - assert iterfilters.natsort(["B1", "A1"], key=lambda x: x, reverse=True) == [ - "B1", - "A1", - ] - - -def test_do_any(): - assert iterfilters.do_any([True, False, False]) is True - assert iterfilters.do_any([False, False, False]) is False - assert iterfilters.do_any([]) is False - assert iterfilters.do_any([0, 1, 2], attribute="real") is True - - -def test_groupby_first_letter(): - data = ["apple", "banana", "cherry", "avocado", "carrot", "blueberry"] - grouped = iterfilters.groupby_first_letter(data) - assert grouped == { - "A": ["apple", "avocado"], - "B": ["banana", "blueberry"], - "C": ["carrot", "cherry"], - } - - -def test_groupby_first_letter_with_empty_data(): - data: list[str] = [] - grouped = iterfilters.groupby_first_letter(data) - assert grouped == {} - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_llmfilters.py b/tests/test_llmfilters.py deleted file mode 100644 index 732ef82..0000000 --- a/tests/test_llmfilters.py +++ /dev/null @@ -1,148 +0,0 @@ -from unittest.mock import MagicMock, patch - -import pytest -import requests - -from jinjarope.llmfilters import ( - generate_class_schemas, - generate_openai_schema, - llm_analyze_image, - llm_complete, - llm_generate_image, -) - - -# Test for generate_openai_schema -def test_generate_openai_schema(): - def sample_func(param1: int, param2: str = "default"): - """Sample function for testing. - - This is a longer description. - """ - - schema = generate_openai_schema(sample_func) - assert schema["name"] == "sample_func" - assert "Sample function for testing." in schema["description"] - assert schema["parameters"]["type"] == "object" - assert "param1" in schema["parameters"]["properties"] - assert schema["parameters"]["properties"]["param1"]["type"] == "integer" - assert "param2" in schema["parameters"]["properties"] - assert schema["parameters"]["required"] == ["param1"] - - -def test_generate_openai_schema_no_docstring(): - def no_doc_func(param): - pass - - with pytest.raises(ValueError, match="Function must have a docstring"): - generate_openai_schema(no_doc_func) - - -def test_generate_openai_schema_no_params(): - def no_param_func(): - """This function has no parameters.""" - - with pytest.raises(ValueError, match="Function must have at least one parameter"): - generate_openai_schema(no_param_func) - - -# Test for generate_class_schemas -class SampleClass: - def method1(self, param1: int): - """Method 1.""" - - def method2(self, param2: str = "default"): - """Method 2.""" - - def _private_method(self): - """Private method.""" - - -def test_generate_class_schemas(): - instance = SampleClass() - schemas = generate_class_schemas(instance) - assert len(schemas) == 2 # noqa: PLR2004 - assert any(schema["name"] == "method1" for schema in schemas) - assert any(schema["name"] == "method2" for schema in schemas) - - -def test_llm_complete(): - response = llm_complete( - model="ollama/llava", - prompt="Test prompt", - system_prompt="System prompt", - context="Context", - mock_response="Test response", - ) - assert response == "Test response" - - -@patch("litellm.completion") -def test_llm_complete_error(mock_completion): - mock_completion.side_effect = ValueError("API Error") - - with pytest.raises(ValueError, match="API Error"): - llm_complete("Test prompt") - - -# Test for llm_generate_image -@patch("litellm.image_generation") -def test_llm_generate_image(mock_image_generation): - mock_response = MagicMock() - mock_response.data = [MagicMock(url="http://test-image.com")] - mock_image_generation.return_value = mock_response - - result = llm_generate_image("Generate a cat") - assert result == "http://test-image.com" - mock_image_generation.assert_called_once() - - -@patch("litellm.image_generation") -def test_llm_generate_image_b64(mock_image_generation): - mock_response = MagicMock() - mock_response.data = [MagicMock(b64_json="base64encodedimage")] - mock_image_generation.return_value = mock_response - - result = llm_generate_image("Generate a dog", as_b64_json=True) - assert result == "base64encodedimage" - - -@patch("litellm.image_generation") -def test_llm_generate_image_no_result(mock_image_generation): - mock_image_generation.return_value = MagicMock(data=[]) - - result = llm_generate_image("Generate a bird") - assert result is None - - -# Test for llm_analyze_image -@patch("requests.get") -@patch("litellm.completion") -def test_llm_analyze_image(mock_completion, mock_get): - mock_response = MagicMock() - mock_response.choices = [MagicMock(message=MagicMock(content="Image analysis"))] - mock_completion.return_value = mock_response - - mock_get.return_value.content = b"image_data" - - result = llm_analyze_image("http://test-image.com", encode_b64=True) - assert result == "Image analysis" - mock_completion.assert_called_once() - mock_get.assert_called_once() - - -def test_llm_analyze_image_empty_url(): - with pytest.raises(ValueError, match="Image URL cannot be empty"): - llm_analyze_image("") - - -@patch("requests.get") -def test_llm_analyze_image_download_error(mock_get): - mock_get.side_effect = requests.RequestException("Download failed") - - with pytest.raises(Exception, match="Download failed"): - llm_analyze_image("http://test-image.com", encode_b64=True) - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_mdfilters.py b/tests/test_mdfilters.py deleted file mode 100644 index 036a79d..0000000 --- a/tests/test_mdfilters.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import annotations - -import pytest - -from jinjarope import mdfilters - - -def test_md_link(): - assert ( - mdfilters.md_link("GitHub", "http://github.com") == "[GitHub](http://github.com)" - ) - assert ( - mdfilters.md_link("GitHub", "http://github.com", "GitHub homepage") - == "[GitHub](http://github.com 'GitHub homepage')" - ) - assert mdfilters.md_link("GitHub", "") == "GitHub" - assert mdfilters.md_link("GitHub", None) == "GitHub" - assert ( - mdfilters.md_link(None, "http://github.com") - == "[http://github.com](http://github.com)" - ) - assert mdfilters.md_link(None, None) == "" - - -def test_extract_header_section(): - markdown = """\ -# Section 1 -Content 1 -## Subsection 1 -Content 1.1 -# Section 2 -Content 2 -""" - assert ( - mdfilters.extract_header_section(markdown, "Section 1") - == "Content 1\n## Subsection 1\nContent 1.1\n" - ) - assert mdfilters.extract_header_section(markdown, "Section 2") == "Content 2\n" - assert mdfilters.extract_header_section(markdown, "Section 3") is None - - -def test_md_escape(): - assert mdfilters.md_escape("Hello, World!") == "Hello, World\\!" - assert mdfilters.md_escape("Hello, World!", "pre") == "Hello, World!" - assert mdfilters.md_escape("Hello, World!", "code") == "Hello, World!" - assert mdfilters.md_escape("Hello, World!", "text_link") == "Hello, World!" - assert ( - mdfilters.md_escape("_*[]()~`>#+-=|{}.!") - == "\\_\\*\\[\\]\\(\\)\\~\\`\\>\\#\\+\\-\\=\\|\\{\\}\\.\\!" - ) - - -def test_md_style(): - assert mdfilters.md_style("Hello, World!") == "Hello, World!" - assert ( - mdfilters.md_style("Hello, World!", size=3) - == "Hello, World!" - ) - assert mdfilters.md_style("Hello, World!", bold=True) == "**Hello, World!**" - assert mdfilters.md_style("Hello, World!", italic=True) == "*Hello, World!*" - assert mdfilters.md_style("Hello, World!", code=True) == "`Hello, World!`" - assert ( - mdfilters.md_style("Hello, World!", align="center") - == "

Hello, World!

" - ) - assert ( - mdfilters.md_style( - "Hello, World!", - size=3, - bold=True, - italic=True, - code=True, - align="center", - ) - == "

`***Hello," - " World!***`

" - ) - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_regexfilters.py b/tests/test_regexfilters.py deleted file mode 100644 index 9349aeb..0000000 --- a/tests/test_regexfilters.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from jinja2.exceptions import FilterArgumentError -import pytest - -from jinjarope import regexfilters - - -def test_re_replace(): - assert ( - regexfilters.re_replace("Hello, World!", "World", "Universe") - == "Hello, Universe!" - ) - assert ( - regexfilters.re_replace("Hello, World!", "world", "Universe", ignorecase=True) - == "Hello, Universe!" - ) - assert ( - regexfilters.re_replace( - "Hello, World! Hello, World!", - "World", - "Universe", - count=1, - ) - == "Hello, Universe! Hello, World!" - ) - - -def test_re_findall(): - assert regexfilters.re_findall("Hello, World! Hello, Universe!", "Hello") == [ - "Hello", - "Hello", - ] - assert regexfilters.re_findall( - "Hello, World! Hello, Universe!", - "hello", - ignorecase=True, - ) == ["Hello", "Hello"] - assert regexfilters.re_findall("Hello, World! Hello, Universe!", "Goodbye") == [] - - -def test_re_search(): - assert regexfilters.re_search("Hello, World! Hello, Universe!", "World") == "World" - assert ( - regexfilters.re_search("Hello, World! Hello, Universe!", "world", ignorecase=True) - == "World" - ) - assert regexfilters.re_search("Hello, World! Hello, Universe!", "Goodbye") is None - assert regexfilters.re_search("A\nB", "^B", multiline=True) - with pytest.raises(FilterArgumentError): - regexfilters.re_search("A\nB", "^B", "x") - - -def test_re_escape(): - assert regexfilters.re_escape("Hello, World!") == "Hello,\\ World!" - assert regexfilters.re_escape("Hello, World!", "posix_basic") == "Hello, World!" - assert regexfilters.re_escape("[a]", "posix_basic") == "\\[a\\]" - with pytest.raises(NotImplementedError): - regexfilters.re_escape("Hello, World!", "unknown") - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_serializefilters.py b/tests/test_serializefilters.py deleted file mode 100644 index 7ebec8e..0000000 --- a/tests/test_serializefilters.py +++ /dev/null @@ -1,212 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -import pytest - -from jinjarope import serializefilters - - -if TYPE_CHECKING: - from collections.abc import Callable - - -def test_serialize_deserialize(): - text = {"abc": {"def": "ghi"}} - fmts: list[serializefilters.SerializeFormatStr] = ["yaml", "json", "ini", "toml"] - for fmt in fmts: - serialized = serializefilters.serialize(text, fmt) - assert serializefilters.deserialize(serialized, fmt) == text - - -def test_dig(): - data = { - "section1": { - "section2": { - "section3": "Hello, World!", - }, - }, - } - assert ( - serializefilters.dig(data, "section1", "section2", "section3") == "Hello, World!" - ) - assert serializefilters.dig(data, "section1", "section2", "nonexistent") is None - - -def test_dig_with_list(): - data = { - "section1": [ - {"section1": "Wrong one!"}, - {"section2": "Hello, World!"}, - ], - } - assert serializefilters.dig(data, "section1", "section2") == "Hello, World!" - - -def test_dig_with_keep_path(): - data = { - "section1": { - "section2": { - "section3": "Hello, World!", - "something": "else!", - }, - }, - } - assert serializefilters.dig( - data, - "section1", - "section2", - "section3", - keep_path=True, - ) == { - "section1": {"section2": {"section3": "Hello, World!"}}, - } - - -def test_dig_with_keep_path_and_list(): - # TODO: this behaviour needs to get implemented correctly. - data = { - "section1": [ - {"section1": "Wrong one!"}, - {"section2": "Hello, World!"}, - ], - } - assert serializefilters.dig(data, "section1", "section2", keep_path=True) == { - "section1": {"section2": "Hello, World!"}, - } - - -@pytest.fixture -def nested_dict() -> dict[str, Any]: - return { - "level1": { - "level2": { - "key": "value", - "numbers": [1, 2, 3], - }, - }, - } - - -@pytest.fixture -def simple_dict() -> dict[str, str]: - return {"a": "1", "b": "2"} - - -@pytest.fixture -def simple_list() -> list[int]: - return [1, 2, 3] - - -def test_merge_dicts_basic() -> None: - dict1 = {"a": 1, "b": 2} - dict2 = {"c": 3, "d": 4} - expected = {"a": 1, "b": 2, "c": 3, "d": 4} - - result = serializefilters.merge(dict1, dict2) - assert result == expected - - -def test_merge_dicts_with_overlap() -> None: - dict1 = {"a": 1, "b": 2} - dict2 = {"b": 3, "c": 4} - expected = {"a": 1, "b": 3, "c": 4} - - result = serializefilters.merge(dict1, dict2) - assert result == expected - - -def test_merge_lists() -> None: - list1 = [1, 2, 3] - list2 = [4, 5, 6] - expected = [1, 2, 3, 4, 5, 6] - - result = serializefilters.merge(list1, list2) - assert result == expected - - -def test_merge_nested_structures(nested_dict: dict[str, Any]) -> None: - source = { - "level1": { - "level2": { - "new_key": "new_value", - "numbers": [4, 5, 6], - }, - }, - } - expected = { - "level1": { - "level2": { - "key": "value", - "new_key": "new_value", - "numbers": [1, 2, 3, 4, 5, 6], - }, - }, - } - - result = serializefilters.merge(nested_dict, source) - assert result == expected - - -def test_deepcopy_option(simple_dict: dict[str, str]) -> None: - source = {"c": "3"} - result = serializefilters.merge(simple_dict, source, deepcopy=True) - assert isinstance(result, dict) - # Modify the original dict - simple_dict["a"] = "modified" - - # Result should remain unchanged due to deepcopy - assert result["a"] == "1" - - -def test_multiple_sources() -> None: - target = {"a": 1} - source1 = {"b": 2} - source2 = {"c": 3} - expected = {"a": 1, "b": 2, "c": 3} - - result = serializefilters.merge(target, source1, source2) - assert result == expected - - -def test_custom_merger() -> None: - def custom_list_merger(_merger, target: list[int], source: list[int]) -> list[int]: - return sorted(set(target + source)) - - mergers: dict[type, Callable[[Any, Any, Any], Any]] = {list: custom_list_merger} - list1 = [3, 1, 2] - list2 = [2, 3, 4] - expected = [1, 2, 3, 4] - - result = serializefilters.merge(list1, list2, mergers=mergers) - assert result == expected - - -def test_merge_empty_structures() -> None: - dict1: dict[str, Any] = {} - dict2 = {"a": 1} - result = serializefilters.merge(dict1, dict2) - assert result == {"a": 1} - - list1: list[Any] = [] - list2 = [1, 2] - result = serializefilters.merge(list1, list2) - assert result == [1, 2] - - -@pytest.mark.parametrize( - "invalid_input", - [ - None, - 42, - "string", - True, - ], -) -def test_merge_invalid_input(invalid_input: Any) -> None: - with pytest.raises(TypeError): - serializefilters.merge(invalid_input, {}) - - -if __name__ == "__main__": - pytest.main([__file__]) diff --git a/tests/test_textfilters.py b/tests/test_textfilters.py deleted file mode 100644 index 85868cb..0000000 --- a/tests/test_textfilters.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import annotations - -import pytest - -from jinjarope import textfilters - - -GIVEN = """def test(sth, averylongvarname, anotherlongvarname, andanother): pass""" -EXPECTED = """\ -def test( - sth, - averylongvarname, - anotherlongvarname, - andanother, -): - pass -""" - - -def test_removesuffix(): - assert textfilters.removesuffix("Hello, World!", ", World!") == "Hello" - - -def test_removeprefix(): - assert textfilters.removeprefix("Hello, World!", "Hello, ") == "World!" - - -def test_lstrip(): - assert textfilters.lstrip(" Hello, World! ") == "Hello, World! " # noqa: B005 - - -def test_rstrip(): - assert textfilters.rstrip(" Hello, World! ") == " Hello, World!" # noqa: B005 - - -def test_format_code(): - assert textfilters.format_code(GIVEN, line_length=50) == EXPECTED - assert textfilters.format_code("invalid code!", line_length=50) == "invalid code!" - - -def test_format_signature(): - def test_function(a, b, c: int = 1, *args, **kwargs): - pass - - assert ( - textfilters.format_signature(test_function) - == "(a, b, c: int = 1, *args, **kwargs)" - ) - assert ( - textfilters.format_signature(test_function, eval_str=False) - == "(a, b, c: 'int' = 1, *args, **kwargs)" - ) - - -def test_slugify(): - assert textfilters.slugify("Hello, World!") == "hello__world_" - - -if __name__ == "__main__": - code = "def test(sth, fsjkdalfjksdalfjsadk, fjskldjfkdsljf, fsdkjlafjkdsafj): pass" - text = textfilters.format_code(code, line_length=50) - print(text) - - -if __name__ == "__main__": - pytest.main([__file__])