Move yams code into a SwiftGenKit helper file

This commit is contained in:
David Jennes
2018-07-30 16:10:22 +02:00
parent 03b96a5fa2
commit a87c87fb53
5 changed files with 74 additions and 31 deletions
+2 -3
View File
@@ -7,7 +7,7 @@
//
import PathKit
import Yams
import SwiftGenKit
// MARK: - Config
@@ -27,8 +27,7 @@ extension Config {
if !file.exists {
throw Config.Error.pathNotFound(path: file)
}
let content: String = try file.read()
let anyConfig = try Yams.load(yaml: content)
let anyConfig = try YAML.read(path: file)
guard let config = anyConfig as? [String: Any] else {
throw Config.Error.wrongType(key: nil, expected: "Dictionary", got: type(of: anyConfig))
}
+63
View File
@@ -0,0 +1,63 @@
//
// YAML.swift
// SwiftGenKit
//
// Created by David Jennes on 30/07/2018.
// Copyright © 2018 AliSoftware. All rights reserved.
//
import PathKit
import Yams
public enum YAML {
/// Read the contents of a YAML file located at the given path (only the first document).
///
/// - parameter path: The path to the YAML file
/// - returns: The decoded document
public static func read(path: Path) throws -> Any? {
let contents: String = try path.read()
return try decode(string: contents)
}
/// Decode the contents of YAML string (only the first document).
///
/// - parameter string: The YAML string
/// - returns: The decoded document
public static func decode(string: String) throws -> Any? {
return try Yams.load(yaml: string)
}
/// Encode the given object to YAML and write it to the given path
///
/// - parameter object: The object to encode
/// - parameter path: The path to the output file
public static func write(object: Any, to path: Path) throws {
let string = try encode(object: object)
try path.write(string)
}
/// Encode the given object to YAML and return it as a string
///
/// - parameter object: The object to encode
/// - returns: The encoded YAML string
public static func encode(object: Any) throws -> String {
let node = try represent(object: object)
return try Yams.serialize(node: node)
}
private static func represent(object: Any) throws -> Node {
switch object {
case let string as String:
return Node(string, .implicit, .doubleQuoted)
case let array as [Any]:
return Node(try array.map(represent), Tag(.seq))
case let dictionary as [String: Any]:
let pairs = try dictionary.map { (Node($0.key), try represent(object: $0.value)) }
return Node(pairs.sorted { $0.0 < $1.0 }, Tag(.map))
case let representable as NodeRepresentable:
return try representable.represented()
default:
throw YamlError.representer(problem: "Failed to represent \(object) as a Yams.Node")
}
}
}
+4
View File
@@ -83,6 +83,7 @@
DDCCACDB209551240017FB43 /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCCACD7209551230017FB43 /* Platform.swift */; };
DDCCACDC209551240017FB43 /* Segue.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCCACD8209551230017FB43 /* Segue.swift */; };
DDCCACDD209551240017FB43 /* Scene.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCCACD9209551230017FB43 /* Scene.swift */; };
DDD2D709210F293E00D678E0 /* YAML.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD2D708210F293E00D678E0 /* YAML.swift */; };
DDDE51131FAF6AD4004203BE /* StringsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDE506D1FAF6AD4004203BE /* StringsTests.swift */; };
DDDE51141FAF6AD4004203BE /* FontsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDE506E1FAF6AD4004203BE /* FontsTests.swift */; };
DDDE51941FAF6AD4004203BE /* XCAssetsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDE50F51FAF6AD4004203BE /* XCAssetsTests.swift */; };
@@ -322,6 +323,7 @@
DDCCACD7209551230017FB43 /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = "<group>"; };
DDCCACD8209551230017FB43 /* Segue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Segue.swift; sourceTree = "<group>"; };
DDCCACD9209551230017FB43 /* Scene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scene.swift; sourceTree = "<group>"; };
DDD2D708210F293E00D678E0 /* YAML.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YAML.swift; sourceTree = "<group>"; };
DDDE504B1FAF687A004203BE /* Templates UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Templates UnitTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
DDDE506D1FAF6AD4004203BE /* StringsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringsTests.swift; sourceTree = "<group>"; };
DDDE506E1FAF6AD4004203BE /* FontsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontsTests.swift; sourceTree = "<group>"; };
@@ -676,6 +678,7 @@
children = (
DDC8211420967180007A55F3 /* Path.swift */,
DDC82116209672E1007A55F3 /* String.swift */,
DDD2D708210F293E00D678E0 /* YAML.swift */,
);
path = Utils;
sourceTree = "<group>";
@@ -1298,6 +1301,7 @@
DD428E1D1FC50FBF001649D6 /* ColorsXMLFileParser.swift in Sources */,
DDCCACDA209551240017FB43 /* Storyboard.swift in Sources */,
DD428E1F1FC50FBF001649D6 /* InterfaceBuilderParser.swift in Sources */,
DDD2D709210F293E00D678E0 /* YAML.swift in Sources */,
DDCCACDC209551240017FB43 /* Segue.swift in Sources */,
DD9F688620956074004EB720 /* PlaceholderType.swift in Sources */,
DD428E251FC50FBF001649D6 /* AssetsCatalogContext.swift in Sources */,
+3 -25
View File
@@ -6,8 +6,8 @@
import Foundation
import PathKit
import SwiftGenKit
import XCTest
import Yams
private let colorCode: (String) -> String =
ProcessInfo().environment["XcodeColors"] == "YES" ? { "\u{001b}[\($0);" } : { _ in "" }
@@ -136,8 +136,7 @@ func XCTDiffContexts(_ result: [String: Any],
if ProcessInfo().environment["GENERATE_CONTEXTS"] == "YES" {
let target = Path(#file).parent().parent() + "Fixtures/StencilContexts" + directory.rawValue + fileName
do {
let data = try Yams.serialize(node: YamsFix.represent(result))
try target.write(data)
try YAML.write(object: result, to: target)
} catch let error {
fatalError("Unable to write context file \(target): \(error)")
}
@@ -186,8 +185,7 @@ class Fixtures {
static func context(for name: String, sub: Directory) -> [String: Any] {
let path = self.path(for: name, subDirectory: "StencilContexts/\(sub.rawValue)")
guard let data: String = try? path.read(),
let yaml = try? Yams.load(yaml: data),
guard let yaml = try? YAML.read(path: path),
let result = yaml as? [String: Any] else {
fatalError("Unable to load fixture content")
}
@@ -195,23 +193,3 @@ class Fixtures {
return result
}
}
// MARK: - Temporary fix until Yams fixes string dumping
enum YamsFix {
static func represent(_ any: Any) throws -> Node {
switch any {
case let string as String:
return Node(string, .implicit, .doubleQuoted)
case let array as [Any]:
return Node(try array.map(represent), Tag(.seq))
case let dictionary as [String: Any]:
let pairs = try dictionary.map { (Node($0.key), try represent($0.value)) }
return Node(pairs.sorted { $0.0 < $1.0 }, Tag(.map))
case let representable as NodeRepresentable:
return try representable.represented()
default:
throw YamlError.representer(problem: "Failed to represent \(any) as a Yams.Node")
}
}
}
+2 -3
View File
@@ -7,8 +7,8 @@
import Foundation
import PathKit
import StencilSwiftKit
import SwiftGenKit
import XCTest
import Yams
private let colorCode: (String) -> String =
ProcessInfo().environment["XcodeColors"] == "YES" ? { "\u{001b}[\($0);" } : { _ in "" }
@@ -103,8 +103,7 @@ class Fixtures {
static func context(for name: String, sub: Directory) -> [String: Any] {
let path = self.path(for: name, subDirectory: "StencilContexts/\(sub.rawValue)")
guard let data: String = try? path.read(),
let yaml = try? Yams.load(yaml: data),
guard let yaml = try? YAML.read(path: path),
let result = yaml as? [String: Any] else {
fatalError("Unable to load fixture content")
}