한국어

개발자 도구 · 구문 변환기

노르웨이 문제: YAML 1.1 대 1.2 및 NO가 false가 되는 이유

· 배경

YAML 데이터 형식 디버깅

레거시 부울 경로가 지워진 동안 문자열을 유지하지 않는 텍스트 NO
원본 ToolAcre 벡터 일러스트레이션

YAML 1.1에서 인용되지 않은 값 NO는 부울이며, 이는 노르웨이가 국가 목록에서 사라지는 이유입니다. 이 게시물에서는 YAML의 암시적 유형 지정 기록, 1.2 사양이 변경된 내용, 오늘날의 도구에서 문제가 지속되는 이유를 알려줍니다.

하나가 누락된 국가 목록 — 거짓으로 분석된 NO 및 오슬로 사무소의 버그 보고서

전형적인 버그는 인용되지 않은 국가 코드 `NO`가 거짓이 되는 것입니다. ToolAcre의 테스트는 이것이 여기서 발생하지 않음을 증명합니다. 두 스키마 옵션 모두 `NO`, yes, no를 문자열로 설정 및 해제합니다. 이 패널 내에서 노르웨이가 사라지는 이야기가 시작되면 구현과 모순됩니다.

이 예는 호환성 경고로 여전히 유용합니다. 다른 YAML 소비자가 레거시 규칙을 사용하는 경우 ToolAcre 작성자는 모호한 문자열을 인용하여 다운스트림 독자가 이를 재해석하지 않도록 합니다. 판독기와 기록기는 개요에서 설명하는 바로 그 오류를 방지하도록 구성됩니다.

이 변환기에서는 노르웨이가 사라지지 않습니다. 텍스트가 유지되지 않습니다.

이 저장소는 js-yaml의 제한된 JSON 및 핵심 스키마와 관찰된 스칼라 동작을 문서화합니다. 여기에는 YAML의 2001 기원, 작성자의 의도 또는 역사적 디자인 논쟁에 대한 소스가 포함되어 있지 않습니다. 이러한 주장은 기억에서 재구성되기보다는 생략됩니다.

현재 메커니즘은 실용적인 가이드로 충분합니다. 일반 스칼라 해결은 선택한 스키마에서 발생합니다. 인용된 값은 텍스트로 유지됩니다. 지원되지 않는 태그는 거부됩니다. 코드에 대한 증거를 소스가 없는 표준 기록으로 확장해서는 안 됩니다.

저장소 증거는 YAML의 원본 기록이 아닌 현재 파서 구성을 포함합니다.

YAML 1.1 일반적으로 yes, no, on 및 off 변형을 부울로 처리합니다. 이것이 노르웨이 문제가 일부 생태계에 존재하는 이유를 설명합니다. ToolAcre는 1.1 스위치를 노출하지 않으며 이러한 모드에서 60진수 또는 레거시 8진수 변환을 보여주지 않습니다.

이 패널을 예측하는 것이 아니라 외부 파서 출력을 검토하려면 위험을 사용하십시오. 다른 도구가 false를 생성하면 해당 라이브러리와 스키마를 기록하십시오. ToolAcre의 결과는 대조되는 YAML 1.2 읽기 역할을 할 수 있지만 다른 구현이 해당 계약에 대해 잘못 구성되었다는 증거는 아닙니다.

레거시 YAML 1.1 부울은 위험을 설명하지만 여기서는 활성화되지 않습니다.

엄격한 JSON 스키마는 JSON 호환 스칼라 철자만 인식합니다. Core는 추가로 물결표 및 빈 값을 null, 16진수 또는 `0o` 정수 및 무한한 숫자로 확인합니다. 둘 다 참과 거짓을 넘어 부울 어휘를 확장하지 않습니다.

Core Infinity 및 NaN은 나중에 JSON에 대한 표현이 없기 때문에 경고와 함께 JSON에서 null이 됩니다. 따라서 노르웨이 값 자체가 안정적으로 유지되더라도 스키마 옵션 간의 차이는 눈에 띄고 때로는 손실이 발생합니다.

