Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add List pull requests files endpoint #173

Merged
merged 4 commits into from
Jul 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 88 additions & 1 deletion OctoKit/PullRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,48 @@ open class PullRequest: Codable {
}
}

public extension PullRequest {
struct File: Codable {
public var sha: String
public var filename: String
public var status: Status
public var additions: Int
public var deletions: Int
public var changes: Int
public var blobUrl: String
public var rawUrl: String
public var contentsUrl: String
public var patch: String
}
}

public extension PullRequest.File {
enum Status: String, Codable {
case added
case removed
case modified
case renamed
case copied
case changed
case unchanged
}
}

extension PullRequest.File {
enum CodingKeys: String, CodingKey {
case sha
case filename
case status
case additions
case deletions
case changes
case blobUrl = "blob_url"
case rawUrl = "raw_url"
case contentsUrl = "contents_url"
case patch
}
}

// MARK: Request

public extension Octokit {
Expand Down Expand Up @@ -310,6 +352,37 @@ public extension Octokit {
decoder.dateDecodingStrategy = .formatted(Time.rfc3339DateFormatter)
return try await router.post(session, decoder: decoder, expectedResultType: PullRequest.self)
}

#endif

func listPullRequestsFiles(owner: String,
repository: String,
number: Int,
perPage: Int? = nil,
page: Int? = nil,
completion: @escaping (_ response: Result<[PullRequest.File], Error>) -> Void) -> URLSessionDataTaskProtocol? {
let router = PullRequestRouter.listPullRequestsFiles(configuration, owner, repository, number, perPage, page)
return router.load(session, dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: [PullRequest.File].self) { files, error in
if let error = error {
completion(.failure(error))
} else {
if let files = files {
completion(.success(files))
}
}
}
}

#if compiler(>=5.5.2) && canImport(_Concurrency)
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
func listPullRequestsFiles(owner: String,
repository: String,
number: Int,
perPage: Int? = nil,
page: Int? = nil) async throws -> [PullRequest.File] {
let router = PullRequestRouter.listPullRequestsFiles(configuration, owner, repository, number, perPage, page)
return try await router.load(session, dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: [PullRequest.File].self)
}
#endif
}

Expand All @@ -320,13 +393,15 @@ enum PullRequestRouter: JSONPostRouter {
case readPullRequests(Configuration, String, String, String?, String?, Openness, SortType, SortDirection)
case createPullRequest(Configuration, String, String, String, String, String?, String, String?, Bool?, Bool?)
case patchPullRequest(Configuration, String, String, String, String, String, Openness, String?, Bool?)
case listPullRequestsFiles(Configuration, String, String, Int, Int?, Int?)

var method: HTTPMethod {
switch self {
case .createPullRequest:
return .POST
case .readPullRequest,
.readPullRequests:
.readPullRequests,
.listPullRequestsFiles:
return .GET
case .patchPullRequest:
return .PATCH
Expand All @@ -348,6 +423,7 @@ enum PullRequestRouter: JSONPostRouter {
case let .readPullRequests(config, _, _, _, _, _, _, _): return config
case let .patchPullRequest(config, _, _, _, _, _, _, _, _): return config
case let .createPullRequest(config, _, _, _, _, _, _, _, _, _): return config
case let .listPullRequestsFiles(config, _, _, _, _, _): return config
}
}

Expand Down Expand Up @@ -404,6 +480,15 @@ enum PullRequestRouter: JSONPostRouter {
parameters["draft"] = draft
}
return parameters
case let .listPullRequestsFiles(_, _, _, _, perPage, page):
var parameters: [String: Any] = [:]
if let perPage = perPage {
parameters["per_page"] = perPage
}
if let page = page {
parameters["page"] = page
}
return parameters
}
}

