Skip to content

Commit 44b2e44

Browse files
committed
Fix regression when building paths with hyphens
1 parent a3c79b4 commit 44b2e44

File tree

12 files changed

+225
-1
lines changed

12 files changed

+225
-1
lines changed

Sources/dep/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public struct Package {
3636
- Note: Throws if the Package manifest will not parse.
3737
*/
3838
public init?(path: String) throws {
39-
let parts = path.characters.split("-")
39+
let parts = path.basename.characters.split("-")
4040

4141
// Packages are git clones
4242
guard let repo = Git.Repo(root: path) else { return nil }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import PackageDescription
2+
3+
let package = Package(
4+
name: "DeckOfPlayingCards",
5+
dependencies: [
6+
.Package(url: "../PlayingCard", majorVersion: 1),
7+
.Package(url: "../FisherYates", majorVersion: 1)
8+
]
9+
)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import FisherYates
2+
import PlayingCard
3+
4+
public struct Deck {
5+
private var cards: [PlayingCard]
6+
7+
public static func standard52CardDeck() -> Deck {
8+
let suits: [Suit] = [.Spades, .Hearts, .Diamonds, .Clubs]
9+
let ranks: [Rank] = [.Ace, .Two, .Three, .Four, .Five, .Six, .Seven, .Eight, .Nine, .Ten, .Jack, .Queen, .King]
10+
11+
var cards: [PlayingCard] = []
12+
for suit in suits {
13+
for rank in ranks {
14+
cards.append(PlayingCard(rank: rank, suit: suit))
15+
}
16+
}
17+
18+
return Deck(cards)
19+
}
20+
21+
public init(_ cards: [PlayingCard]) {
22+
self.cards = cards
23+
}
24+
25+
public mutating func shuffle() {
26+
cards.shuffleInPlace()
27+
}
28+
29+
public mutating func deal() -> PlayingCard? {
30+
guard !cards.isEmpty else { return nil }
31+
32+
return cards.removeLast()
33+
}
34+
}
35+
36+
// MARK: - ArrayLiteralConvertible
37+
38+
extension Deck : ArrayLiteralConvertible {
39+
public init(arrayLiteral elements: PlayingCard...) {
40+
self.init(elements)
41+
}
42+
}
43+
44+
// MARK: - Equatable
45+
46+
extension Deck : Equatable {}
47+
48+
public func ==(lhs: Deck, rhs: Deck) -> Bool {
49+
return lhs.cards == rhs.cards
50+
}

Tests/dep/Fixtures/103-mattts-dealer/FisherYates/Package.swift

Whitespace-only changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#if os(OSX) || os(iOS)
2+
import Darwin
3+
#else
4+
import Glibc
5+
#endif
6+
7+
public extension CollectionType {
8+
func shuffle() -> [Generator.Element] {
9+
var array = Array(self)
10+
array.shuffleInPlace()
11+
12+
return array
13+
}
14+
}
15+
16+
public extension MutableCollectionType where Index == Int {
17+
mutating func shuffleInPlace() {
18+
guard count > 1 else { return }
19+
20+
for i in 0..<count - 1 {
21+
#if os(OSX) || os(iOS)
22+
let j = Int(arc4random_uniform(UInt32(count - i))) + i
23+
#else
24+
let j = Int(g_random_int_range(0, Int32(count - i))) + i
25+
#endif
26+
guard i != j else { continue }
27+
swap(&self[i], &self[j])
28+
}
29+
}
30+
}

Tests/dep/Fixtures/103-mattts-dealer/PlayingCard/Package.swift

Whitespace-only changes.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
public struct PlayingCard {
2+
let rank: Rank
3+
let suit: Suit
4+
5+
public init(rank: Rank, suit: Suit) {
6+
self.rank = rank
7+
self.suit = suit
8+
}
9+
}
10+
11+
// MARK: - Equatable
12+
13+
extension PlayingCard: Equatable {}
14+
15+
public func ==(lhs: PlayingCard, rhs: PlayingCard) -> Bool {
16+
return lhs.rank == rhs.rank && lhs.suit == rhs.suit
17+
}
18+
19+
// MARK: - Comparable
20+
21+
extension PlayingCard: Comparable {}
22+
23+
public func <(lhs: PlayingCard, rhs: PlayingCard) -> Bool {
24+
return lhs.suit < rhs.suit || (lhs.suit == rhs.suit && lhs.rank < rhs.rank)
25+
}
26+
27+
// MARK: - CustomStringConvertible
28+
29+
extension PlayingCard : CustomStringConvertible {
30+
public var description: String {
31+
return "\(suit)\(rank)"
32+
}
33+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
public enum Rank : Int {
2+
case Ace = 1
3+
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
4+
case Jack, Queen, King
5+
}
6+
7+
// MARK: - Comparable
8+
9+
extension Rank : Comparable {}
10+
11+
public func <(lhs: Rank, rhs: Rank) -> Bool {
12+
switch (lhs, rhs) {
13+
case (_, _) where lhs == rhs:
14+
return false
15+
case (.Ace, _):
16+
return false
17+
default:
18+
return lhs.rawValue < rhs.rawValue
19+
}
20+
}
21+
22+
// MARK: - CustomStringConvertible
23+
24+
extension Rank : CustomStringConvertible {
25+
public var description: String {
26+
switch self {
27+
case .Ace: return "A"
28+
case .Jack: return "J"
29+
case .Queen: return "Q"
30+
case .King: return "K"
31+
default:
32+
return "\(rawValue)"
33+
}
34+
}
35+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
public enum Suit: String {
2+
case Spades, Hearts, Diamonds, Clubs
3+
}
4+
5+
// MARK: - Comparable
6+
7+
extension Suit: Comparable {}
8+
9+
public func <(lhs: Suit, rhs: Suit) -> Bool {
10+
switch (lhs, rhs) {
11+
case (_, _) where lhs == rhs:
12+
return false
13+
case (.Spades, _),
14+
(.Hearts, .Diamonds), (.Hearts, .Clubs),
15+
(.Diamonds, .Clubs):
16+
return false
17+
default:
18+
return true
19+
}
20+
}
21+
22+
// MARK: - CustomStringConvertible
23+
24+
extension Suit : CustomStringConvertible {
25+
public var description: String {
26+
switch self {
27+
case .Spades: return "♠︎"
28+
case .Hearts: return ""
29+
case .Diamonds: return ""
30+
case .Clubs: return "♣︎"
31+
}
32+
}
33+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import PackageDescription
2+
3+
let package = Package(
4+
name: "Dealer",
5+
dependencies: [
6+
.Package(url: "../DeckOfPlayingCards", versions: Version(1,1,0)..<Version(2,0,0)),
7+
.Package(url: "../PlayingCard", versions: Version(1,1,0)..<Version(2,0,0)),
8+
.Package(url: "../FisherYates", versions: Version(1,2,0)..<Version(2,0,0))
9+
]
10+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import FisherYates
2+
import PlayingCard
3+
import DeckOfPlayingCards
4+
5+
let numberOfCards = 10
6+
7+
var deck = Deck.standard52CardDeck()
8+
9+
//deck.shuffle() // no shuffle!
10+
11+
for _ in 0..<numberOfCards {
12+
guard let card = deck.deal() else {
13+
print("No More Cards!")
14+
break
15+
}
16+
17+
print(card)
18+
}

Tests/dep/FunctionalBuildTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,4 +395,10 @@ class FunctionalBuildTests: XCTestCase, XCTestCaseProvider {
395395
XCTAssertNotNil(try? executeSwiftBuild("\(prefix)/app"))
396396
}
397397
}
398+
399+
func testWhenThereAreHyphensInThePath() {
400+
fixture(name: "103-mattts-dealer") { prefix in
401+
XCTAssertNotNil(try? executeSwiftBuild("\(prefix)/app"))
402+
}
403+
}
398404
}

0 commit comments

Comments
 (0)