TRAVIS_OS_NAME=osx <<<<<< ENV ./codecov.yml .github/CODEOWNERS Package.swift Sources/GitHub/Client.swift Sources/GitHub/GitHub.swift Sources/GitHub/GitHubError.swift Sources/GitHub/Models.swift Tests/GitHubTests/GitHubTests.swift Tests/LinuxMain.swift <<<<<< network # path=GitHub.framework.coverage.txt /Users/travis/build/eneko/GitHub/Sources/GitHub/Client.swift: 1| |// 2| |// Client.swift 3| |// GitHub 4| |// 5| |// Created by Eneko Alonso on 12/20/17. 6| |// 7| | 8| |import Foundation 9| | 10| | 11| |struct Client { 12| | 13| | let token: String 14| | 15| | typealias CompletionBlock = (_ response: Response?, _ error: Error?) -> Void 16| | 17| 2| func submit(request: Request) throws -> Response { 18| 2| let urlRequest = try makeURLRequest(with: request) 19| 2| return try submit(urlRequest: urlRequest) 20| 2| } 21| | 22| 2| func makeURLRequest(with request: Request) throws -> URLRequest { 23| 2| guard let url = URL(string: "https://api.github.com/graphql") else { 24| 0| fatalError("Failed to make url") 25| 2| } 26| 2| 27| 2| var urlRequest = URLRequest(url: url) 28| 2| urlRequest.httpMethod = "POST" 29| 2| urlRequest.setValue("bearer \(token)", forHTTPHeaderField: "Authorization") 30| 2| 31| 2| let encoder = JSONEncoder() 32| 2| urlRequest.httpBody = try encoder.encode(request) 33| 2| 34| 2| return urlRequest 35| 2| } 36| | 37| 2| func submit(urlRequest: URLRequest) throws -> Response { 38| 2| var responseData: Response? 39| 2| let semaphore = DispatchSemaphore(value: 0) 40| 2| submit(urlRequest: urlRequest) { (response, error) in 41| 2| responseData = response 42| 2| semaphore.signal() 43| 2| } 44| 2| if semaphore.wait(timeout: DispatchTime.now() + 30) == .timedOut { 45| 0| throw GitHubError.requestTimedOut 46| 2| } 47| 2| guard let response = responseData else { 48| 0| throw GitHubError.invalidResponse 49| 2| } 50| 2| return response 51| 2| } 52| | 53| 2| func submit(urlRequest: URLRequest, completion: @escaping CompletionBlock) { 54| 2| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: OperationQueue()) 55| 2| let task = session.dataTask(with: urlRequest) { (data, response, error) in 56| 2| guard let data = data else { 57| 0| completion(nil, error) 58| 0| return 59| 2| } 60| 2| let decoder = JSONDecoder() 61| 2| guard let response = try? decoder.decode(Response.self, from: data) else { 62| 0| completion(nil, GitHubError.invalidResponse) 63| 0| return 64| 2| } 65| 2| completion(response, nil) 66| 2| } 67| 2| task.resume() 68| 2| } 69| | 70| |} /Users/travis/build/eneko/GitHub/Sources/GitHub/GitHub.swift: 1| |// 2| |// GitHub.swift 3| |// GitHub 4| |// 5| |// Created by Eneko Alonso on 12/19/17. 6| |// 7| | 8| |import Foundation 9| | 10| |public struct GitHub { 11| | let client: Client 12| | 13| 3| public init(token: String) { 14| 3| client = Client(token: token) 15| 3| } 16| | 17| 2| public func submit(query: String) throws -> Response { 18| 2| return try client.submit(request: Request(query: query)) 19| 2| } 20| | 21| 1| public func latestRelease(owner: String, project: String) throws -> String? { 22| 1| let query = """ 23| 1| query { 24| 1| repository(owner: "\(owner)", name: "\(project)") { 25| 1| releases(last: 1) { 26| 1| nodes { 27| 1| name 28| 1| tag { 29| 1| id 30| 1| name 31| 1| } 32| 1| } 33| 1| } 34| 1| } 35| 1| } 36| 1| """ 37| 1| 38| 1| let response = try submit(query: query) 39| 1| guard let repository = response.data.repository else { 40| 0| throw GitHubError.repositoryNotFound(name: project) 41| 1| } 42| 1| return repository.releases?.nodes?.first?.tag?.name 43| 1| } 44| | 45| 1| public func openPullRequests(owner: String, project: String, limit: Int = 100) throws -> [PullRequest] { 46| 1| let query = """ 47| 1| query { 48| 1| repository(owner: "\(owner)", name: "\(project)") { 49| 1| pullRequests(states: [OPEN], first: \(limit)) { 50| 1| nodes { 51| 1| createdAt 52| 1| number 53| 1| title 54| 1| } 55| 1| } 56| 1| } 57| 1| } 58| 1| """ 59| 1| 60| 1| let response = try submit(query: query) 61| 1| guard let repository = response.data.repository else { 62| 0| throw GitHubError.repositoryNotFound(name: project) 63| 1| } 64| 1| return repository.pullRequests?.nodes ?? [] 65| 1| } 66| | 67| |} /Users/travis/build/eneko/GitHub/Sources/GitHub/GitHubError.swift: 1| |// 2| |// GitHubError.swift 3| |// GitHubPackageDescription 4| |// 5| |// Created by Eneko Alonso on 12/20/17. 6| |// 7| | 8| |import Foundation 9| | 10| |public enum GitHubError: Error { 11| | case requestTimedOut 12| | case invalidResponse 13| | case repositoryNotFound(name: String) 14| |} 15| | 16| |extension GitHubError: LocalizedError { 17| 0| public var localizedDescription: String { 18| 0| switch self { 19| 0| case .requestTimedOut: 20| 0| return "GitHub API request timed out." 21| 0| case .invalidResponse: 22| 0| return "Invalid response or no response received from GitHub API" 23| 0| case .repositoryNotFound(let name): 24| 0| return "Repository not found: \(name)" 25| 0| } 26| 0| } 27| |} <<<<<< EOF # path=GitHubTests.xctest.coverage.txt 1| |import XCTest 2| |@testable import GitHub 3| | 4| |class GitHubTests: XCTestCase { 5| | 6| 1| func testClientToken() { 7| 1| XCTAssertEqual(GitHub(token: "foo").client.token, "foo") 8| 1| } 9| | 10| 1| func testLatestRelease() throws { 11| 1| guard let token = ProcessInfo.processInfo.environment["GITHUB_ACCESS_TOKEN"] else { 12| 0| XCTFail("No token") 13| 0| return 14| 1| } 15| 1| let release = try GitHub(token: token).latestRelease(owner: "eneko", project: "GitHubTest") 16| 1| XCTAssertEqual(release, "0.0.0") 17| 1| } 18| | 19| 1| func testPullRequests() throws { 20| 1| guard let token = ProcessInfo.processInfo.environment["GITHUB_ACCESS_TOKEN"] else { 21| 0| XCTFail("No token") 22| 0| return 23| 1| } 24| 1| let pullRequests = try GitHub(token: token).openPullRequests(owner: "eneko", project: "GitHubTest") 25| 1| XCTAssertEqual(pullRequests.first?.title, "Update README.md") 26| 1| } 27| | 28| | static var allTests = [ 29| | ("testClientToken", testClientToken), 30| | ("testLatestRelease", testLatestRelease) 31| | ] 32| |} <<<<<< EOF # path=fixes ./Tests/LinuxMain.swift:3 ./Tests/GitHubTests/GitHubTests.swift:3,5,8,9,14,17,18,23,26,27,32 ./Package.swift:3 ./Sources/GitHub/GitHubError.swift:7,9,14,15,25,26,27 ./Sources/GitHub/Client.swift:7,9,10,12,14,16,20,21,25,26,30,33,35,36,43,46,49,51,52,59,64,66,68,69,70 ./Sources/GitHub/Models.swift:7,9,12,13,16,17,20,21,25,26,29,30,34,35,38,39,46,47,51 ./Sources/GitHub/GitHub.swift:7,9,12,15,16,19,20,31,32,33,34,35,37,41,43,44,54,55,56,57,59,63,65,66,67 <<<<<< EOF