Skip to content
This repository has been archived by the owner on Dec 3, 2023. It is now read-only.

Commit

Permalink
Merge pull request #34 from kiliankoe/parse-dependencies
Browse files Browse the repository at this point in the history
Parse dependencies
  • Loading branch information
kiliankoe authored Aug 9, 2017
2 parents f2d8c08 + ce44f4e commit b699313
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Sources/ApodidaeCore/GitHub.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ struct RepoQuery: GraphQLQuery {
}
packageManifest: object(expression: "master:Package.swift") {
... on Blob {
abbreviatedOid
text
}
}
}
Expand Down
35 changes: 30 additions & 5 deletions Sources/ApodidaeCore/Repository.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Regex
import Rainbow

public typealias Tag = String
Expand All @@ -17,7 +18,26 @@ public struct Repository: Decodable {
public let stargazers: Int
public var tags: [Tag] = []
public var heads: [Head] = []
public let hasPackageManifest: Bool
public let packageManifest: String?

public var hasPackageManifest: Bool {
if let _ = self.packageManifest {
return true
}
return false
}

public var dependencies: [String] {
guard let manifest = self.packageManifest else { return [] }
let packageRegex = Regex("url: \"(\\S+)\",.+\\)")
let githubRegex = Regex("https?:\\/\\/github.com\\/")
let gitSuffixRegex = Regex(".git$")

return packageRegex.allMatches(in: manifest)
.flatMap { $0.captures.first ?? nil }
.map { $0.replacingAll(matching: githubRegex, with: "") }
.map { $0.replacingAll(matching: gitSuffixRegex, with: "") }
}

public var owner: String {
return nameWithOwner.components(separatedBy: "/").first ?? ""
Expand Down Expand Up @@ -54,7 +74,7 @@ public struct Repository: Decodable {
}

private enum PackageManifestContainer: String, CodingKey {
case abbreviatedOid
case text
}

private enum ParentContainer: String, CodingKey {
Expand Down Expand Up @@ -83,10 +103,10 @@ public struct Repository: Decodable {
self.stargazers = try stargazersContainer.decode(Int.self, forKey: .totalCount)

let packageManifestContainer = try? container.nestedContainer(keyedBy: PackageManifestContainer.self, forKey: .packageManifest)
if let _ = packageManifestContainer {
self.hasPackageManifest = true
if let packageManifestContainer = packageManifestContainer {
self.packageManifest = try packageManifestContainer.decode(String.self, forKey: .text)
} else {
self.hasPackageManifest = false
self.packageManifest = nil
}
}

Expand Down Expand Up @@ -117,6 +137,8 @@ public struct Repository: Decodable {
let priv = isPrivate ? "private" : ""
let fork = "Fork of \(parent ?? "unknown")".lightBlue

let dependencies = self.dependencies.isEmpty ? "None" : self.dependencies.joined(separator: "\n ")

var output = """
\(owner.bold.italic)/\(name.lightCyan.bold) \(latestVersion ?? "unreleased".italic) \(priv.yellow)
\(url.absoluteString.italic)\n
Expand All @@ -139,6 +161,9 @@ public struct Repository: Decodable {
Last activity: \(pushedAt.iso)
Last versions: \(versions)
Branches: \(heads.joined(separator: ", "))
Dependencies:
\(dependencies)
"""

return output
Expand Down
32 changes: 26 additions & 6 deletions Tests/ApodidaeTests/GitHubTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class GitHubTests: XCTestCase {
"totalCount": 11
},
"packageManifest": {
"abbreviatedOid": "3571935"
"text": "import PackageDescription\\n\\nlet package = Package(\\n name: \\"DVB\\",\\n dependencies: [\\n .Package(url: \\"https://github.com/utahiosmac/Marshal\\", majorVersion: 1, minor: 2),\\n .Package(url: \\"https://github.com/kiliankoe/gausskrueger\\", majorVersion: 0, minor: 3),\\n ]\\n)\\n"
}
}
},
Expand All @@ -47,10 +47,29 @@ class GitHubTests: XCTestCase {
"totalCount": 0
},
"packageManifest": {
"abbreviatedOid": "5338ca5"
"text": "// swift-tools-version:4.0\\n// The swift-tools-version declares the minimum version of Swift required to build this package.\\n\\nimport PackageDescription\\n\\nlet package = Package(\\n name: \\"alfred_emeal\\",\\n dependencies: [\\n // Dependencies declare other packages that this package depends on.\\n // .package(url: /* package url */, from: \\"1.0.0\\"),\\n .package(url: \\"https://github.com/benchr267/swiftalfred\\", .branch(\\"master\\")),\\n .package(url: \\"https://github.com/kiliankoe/StuWeDD\\", from: \\"0.2.1\\")\\n ],\\n targets: [\\n // Targets are the basic building blocks of a package. A target can define a module or a test suite.\\n // Targets can depend on other targets in this package, and on products in packages which this package depends on.\\n .target(\\n name: \\"alfred_emeal\\",\\n dependencies: [\\"SwiftAlfred\\", \\"StuWeDD\\"]),\\n ]\\n)\\n"
}
}
},
{
"node": {
"nameWithOwner": "kiliankoe/campusnavigator",
"description": "🗺 Campus Navigator",
"url": "https://github.com/kiliankoe/campusnavigator",
"isFork": false,
"parent": null,
"isPrivate": true,
"pushedAt": "2017-02-17T21:06:10Z",
"license": null,
"openIssues": {
"totalCount": 22
},
"stargazers": {
"totalCount": 0
},
"packageManifest": null
}
},
{
"node": {
"nameWithOwner": "kiliankoe/StuWeDD",
Expand All @@ -68,7 +87,7 @@ class GitHubTests: XCTestCase {
"totalCount": 0
},
"packageManifest": {
"abbreviatedOid": "dcc137a"
"text": "// swift-tools-version:4.0\\n// The swift-tools-version declares the minimum version of Swift required to build this package.\\n\\nimport PackageDescription\\n\\nlet package = Package(\\n name: \\"StuWeDD\\",\\n products: [\\n // Products define the executables and libraries produced by a package, and make them visible to other packages.\\n .library(\\n name: \\"StuWeDD\\",\\n targets: [\\"StuWeDD\\"]),\\n ],\\n dependencies: [\\n // Dependencies declare other packages that this package depends on.\\n // .package(url: /* package url */, from: \\"1.0.0\\"),\\n ],\\n targets: [\\n // Targets are the basic building blocks of a package. A target can define a module or a test suite.\\n // Targets can depend on other targets in this package, and on products in packages which this package depends on.\\n .target(\\n name: \\"StuWeDD\\",\\n dependencies: []),\\n .testTarget(\\n name: \\"StuWeDDTests\\",\\n dependencies: [\\"StuWeDD\\"]),\\n ]\\n)\\n"
}
}
},
Expand Down Expand Up @@ -132,9 +151,9 @@ class GitHubTests: XCTestCase {
]
},
"rateLimit": {
"cost": 3,
"remaining": 4797,
"resetAt": "2017-07-30T11:41:21Z"
"cost": 2,
"remaining": 4984,
"resetAt": "2017-08-09T09:33:42Z"
}
}
}
Expand All @@ -149,6 +168,7 @@ class GitHubTests: XCTestCase {
XCTAssertEqual(response.data?.repositories.count, 3)
XCTAssertEqual(response.data?.repositories[0].nameWithOwner, "kiliankoe/DVB")
XCTAssertTrue(response.data?.repositories[0].hasPackageManifest ?? false)
XCTAssertEqual(response.data?.repositories[0].dependencies ?? [], ["utahiosmac/Marshal", "kiliankoe/gausskrueger"])
}

// func testGitHubRequest() {
Expand Down
2 changes: 1 addition & 1 deletion Tests/ApodidaeTests/ManifestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,6 @@ extension Repository {
self.stargazers = 0
self.tags = ["0.1.0"]
self.heads = ["master"]
self.hasPackageManifest = true
self.packageManifest = ""
}
}

0 comments on commit b699313

Please sign in to comment.