support swift3

This commit is contained in:
Kazuhiro Hayashi 2016-08-07 18:40:39 +09:00
parent 09db322c6d
commit 7b6440d2a1
9 changed files with 122 additions and 123 deletions

View File

@ -378,7 +378,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 2.3;
SWIFT_VERSION = 3.0;
};
name = Debug;
};
@ -396,7 +396,7 @@
PRODUCT_BUNDLE_IDENTIFIER = jp.co.yahoo.shopping.SwiftyXMLParser;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 2.3;
SWIFT_VERSION = 3.0;
};
name = Release;
};
@ -407,7 +407,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = jp.co.yahoo.shopping.SwiftyXMLParserTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 2.3;
SWIFT_VERSION = 3.0;
};
name = Debug;
};
@ -418,7 +418,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = jp.co.yahoo.shopping.SwiftyXMLParserTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 2.3;
SWIFT_VERSION = 3.0;
};
name = Release;
};

View File

@ -39,21 +39,21 @@ extension XML {
*/
public enum Accessor: CustomStringConvertible, SequenceType {
case SingleElement(Element)
case Sequence([Element])
case Failure(Error)
public enum Accessor: CustomStringConvertible, Swift.Sequence {
case singleElement(Element)
case sequence([Element])
case failure(Error)
public init(_ element: Element) {
self = .SingleElement(element)
self = .singleElement(element)
}
public init(_ sequence: [Element]) {
self = .Sequence(sequence)
self = .sequence(sequence)
}
public init(_ error: Error) {
self = .Failure(error)
self = .failure(error)
}
/**
@ -81,11 +81,11 @@ extension XML {
private subscript(index index: Int) -> Accessor {
let accessor: Accessor
switch self {
case .Sequence(let elements) where index < elements.count:
case .sequence(let elements) where index < elements.count:
accessor = Accessor(elements[index])
case .SingleElement(let element) where index == 0:
case .singleElement(let element) where index == 0:
accessor = Accessor(element)
case .Failure(let error):
case .failure(let error):
accessor = Accessor(error)
break
default:
@ -121,7 +121,7 @@ extension XML {
private subscript(key key: String) -> Accessor {
let accessor: Accessor
switch self {
case .SingleElement(let element):
case .singleElement(let element):
let filterdElements = element.childElements.filter { $0.name == key }
if filterdElements.isEmpty {
let error = accessError("\(key) not found.")
@ -131,9 +131,9 @@ extension XML {
} else {
accessor = Accessor(filterdElements)
}
case .Failure(let error):
case .failure(let error):
accessor = Accessor(error)
case .Sequence(_):
case .sequence(_):
fallthrough
default:
let error = accessError("cannot access \(key), because of multiple elements")
@ -219,9 +219,9 @@ extension XML {
public var name: String? {
let name: String?
switch self {
case .SingleElement(let element):
case .singleElement(let element):
name = element.name
case .Failure(_), .Sequence(_):
case .failure(_), .sequence(_):
fallthrough
default:
name = nil
@ -233,9 +233,9 @@ extension XML {
public var text: String? {
let text: String?
switch self {
case .SingleElement(let element):
case .singleElement(let element):
text = element.text
case .Failure(_), .Sequence(_):
case .failure(_), .sequence(_):
fallthrough
default:
text = nil
@ -252,8 +252,8 @@ extension XML {
/// syntax sugar to access URL Text
public var url: NSURL? {
return text.flatMap({NSURL(string: $0)})
public var url: URL? {
return text.flatMap({URL(string: $0)})
}
/// syntax sugar to access Int Text
@ -270,9 +270,9 @@ extension XML {
public var attributes: [String: String] {
let attributes: [String: String]
switch self {
case .SingleElement(let element):
case .singleElement(let element):
attributes = element.attributes
case .Failure(_), .Sequence(_):
case .failure(_), .sequence(_):
fallthrough
default:
attributes = [String: String]()
@ -284,11 +284,11 @@ extension XML {
/// access to child Elements
public var all: [Element]? {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return [element]
case .Sequence(let elements):
case .sequence(let elements):
return elements
case .Failure(_):
case .failure(_):
return nil
}
}
@ -296,11 +296,11 @@ extension XML {
/// access to child Elemnet Tag Names
public var names: [String]? {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return [element.name]
case .Sequence(let elements):
case .sequence(let elements):
return elements.map { $0.name }
case .Failure(_):
case .failure(_):
return nil
}
}
@ -308,9 +308,9 @@ extension XML {
/// if it has wrong XML path, return Error, otherwise return nil
public var error: Error? {
switch self {
case .Failure(let error):
case .failure(let error):
return error
case .SingleElement(_), .Sequence(_):
case .singleElement(_), .sequence(_):
return nil
}
}
@ -319,9 +319,9 @@ extension XML {
/// if it has wrong XML path or multiple child elements, return nil, otherwise return Element
public var element: Element? {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return element
case .Failure(_), .Sequence(_):
case .failure(_), .sequence(_):
return nil
}
}
@ -329,15 +329,15 @@ extension XML {
/// if it has wrong XML path or no child Element, return nil, otherwise return last Element
public var last: Accessor {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return Accessor(element)
case .Sequence(let elements):
case .sequence(let elements):
if let lastElement = elements.last {
return Accessor(lastElement)
} else {
return Accessor(accessError("cannot access last element"))
}
case .Failure(let error):
case .failure(let error):
return Accessor(error)
}
}
@ -345,39 +345,39 @@ extension XML {
/// if it has wrong XML path or no child Element, return nil, otherwise return first Element
public var first: Accessor {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return Accessor(element)
case .Sequence(let elements):
case .sequence(let elements):
if let firstElement = elements.first {
return Accessor(firstElement)
} else {
return Accessor(accessError("cannot access first element"))
}
case .Failure(let error):
case .failure(let error):
return Accessor(error)
}
}
public func map<T>(transform: (Accessor) -> T) -> [T] {
public func map<T>(_ transform: (Accessor) -> T) -> [T] {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return [Accessor(element)].map(transform)
case .Sequence(let elements):
case .sequence(let elements):
return elements.map({ Accessor($0) }).map(transform)
case .Failure:
case .failure:
return [Accessor]().map(transform)
}
}
@available(*, renamed="flatMap")
public func mapWithSqueezeNil<T>(transform: (Accessor) -> T?) -> [T] {
@available(*, renamed:"flatMap")
public func mapWithSqueezeNil<T>(_ transform: (Accessor) -> T?) -> [T] {
var accessors = [Accessor]()
switch self {
case .SingleElement(let element):
case .singleElement(let element):
accessors = [Accessor(element)]
case .Sequence(let elements):
case .sequence(let elements):
accessors = elements.map({ Accessor($0) })
case .Failure:
case .failure:
accessors = [Accessor]()
}
return accessors.reduce([T]()) {
@ -392,18 +392,18 @@ extension XML {
// MARK :- SequenceType
public func generate() -> AnyGenerator<Accessor> {
public func makeIterator() -> AnyIterator<Accessor> {
let generator: [Element]
switch self {
case .Failure(_):
case .failure(_):
generator = [Element]()
case .SingleElement(let element):
case .singleElement(let element):
generator = [element]
case .Sequence(let elements):
case .sequence(let elements):
generator = elements
}
var index = 0
return AnyGenerator {
return AnyIterator {
let nextAccessor: Accessor?
if index < generator.count {
nextAccessor = Accessor(generator[index])
@ -420,17 +420,17 @@ extension XML {
public var description: String {
switch self {
case .SingleElement(let element):
case .singleElement(let element):
return "\"" + self.recursivePrintAncient(element) + "\""
case .Sequence(let elements):
case .sequence(let elements):
let descriptions = elements.map { self.recursivePrintAncient($0) }
return "[ " + descriptions.joinWithSeparator(",\n ") + " ]"
case .Failure(let error):
return "[ " + descriptions.joined(separator: ",\n ") + " ]"
case .failure(let error):
return "\(error)"
}
}
private func recursivePrintAncient(element: Element) -> String {
private func recursivePrintAncient(_ element: Element) -> String {
var description = element.name
if let unwrappedParent = element.parentElement {
description = recursivePrintAncient(unwrappedParent) + " > " + description
@ -438,8 +438,8 @@ extension XML {
return description
}
private func accessError(description: String) -> Error {
return Error.AccessError(description: description)
private func accessError(_ description: String) -> Error {
return Error.accessError(description: description)
}
}
}

View File

@ -25,8 +25,8 @@
import Foundation
extension XML {
public enum Error: ErrorType {
case ParseError
case AccessError(description: String)
public enum Error: ErrorProtocol {
case parseError
case accessError(description: String)
}
}
}

View File

@ -25,11 +25,11 @@
import Foundation
extension XML {
class Parser: NSObject, NSXMLParserDelegate {
func parse(data: NSData) -> Accessor {
class Parser: NSObject, XMLParserDelegate {
func parse(_ data: Data) -> Accessor {
stack = [Element]()
stack.append(documentRoot)
let parser = NSXMLParser(data: data)
let parser = XMLParser(data: data)
parser.delegate = self
parser.parse()
return Accessor(documentRoot)
@ -39,16 +39,16 @@ extension XML {
trimmingManner = nil
}
init(trimming manner: NSCharacterSet) {
init(trimming manner: CharacterSet) {
trimmingManner = manner
}
// MARK:- private
private var documentRoot = Element(name: "XML.Parser.AbstructedDocumentRoot")
private var stack = [Element]()
private let trimmingManner: NSCharacterSet?
private let trimmingManner: CharacterSet?
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
let node = Element(name: elementName)
if !attributeDict.isEmpty {
node.attributes = attributeDict
@ -61,7 +61,7 @@ extension XML {
stack.append(node)
}
func parser(parser: NSXMLParser, foundCharacters string: String) {
func parser(_ parser: XMLParser, foundCharacters string: String) {
if let text = stack.last?.text {
stack.last?.text = text + (string ?? "")
} else {
@ -69,11 +69,11 @@ extension XML {
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if let trimmingManner = self.trimmingManner {
stack.last?.text = stack.last?.text?.stringByTrimmingCharactersInSet(trimmingManner)
stack.last?.text = stack.last?.text?.trimmingCharacters(in: trimmingManner)
}
stack.removeLast()
}
}
}
}

View File

@ -34,7 +34,7 @@ infix operator ?= {} // Failable Assignment
/**
assign value if rhs is not optonal. When rhs is optional, nothing to do.
*/
public func ?=<T>(inout lhs: T, rhs: T?) {
public func ?=<T>(lhs: inout T, rhs: T?) {
if let unwrappedRhs = rhs {
lhs = unwrappedRhs
}
@ -45,7 +45,7 @@ infix operator ?<< {} // Failable Push
/**
push value to array if rhs is not optonal. When rhs is optional, nothing to do.
*/
public func ?<< <T>(inout lhs: [T], rhs: T?) {
public func ?<< <T>(lhs: inout [T], rhs: T?) {
if let unwrappedRhs = rhs {
lhs.append(unwrappedRhs)
}
@ -92,7 +92,7 @@ public class XML {
- parameter data:NSData XML document
- returns:Accessor object to access XML document
*/
public class func parse(data: NSData) -> Accessor {
public class func parse(_ data: Data) -> Accessor {
return Parser().parse(data)
}
@ -102,9 +102,9 @@ public class XML {
- Parameter str:String XML document
- Returns:Accessor object to access XML document
*/
public class func parse(str: String) throws -> Accessor {
guard let data = str.dataUsingEncoding(NSUTF8StringEncoding) else {
throw XML.Error.ParseError
public class func parse(_ str: String) throws -> Accessor {
guard let data = str.data(using: String.Encoding.utf8) else {
throw XML.Error.parseError
}
return Parser().parse(data)
@ -117,7 +117,7 @@ public class XML {
- parameter manner:NSCharacterSet If you wannna trim Text, assign this arg
- returns:Accessor object to access XML document
*/
public class func parse(data: NSData, trimming manner: NSCharacterSet) -> Accessor {
public class func parse(_ data: Data, trimming manner: CharacterSet) -> Accessor {
return Parser(trimming: manner).parse(data)
}
@ -128,11 +128,11 @@ public class XML {
- parameter manner:NSCharacterSet If you wannna trim Text, assign this arg
- Returns:Accessor object to access XML document
*/
public class func parse(str: String, trimming manner: NSCharacterSet) throws -> Accessor {
guard let data = str.dataUsingEncoding(NSUTF8StringEncoding) else {
throw XML.Error.ParseError
public class func parse(_ str: String, trimming manner: CharacterSet) throws -> Accessor {
guard let data = str.data(using: String.Encoding.utf8) else {
throw XML.Error.parseError
}
return Parser(trimming: manner).parse(data)
}
}
}

View File

@ -47,7 +47,7 @@ class AccessorTests: XCTestCase {
let target2 = singleElementAccessor[1]
switch target2 {
case .Failure(_):
case .failure(_):
XCTAssert(true, "access to wrong path")
default:
XCTFail("need to fail")
@ -72,7 +72,7 @@ class AccessorTests: XCTestCase {
let target3 = accessor[2]
switch target3 {
case .Failure(_):
case .failure(_):
XCTAssert(true, "Aaccess to wrong path")
default:
XCTFail("need to fail")
@ -83,7 +83,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(singleElement())
let me = accessor["RootElement"]
switch me {
case .Failure(_):
case .failure(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
@ -94,7 +94,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(singleElement())
let children = accessor["ChildElement"]
switch children {
case .Sequence(_):
case .sequence(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
@ -105,7 +105,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(sequence())
let failureChildren = accessor["ChildElement"]
switch failureChildren {
case .Failure(_):
case .failure(_):
XCTAssert(true, "need to select one element from multiple elements")
default:
XCTFail("need to fail")
@ -113,7 +113,7 @@ class AccessorTests: XCTestCase {
let successChildren = accessor[0]["ChildElement1"]
switch successChildren {
case .Sequence(_):
case .sequence(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
@ -124,7 +124,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(failure())
let intIndexer = accessor[0]
switch intIndexer {
case .Failure(_):
case .failure(_):
XCTAssert(true, "need to return failure when access wrong path once")
default:
XCTFail("need to fail")
@ -132,7 +132,7 @@ class AccessorTests: XCTestCase {
let stringIndexer = accessor["ChildElement"]
switch stringIndexer {
case .Failure(_):
case .failure(_):
XCTAssert(true, "need to return failure when access wrong path once")
default:
XCTFail("need to fail")
@ -143,7 +143,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(sequence())
let indexer = accessor[[0, "ChildElement1", 1]]
switch indexer {
case .SingleElement(_):
case .singleElement(_):
XCTAssert(true, "access element with Array")
default:
XCTFail("fail to get element")
@ -151,7 +151,7 @@ class AccessorTests: XCTestCase {
let failureIndexer = accessor[[1, "Hoget", "Foge"]]
switch failureIndexer {
case .Failure(_):
case .failure(_):
XCTAssert(true, "access wrong path with Array")
default:
XCTFail("need to fail")
@ -162,7 +162,7 @@ class AccessorTests: XCTestCase {
let accessor = XML.Accessor(sequence())
let indexer = accessor[0, "ChildElement1", 1]
switch indexer {
case .SingleElement(_):
case .singleElement(_):
XCTAssert(true, "access element with Variadic")
default:
XCTFail("fail to get element")
@ -170,7 +170,7 @@ class AccessorTests: XCTestCase {
let failureIndexer = accessor[1, "Hoget", "Foge"]
switch failureIndexer {
case .Failure(_):
case .failure(_):
XCTAssert(true, "access wrong path with Variadic")
default:
XCTFail("need to fail")
@ -399,6 +399,6 @@ class AccessorTests: XCTestCase {
}
private func failure() -> XML.Error {
return XML.Error.AccessError(description: "error")
return XML.Error.accessError(description: "error")
}
}

View File

@ -38,8 +38,8 @@ class ParserTests: XCTestCase {
}
func testSuccessParse() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("XMLDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("XMLDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -55,8 +55,8 @@ class ParserTests: XCTestCase {
}
func testFailParse() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("BrokenXMLDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("BrokenXMLDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -70,8 +70,8 @@ class ParserTests: XCTestCase {
}
func testTextParseWithMockData() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -85,8 +85,8 @@ class ParserTests: XCTestCase {
}
func testWhitespaceParseWithMockData() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -100,8 +100,8 @@ class ParserTests: XCTestCase {
}
func testReturnParseWithMockData() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -115,8 +115,8 @@ class ParserTests: XCTestCase {
}
func testWhitespaceAndReturnParseWithMockData() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
@ -131,18 +131,17 @@ class ParserTests: XCTestCase {
}
func testWhitespaceAndReturnParseWithMockDataAndTrimmingWhitespaceAndLineBreak() {
guard let path = NSBundle(forClass: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = NSData(contentsOfFile: path) else {
guard let path = Bundle(for: self.dynamicType).pathForResource("SimpleDocument", ofType: "xml"),
let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
XCTFail("fail to parse")
return
}
let xml = XML.Parser(trimming: .whitespaceAndNewlineCharacterSet()).parse(data)
let xml = XML.Parser(trimming: .whitespacesAndNewlines).parse(data)
if let text = xml["Result", "WhitespaceReturn"].text {
XCTAssertEqual("", text, "Parsed Success and trim them")
} else {
XCTAssert(false, "fail")
}
}
}
}

View File

@ -44,7 +44,7 @@ class SwiftyXMLParserTests: XCTestCase {
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock {
self.measure {
// Put the code you want to measure the time of here.
}
}

View File

@ -37,8 +37,8 @@ class XMLTests: XCTestCase {
}
func testParse() {
if let path = NSBundle(forClass: self.dynamicType).pathForResource("XMLDocument", ofType: "xml") {
if let data = NSData(contentsOfFile: path) {
if let path = Bundle(for: self.dynamicType).pathForResource("XMLDocument", ofType: "xml") {
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
let xml = XML.parse(data)
if let _ = xml["ResultSet"].error {
XCTFail("fail to parse")
@ -56,8 +56,8 @@ class XMLTests: XCTestCase {
func testSuccessParseFromString() {
if let path = NSBundle(forClass: self.dynamicType).pathForResource("XMLDocument", ofType: "xml"),
let string = try? String(contentsOfFile: path, encoding: NSUTF8StringEncoding),
if let path = Bundle(for: self.dynamicType).pathForResource("XMLDocument", ofType: "xml"),
let string = try? String(contentsOfFile: path, encoding: String.Encoding.utf8),
let xml = try? XML.parse(string) {
if let _ = xml["ResultSet"].error {
XCTFail("fail to parse")