Skip to content

fix: pass non-string values through clean_string (CDATA support) - #542

Open
Sanjays2402 wants to merge 3 commits into
cleder:developfrom
Sanjays2402:fix/clean-string-cdata
Open

Sanjays2402 wants to merge 3 commits into
cleder:developfrom
Sanjays2402:fix/clean-string-cdata

Conversation

@Sanjays2402

@Sanjays2402 Sanjays2402 commented Jul 31, 2026

Copy link
Copy Markdown

Closes #418

clean_string() called .strip() on any truthy value, so passing an lxml.etree.CDATA object as a description raised AttributeError: 'lxml.etree.CDATA' object has no attribute 'strip'. Non-string values are now passed through unchanged — the approach suggested on the issue — so a CDATA description serialises as <![CDATA[...]]> instead of being escaped.

Regression tests added to tests/helper_test.py; both fail without the change and pass with it.

This change was prepared with AI assistance; the regression test was run locally and fails without the fix.

Summary by Sourcery

Preserve non-string description values while continuing to normalize string inputs.

Bug Fixes:

  • Preserve non-string values passed to clean_string, allowing lxml CDATA descriptions to serialize correctly without escaping.

Tests:

  • Add regression coverage for string cleaning, CDATA pass-through, and unescaped CDATA serialization.

Summary by CodeRabbit

  • Bug Fixes

    • Improved handling of non-string values during string cleanup while preserving expected behavior for empty, null, and whitespace-only values.
    • Preserved CDATA content without unwanted escaping when serializing placemark descriptions.
  • Tests

    • Added coverage for empty, null, trimmed string, non-string, and CDATA input scenarios.
    • Verified that placemark descriptions retain their original CDATA content during serialization.

clean_string() called .strip() on any truthy value, so passing an
lxml.etree.CDATA object as a description (or any other cleaned string
field) raised AttributeError: 'lxml.etree.CDATA' object has no attribute
'strip'. This made it impossible to emit unescaped HTML in a description,
which worked before 1.0.

Non-string values are now returned unchanged, as suggested on the issue,
so a CDATA description round-trips as <![CDATA[...]]>.

Closes cleder#418
@semanticdiff-com

semanticdiff-com Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review changes with  SemanticDiff

Changed Files
File Status
  fastkml/helpers.py  34% smaller
  tests/helper_test.py  0% smaller

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@sourcery-ai

sourcery-ai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Adjusts clean_string to safely handle non-string values (notably lxml.etree.CDATA) and adds regression tests ensuring CDATA descriptions in Placemark are preserved as CDATA rather than escaped.

Sequence diagram for CDATA description handling via clean_string

sequenceDiagram
    actor User
    participant Placemark
    participant clean_string
    participant CDATA
    participant Serializer

    User->>Placemark: set_description(CDATA)
    Placemark->>clean_string: clean_string(CDATA)
    clean_string->>clean_string: [value is not str]
    clean_string-->>Placemark: CDATA (unchanged)
    Placemark->>Serializer: write_description(CDATA)
    Serializer-->>User: <![CDATA[description]] in output
Loading

File-Level Changes

Change Details Files
Make clean_string tolerant of non-string values by returning them unchanged instead of calling strip, while preserving existing whitespace-stripping behavior for strings.
  • Return None for falsy values early in clean_string.
  • Add type check to return non-string values unchanged (e.g., lxml.etree.CDATA).
  • Keep string-specific strip logic and empty-to-None conversion for valid string inputs.
fastkml/helpers.py
Add regression tests covering clean_string behavior and CDATA handling in Placemark descriptions using lxml backend.
  • Import lxml.etree, Placemark, clean_string, and Lxml test base in tests.
  • Add unit test verifying clean_string’s behavior with typical string and None inputs.
  • Add lxml-specific tests verifying CDATA is passed through unchanged and Placemark description serializes as CDATA rather than escaped.
tests/helper_test.py

Assessment against linked issues

Issue Objective Addressed Explanation
#418 Allow non-string values (e.g., lxml.etree.CDATA) to be passed as description without calling .strip() or causing AttributeError in clean_string/Placemark.
#418 Ensure that a CDATA value used as a Placemark description is preserved and serialised as rather than having its HTML content escaped.

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@codereviewbot-ai

codereviewbot-ai Bot commented Jul 31, 2026

Copy link
Copy Markdown

PR Review Summary

The changes in this PR correctly fix issue #418 by allowing lxml.etree.CDATA instances to pass through clean_string without triggering a AttributeError on .strip(), enabling unescaped CDATA sections during Placemark serialization.

