From cdd95843e8a2ccce6ff531420329298f328f846c Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Mon, 23 Sep 2024 22:13:26 -0700 Subject: [PATCH] =?UTF-8?q?Remove=20ParserData=20from=20FeedParser=20API,?= =?UTF-8?q?=20so=20clients=20won=E2=80=99t=20need=20to=20import=20SAX.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Parser/Package.swift | 1 - .../Sources/FeedParser/Feeds/FeedParser.swift | 17 +++++++-------- .../Feeds/JSON/JSONFeedParser.swift | 8 +++---- .../Feeds/JSON/RSSInJSONParser.swift | 8 +++---- .../FeedParser/Feeds/XML/AtomParser.swift | 21 +++++++------------ .../FeedParser/Feeds/XML/RSSParser.swift | 21 +++++++------------ .../ParserTests/RSSInJSONParserTests.swift | 9 ++++++++ 7 files changed, 41 insertions(+), 44 deletions(-) diff --git a/Modules/Parser/Package.swift b/Modules/Parser/Package.swift index d475aca85..9e749f804 100644 --- a/Modules/Parser/Package.swift +++ b/Modules/Parser/Package.swift @@ -88,4 +88,3 @@ let package = Package( resources: [.copy("Resources")]), ] ) - diff --git a/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift index 6e467f7b4..cc124c43b 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/FeedParser.swift @@ -7,16 +7,15 @@ // import Foundation -import SAX // FeedParser handles RSS, Atom, JSON Feed, and RSS-in-JSON. // You don’t need to know the type of feed. public struct FeedParser { - public static func canParse(_ parserData: ParserData) -> Bool { + public static func canParse(_ data: Data) -> Bool { - let type = FeedType.feedType(parserData.data) + let type = FeedType.feedType(data) switch type { case .jsonFeed, .rssInJSON, .rss, .atom: @@ -26,24 +25,24 @@ public struct FeedParser { } } - public static func parse(_ parserData: ParserData) throws -> ParsedFeed? { + public static func parse(urlString: String, data: Data) throws -> ParsedFeed? { - let type = FeedType.feedType(parserData.data) + let type = FeedType.feedType(data) switch type { case .jsonFeed: - return try JSONFeedParser.parse(parserData) + return try JSONFeedParser.parse(urlString: urlString, data: data) case .rssInJSON: - return try RSSInJSONParser.parse(parserData) + return try RSSInJSONParser.parse(urlString: urlString, data: data) case .rss: - let feed = RSSParser.parsedFeed(with: parserData) + let feed = RSSParser.parsedFeed(urlString: urlString, data: data) return RSSFeedTransformer.parsedFeed(with: feed, feedType: .rss) case .atom: - let feed = AtomParser.parsedFeed(with: parserData) + let feed = AtomParser.parsedFeed(urlString: urlString, data: data) return RSSFeedTransformer.parsedFeed(with: feed, feedType: .atom) case .unknown, .notAFeed: diff --git a/Modules/Parser/Sources/FeedParser/Feeds/JSON/JSONFeedParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/JSON/JSONFeedParser.swift index 36cc1f23d..488a1db4c 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/JSON/JSONFeedParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/JSON/JSONFeedParser.swift @@ -51,9 +51,9 @@ public struct JSONFeedParser { static let jsonFeedVersionMarker = "://jsonfeed.org/version/" // Allow for the mistake of not getting the scheme exactly correct. - public static func parse(_ parserData: ParserData) throws -> ParsedFeed? { + public static func parse(urlString: String, data: Data) throws -> ParsedFeed? { - guard let d = JSONUtilities.dictionary(with: parserData.data) else { + guard let d = JSONUtilities.dictionary(with: data) else { throw FeedParserError(.invalidJSON) } @@ -69,7 +69,7 @@ public struct JSONFeedParser { let authors = parseAuthors(d) let homePageURL = d[Key.homePageURL] as? String - let feedURL = d[Key.feedURL] as? String ?? parserData.url + let feedURL = d[Key.feedURL] as? String ?? urlString let feedDescription = d[Key.feedDescription] as? String let nextURL = d[Key.nextURL] as? String let iconURL = d[Key.icon] as? String @@ -78,7 +78,7 @@ public struct JSONFeedParser { let hubs = parseHubs(d) let language = d[Key.language] as? String - let items = parseItems(itemsArray, parserData.url) + let items = parseItems(itemsArray, urlString) return ParsedFeed(type: .jsonFeed, title: title, homePageURL: homePageURL, feedURL: feedURL, language: language, feedDescription: feedDescription, nextURL: nextURL, iconURL: iconURL, faviconURL: faviconURL, authors: authors, expired: expired, hubs: hubs, items: items) } diff --git a/Modules/Parser/Sources/FeedParser/Feeds/JSON/RSSInJSONParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/JSON/RSSInJSONParser.swift index 2dcd92313..6e7feca1f 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/JSON/RSSInJSONParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/JSON/RSSInJSONParser.swift @@ -15,10 +15,10 @@ import DateParser public struct RSSInJSONParser { - public static func parse(_ parserData: ParserData) throws -> ParsedFeed? { + public static func parse(urlString: String, data: Data) throws -> ParsedFeed? { do { - guard let parsedObject = try JSONSerialization.jsonObject(with: parserData.data) as? JSONDictionary else { + guard let parsedObject = try JSONSerialization.jsonObject(with: data) as? JSONDictionary else { throw FeedParserError(.invalidJSON) } guard let rssObject = parsedObject["rss"] as? JSONDictionary else { @@ -46,11 +46,11 @@ public struct RSSInJSONParser { let title = channelObject["title"] as? String let homePageURL = channelObject["link"] as? String - let feedURL = parserData.url + let feedURL = urlString let feedDescription = channelObject["description"] as? String let feedLanguage = channelObject["language"] as? String - let items = parseItems(itemsObject!, parserData.url) + let items = parseItems(itemsObject!, urlString) return ParsedFeed(type: .rssInJSON, title: title, homePageURL: homePageURL, feedURL: feedURL, language: feedLanguage, feedDescription: feedDescription, nextURL: nil, iconURL: nil, faviconURL: nil, authors: nil, expired: false, hubs: nil, items: items) diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift index 4aaa77925..a77015c3f 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift @@ -13,14 +13,8 @@ import DateParser final class AtomParser { - private var parserData: ParserData - private var feedURL: String { - parserData.url - } - private var data: Data { - parserData.data - } - + private var feedURL: String + private let data: Data private let feed: RSSFeed private var articles = [RSSArticle]() @@ -43,16 +37,17 @@ final class AtomParser { private var parsingSource = false private var endFeedFound = false - static func parsedFeed(with parserData: ParserData) -> RSSFeed { + static func parsedFeed(urlString: String, data: Data) -> RSSFeed { - let parser = AtomParser(parserData) + let parser = AtomParser(urlString: urlString, data: data) parser.parse() return parser.feed } - init(_ parserData: ParserData) { - self.parserData = parserData - self.feed = RSSFeed(urlString: parserData.url) + init(urlString: String, data: Data) { + self.feedURL = urlString + self.data = data + self.feed = RSSFeed(urlString: urlString) } } diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSParser.swift index 4b06a6123..341b0f702 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSParser.swift @@ -13,14 +13,8 @@ import DateParser public final class RSSParser { - private var parserData: ParserData - private var feedURL: String { - parserData.url - } - private var data: Data { - parserData.data - } - + private let feedURL: String + private let data: Data private let feed: RSSFeed private var articles = [RSSArticle]() private var currentArticle: RSSArticle? { @@ -34,16 +28,17 @@ public final class RSSParser { private var parsingAuthor = false private var currentAttributes: StringDictionary? - static func parsedFeed(with parserData: ParserData) -> RSSFeed { + static func parsedFeed(urlString: String, data: Data) -> RSSFeed { - let parser = RSSParser(parserData) + let parser = RSSParser(urlString: urlString, data: data) parser.parse() return parser.feed } - init(_ parserData: ParserData) { - self.parserData = parserData - self.feed = RSSFeed(urlString: parserData.url) + init(urlString: String, data: Data) { + self.feedURL = urlString + self.data = data + self.feed = RSSFeed(urlString: urlString) } } diff --git a/Modules/Parser/Tests/ParserTests/RSSInJSONParserTests.swift b/Modules/Parser/Tests/ParserTests/RSSInJSONParserTests.swift index 21c345935..2474b286e 100644 --- a/Modules/Parser/Tests/ParserTests/RSSInJSONParserTests.swift +++ b/Modules/Parser/Tests/ParserTests/RSSInJSONParserTests.swift @@ -7,6 +7,7 @@ // import XCTest +import SAX import FeedParser final class RSSInJSONParserTests: XCTestCase { @@ -26,3 +27,11 @@ final class RSSInJSONParserTests: XCTestCase { XCTAssertEqual(parsedFeed.language, "en-us") } } + +extension FeedParser { + + static func parse(_ parserData: ParserData) throws -> ParsedFeed? { + + try FeedParser.parse(urlString: parserData.url, data: parserData.data) + } +}