Skip to content

Commit f19b8a1

Browse files
Refactor progress report (#152)
* Introduce Compiler Event * Introduce Render Event * Add method to report finalization of a step * Replace console by progress report * Add progress report as a dependency * Add progress report as a dependency * Replace console by progress report * Add progress report as a dependency * Introduce Jekyll event * Add progress report as a dependency * Replace console by progress report * Add progress report as a dependency * Introduce Playground Event * Add function to report finalization of a step * Add progress report as a dependency * Replace console by progress report * Introduce PlaygroundBook Event * Add progress report as a dependency * Replace console by progress report * Remove unused code * Remove console from RenderEnvironment * Remove unused code * Remove unused dependency * Replace Console by ProgressReport * Reorganize CleanAPI * Reorganize CompilerAPI * Reorganize VersionAPI * Reorganize MarkdownAPI * Reorganize Jekyll API * Reorganize CarbonAPI * Reorganize PlaygroundAPI * Reorganize SwiftPlaygroundAPI * Add exported annotation * Remove unused file * Generalize CommandOutcome * Generalize outcome reporting * Adapt Compiler command * Reorder parameters * Adapt Markdown command * Adapt Markdown page command * Adapt Jekyll command * Adapt Jekyll page command * Adapt Carbon command * Adapt Carbon page command * Adapt Playground command * Adapt PlaygroundBook command * Fix compilation error * Remove unused code * Adapt Version command * Add tick to visualization * Remove unused file * Minor detail * Remove unused parameter * Move events to NefModels * Remove oneShot status and express it in terms of other actions * fix dependencies between NefModels and NefCommon * fix override `demo` folder in installer * Separate progress and outcome reporting * Propagate errors to the outer layer * Remove error from progress Co-authored-by: Miguel Ángel Díaz <[email protected]>
1 parent d1df62b commit f19b8a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1603
-1331
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ BINARIES = nef\
2424

2525

2626
.PHONY: install
27-
install: build install_folders
27+
install: uninstall build install_folders
2828
$(foreach binary,$(BINARIES),$(shell install $(BINARIES_PATH)/$(binary) $(PREFIX_BIN)/$(binary)))
2929
@cp -R Documentation.app $(PREFIX_TESTS)
3030

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ let package = Package(
1414
.package(url: "https://github.com/bow-swift/Swiftline", .exact("0.5.4")),
1515
],
1616
targets: [
17-
.target(name: "NefModels", dependencies: ["BowEffects"], path: "project/Component/NefModels", publicHeadersPath: "Support Files"),
18-
.target(name: "NefCommon", dependencies: ["Bow", "BowEffects", "BowOptics", "NefModels"], path: "project/Component/NefCommon", publicHeadersPath: "Support Files"),
17+
.target(name: "NefModels", dependencies: ["Bow", "BowEffects", "BowOptics"], path: "project/Component/NefModels", publicHeadersPath: "Support Files"),
18+
.target(name: "NefCommon", dependencies: ["NefModels"], path: "project/Component/NefCommon", publicHeadersPath: "Support Files"),
1919
.target(name: "NefCore", dependencies: ["NefCommon"], path: "project/Core", publicHeadersPath: "Support Files"),
2020
.target(name: "NefRender", dependencies: ["NefCore"], path: "project/Component/NefRender", publicHeadersPath: "Support Files"),
2121
.target(name: "NefMarkdown", dependencies: ["NefRender"], path: "project/Component/NefMarkdown", publicHeadersPath: "Support Files"),

project/Component/NefCarbon/Models/RenderCarbonEnvironment.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ public struct RenderCarbonEnvironment<A> {
1414

1515
internal var fileSystem: FileSystem { renderEnvironment.fileSystem }
1616

17-
public init(console: Console,
18-
fileSystem: FileSystem,
19-
persistence: RenderingPersistence<A>,
20-
xcodePlaygroundSystem: XcodePlaygroundSystem,
21-
style: CarbonStyle,
22-
carbonPrinter: @escaping (_ content: String) -> EnvIO<CoreCarbonEnvironment, CoreRenderError, RenderingOutput<A>>) {
17+
public init(
18+
progressReport: ProgressReport,
19+
fileSystem: FileSystem,
20+
persistence: RenderingPersistence<A>,
21+
xcodePlaygroundSystem: XcodePlaygroundSystem,
22+
style: CarbonStyle,
23+
carbonPrinter: @escaping (_ content: String) -> EnvIO<CoreCarbonEnvironment, CoreRenderError, RenderingOutput<A>>) {
2324

2425
func environment(style: CarbonStyle) -> CoreCarbonEnvironment {
2526
.init(downloader: CarbonAssembler().resolveCarbonDownloader(),
@@ -28,9 +29,10 @@ public struct RenderCarbonEnvironment<A> {
2829

2930
self.persistence = persistence
3031
self.render = Render<A>()
31-
self.renderEnvironment = RenderEnvironment(console: console,
32-
fileSystem: fileSystem,
33-
xcodePlaygroundSystem: xcodePlaygroundSystem,
34-
nodePrinter: { content in carbonPrinter(content).provide(environment(style: style)).env() })
32+
self.renderEnvironment = RenderEnvironment(
33+
progressReport: progressReport,
34+
fileSystem: fileSystem,
35+
xcodePlaygroundSystem: xcodePlaygroundSystem,
36+
nodePrinter: { content in carbonPrinter(content).provide(environment(style: style)).env() })
3537
}
3638
}

project/Component/NefClean/Clean.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import Foundation
44
import NefCommon
5-
5+
import NefModels
66
import Bow
77
import BowEffects
88

@@ -15,11 +15,8 @@ public struct Clean {
1515
return binding(
1616
|<-env.progressReport.inProgress(step),
1717
|<-env.shell.clean(playground: nefPlayground).provide(env.fileSystem).mapError { e in .clean(info: e) },
18-
yield: ())^
19-
.foldMTap(
20-
{ e in env.progressReport.failed(step, e) },
21-
{ env.progressReport.succeeded(step) })
22-
18+
yield: ())^
19+
.step(step, reportCompleted: env.progressReport)
2320
}
2421
}
2522
}
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
import BowEffects
2+
import NefModels
23

34
public extension IO {
45
func foldMTap<B>(_ f: @escaping (E) -> IO<E, B>,
56
_ g: @escaping (A) -> IO<E, B>) -> IO<E, A> {
6-
handleErrorWith { e in
7+
flatTap(g).handleErrorWith { e in
78
f(e).followedBy(.raiseError(e))
8-
}.flatTap(g)^
9+
}^
10+
}
11+
12+
func step<B: CustomProgressDescription>(
13+
_ step: B,
14+
reportCompleted progressReport: ProgressReport
15+
) -> IO<E, A> {
16+
17+
self.foldMTap(
18+
{ e in progressReport.failed(step) },
19+
{ _ in progressReport.succeeded(step) })
920
}
1021
}

project/Component/NefCompiler/Models/RenderCompilerEnvironment.swift

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,29 @@ public struct RenderCompilerEnvironment<A> {
1212
let render: Render<A>
1313
let codeEnvironment: RenderEnvironment<A>
1414

15-
internal var console: Console { codeEnvironment.console }
15+
internal var progressReport: ProgressReport { codeEnvironment.progressReport }
1616
internal var fileSystem: FileSystem { codeEnvironment.fileSystem }
1717
internal var xcodePlaygroundSystem: XcodePlaygroundSystem { codeEnvironment.xcodePlaygroundSystem }
1818

19-
public init(console: Console,
20-
fileSystem: FileSystem,
21-
compilerShell: CompilerShell,
22-
nefPlaygroundSystem: NefPlaygroundSystem,
23-
xcodePlaygroundSystem: XcodePlaygroundSystem,
24-
codePrinter: @escaping (_ content: String) -> EnvIO<CoreCodeEnvironment, CoreRenderError, RenderingOutput<A>>) {
19+
public init(
20+
progressReport: ProgressReport,
21+
fileSystem: FileSystem,
22+
compilerShell: CompilerShell,
23+
nefPlaygroundSystem: NefPlaygroundSystem,
24+
xcodePlaygroundSystem: XcodePlaygroundSystem,
25+
codePrinter: @escaping (_ content: String) -> EnvIO<CoreCodeEnvironment, CoreRenderError, RenderingOutput<A>>) {
2526

2627
self.compilerSystem = NefCompilerSystem()
27-
self.compilerEnvironment = CompilerSystemEnvironment(shell: compilerShell,
28-
fileSystem: fileSystem,
29-
nefPlaygroundSystem: nefPlaygroundSystem)
28+
self.compilerEnvironment = CompilerSystemEnvironment(
29+
shell: compilerShell,
30+
fileSystem: fileSystem,
31+
nefPlaygroundSystem: nefPlaygroundSystem)
3032

3133
self.render = Render<A>()
32-
self.codeEnvironment = RenderEnvironment(console: console,
33-
fileSystem: fileSystem,
34-
xcodePlaygroundSystem: xcodePlaygroundSystem,
35-
nodePrinter: { content in codePrinter(content).provide(.init()).env() })
34+
self.codeEnvironment = RenderEnvironment(
35+
progressReport: progressReport,
36+
fileSystem: fileSystem,
37+
xcodePlaygroundSystem: xcodePlaygroundSystem,
38+
nodePrinter: { content in codePrinter(content).provide(.init()).env() })
3639
}
3740
}

project/Component/NefCompiler/NefCompiler.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,17 @@ public struct Compiler {
6161

6262
private func compile(page: RenderingOutput, filename: String, inPlayground: URL, atNefPlayground nefPlayground: NefPlaygroundURL, platform: Platform, frameworks: [URL]) -> EnvIO<Environment, RenderError, Void> {
6363
let page = page.output.all().joined()
64+
let step = CompilerEvent.compilingPage(filename.removeExtension)
6465

6566
return EnvIO { env -> IO<RenderError, Void> in
6667
binding(
67-
|<-env.console.print(information: "\t• Compiling page '\(filename.removeExtension)'"),
68+
|<-env.progressReport.inProgress(step),
6869
|<-env.compilerSystem
6970
.compile(page: page, filename: filename, inPlayground: inPlayground, atNefPlayground: nefPlayground, platform: platform, frameworks: frameworks)
7071
.contramap(\Environment.compilerEnvironment).provide(env)
7172
.mapError { e in RenderError.content(info: e) },
72-
yield: ())^.reportStatus(console: env.console)
73+
yield: ())^
74+
.step(step, reportCompleted: env.progressReport)
7375
}
7476
}
7577

@@ -83,8 +85,9 @@ public struct Compiler {
8385
return EnvIO { env in
8486
binding(
8587
|<-compilePages(pages, inPlayground: playground, atNefPlayground: nefPlayground, frameworks: frameworks).provide(env),
86-
|<-env.console.print(information: "Building playground '\(playground.lastPathComponent.removeExtension)'"),
87-
|<-env.console.printStatus(success: true),
88+
|<-env.progressReport.oneShot(
89+
CompilerEvent.buildingPlayground(
90+
playground.lastPathComponent.removeExtension)),
8891
yield: ())^
8992
}
9093
}
@@ -100,11 +103,13 @@ public struct Compiler {
100103

101104
return EnvIO { env in
102105
let dependencies = IO<RenderError, URL>.var()
106+
let step = CompilerEvent.buildingWorkspace(workspace.lastPathComponent.removeExtension)
103107

104108
return binding(
105-
|<-env.console.print(information: "Building workspace '\(workspace.lastPathComponent.removeExtension)'"),
109+
|<-env.progressReport.inProgress(step),
106110
dependencies <- buildWorkspace(workspace, atNefPlayground: nefPlayground, platform: platform, cached: cached).provide(env),
107-
yield: [dependencies.get])^.reportStatus(console: env.console)
111+
yield: [dependencies.get])^
112+
.step(step, reportCompleted: env.progressReport)
108113
}
109114
}
110115

project/Component/NefJekyll/Models/RenderJekyllEnvironment.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,29 @@ public struct RenderJekyllEnvironment<A> {
1212
public let jekyllEnvironment: (_ permalink: String) -> RenderEnvironment<A>
1313
public let renderEnvironment: RenderEnvironment<A>
1414

15-
internal var console: Console { renderEnvironment.console }
15+
internal var progressReport: ProgressReport { renderEnvironment.progressReport }
1616
internal var fileSystem: FileSystem { renderEnvironment.fileSystem }
1717

18-
public init(console: Console,
18+
public init(progressReport: ProgressReport,
1919
fileSystem: FileSystem,
2020
persistence: RenderingPersistence<A>,
2121
xcodePlaygroundSystem: XcodePlaygroundSystem,
2222
jekyllPrinter: @escaping (_ content: String) -> EnvIO<CoreJekyllEnvironment, CoreRenderError, RenderingOutput<A>>) {
2323

2424
self.persistence = persistence
2525
self.render = Render<A>()
26-
self.jekyllEnvironment = { permalink in RenderEnvironment(console: console, fileSystem: fileSystem, xcodePlaygroundSystem: xcodePlaygroundSystem, nodePrinter: Self.nodePrinter(from: jekyllPrinter, permalink: permalink)) }
27-
self.renderEnvironment = RenderEnvironment(console: console, fileSystem: fileSystem, xcodePlaygroundSystem: xcodePlaygroundSystem, nodePrinter: Self.nodePrinter(from: jekyllPrinter))
26+
self.jekyllEnvironment = { permalink in
27+
RenderEnvironment(
28+
progressReport: progressReport,
29+
fileSystem: fileSystem,
30+
xcodePlaygroundSystem: xcodePlaygroundSystem,
31+
nodePrinter: Self.nodePrinter(from: jekyllPrinter, permalink: permalink))
32+
}
33+
self.renderEnvironment = RenderEnvironment(
34+
progressReport: progressReport,
35+
fileSystem: fileSystem,
36+
xcodePlaygroundSystem: xcodePlaygroundSystem,
37+
nodePrinter: Self.nodePrinter(from: jekyllPrinter))
2838
}
2939

3040
// MARK: - helpers

project/Component/NefJekyll/NefJekyll.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,15 @@ public struct Jekyll {
109109
permalink: /docs/
110110
---
111111
"""
112+
let step = JekyllEvent.buildingMainPage(mainPage.path)
112113

113114
return EnvIO { env in
114115
binding(
115-
|<-env.console.print(information: "Building main page '\(mainPage.path)'"),
116+
|<-env.progressReport.inProgress(step),
116117
|<-env.fileSystem.createDirectory(atPath: docs.path),
117118
|<-env.fileSystem.write(content: content ?? defaultContent, toFile: file.path),
118-
yield: ())^.mapError { _ in .page(mainPage) }^.reportStatus(console: env.console)
119+
yield: ())^.mapError { _ in .page(mainPage) }^
120+
.step(step, reportCompleted: env.progressReport)
119121
}
120122
}
121123

@@ -156,14 +158,16 @@ public struct Jekyll {
156158

157159
let sidebarFile = data.appendingPathComponent("sidebar.yml")
158160
let content = IO<RenderError, String>.var()
161+
let step = JekyllEvent.buildingSidebar(sidebarFile.path)
159162

160163
return EnvIO { env in
161164
binding(
162-
|<-env.console.print(information: "Building sidebar '\(sidebarFile.path)'"),
165+
|<-env.progressReport.inProgress(step),
163166
|<-env.fileSystem.createDirectory(atPath: data.path).mapError { _ in .page(sidebarFile) },
164167
content <- sidebar(rendered),
165168
|<-env.fileSystem.write(content: content.get, toFile: sidebarFile.path).mapError { _ in .page(sidebarFile) },
166-
yield: ())^.reportStatus(console: env.console)
169+
yield: ())^
170+
.step(step, reportCompleted: env.progressReport)
167171
}
168172
}
169173

project/Component/NefMarkdown/Models/RenderMarkdownEnvironment.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@ public struct RenderMarkdownEnvironment<A> {
1313

1414
internal var fileSystem: FileSystem { renderEnvironment.fileSystem }
1515

16-
public init(console: Console,
16+
public init(progressReport: ProgressReport,
1717
fileSystem: FileSystem,
1818
persistence: RenderingPersistence<A>,
1919
xcodePlaygroundSystem: XcodePlaygroundSystem,
2020
markdownPrinter: @escaping (_ content: String) -> EnvIO<CoreMarkdownEnvironment, CoreRenderError, RenderingOutput<A>>) {
2121

2222
self.persistence = persistence
2323
self.render = Render<A>()
24-
self.renderEnvironment = RenderEnvironment(console: console, fileSystem: fileSystem, xcodePlaygroundSystem: xcodePlaygroundSystem, nodePrinter: { content in markdownPrinter(content).provide(.init()).env() })
24+
self.renderEnvironment = RenderEnvironment(
25+
progressReport: progressReport,
26+
fileSystem: fileSystem,
27+
xcodePlaygroundSystem: xcodePlaygroundSystem,
28+
nodePrinter: { content in markdownPrinter(content).provide(.init()).env() })
2529
}
2630
}

project/Component/NefModels/Console.swift

Lines changed: 0 additions & 80 deletions
This file was deleted.

project/Component/NefClean/Models/CleanEvent.swift renamed to project/Component/NefModels/Events/CleanEvent.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import NefModels
2-
31
public enum CleanEvent {
42
case cleaningPlayground(String)
53
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
public enum CompilerEvent {
2+
case buildingWorkspace(String)
3+
case buildingPlayground(String)
4+
case compilingPage(String)
5+
}
6+
7+
extension CompilerEvent: CustomProgressDescription {
8+
9+
public var progressDescription: String {
10+
switch self {
11+
12+
case let .buildingWorkspace(name):
13+
return "Building workspace '\(name)'"
14+
15+
case let .buildingPlayground(name):
16+
return "Building playground '\(name)'"
17+
18+
case let .compilingPage(name):
19+
return "\t• Compiling page '\(name)'"
20+
}
21+
}
22+
}

0 commit comments

Comments
 (0)