Feedback Summary

  • fastkml/helpers.py:
    • Updated clean_string type signature to Any so static type checkers accept lxml.etree.CDATA (and other non-string inputs) without error.
    • Adjusted falsy check to value is None to ensure non-string objects are preserved as intended without being prematurely returned as None.
  • tests/helper_test.py: Test coverage is clean and directly verifies both clean_string CDATA passthrough and round-trip Placemark XML serialization.

🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

@what-the-diff

what-the-diff Bot commented Jul 31, 2026

Copy link
Copy Markdown

PR Summary

  • Enhancement to the clean_string Function

    • The function has been improved to manage non-string values more effectively by letting them pass through without modifications.
    • More checks have been introduced to return None when an empty string or None is given as input.
  • New Tests for clean_string

    • Brand new tests for the clean_string function include checks for empty and None inputs, as well as verifying the correct handling of non-string inputs.
    • Inclusion of tests for the Placemark has been done to make sure that CDATA descriptions are kept intact in the output.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 630a3e8a-67e0-4fd8-8a23-d38854e3a86a

📥 Commits

Reviewing files that changed from the base of the PR and between 88677d1 and a00d91e.

📒 Files selected for processing (2)
  • fastkml/helpers.py
  • tests/helper_test.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • tests/helper_test.py
  • fastkml/helpers.py

Included review availability: Your plan provides up to 2 included reviews per hour; 1 remains after this review.


Walkthrough

clean_string now preserves non-string values, including lxml CDATA. Tests verify string cleanup, CDATA identity, and unescaped Placemark description serialization.

Changes

CDATA preservation

Layer / File(s) Summary
Preserve non-string description values
fastkml/helpers.py, tests/helper_test.py
clean_string passes through non-string values and retains string trimming and empty-value behavior. Tests verify lxml CDATA identity and unescaped Placemark description serialization.

Estimated code review effort: 2 (Simple) | ~10 minutes

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to a00d9

This change preserves CDATA description values while retaining string cleanup behavior, with regression coverage for CDATA serialization and existing string cases. No merge-blocking risk is identified.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 2 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: allowing non-string values, including CDATA, to pass through clean_string.
Linked Issues check ✅ Passed The changes satisfy issue #418 by preserving non-string values such as lxml.etree.CDATA in clean_string and validating CDATA serialization in Placemark descriptions.
Out of Scope Changes check ✅ Passed The changes are limited to clean_string behavior, its documentation, and focused regression tests. No unrelated changes are present.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit keeps strings neat,
While CDATA stays complete.
Placemark carries HTML through,
Without escaping what is true.
Tests confirm the path is clear.

Comment @coderabbitai help to get the list of available commands.

codescene-access[bot]

This comment was marked as outdated.

@codacy-production

codacy-production Bot commented Jul 31, 2026

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 7 high

Alerts:
⚠ 7 issues (≤ 0 issues of at least minor severity)

Results:
7 new issues

Category Results
Security 7 high

View in Codacy

🟢 Metrics 0 complexity · 0 duplication

Metric Results
Complexity 0
Duplication 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@mergify

mergify Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="fastkml/helpers.py" line_range="93-100" />
<code_context>

 def clean_string(value: str | None) -> str | None:
     """Clean and validate a string value, returning None if empty."""
-    return value.strip() or None if value else None
+    if not value:
+        return None
+    if not isinstance(value, str):
+        # Pass non-string values (e.g. ``lxml.etree.CDATA``) through unchanged.
+        return value
+    return value.strip() or None


</code_context>
<issue_to_address>
**suggestion:** The type hints and docstring no longer match the actual behavior, which can now return non-string values.

Given the new branch that returns non-string values unchanged, `clean_string` can now return the original input (e.g. a CDATA-like object), not just `str | None`. The parameter type `value: str | None` is also inaccurate now that non-string inputs are explicitly supported. Please update the parameter and return annotations to reflect the actual behavior, or adjust the implementation so it only accepts and returns strings, depending on the intended public API.

Suggested implementation:

```python
def clean_string(value: object | None) -> object | None:
    """Clean and validate string-like values.

    For string inputs, returns the stripped string or ``None`` if the result is empty.
    For non-string inputs (e.g. ``lxml.etree.CDATA`` or other objects), returns the
    value unchanged.
    """
    if value is None:
        return None
    if isinstance(value, str):
        return value.strip() or None
    # Pass non-string values (e.g. ``lxml.etree.CDATA``) through unchanged.
    return value

```

Depending on your preferred typing style, you may want to:
1. Replace ``object`` with ``typing.Any`` and add ``from typing import Any`` at the top of the file, updating the signature to ``def clean_string(value: Any | None) -> Any | None:``.
2. If this helper is part of a public API, consider documenting explicitly that it is intended to be used with both plain strings and string-like objects such as CDATA, and that non-string inputs are returned unchanged.
</issue_to_address>

### Comment 2
<location path="tests/helper_test.py" line_range="171-178" />
<code_context>
+
+        assert clean_string(cdata) is cdata
+
+    def test_placemark_description_cdata_is_not_escaped(self) -> None:
+        """A CDATA description round-trips unescaped (#418)."""
+        placemark = Placemark(
+            ns="{http://www.opengis.net/kml/2.2}",
+            description=lxml.etree.CDATA("<b>bold</b>"),
+        )
+
+        assert "<![CDATA[<b>bold</b>]]>" in placemark.to_string()
</code_context>
<issue_to_address>
**suggestion (testing):** Consider also asserting that the escaped form is absent to fully capture the regression scenario.

Right now the test only checks that the CDATA wrapper is present in the serialized output. To fully cover the regression, also assert that the escaped version (e.g. `"&lt;b&gt;bold&lt;/b&gt;"`) does not appear in `placemark.to_string()`, so the description isn’t both wrapped in CDATA and escaped at the same time.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread fastkml/helpers.py Outdated
Comment thread tests/helper_test.py Outdated
Comment thread fastkml/helpers.py Outdated
@@ -92,7 +92,12 @@

def clean_string(value: str | None) -> str | None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Type Annotation: Since clean_string is now designed to accept and return non-string objects like lxml.etree.CDATA, the str | None parameter and return type annotations cause static type checkers (mypy/pyright) to report type errors when passing or returning non-string instances. Annotating with Any (or str | Any | None) accurately reflects the expected inputs and outputs.

  2. Control Flow: if not value: runs before checking isinstance(value, str). If a non-string object that evaluates as falsy in a boolean context is passed, clean_string will return None rather than passing the object through unchanged. Checking if value is None: or performing the isinstance check first fixes this edge case.

Suggested change
def clean_string(value: str | None) -> str | None:
def clean_string(value: Any) -> Any:
"""Clean and validate a string value, returning None if empty."""
if value is None:
return None
if not isinstance(value, str):
# Pass non-string values (e.g. ``lxml.etree.CDATA``) through unchanged.
return value
return value.strip() or None

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — updated the annotation to Any -> Any and fixed the control flow so only None becomes None; non-strings pass through unchanged.

@greptile-apps

greptile-apps Bot commented Jul 31, 2026

Copy link
Copy Markdown

Greptile Summary

This PR extends string cleaning to preserve non-string values such as CDATA while retaining existing normalization for strings.

  • Updates clean_string to strip only string inputs and pass other values through unchanged.
  • Adds coverage for empty strings, None, falsy non-string values, CDATA identity, and Placemark CDATA serialization.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the previously reported type-contract mismatch was addressed by broadening the helper signature to match its non-string passthrough behavior.

Important Files Changed

Filename Overview
fastkml/helpers.py Broadens the helper contract and safely preserves non-string values while maintaining existing string-cleaning behavior.
tests/helper_test.py Adds focused regression coverage for string normalization and unescaped CDATA serialization.

Reviews (3): Last reviewed commit: "Address review: align clean_string type ..." | Re-trigger Greptile

Comment thread fastkml/helpers.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/helper_test.py (1)

155-159: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a Hypothesis property for clean_string.

The current test covers only four fixed inputs. Add a property over normal str inputs that asserts clean_string(value) == value.strip() or None, and keep the named regression cases and the CDATA pass-through test where needed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/helper_test.py` around lines 155 - 159, Add a Hypothesis-based property
test for clean_string using arbitrary normal str values, asserting the result
equals value.strip() when non-empty and None otherwise. Retain the existing
named regression cases and any separate CDATA pass-through coverage required by
the current tests.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@fastkml/helpers.py`:
- Around line 95-100: Update clean_string’s type contract and documentation to
reflect that non-string XML text values such as lxml.etree.CDATA are returned
unchanged, and revise all _Feature field annotations that use this helper
accordingly. Prefer an overload or generic preserving the input type for
supported values; otherwise explicitly narrow and diagnose the CDATA passthrough
so strict type checking matches runtime behavior.

---

Nitpick comments:
In `@tests/helper_test.py`:
- Around line 155-159: Add a Hypothesis-based property test for clean_string
using arbitrary normal str values, asserting the result equals value.strip()
when non-empty and None otherwise. Retain the existing named regression cases
and any separate CDATA pass-through coverage required by the current tests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 07c47e90-c5a0-42e1-b5e6-181fb370a9ff

📥 Commits

Reviewing files that changed from the base of the PR and between d67305d and e9fd6e4.

📒 Files selected for processing (2)
  • fastkml/helpers.py
  • tests/helper_test.py

Comment thread fastkml/helpers.py Outdated

