Skip to content

Commit

Permalink
Merge pull request #592 from garden-io/integ-testing
Browse files Browse the repository at this point in the history
chore: added integ tests & tools
  • Loading branch information
edvald authored Mar 14, 2019
2 parents c47a808 + 2001c79 commit c5f4c0e
Show file tree
Hide file tree
Showing 278 changed files with 1,522 additions and 272 deletions.
54 changes: 36 additions & 18 deletions garden-service/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions garden-service/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
"koa-websocket": "^5.0.1",
"lodash": "^4.17.11",
"log-symbols": "^2.2.0",
"mocha-logger": "^1.0.6",
"moment": "^2.23.0",
"node-emoji": "^1.8.1",
"normalize-url": "^4.1.0",
Expand Down Expand Up @@ -177,6 +178,7 @@
"dev": "npm link && tsc -w -p tsconfig.build.json --outDir build",
"dist": "npm run build",
"integ": "./test/integ/run",
"integ-full": "node_modules/.bin/mocha --opts test/mocha.integ.opts",
"prepare": "npm run snyk-protect",
"snyk-protect": "snyk protect",
"test": "node_modules/.bin/mocha",
Expand Down
29 changes: 19 additions & 10 deletions garden-service/src/cli/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { safeDump } from "js-yaml"
import { coreCommands } from "../commands/commands"
import { DeepPrimitiveMap } from "../config/common"
import { shutdown, sleep, getPackageVersion } from "../util/util"
import { deline } from "../util/string"
import {
BooleanParameter,
ChoicesParameter,
Expand All @@ -28,6 +29,7 @@ import { getLogger, Logger, LoggerType } 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 } from "../logger/writers/file-writer"
import { Writer } from "../logger/writers/base"

Expand Down Expand Up @@ -59,6 +61,12 @@ const OUTPUT_RENDERERS = {
},
}

const WRITER_CLASSES = {
[LoggerType.basic]: BasicTerminalWriter,
[LoggerType.fancy]: FancyTerminalWriter,
[LoggerType.json]: JsonTerminalWriter,
}