Expand All @@ -417,6 +502,8 @@ enum PullRequestRouter: JSONPostRouter {
return "repos/\(owner)/\(repository)/pulls"
case let .createPullRequest(_, owner, repository, _, _, _, _, _, _, _):
return "repos/\(owner)/\(repository)/pulls"
case let .listPullRequestsFiles(_, owner, repository, number, _, _):
return "/repos/\(owner)/\(repository)/pulls/\(number)/files"
}
}
}
14 changes: 14 additions & 0 deletions Tests/OctoKitTests/Fixtures/pull_requests_files.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[
{
"sha": "bbcd538c8e72b8c175046e27cc8f907076331401",
"filename": "file1.txt",
"status": "added",
"additions": 103,
"deletions": 21,
"changes": 124,
"blob_url": "https://github.com/octocat/Hello-World/blob/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt",
"raw_url": "https://github.com/octocat/Hello-World/raw/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt",
"contents_url": "https://api.github.com/repos/octocat/Hello-World/contents/file1.txt?ref=6dcb09b5b57875f334f61aebed695e2e4193db5e",
"patch": "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test"
}
]
63 changes: 63 additions & 0 deletions Tests/OctoKitTests/PullRequestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -366,4 +366,67 @@ class PullRequestTests: XCTestCase {
XCTAssertTrue(session.wasCalled)
}
#endif

func testListPullRequestsFiles() {
let session = OctoKitURLTestSession(expectedURL: "https://api.github.com/repos/octocat/Hello-World/pulls/1347/files",
expectedHTTPMethod: "GET",
jsonFile: "pull_requests_files",
statusCode: 200)

let task = Octokit(session: session)
.listPullRequestsFiles(owner: "octocat",
repository: "Hello-World",
number: 1347) { response in
switch response {
case let .success(files):
XCTAssertEqual(files.count, 1)
let file = files.first
XCTAssertNotNil(file)
XCTAssertEqual(file?.sha, "bbcd538c8e72b8c175046e27cc8f907076331401")
XCTAssertEqual(file?.filename, "file1.txt")
XCTAssertEqual(file?.status, .added)
XCTAssertEqual(file?.additions, 103)
XCTAssertEqual(file?.deletions, 21)
XCTAssertEqual(file?.changes, 124)
XCTAssertEqual(file?.blobUrl, "https://github.com/octocat/Hello-World/blob/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt")
XCTAssertEqual(file?.rawUrl, "https://github.com/octocat/Hello-World/raw/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt")
XCTAssertEqual(file?.contentsUrl, "https://api.github.com/repos/octocat/Hello-World/contents/file1.txt?ref=6dcb09b5b57875f334f61aebed695e2e4193db5e")
XCTAssertEqual(file?.patch, "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test")
case let .failure(error):
XCTAssertNil(error)
}
}
XCTAssertNotNil(task)
XCTAssertTrue(session.wasCalled)
}

#if compiler(>=5.5.2) && canImport(_Concurrency)
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
func testListPullRequestsFilesAsync() async throws {
let session = OctoKitURLTestSession(expectedURL: "https://api.github.com/repos/octocat/Hello-World/pulls/1347/files",
expectedHTTPMethod: "GET",
jsonFile: "pull_requests_files",
statusCode: 200)

let files = try await Octokit(session: session)
.listPullRequestsFiles(owner: "octocat",
repository: "Hello-World",
number: 1347)
XCTAssertEqual(files.count, 1)
let file = files.first
XCTAssertNotNil(file)
XCTAssertEqual(file?.sha, "bbcd538c8e72b8c175046e27cc8f907076331401")
XCTAssertEqual(file?.filename, "file1.txt")
XCTAssertEqual(file?.status, .added)
XCTAssertEqual(file?.additions, 103)
XCTAssertEqual(file?.deletions, 21)
XCTAssertEqual(file?.changes, 124)
XCTAssertEqual(file?.blobUrl, "https://github.com/octocat/Hello-World/blob/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt")
XCTAssertEqual(file?.rawUrl, "https://github.com/octocat/Hello-World/raw/6dcb09b5b57875f334f61aebed695e2e4193db5e/file1.txt")
XCTAssertEqual(file?.contentsUrl, "https://api.github.com/repos/octocat/Hello-World/contents/file1.txt?ref=6dcb09b5b57875f334f61aebed695e2e4193db5e")
XCTAssertEqual(file?.patch, "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test")

XCTAssertTrue(session.wasCalled)
}
#endif
}