Skip to content

Commit

Permalink
improvement(cli): rename --loglevel to --log-level + refactor log init
Browse files Browse the repository at this point in the history
BREAKING CHANGE:

The --loglevel CLI option is now called --log-level
  • Loading branch information
eysi09 committed Jun 11, 2019
1 parent 9d78108 commit de5e78a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 34 deletions.
64 changes: 32 additions & 32 deletions garden-service/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

import * as sywac from "sywac"
import chalk from "chalk"
import { intersection, merge } from "lodash"
import { resolve, join } from "path"
import { safeDump } from "js-yaml"
Expand All @@ -25,13 +26,10 @@ import {
} from "../commands/base"
import { GardenError, PluginError, toGardenError } from "../exceptions"
import { Garden, GardenOpts } from "../garden"
import { getLogger, Logger, LoggerType, LOGGER_TYPES } from "../logger/logger"
import { getLogger, Logger, LoggerType, LOGGER_TYPES, getWriterInstance } from "../logger/logger"
import { LogLevel } from "../logger/log-node"
import { BasicTerminalWriter } from "../logger/writers/basic-terminal-writer"
import { FancyTerminalWriter } from "../logger/writers/fancy-terminal-writer"
import { JsonTerminalWriter } from "../logger/writers/json-terminal-writer"
import { FileWriter, FileWriterConfig } from "../logger/writers/file-writer"
import { Writer } from "../logger/writers/base"

import {
envSupportsEmoji,
Expand Down Expand Up @@ -66,12 +64,6 @@ const OUTPUT_RENDERERS = {
},
}

const WRITER_CLASSES = {
basic: BasicTerminalWriter,
fancy: FancyTerminalWriter,
json: JsonTerminalWriter,
}

const GLOBAL_OPTIONS_GROUP_NAME = "Global options"
const DEFAULT_CLI_LOGGER_TYPE = "fancy"

Expand Down Expand Up @@ -99,21 +91,25 @@ export const GLOBAL_OPTIONS = {
}),
"silent": new BooleanParameter({
alias: "s",
help: "Suppress log output.",
help: "Suppress log output. Same as setting --logger-type=quiet.",
defaultValue: false,
}),
"env": new EnvironmentOption(),
"logger-type": new ChoicesParameter({
choices: [...LOGGER_TYPES],
help: deline`
Set logger type:
fancy: updates log lines in-place when their status changes (e.g. when tasks complete),
basic: appends a new log line when a log line's status changes,
json: same as basic, but renders log lines as JSON,
quiet: uppresses all log output,
Set logger type.
${chalk.bold("fancy:")} updates log lines in-place when their status changes (e.g. when tasks complete),
${chalk.bold("basic:")} appends a new log line when a log line's status changes,
${chalk.bold("json:")} same as basic, but renders log lines as JSON,
${chalk.bold("quiet:")} suppresses all log output, same as --silent.
`,
}),
"loglevel": new ChoicesParameter({
"log-level": new ChoicesParameter({
alias: "l",
choices: getLogLevelChoices(),
help: deline`
Expand All @@ -136,15 +132,9 @@ export const GLOBAL_OPTIONS = {

export type GlobalOptions = typeof GLOBAL_OPTIONS

function initLogger({ level, logEnabled, loggerType, emoji }: {
level: LogLevel, logEnabled: boolean, loggerType: LoggerType, emoji: boolean,
}) {
let writers: Writer[] = []

if (logEnabled) {
writers.push(new WRITER_CLASSES[loggerType]())
}

function initLogger({ level, loggerType, emoji }: { level: LogLevel, loggerType: LoggerType, emoji: boolean }) {
const writer = getWriterInstance(loggerType)
const writers = writer ? [writer] : undefined
return Logger.initialize({ level, writers, useEmoji: emoji })
}

Expand Down Expand Up @@ -240,14 +230,24 @@ export class GardenCli {
const parsedArgs = filterByKeys(argv, argKeys)
const parsedOpts = filterByKeys(argv, optKeys.concat(globalKeys))
const root = resolve(process.cwd(), parsedOpts.root)
const { emoji, env, loglevel, "logger-type": loggerTypeOpt, silent, output } = parsedOpts

const loggerType = loggerTypeOpt || command.loggerType || DEFAULT_CLI_LOGGER_TYPE
const {
"logger-type": loggerTypeOpt,
"log-level": logLevel,
emoji,
env,
silent,
output,
} = parsedOpts

let loggerType = loggerTypeOpt || command.loggerType || DEFAULT_CLI_LOGGER_TYPE

if (silent || output) {
loggerType = "quiet"
}

// Init logger
const logEnabled = !silent && !output && loggerType !== "quiet"
const level = parseLogLevel(loglevel)
const logger = initLogger({ level, logEnabled, loggerType, emoji })
const level = parseLogLevel(logLevel)
const logger = initLogger({ level, loggerType, emoji })

// Currently we initialise an empty placeholder log entry and pass that to the
// framework as opposed to the logger itself. This is mainly for type conformity.
Expand Down
18 changes: 16 additions & 2 deletions garden-service/src/logger/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ 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 getCommonConfig(loggerType: LoggerType): LoggerConfig {
export function getLoggerConfig(loggerType: LoggerType): LoggerConfig {
const configs: { [key in LoggerType]: LoggerConfig } = {
quiet: {
level: LogLevel.info,
Expand All @@ -41,6 +41,19 @@ export function getCommonConfig(loggerType: LoggerType): LoggerConfig {
return configs[loggerType]
}

export function getWriterInstance(loggerType: LoggerType) {
switch (loggerType) {
case "basic":
return new BasicTerminalWriter()
case "fancy":
return new FancyTerminalWriter()
case "json":
return new JsonTerminalWriter()
case "quiet":
return undefined
}
}

export interface LoggerConfig {
level: LogLevel
writers?: Writer[]
Expand Down Expand Up @@ -89,7 +102,8 @@ export class Logger extends LogNode {
})
}

instance = new Logger({ ...getCommonConfig(loggerType), level: config.level })
const writer = getWriterInstance(loggerType)
instance = new Logger({ writers: writer ? [writer] : undefined, level: config.level })
instance.debug(`Setting logger type to ${loggerType} (from GARDEN_LOGGER_TYPE)`)
} else {
instance = new Logger(config)
Expand Down

0 comments on commit de5e78a

Please sign in to comment.