Skip to content

Commit

Permalink
fix(cli): fix janky spinner when initializing providers
Browse files Browse the repository at this point in the history
This avoids triggering the log writers if their level is lower than
the log entry. This was particularly apparent when initializing
providers because that process triggers a lot of verbose+ entries.
  • Loading branch information
edvald committed Dec 3, 2019
1 parent 7ad6365 commit eb0eb33
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 36 deletions.
2 changes: 1 addition & 1 deletion garden-service/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ export const GLOBAL_OPTIONS = {
export type GlobalOptions = typeof GLOBAL_OPTIONS

function initLogger({ level, loggerType, emoji }: { level: LogLevel; loggerType: LoggerType; emoji: boolean }) {
const writer = getWriterInstance(loggerType)
const writer = getWriterInstance(loggerType, level)
const writers = writer ? [writer] : undefined
return Logger.initialize({ level, writers, useEmoji: emoji })
}
Expand Down
37 changes: 10 additions & 27 deletions garden-service/src/logger/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,14 @@ import { parseLogLevel } from "../cli/helpers"
export type LoggerType = "quiet" | "basic" | "fancy" | "json"
export const LOGGER_TYPES = new Set<LoggerType>(["quiet", "basic", "fancy", "json"])

export function getLoggerConfig(loggerType: LoggerType): LoggerConfig {
const configs: { [key in LoggerType]: LoggerConfig } = {
quiet: {
level: LogLevel.info,
},
basic: {
level: LogLevel.info,
writers: [new BasicTerminalWriter()],
},
fancy: {
level: LogLevel.info,
writers: [new FancyTerminalWriter()],
},
json: {
level: LogLevel.info,
writers: [new JsonTerminalWriter()],
},
}
return configs[loggerType]
}

export function getWriterInstance(loggerType: LoggerType) {
export function getWriterInstance(loggerType: LoggerType, level: LogLevel) {
switch (loggerType) {
case "basic":
return new BasicTerminalWriter()
return new BasicTerminalWriter(level)
case "fancy":
return new FancyTerminalWriter()
return new FancyTerminalWriter(level)
case "json":
return new JsonTerminalWriter()
return new JsonTerminalWriter(level)
case "quiet":
return undefined
}
Expand Down Expand Up @@ -102,7 +81,7 @@ export class Logger extends LogNode {
})
}

const writer = getWriterInstance(loggerType)
const writer = getWriterInstance(loggerType, config.level)
instance = new Logger({
writers: writer ? [writer] : undefined,
level: config.level,
Expand Down Expand Up @@ -132,7 +111,11 @@ export class Logger extends LogNode {
}

onGraphChange(entry: LogEntry) {
this.writers.forEach((writer) => writer.onGraphChange(entry, this))
for (const writer of this.writers) {
if (entry.level <= writer.level) {
writer.onGraphChange(entry, this)
}
}
}

getLogEntries(): LogEntry[] {
Expand Down
5 changes: 5 additions & 0 deletions garden-service/src/logger/writers/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@

import { LogEntry } from "../log-entry"
import { Logger } from "../logger"
import { LogLevel } from "../log-node"

export abstract class Writer {
abstract type: string

constructor(public level: LogLevel = LogLevel.info) {}

abstract render(...args): string | string[] | null
abstract onGraphChange(entry: LogEntry, logger: Logger): void
abstract stop(): void
Expand Down
2 changes: 2 additions & 0 deletions garden-service/src/logger/writers/basic-terminal-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { Logger } from "../logger"
import { Writer } from "./base"

export class BasicTerminalWriter extends Writer {
type = "basic"

render(entry: LogEntry, logger: Logger): string | null {
return basicRender(entry, logger)
}
Expand Down
8 changes: 4 additions & 4 deletions garden-service/src/logger/writers/fancy-terminal-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,17 @@ export interface CustomStream extends NodeJS.WriteStream {
}

export class FancyTerminalWriter extends Writer {
type = "fancy"

private spinners: { [key: string]: Function }
private intervalID: NodeJS.Timer | null
private stream: CustomStream
private prevOutput: string[]
private lastInterceptAt: number | null
private updatePending: boolean

public level: LogLevel

constructor() {
super()
constructor(level: LogLevel = LogLevel.info) {
super(level)
this.intervalID = null
this.spinners = {} // Each entry has it's own spinner
this.prevOutput = []
Expand Down
5 changes: 3 additions & 2 deletions garden-service/src/logger/writers/file-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ export function render(level: LogLevel, entry: LogEntry): string | null {
}

export class FileWriter extends Writer {
type = "file"

private fileLogger: winston.Logger | null
private logFilePath: string
private fileTransportOptions: FileTransportOptions
public level: LogLevel

constructor(logFilePath: string, config: FileWriterConfig) {
super()
super(config.level)

const { fileTransportOptions = DEFAULT_FILE_TRANSPORT_OPTIONS, level } = config
this.level = level
Expand Down
3 changes: 1 addition & 2 deletions garden-service/src/logger/writers/json-terminal-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

import { LogLevel } from "../log-node"
import { LogEntry, LogEntryMetadata } from "../log-entry"
import { Logger } from "../logger"
import { Writer } from "./base"
Expand All @@ -21,7 +20,7 @@ export interface JsonLogEntry {
}

export class JsonTerminalWriter extends Writer {
public level: LogLevel
type = "json"

render(entry: LogEntry, logger: Logger): string | null {
const level = this.level || logger.level
Expand Down

0 comments on commit eb0eb33

Please sign in to comment.