{"record":{"id":"e5be519ad1b515a9","repo":"JuliusBrussee/caveman","slug":"path-every-catalog-row-must-be-an-object","errorCode":null,"errorMessage":"{path}: every catalog row must be an object","messagePattern":"(.+?): every catalog row must be an object","errorType":"validation","errorClass":"CatalogError","httpStatus":null,"severity":"error","filePath":"shared/provider-catalog/validate_catalog.py","lineNumber":97,"sourceCode":"# own pricing page; until then, the catalog is invalid.\n# MUST stay a prefix of REVIEW_MARKER_PREFIX in that script (the test suite\n# asserts it), or a renamed marker would sail past this rule.\nREVIEW_MARKER = \"# proposed-by:\"\n\n\nclass CatalogError(ValueError):\n    pass\n\n\ndef load_yaml(path: Path) -> list[dict[str, Any]]:\n    try:\n        document = yaml.safe_load(path.read_text(encoding=\"utf-8\"))\n    except (OSError, yaml.YAMLError) as error:\n        raise CatalogError(f\"{path}: invalid YAML: {error}\") from error\n    if not isinstance(document, list) or not document:\n        raise CatalogError(f\"{path}: catalog must be a non-empty list\")\n    if not all(isinstance(row, dict) for row in document):\n        raise CatalogError(f\"{path}: every catalog row must be an object\")\n    return document\n\n\ndef parsed_time(value: Any, label: str) -> datetime:\n    if isinstance(value, datetime):\n        parsed = value\n    elif isinstance(value, str):\n        try:\n            parsed = datetime.fromisoformat(value.replace(\"Z\", \"+00:00\"))\n        except ValueError as error:\n            raise CatalogError(f\"{label}: verified_at must be RFC3339\") from error\n    else:\n        raise CatalogError(f\"{label}: verified_at must be an RFC3339 timestamp\")\n    if parsed.tzinfo is None:\n        raise CatalogError(f\"{label}: verified_at must include a timezone\")\n    return parsed.astimezone(timezone.utc)\n\n","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/shared/provider-catalog/validate_catalog.py#L79-L115","documentation":"Error \"{path}: every catalog row must be an object\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at shared/provider-catalog/validate_catalog.py:97 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Make every catalog row a mapping/object."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}