const FILE_WRITER_CONFIGS = [
{ filename: "development.log" },
{ filename: ERROR_LOG_FILENAME, level: LogLevel.error },
Expand Down Expand Up @@ -100,12 +108,16 @@ export const GLOBAL_OPTIONS = {
defaultValue: false,
}),
env: new EnvironmentOption(),
loggerType: new ChoicesParameter({
choices: Object.keys(WRITER_CLASSES),
help: `TODO`,
}),
loglevel: new ChoicesParameter({
alias: "l",
choices: getLogLevelChoices(),
help:
"Set logger level. Values can be either string or numeric and are prioritized from 0 to 5 " +
"(highest to lowest) as follows: error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5.",
help: deline`
Set logger level. Values can be either string or numeric and are prioritized from 0 to 5
(highest to lowest) as follows: error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5.`,
hints:
"[enum] [default: info] [error || 0, warn || 1, info || 2, verbose || 3, debug || 4, silly || 5]",
defaultValue: LogLevel[LogLevel.info],
Expand All @@ -127,11 +139,7 @@ function initLogger({ level, logEnabled, loggerType, emoji }: {
let writers: Writer[] = []

if (logEnabled) {
if (loggerType === LoggerType.fancy) {
writers.push(new FancyTerminalWriter())
} else if (loggerType === LoggerType.basic) {
writers.push(new BasicTerminalWriter())
}
writers.push(new WRITER_CLASSES[loggerType]())
}

return Logger.initialize({ level, writers, useEmoji: emoji })
Expand Down Expand Up @@ -215,7 +223,6 @@ export class GardenCli {

const {
arguments: args = {},
loggerType = DEFAULT_CLI_LOGGER_TYPE,
options = {},
} = command

Expand All @@ -233,7 +240,9 @@ 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, silent, output } = parsedOpts
const { emoji, env, loglevel, loggerType: loggerTypeOpt, silent, output } = parsedOpts

const loggerType = loggerTypeOpt || command.loggerType || DEFAULT_CLI_LOGGER_TYPE

// Init logger
const logEnabled = !silent && !output && loggerType !== LoggerType.quiet
Expand Down
13 changes: 13 additions & 0 deletions garden-service/src/logger/log-entry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ import { Logger } from "./logger"
export type EmojiName = keyof typeof nodeEmoji.emoji
export type LogSymbol = keyof typeof logSymbols | "empty"
export type EntryStatus = "active" | "done" | "error" | "success" | "warn"
export type TaskLogStatus = "active" | "success" | "error"

export interface LogEntryMetadata { task?: TaskMetadata }

export interface TaskMetadata {
type: string,
baseKey: string,
status: TaskLogStatus,
id: string,
versionString: string,
durationMs?: number,
}

export interface UpdateOpts {
msg?: string | string[]
Expand All @@ -32,6 +44,7 @@ export interface UpdateOpts {
status?: EntryStatus
indent?: number
childEntriesInheritLevel?: boolean
metadata?: LogEntryMetadata
}

export interface CreateOpts extends UpdateOpts {
Expand Down
14 changes: 10 additions & 4 deletions garden-service/src/logger/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,34 @@ import { getChildEntries, findLogNode } from "./util"
import { Writer } from "./writers/base"
import { InternalError, ParameterError } from "../exceptions"
import { LogLevel } from "./log-node"
import { FancyTerminalWriter } from "./writers/fancy-terminal-writer"
import { BasicTerminalWriter } from "./writers/basic-terminal-writer"
import { FancyTerminalWriter } from "./writers/fancy-terminal-writer"
import { JsonTerminalWriter } from "./writers/json-terminal-writer"
import { parseLogLevel } from "../cli/helpers"

export enum LoggerType {
quiet = "quiet",
basic = "basic",
fancy = "fancy",
json = "json",
}

export function getCommonConfig(loggerType: LoggerType): LoggerConfig {
const configs: { [key in LoggerType]: LoggerConfig } = {
[LoggerType.fancy]: {
[LoggerType.quiet]: {
level: LogLevel.info,
writers: [new FancyTerminalWriter()],
},
[LoggerType.basic]: {
level: LogLevel.info,
writers: [new BasicTerminalWriter()],
},
[LoggerType.quiet]: {
[LoggerType.fancy]: {
level: LogLevel.info,
writers: [new FancyTerminalWriter()],
},
[LoggerType.json]: {
level: LogLevel.info,
writers: [new JsonTerminalWriter()],
},
}
return configs[loggerType]
Expand Down
31 changes: 31 additions & 0 deletions garden-service/src/logger/renderers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
import * as logSymbols from "log-symbols"
import * as nodeEmoji from "node-emoji"
import * as yaml from "js-yaml"
import { chain } from "lodash"
import chalk from "chalk"
import * as stripAnsi from "strip-ansi"
import {
curryRight,
flow,
Expand All @@ -25,6 +27,7 @@ import stringWidth = require("string-width")
import hasAnsi = require("has-ansi")

import { LogEntry, EmojiName } from "./log-entry"
import { JsonLogEntry } from "./writers/json-terminal-writer"

export type ToRender = string | ((...args: any[]) => string)
export type Renderer = [ToRender, any[]] | ToRender[]
Expand Down Expand Up @@ -158,3 +161,31 @@ export function formatForTerminal(entry: LogEntry): string {
["\n"],
])
}

export function cleanForJSON(input?: string | string[]): string {
if (!input) {
return ""
}

const inputStr = isArray(input) ? input.join(" - ") : input
return chain(inputStr)
.thru(str => stripAnsi(str))
.thru(str => str.replace(/\s+/g, " ")) // clean up whitespace
.thru(str => str.replace(/\\"/g, "'")) // replace double quotes with single quotes
.value()
.trim()
}

export function cleanWhitespace(str) {
return str.replace(/\s+/g, " ")
}

export function formatForJSON(entry: LogEntry): JsonLogEntry {
const { msg, section, showDuration, metadata } = entry.opts
return {
msg: cleanForJSON(msg),
metadata,
section: cleanForJSON(section),
durationMs: showDuration ? entry.getDuration(3) * 1000 : undefined,
}
}
Loading

0 comments on commit c5f4c0e

Please sign in to comment.