Skip to content

Commit af56f63

Browse files
committed
fix: accept numeric string catalog priorities
1 parent 1ed25f7 commit af56f63

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

src/specify_cli/integrations/catalog.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,13 +513,21 @@ def add_catalog(self, url: str, name: Optional[str] = None) -> None:
513513
)
514514
if "priority" in cat:
515515
raw_priority = cat.get("priority")
516-
if isinstance(raw_priority, bool) or not isinstance(raw_priority, int):
516+
if isinstance(raw_priority, bool):
517517
raise IntegrationValidationError(
518518
f"Invalid catalog entry at index {idx}: "
519519
f"'priority' must be an integer, got "
520520
f"{type(raw_priority).__name__}."
521521
)
522-
existing_priorities.append(raw_priority)
522+
try:
523+
normalized_priority = int(raw_priority)
524+
except (TypeError, ValueError):
525+
raise IntegrationValidationError(
526+
f"Invalid catalog entry at index {idx}: "
527+
f"'priority' must be an integer, got "
528+
f"{type(raw_priority).__name__}."
529+
) from None
530+
existing_priorities.append(normalized_priority)
523531
else:
524532
# Match `_load_catalog_config()`'s defaulting rule so the new
525533
# entry still sorts after implicit-priority siblings.

tests/integrations/test_integration_catalog.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,30 @@ def test_add_catalog_rejects_non_integer_priority(self, tmp_path, monkeypatch):
799799
with pytest.raises(IntegrationValidationError, match="'priority' must be an integer"):
800800
cat.add_catalog("https://b.example.com/catalog.json")
801801

802+
def test_add_catalog_accepts_numeric_string_priority(self, tmp_path, monkeypatch):
803+
self._isolate(tmp_path, monkeypatch)
804+
cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
805+
cfg_path.write_text(
806+
yaml.dump(
807+
{
808+
"catalogs": [
809+
{
810+
"url": "https://a.example.com/catalog.json",
811+
"name": "a",
812+
"priority": "10",
813+
}
814+
]
815+
}
816+
),
817+
encoding="utf-8",
818+
)
819+
cat = IntegrationCatalog(tmp_path)
820+
cat.add_catalog("https://b.example.com/catalog.json", name="b")
821+
822+
data = yaml.safe_load(cfg_path.read_text(encoding="utf-8"))
823+
assert data["catalogs"][-1]["name"] == "b"
824+
assert data["catalogs"][-1]["priority"] == 11
825+
802826
def test_add_catalog_rejects_existing_entry_with_bad_url(self, tmp_path, monkeypatch):
803827
"""A sibling entry with an http:// URL should block a new add."""
804828
self._isolate(tmp_path, monkeypatch)

0 commit comments

Comments
 (0)