Skip to content

fix(extensions): tolerate non-string tags in catalog search#3746

Open
Noor-ul-ain001 wants to merge 2 commits into
github:mainfrom
Noor-ul-ain001:fix/ext-catalog-nonstring-tags
Open

fix(extensions): tolerate non-string tags in catalog search#3746
Noor-ul-ain001 wants to merge 2 commits into
github:mainfrom
Noor-ul-ain001:fix/ext-catalog-nonstring-tags

Conversation

@Noor-ul-ain001

Copy link
Copy Markdown
Contributor

@

Summary

ExtensionCatalog.search() assumed catalog tags entries were always strings:

  • the tag filter did tag.lower() not in [t.lower() for t in ext_data.get("tags", [])]
  • the query path did " ".join([...] + ext_data.get("tags", []))

Extension catalog JSON is user-editable, so a hand-authored tags: [1, 2] crashes search:

  • search(tag=...)AttributeError: int object has no attribute lower
  • search(query=...)TypeError: sequence item N: expected str instance, int found

Fix

Coerce defensively: guard the tags value as a list and filter to isinstance(t, str), matching the reference-correct sibling in integrations/catalog.py::search. Non-string tags are skipped rather than crashing. This is the same bug class fixed for presets in #3743.

Testing

Adds test_search_tolerates_non_string_tags, which drives both search(tag=...) and search(query=...) against a catalog with mixed string/int tags. It fails pre-fix (AttributeError at the tag filter) and passes after. All existing test_search* tests remain green.

🤖 Generated with Claude Code
@

ExtensionCatalog.search() assumed catalog `tags` were always strings:
the tag filter called `t.lower()` and the query path did
`" ".join([...] + tags)`. Extension catalog JSON is user-editable, so a
hand-authored `tags: [1, 2]` crashed search with AttributeError (tag
filter) or TypeError (query join).

Coerce defensively by filtering to `isinstance(t, str)` and guarding the
tags value as a list, matching the reference-correct sibling in
integrations/catalog.py. Non-string tags are now skipped rather than
raising.

Adds a regression test driving search(tag=...) and search(query=...)
against a catalog with mixed string/int tags; both fail pre-fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Noor-ul-ain001
Noor-ul-ain001 requested a review from mnriem as a code owner July 26, 2026 06:29
The same ExtensionCatalog.search() method had two more string
assumptions on user-editable catalog fields: the author filter called
`ext_data.get("author", "").lower()` (AttributeError on a numeric
author) and the query searchable-text joined `name`/`description`
uncoerced (TypeError on a numeric name). Coerce both defensively,
matching the reference-correct integrations/catalog.py::search.

Extends the regression test with non-string author/name coverage;
fails pre-fix with AttributeError at the author filter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant