From 0fc39aae9deec5fd89da20f1ba68ab0acb587bb2 Mon Sep 17 00:00:00 2001 From: ened Date: Thu, 22 Jun 2023 14:42:11 +0900 Subject: [PATCH] Add environment variable "KISS_ASSERT_COMMA_CSV_DATA" --- .../Common/Foundation+Extensions.swift | 31 ++++++++++++++----- KissMe/Sources/Context/ShopContext.swift | 1 + KissMeConsole/Sources/main.swift | 4 +++ README.md | 2 +- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/KissMe/Sources/Common/Foundation+Extensions.swift b/KissMe/Sources/Common/Foundation+Extensions.swift index db62ee7..65c7953 100644 --- a/KissMe/Sources/Common/Foundation+Extensions.swift +++ b/KissMe/Sources/Common/Foundation+Extensions.swift @@ -96,6 +96,10 @@ extension String { } return (hh, mm, ss) } + + public var hasComma: Bool { + return nil != rangeOfCharacter(from: commaCharSet) + } } @@ -168,21 +172,31 @@ extension FileManager { } -private let commaCharSet = CharacterSet([","]) +private var assertCommaCsvData: Bool = { + let val = ProcessInfo.processInfo.environment["KISS_ASSERT_COMMA_CSV_DATA"] + switch val { + case "true", "1": return true + case "false", "0": return false + default: return false + } +}() +private let commaCharSet = CharacterSet([","]) public func valueToString(_ any: Any) -> String { - func validateComma(_ s: String) -> String { - let comma: CharacterSet = [","] - if s.rangeOfCharacter(from: comma) != nil { - assertionFailure("There are comma in: \(s)") + func validateComma(_ s: String) { + if s.hasComma { + print("There are comma in: \(s)") + if assertCommaCsvData { + assertionFailure("There are comma in: \(s)") + } } - return s } switch any { case let s as String: + validateComma(s) return s.trimmingCharacters(in: commaCharSet) case let i as Int8: return String(i) case let i as UInt8: return String(i) @@ -202,6 +216,7 @@ public func valueToString(_ any: Any) -> String { case let raw as any RawRepresentable: switch raw.rawValue { case let s as String: + validateComma(s) return s.trimmingCharacters(in: commaCharSet) case let i as Int8: return String(i) case let i as UInt8: return String(i) @@ -217,7 +232,9 @@ public func valueToString(_ any: Any) -> String { return "" } case let c as CustomStringConvertible: - return c.description.trimmingCharacters(in: commaCharSet) + let s = c.description + validateComma(s) + return s.trimmingCharacters(in: commaCharSet) default: return "" } diff --git a/KissMe/Sources/Context/ShopContext.swift b/KissMe/Sources/Context/ShopContext.swift index 6fab9ea..a438ebf 100644 --- a/KissMe/Sources/Context/ShopContext.swift +++ b/KissMe/Sources/Context/ShopContext.swift @@ -135,6 +135,7 @@ extension ShopContext { for items in products.values { all.append(contentsOf: items) } + all.sort(by: { $0.shortCode < $1.shortCode }) return all } diff --git a/KissMeConsole/Sources/main.swift b/KissMeConsole/Sources/main.swift index ae95dee..8b5a0ce 100644 --- a/KissMeConsole/Sources/main.swift +++ b/KissMeConsole/Sources/main.swift @@ -21,4 +21,8 @@ let data = try [CapturePrice].readCsv(fromFile: path, verifyHeader: true) if let last = data.last { print(last) } + +let shopProductsUrl = URL.currentDirectory().appending(path: "data/shop-products.csv") +let context = ShopContext() +context.loadShop(url: shopProductsUrl) */ diff --git a/README.md b/README.md index 7697e65..61e418f 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ WIP `showcase` | 추천 상품을 제안함. Environment variable | 설명 -------------------- | --- KISS_RESPONSE_LOGGABLE | `true`, `1` 이면, API 응답로그를 기록함. `false`, `0` 이면 기록하지 않음. 기본값은 `false`. - +KISS_ASSERT_COMMA_CSV_DATA | `true`, `1` 이면, CSV 데이터에 comma 문자가 감지되면 assertion 을 발생시킴. 기본값은 `false`. # KissMeIndex