From 6afc1bc5a77b523f6293400a33ca79a7c3083762 Mon Sep 17 00:00:00 2001 From: Jung Hyun Nam Date: Tue, 6 Feb 2024 17:08:04 +0900 Subject: [PATCH] =?UTF-8?q?README=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= =?UTF-8?q?=20/=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +++-- src/CatalogValidation.csx | 138 -------------------------------------- 2 files changed, 10 insertions(+), 145 deletions(-) delete mode 100644 src/CatalogValidation.csx diff --git a/README.md b/README.md index eb3d2a5..db5740f 100644 --- a/README.md +++ b/README.md @@ -21,18 +21,21 @@ 위의 두 개의 파일에 새로운 항목을 추가하고 Pull Request를 보내주시면, 검토 후에 반영하도록 하겠습니다. -### Catalog.xml 스키마 유효성 검사 +### 카탈로그 빌더 실행하기 -Catalog.xml이 규격에 맞도록 XML 마크업을 잘 기술했는지 C# 스크립트를 `dotnet script` CLI 유틸리티를 통해 실행하여 확인할 수 있습니다. - -`dotnet-script` CLI 도구는 [github.com/dotnet-script/dotnet-script]](https://github.com/dotnet-script/dotnet-script) 리포지터리를 참고하여 설치할 수 있습니다. 이 도구는 Windows 뿐 아니라 Linux, macOS에서도 사용할 수 있도록 설계되었습니다. +각종 유효성 검사 및 리소스 자동 생성을 위하여 CatalogBuilder를 새롭게 추가하였습니다. 새로운 커밋이 브랜치에 푸시되면, CatalogBuilder가 `outputs` 디렉터리에 `gh-pages` 브랜치에 내보낼 파일들을 복사하면서 추가 리소스 생성이나 유효성 검사를 진행하게 됩니다. ```bash -# 현재 디렉터리가 TableClothCatalog라고 가정합니다. -dotnet script --no-cache ./src/CatalogValidation.csx -- ./docs/Catalog.xml +# 리포지터리 루트 디렉터리에서 아래 명령어를 실행한다고 가정합니다. + +# 빌드 +dotnet build src/TableCloth.CatalogBuilder/TableCloth.CatalogBuilder.csproj --configuration Release + +# 실행 +dotnet run --project src/TableCloth.CatalogBuilder/TableCloth.CatalogBuilder.csproj --configuration Release -- ./docs/ ./outputs/ ``` -Catalog.xml 파일을 수정하여 제출하기 전에 검사를 진행하는 것을 권장합니다. +도구를 실행하여 나타나는 Error나 Warning을 최대한 제거하는 것이 좋습니다. Catalog.xml 파일을 수정하여 제출하기 전에 검사를 진행하는 것을 권장합니다. ### 자동 응답 설치 옵션을 찾는 방법 diff --git a/src/CatalogValidation.csx b/src/CatalogValidation.csx deleted file mode 100644 index ce855b7..0000000 --- a/src/CatalogValidation.csx +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env dotnet-script - -using System; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Schema; - -var path = Args.ElementAtOrDefault(0); - -const string schemaUrl = "http://yourtablecloth.app/TableClothCatalog/Catalog.xsd"; -const string userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"; - -var getPositionInfo = (IXmlLineInfo lineInfo) => -{ - var positionText = "Unknown Position"; - - if (lineInfo != null) - positionText = $"Line: {lineInfo.LineNumber}, Line Position: {lineInfo.LinePosition}"; - - return positionText; -}; - -if (string.Equals(path, "--help", StringComparison.OrdinalIgnoreCase)) -{ - Console.Out.WriteLine("Usage: "); - Environment.Exit(0); - return; -} - -if (!File.Exists(path)) -{ - Console.Error.WriteLine($"Error: Selected file path `{path}` does not exists."); - Environment.Exit(1); - return; -} - -var config = new XmlReaderSettings() -{ - ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings, -}; - -if (!string.IsNullOrWhiteSpace(schemaUrl)) -{ - Console.Out.WriteLine($"Info: Using schema `{schemaUrl}`."); - config.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; - config.ValidationType = ValidationType.Schema; - config.Schemas.Add(null, schemaUrl); -} - -var warningCount = 0; -var errorCount = 0; - -config.ValidationEventHandler += new ValidationEventHandler((_sender, _e) => -{ - if (_e.Severity == XmlSeverityType.Warning) - { - warningCount++; - Console.Error.WriteLine($"Warning: {_e.Message} - {getPositionInfo(_sender as IXmlLineInfo)}"); - } - else if (_e.Severity == XmlSeverityType.Error) - { - errorCount++; - Console.Error.WriteLine($"Error: {_e.Message} - {getPositionInfo(_sender as IXmlLineInfo)}"); - } -}); - -var httpClient = new HttpClient(); - -if (!string.IsNullOrWhiteSpace(userAgent)) -{ - Console.Out.WriteLine($"Info: Using User Agent String `{userAgent}`."); - httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgent); -} - -Console.Out.WriteLine($"Info: Validating `{path}` file."); - -// Get the XmlReader object with the configured settings. -using (XmlReader reader = XmlReader.Create(path, config)) -{ - // Parsing the file will cause the validation to occur. - while (reader.Read()) - { - try - { - if (reader.NodeType != XmlNodeType.Element) - continue; - - switch (reader.Name) - { - case "Companion": - case "Service": - case "Package": - var urlString = reader.GetAttribute("Url", null); - - if (string.IsNullOrWhiteSpace(urlString)) - { - errorCount++; - Console.Error.WriteLine($"Error: [{reader.Name}] URL string cannot be empty - {getPositionInfo(reader as IXmlLineInfo)}"); - continue; - } - - if (!Uri.TryCreate(urlString, UriKind.Absolute, out Uri result) || - result == null) - { - errorCount++; - Console.Error.WriteLine($"Error: Cannot parse the URI `{urlString}` - {getPositionInfo(reader as IXmlLineInfo)}"); - continue; - } - - var response = await httpClient.GetAsync(result, HttpCompletionOption.ResponseHeadersRead); - - if (response == null || !response.IsSuccessStatusCode) - { - errorCount++; - Console.Error.WriteLine($"Error: Cannot fetch the URI `{urlString}` (Remote response code: {(int?)response?.StatusCode}) - {getPositionInfo(reader as IXmlLineInfo)}"); - continue; - } - break; - } - } - catch (Exception ex) - { - errorCount++; - Console.Error.WriteLine($"Error: {ex.GetType().Name} / {ex.InnerException?.GetType().Name} throwed. ({ex.InnerException?.Message ?? ex.Message}) - {getPositionInfo(reader as IXmlLineInfo)}"); - continue; - } - } -} - -if (errorCount + warningCount < 1) - Console.Out.WriteLine("Success: No XML warnings or errors found."); -else if (errorCount < 1 && warningCount > 0) - Console.Error.WriteLine("Warning: Some XML warnings found."); -else - Console.Error.WriteLine("Error: One or more XML errors or warnings found.");