From 3547ef469b35ad8b7514ed0d2af71f54fb5e5f2b Mon Sep 17 00:00:00 2001 From: Jim Wallace <james.wallace@uwaterloo.ca> Date: Sun, 17 Dec 2023 14:22:46 -0500 Subject: [PATCH] Sketch for Reddit Comment search --- .../Reddit/Reddit Enumerations.swift | 17 +++++++--- .../RedditClient + Comment Search.swift | 31 +++++++++++++++++++ .../Reddit/RedditDataItem.swift | 2 +- .../Reddit API/RedditClient.swift | 21 +++++++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift index 0577a80c..a5325276 100644 --- a/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift +++ b/Sources/SwiftNLP/1. Data Collection/Reddit/Reddit Enumerations.swift @@ -11,15 +11,22 @@ enum RedditContentType: String, CustomStringConvertible { enum ListingSortOrder: String, CustomStringConvertible { - case relevance = "relevance" - case hot = "hot" - case top = "top" - case new = "new" - case comments = "comments" + case relevance = "relevance" + case hot = "hot" + case top = "top" + case new = "new" + case old = "old" + case random = "random" + case qa = "qa" + case live = "live" + case comments = "comments" + case confidence = "confidence" + case controversial = "controversial" var description: String { rawValue } } + enum ListingTime: String, CustomStringConvertible { case hour = "hour" case day = "day" diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift new file mode 100644 index 00000000..4e41dafd --- /dev/null +++ b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditClient + Comment Search.swift @@ -0,0 +1,31 @@ +import Foundation + +extension RedditClient { + + func searchComment( + article: RedditSubmission + ) async throws -> [RedditComment] { + + guard let subreddit = article.subreddit, let articleID = article.id + else { + throw RedditClientError(message: "Submission must include article data.") + } + + let (data, response) = try await _GET( + endpoint: "r/\(subreddit)/search/comment/\(articleID)", + parameters: parameters + ) + + print(response) + print(data) + + do { + let redditListing = try JSONDecoder().decode([RedditComment].self, from: data) + return redditListing + + } catch { + throw RedditClientError(message: "Unable to decode server response.") + } + } + +} diff --git a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift index 39e9474f..6266b5fc 100644 --- a/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift +++ b/Sources/SwiftNLP/1. Data Collection/Reddit/RedditDataItem.swift @@ -1,4 +1,4 @@ -public protocol RedditDataItem: Encodable, Decodable, Equatable { +public protocol RedditDataItem: Codable, Equatable { var created_utc: Int32? { get } var id: String? { get } } diff --git a/Tests/SwiftNLPTests/Reddit API/RedditClient.swift b/Tests/SwiftNLPTests/Reddit API/RedditClient.swift index 65f03c10..2a62c9b5 100644 --- a/Tests/SwiftNLPTests/Reddit API/RedditClient.swift +++ b/Tests/SwiftNLPTests/Reddit API/RedditClient.swift @@ -91,4 +91,25 @@ final class RedditClientTest: XCTestCase { XCTAssert(result.data.children.count > 0) } + +// func testCommentSearch() async throws { +// +// let id = ProcessInfo.processInfo.environment["REDDIT_CLIENT_ID"] ?? nil +// let secret = ProcessInfo.processInfo.environment["REDDIT_CLIENT_SECRET"] ?? nil +// +// guard let id = id, let secret = secret else { +// fatalError("Unable to fetch REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET from ProcessInfo.") +// } +// +// let client = RedditClient(id: id, secret: secret) +// guard let _ = try? await client.authenticate() else { +// throw RedditClientError(message: "Error authenticating client.") +// } +// +// let submission = RedditSubmission() +// +// let result = try await client.searchComment(article: nil) +// +// XCTAssert(result.data.children.count > 0) +// } } -- GitLab