Skip to content

Commit e822f13

Browse files
committed
implement PushBetaGroupsCommand and PullBetaGroupsCommand
1 parent 8f8b39b commit e822f13

2 files changed

Lines changed: 59 additions & 68 deletions

File tree

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,29 @@
11
// Copyright 2020 Itty Bitty Apps Pty Ltd
22

33
import ArgumentParser
4-
import Foundation
5-
import Files
6-
import Yams
7-
import CodableCSV
84

95
struct PullBetaGroupsCommand: CommonParsableCommand {
106

117
static var configuration = CommandConfiguration(
128
commandName: "pull",
13-
abstract: "Load or update local beta group config files from server."
9+
abstract: "Pull down server beta groups, refresh local beta group config files"
1410
)
1511

1612
@OptionGroup()
1713
var common: CommonOptions
1814

19-
@Option(help: "Path to the Folder containing the information about beta groups. (default: ./config/betagroups)")
20-
var outputPath: String?
15+
@Option(
16+
default: "./config/betagroups",
17+
help: "Path to the Folder containing the information about beta groups. (default: './config/betagroups')"
18+
) var outputPath: String
2119

2220
func run() throws {
2321
let service = try makeService()
2422

25-
let betaGroups: [(BetaGroup, [BetaTester])] = try service.pullBetaGroups()
23+
let betaGroupWithTesters = try service.pullBetaGroups()
2624

27-
let folder = outputPath != nil
28-
? try Folder(path: outputPath!)
29-
: try Folder(path: "./config").createSubfolder(named: "betagroups")
30-
31-
try betaGroups.forEach { (group: BetaGroup, testers: [BetaTester]) in
32-
33-
// desired output: app-name_group-name
34-
let groupFileName = "\(group.app.name ?? "")_\(group.groupName ?? "grouo-name")"
35-
.components(separatedBy: .whitespacesAndNewlines)
36-
.joined()
37-
.snakeCased() ?? "file_name"
38-
39-
// desired output: app-name_group-name_beta-testers.csv
40-
let testersFile = try folder
41-
.createFile(named: "\(groupFileName)_beta-testers.csv")
42-
43-
try testersFile.write(testers.renderAsCSV())
44-
45-
var group = group
46-
group.testers = testersFile.path
47-
48-
let groupFile = try folder.createFile(named: "\(groupFileName).yml")
49-
50-
try groupFile.write(try YAMLEncoder().encode(group))
51-
}
25+
try BetaGroupFolderManager(path: outputPath)
26+
.save(groupsWithTesters: betaGroupWithTesters)
5227
}
5328

5429
}
Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,84 @@
11
// Copyright 2020 Itty Bitty Apps Pty Ltd
22

33
import ArgumentParser
4-
import Foundation
5-
import Files
64

75
struct PushBetaGroupsCommand: CommonParsableCommand {
86

97
static var configuration = CommandConfiguration(
108
commandName: "push",
11-
abstract: "TODO."
9+
abstract: "Push local beta group config files to server, update server beta groups"
1210
)
1311

1412
@OptionGroup()
1513
var common: CommonOptions
1614

17-
@Flag(help: "TODO")
15+
@Option(
16+
default: "./config/betagroups",
17+
help: "Path to the Folder containing the information about beta groups. (default: './config/betagroups')"
18+
) var inputPath: String
19+
20+
@Flag(help: "Perform a dry run.")
1821
var dryRun: Bool
1922

2023
func run() throws {
2124
let service = try makeService()
25+
let folderManager = BetaGroupFolderManager(path: inputPath)
2226

2327
let serverGroups = Set(try service.pullBetaGroups().map{ $0.betaGroup })
28+
let localGroups = Set(try folderManager.read())
29+
30+
let strategies = compareGroups(
31+
localGroups: localGroups,
32+
serverGroups: serverGroups
33+
)
34+
35+
let renderer = Renderers.SyncResultRenderer<BetaGroup>()
36+
37+
if dryRun {
38+
renderer.render(strategies, isDryRun: true)
39+
} else {
40+
try strategies.forEach { (strategy: SyncStrategy) in
41+
switch strategy {
42+
case .create(let group):
43+
_ = try service.createBetaGroup(
44+
appBundleId: group.app.bundleId!,
45+
groupName: group.groupName!,
46+
publicLinkEnabled: group.publicLinkEnabled ?? false,
47+
publicLinkLimit: group.publicLinkLimit
48+
)
49+
case .delete(let group):
50+
try service.deleteBetaGroup(with: group.id!)
51+
case .update(let group):
52+
try service.updateBetaGroup(betaGroup: group)
53+
}
54+
55+
renderer.render(strategy, isDryRun: false)
56+
}
2457

25-
var localGroups = Set<BetaGroup>()
26-
27-
for file in try Folder(path: "./config/betagroups").files {
28-
if file.extension == "yml" {
29-
let group = Readers
30-
.FileReader<BetaGroup>(format: .yaml)
31-
.read(filePath: file.path)
58+
let betaGroupWithTesters = try service.pullBetaGroups()
3259

33-
localGroups.insert(group)
34-
}
60+
try folderManager.save(groupsWithTesters: betaGroupWithTesters)
3561
}
62+
}
63+
64+
func compareGroups(localGroups: Set<BetaGroup>, serverGroups: Set<BetaGroup>) -> [SyncStrategy<BetaGroup>] {
65+
var strategies: [SyncStrategy<BetaGroup>] = []
3666

3767
let groupToCreate = localGroups.subtracting(serverGroups)
3868
let groupToDelete = serverGroups.subtracting(localGroups)
3969

40-
guard !dryRun else {
41-
groupToCreate.forEach {
42-
print("+\($0.groupName!)")
70+
groupToDelete.forEach { group in
71+
if !localGroups.contains(where: { group.id == $0.id }) {
72+
strategies.append(.delete(group))
4373
}
44-
45-
groupToDelete.forEach {
46-
print("-\($0.groupName!)")
47-
}
48-
return
4974
}
5075

51-
try groupToDelete.forEach {
52-
try service.deleteBetaGroup(with: $0.id!)
53-
print("\($0.groupName!)")
76+
groupToCreate.forEach { group in
77+
serverGroups.contains(where: { group.id == $0.id })
78+
? strategies.append(.update(group))
79+
: strategies.append(.create(group))
5480
}
5581

56-
try groupToCreate.forEach {
57-
_ = try service.createBetaGroup(
58-
appBundleId: $0.app.bundleId!,
59-
groupName: $0.groupName ?? "group name",
60-
publicLinkEnabled: $0.publicLinkEnabled ?? false,
61-
publicLinkLimit: $0.publicLinkLimit
62-
)
63-
64-
print("\($0.groupName!)")
65-
}
82+
return strategies
6683
}
67-
6884
}

0 commit comments

Comments
 (0)