{"record":{"id":"b92d6e9ad6b594eb","repo":"larksuite/cli","slug":"expected-integer","errorCode":null,"errorMessage":"expected integer","messagePattern":"expected integer","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/lark-slides/scripts/sxsd_validator.py","lineNumber":493,"sourceCode":"        \"actual\": actual,\n        \"message\": message,\n        \"hint\": hint,\n    }\n    if attr is not None:\n        result[\"attr\"] = attr\n    return result\n\n\ndef builtin_scalar_value(type_name: str, value: str) -> Decimal | str | bool:\n    if type_name in {\"string\", \"anyURI\"}:\n        return value\n    if type_name == \"boolean\":\n        if value not in {\"true\", \"false\", \"1\", \"0\"}:\n            raise ValueError(\"expected boolean\")\n        return value in {\"true\", \"1\"}\n    if type_name in {\"integer\", \"positiveInteger\", \"nonNegativeInteger\"}:\n        if re.fullmatch(r\"[+-]?\\d+\", value) is None:\n            raise ValueError(\"expected integer\")\n        number = Decimal(value)\n        if type_name == \"positiveInteger\" and number <= 0:\n            raise ArithmeticError(\"expected positive integer\")\n        if type_name == \"nonNegativeInteger\" and number < 0:\n            raise ArithmeticError(\"expected non-negative integer\")\n        return number\n    if type_name in {\"double\", \"decimal\"}:\n        lexical_value = value.strip(\" \\t\\n\\r\")\n        decimal_pattern = r\"[+-]?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)\"\n        double_pattern = decimal_pattern + r\"(?:[eE][+-]?[0-9]+)?\"\n        expected_pattern = double_pattern if type_name == \"double\" else decimal_pattern\n        if re.fullmatch(expected_pattern, lexical_value) is None:\n            raise ValueError(f\"expected {type_name}\")\n        try:\n            number = Decimal(lexical_value)\n        except InvalidOperation as error:\n            raise ValueError(f\"expected {type_name}\") from error\n        if not math.isfinite(float(number)):","sourceCodeStart":475,"sourceCodeEnd":511,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/skills/lark-slides/scripts/sxsd_validator.py#L475-L511","documentation":"builtin_scalar_value validates integer-family XSD types by requiring the lexical value to match [+-]?\\d+ before converting with Decimal. If the string is not a well-formed integer (e.g. '1.5', '1e3', ' 1', 'abc') it raises ValueError('expected integer'). Note the related ArithmeticError('expected positive integer')/'expected non-negative integer' fires only when the digits parse but violate the type's range.","triggerScenarios":"Validating an element/attribute typed as integer, positiveInteger, or nonNegativeInteger whose lexical value contains a decimal point, exponent, whitespace, thousands separators, or non-digits — anything failing re.fullmatch(r'[+-]?\\d+', value).","commonSituations":"Feeding JSON/CSV numeric data straight into the validator where floats like 3.0 or exponent notation like 1e3 are common; locale-formatted numbers ('1,000'); values pulled from free-text input; scientific-notation serializers.","solutions":["Normalize the value to a plain base-10 integer string before validation: str(int(float(value))) for floats, or strip separators/formatting first.","Ensure float data is serialized without a decimal point when the schema type is integer (e.g. int(value) before writing).","If the value genuinely has a fractional part, change the schema type to decimal/double instead of coercing the data.","Pre-check with re.fullmatch(r'[+-]?\\d+', value) in the caller for a clearer domain-specific error message."],"exampleFix":"// before\nvalidate(\"count\", \"1e3\", type=\"integer\")  # ValueError: expected integer\n\n// after\nvalue = str(int(float(raw)))          # '1e3' -> '1000'\nvalidate(\"count\", value, type=\"integer\")","handlingStrategy":"validation","validationCode":"import re\n\ndef is_xsd_integer(value: str) -> bool:\n    return re.fullmatch(r\"[+-]?\\d+\", value) is not None\n\nif not is_xsd_integer(raw):\n    raise SystemExit(f\"{raw!r} is not an XSD integer literal (no decimals, exponents, or separators)\")","typeGuard":"import re\n\ndef is_xsd_integer(value: str) -> bool:\n    return re.fullmatch(r\"[+-]?\\d+\", value) is not None","tryCatchPattern":"try:\n    parsed = builtin_scalar_value(\"integer\", raw)\nexcept ValueError as err:\n    if str(err) == \"expected integer\":\n        try:\n            raw = str(int(float(raw)))\n        except (TypeError, ValueError):\n            raise SystemExit(f\"not an integer: {raw!r}\") from None\n        parsed = builtin_scalar_value(\"integer\", raw)\n    else:\n        raise","preventionTips":["Coerce floats to int before serializing fields whose schema type is integer.","Strip locale separators (commas, spaces) and reject exponent notation at data-ingestion time.","Map float-ish data to xs:decimal/double in the schema instead of forcing integer.","Distinguish this lexical error (ValueError) from range errors (ArithmeticError) when logging."],"tags":["xsd","validation","schema","integer"],"backgroundTag":"schema-validation-failed","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}