배송된 옵션은 모두 YAML 1.2 스키마입니다.

레거시 동작은 파서 기본값이나 응용 프로그램 규칙이 이를 유지하는 모든 곳에서 유지됩니다. 변환기는 저장소 증거에서 해당 라이브러리 또는 버전을 목록화할 수 없습니다. 모호한 단어와 숫자 유사 항목이 포함된 고정 장치를 사용하여 실제 소비자를 테스트합니다.

ToolAcre의 YAML 작성자는 `NO`, `yes`, `1.0`, `0755` 및 날짜 표시 텍스트를 포함하여 이전 독자가 다르게 입력할 수 있는 문자열 주위에 보호 따옴표를 추가합니다. 이 호환성 출력은 최신 파서 채택에 대한 포괄적인 설명보다 측정 가능하고 안전합니다.

위험은 다른 파서에도 남아 있습니다. 이 도구로 일반화하기보다는 검증해 보세요.

`countries: [SE, NO, DK]`, `answers: [yes, no, on, off]`, `mode: 0755`, `octal: 0o755`, `version: 1.10` 및 `empty:`를 변환합니다. 엄격한 조건에서는 JSON 기본 값을 제외한 모든 값이 문자열로 유지됩니다. Core에서 8진수는 493이 되고 비어 있으면 null이 됩니다. 국가 및 답변 단어는 문자열로 유지됩니다.

모든 토큰을 인용하여 텍스트를 강제합니다. 그런 다음 JSON 결과를 다시 YAML에 쓰고 직렬 변환기가 선택한 따옴표를 검사합니다. 이 코드 정확한 비교는 존재하지 않는 YAML 1.1 모드를 실행하는 척하지 않고 도구의 규칙을 드러냅니다.

작업된 예: 제공된 두 스키마 아래의 국가 코드 및 스칼라 유사 항목

언어별 파서 스위치, 버전 기본값 및 프레임워크 래퍼는 이 구현 외부에 있습니다. 그들의 이름과 행동은 독립적으로 변합니다. 구성을 사용할 구성 요소를 참조하고 테스트하세요.

또한 패널은 애플리케이션 의미 체계의 유효성을 검사하지 않습니다. 국가 코드에는 `NO`을 문자열로 유지하는 것이 필요하지만 `NO`이 특정 스키마에서 허용되는 값인지 증명할 수는 없습니다.

요점: 문자열을 인용하고, 파서 버전을 파악하고, 브라우저에서 YAML을 JSON로 변환하면 암시적 입력이 표시되는 방법을 알 수 있습니다.

다시 입력할 수 있는 텍스트를 인용하고, 실제로 사용 중인 스키마를 파악하고 소비자를 테스트합니다. ToolAcre의 두 가지 YAML 1.2 옵션은 제한된 차이점을 가시화하고 의도적으로 레거시 부울 트랩을 피합니다.

교훈은 모든 파서가 한 가지 방식으로 동작한다는 것이 아닙니다. 암시적 유형 지정은 구성이며 변환기는 해당 구성을 명시해야 합니다. 여기서 증거에 따르면 노르웨이는 여전히 `"NO"` 상태를 유지하고 있습니다.

구성이 여러 시스템에 걸쳐 있는 경우 도메인에서 허용하는 모든 모호한 토큰을 포함하는 상호 운용성 설비를 추가하세요. 각 실제 소비자에서 이를 변환하거나 구문 분석하고 YAML 렌더링되지 않은 입력된 값을 비교합니다. 이는 국가 목록이나 권한 모드가 프로덕션에 도달하기 전에 레거시 부울 테이블, 8진수 규칙 또는 빈 값 차이를 포착합니다. 알려진 문자열을 인용하는 것은 환경 기본값에 의존하지 않고 문서에 의도를 기록하기 때문에 가장 간단한 휴대용 방어 수단으로 남아 있습니다.