@llamapreview llamapreview Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LlamaPReview — Verification needed

How does to_string() serialize a CDATA object assigned as element text through the registry binding, and what happens with the stdlib ElementTree fallback?

Owner action: Read fastkml/base.py _XMLObject.to_string() and the relevant registry binding in fastkml/features.py to confirm how description is bound as element text and whether the configured etree preserves CDATA objects through serialization. Alternatively, run the new test_placemark_description_cdata_is_not_escaped test with lxml configured.

1 further check in details.

Review details and evidence
Priority File Finding Evidence
P2 tests/helper_test.py Unconditional import lxml.etree breaks test collection when lxml is absent confirmed

Material unknowns

  • How does to_string() serialize a CDATA object assigned as element text through the registry binding, and what happens with the stdlib ElementTree fallback? The PR's test asserts <![CDATA[<b>bold</b>]]> appears in placemark.to_string(), but the serialization path (_XMLObject.to_string() / registry element-text binding) was not retrieved by evidence collection. If the etree or binding silently coerces CDATA to a plain string, the fix does not deliver the claimed unescaped round-trip and issue #418 remains unresolved.
  • Analysis surfaced 1 candidate concern whose adjudication did not complete in this review.
    • Check: Have a maintainer look over the changed areas once more, or re-trigger the review to complete adjudication.

LlamaPReview checks

  • Reviewed changed regions in tests/helper_test.py.
  • Read bounded PR-head context from tests/base.py.

Automated review by LlamaPReview · Free for public open-source projects.

Comment thread tests/helper_test.py Outdated
Comment on lines +21 to +23
from unittest.mock import patch

import lxml.etree

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 | Confidence: High

The module-level import lxml.etree added by this PR raises ImportError when lxml is not installed, preventing collection of all tests in tests/helper_test.py — including the existing StdLibrary-based tests that do not require lxml. The repository supports both stdlib ElementTree and lxml backends: tests/base.py defines a StdLibrary base class and a Lxml base class guarded by @pytest.mark.skipif(not LXML, reason="lxml not installed"), confirming lxml is optional. The TestLxml class inherits that guard, but the skip decorator never executes because the module-level import fails first.

Code Suggestion:

Move `import lxml.etree` inside the `TestLxml` class (e.g., in `setup_method` or each test method), or wrap it in `try: import lxml.etree except ImportError: lxml = None` paired with the existing skip logic. Since `TestLxml` already inherits from `Lxml` which is guarded by `@pytest.mark.skipif(not LXML, ...)`, placing the import inside the class body or `setup_method` is safe.

Evidence: changed region in tests/helper_test.py; bounded PR-head context from tests/base.py.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, and it was reproducible: with lxml uninstalled the module-level import lxml.etree fails during collection, so pytest errors out on the whole file and the seven StdLibrary tests never run either — the Lxml skipif on TestLxml never gets a chance to fire.

Fixed in 88677d1 using the same try/except ImportError guard tests/base.py and tests/config_test.py already use.

Before: ERROR tests/helper_test.py / Interrupted: 1 error during collection.
After: 7 passed, 2 skipped without lxml, 9 passed with it.

On the str | None signature point from the other bot — I left that alone deliberately. Widening the annotation would push the CDATA type into every caller's field type across features/links/model/network_link_control, which is a bigger API decision than this fix; happy to do it if you'd prefer.

@codecov

codecov Bot commented Aug 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.95%. Comparing base (d67305d) to head (e9fd6e4).

Additional details and impacted files
@@           Coverage Diff            @@
##           develop     #542   +/-   ##
========================================
  Coverage    99.95%   99.95%           
========================================
  Files           90       90           
  Lines         7160     7180   +20     
  Branches       172      174    +2     
========================================
+ Hits          7157     7177   +20     
  Misses           2        2           
  Partials         1        1           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

codescene-access[bot]

This comment was marked as outdated.

@codereviewbot-ai

codereviewbot-ai Bot commented Aug 6, 2026

Copy link
Copy Markdown

LGTM! The changes to clean_string and the accompanying unit tests accurately allow lxml.etree.CDATA instances to be passed through without error during string cleaning and serialization. The existing feedback regarding type annotations and control-flow edge cases covers all pertinent details.


🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

@codereviewbot-ai

codereviewbot-ai Bot commented Sep 10, 2026

Copy link
Copy Markdown

LGTM! The changes to clean_string to pass through non-string objects (such as lxml.etree.CDATA) are clean, well-typed, and accompanied by comprehensive tests.


🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sourcery assessment

Approved.

@codescene-access codescene-access Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gates Passed
6 Quality Gates Passed

See analysis details in CodeScene

Quality Gate Profile: Customizable Safeguards
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support CDATA in description field

1 participant