Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring of Logger module #1785

Merged
merged 4 commits into from
Mar 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Downloader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
} from './util/index.js'
import S3 from './S3.js'
import { Dump } from './Dump.js'
import logger from './Logger.js'
import * as logger from './Logger.js'
import MediaWiki from './MediaWiki.js'

const imageminOptions = new Map()
Expand Down
2 changes: 1 addition & 1 deletion src/Dump.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as urlParser from 'url'
import { AsyncQueue } from 'async'
import { existsSync } from 'fs'
import * as domino from 'domino'
import logger from './Logger.js'
import * as logger from './Logger.js'
import Downloader from './Downloader.js'
import { getStringsForLang } from './util/index.js'

Expand Down
79 changes: 47 additions & 32 deletions src/Logger.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,56 @@
class Logger {
public getTs() {
return new Date().toISOString()
}
export const logLevels = ['info', 'log', 'warn', 'error', 'quiet']
export type LogLevel = (typeof logLevels)[number]

public info(...args: any[]) {
if (!!(process as any).verbose) {
console.info(`[info] [${this.getTs()}]`, ...args)
}
}
let verboseLevel = 'error'

public log(...args: any[]) {
console.log(`[log] [${this.getTs()}]`, ...args)
const isVerbose = (level: LogLevel) => {
if (!verboseLevel) {
return false
}

public warn(...args: any[]) {
if (!!(process as any).verbose) {
console.warn(`[warn] [${this.getTs()}]`, ...args)
}
}
const verboseLevelIndex = logLevels.indexOf(verboseLevel)
const logLevelIndex = logLevels.indexOf(level)
return logLevelIndex >= verboseLevelIndex ? true : false
}

public error(...args: any[]) {
console.error(`[error] [${this.getTs()}]`, ...args)
const doLog = (type: LogLevel, args: any[]) => {
if (isVerbose(type)) {
console[type](`[${type}] [${getTs()}]`, ...args)
}
}

public logifyArray(arr: any[]) {
if (arr.length < 3) {
return JSON.stringify(arr)
} else {
const ret = arr
.slice(0, 1)
.concat(`+${arr.length - 2} more +`)
.concat(arr[arr.length - 1])
return JSON.stringify(ret)
}
}
const getTs = () => {
return new Date().toISOString()
}

export const setVerboseLevel = (level: LogLevel | true) => {
verboseLevel = level === true ? 'info' : level
}

export const info = (...args: any[]) => {
doLog('info', args)
}

export const log = (...args: any[]) => {
doLog('log', args)
}

export const warn = (...args: any[]) => {
doLog('warn', args)
}

// export default Logger;
const logger = new Logger()
export default logger
export const error = (...args: any[]) => {
doLog('error', args)
}

export const logifyArray = (arr: any[]) => {
if (arr.length < 3) {
return JSON.stringify(arr)
} else {
const ret = arr
.slice(0, 1)
.concat(`+${arr.length - 2} more +`)
.concat(arr[arr.length - 1])
return JSON.stringify(ret)
}
}
2 changes: 1 addition & 1 deletion src/MediaWiki.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import urlParser from 'url'
import * as pathParser from 'path'
import logger from './Logger.js'
import * as logger from './Logger.js'
import * as util from './util/index.js'
import * as domino from 'domino'
import type Downloader from './Downloader.js'
Expand Down
2 changes: 1 addition & 1 deletion src/RedisStore.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { createClient } from 'redis'
import type { RedisClientType } from 'redis'
import RedisKvs from './util/RedisKvs.js'
import logger from './Logger.js'
import * as logger from './Logger.js'

class RedisStore implements RS {
private readonly _client: RedisClientType
Expand Down
2 changes: 1 addition & 1 deletion src/S3.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import S3File from 'aws-sdk'
import logger from './Logger.js'
import * as logger from './Logger.js'
import { Readable } from 'stream'
import { publicIpv4 } from 'public-ip'

Expand Down
9 changes: 5 additions & 4 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import yargs from 'yargs'
import { hideBin } from 'yargs/helpers'
import { parameterDescriptions, requiredParams } from './parameterList.js'
import * as logger from './Logger.js'

import * as mwofflinerLib from './mwoffliner.lib.js'

Expand Down Expand Up @@ -44,7 +45,7 @@ if (argv.osTmpDir) {
throw new Error()
}
} catch {
console.error(`--osTmpDir value [${osTmpDir}] is not valid`)
logger.error(`--osTmpDir value [${osTmpDir}] is not valid`)
process.exit(2)
}
}
Expand All @@ -64,7 +65,7 @@ sanitize_all(argv)
mwofflinerLib
.execute(argv)
.then(() => {
console.info(`Finished running mwoffliner after [${Math.round((Date.now() - execStartTime) / 1000)}s]`)
logger.info(`Finished running mwoffliner after [${Math.round((Date.now() - execStartTime) / 1000)}s]`)
process.exit(0)
})
.catch((err) => {
Expand Down Expand Up @@ -100,9 +101,9 @@ function errorHandler(err: any) {
} catch (err) {
/* NOOP */
}
console.error(`Failed to run mwoffliner after [${Math.round((Date.now() - execStartTime) / 1000)}s]:`, loggableErr)
logger.error(`Failed to run mwoffliner after [${Math.round((Date.now() - execStartTime) / 1000)}s]:`, loggableErr)
if (err && err.message) {
console.error(`\n\n**********\n\n${err.message}\n\n**********\n\n`)
logger.error(`\n\n**********\n\n${err.message}\n\n**********\n\n`)
}
process.exit(2)
}
4 changes: 2 additions & 2 deletions src/mwoffliner.lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {
} from './util/index.js'
import S3 from './S3.js'
import RedisStore from './RedisStore.js'
import logger from './Logger.js'
import * as logger from './Logger.js'
import { Dump } from './Dump.js'
import { config } from './config.js'
import MediaWiki from './MediaWiki.js'
Expand Down Expand Up @@ -97,7 +97,7 @@ async function execute(argv: any) {

let { articleList, articleListToIgnore } = argv

;(process as any).verbose = !!verbose
if (verbose) logger.setVerboseLevel(verbose)

logger.log(`Starting mwoffliner v${packageJSON.version}...`)

Expand Down
3 changes: 2 additions & 1 deletion src/parameterList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ export const parameterDescriptions = {
requestTimeout: 'Request timeout - in seconds(default value is 120 seconds)',
resume: 'Do not overwrite if ZIM file already created',
speed: 'Multiplicator for the number of parallel HTTP requests on Parsoid backend (per default the number of CPU cores). The default value is 1.',
verbose: 'Print debug information to the stdout',
verbose:
'Print information to the stdout if the level is "info" or "log", and to the stderr, if the level is warn or error. The option can be empty or one of "info", "log", "warn", "error", or "quiet". Option with an empty value is equal to "info".The default level is "error". If you choose the lower level then you will see messages also from the more high levels. For example, if you use warn then you will see warnings and errors.',
withoutZimFullTextIndex: "Don't include a fulltext search index to the ZIM",
webp: 'Convert all jpeg, png and gif images to webp format',
addNamespaces: 'Force additional namespace (comma separated numbers)',
Expand Down
13 changes: 11 additions & 2 deletions src/sanitize-argument.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import axios from 'axios'
import RedisStore from './RedisStore.js'
import urlParser from 'url'
import pathParser from 'path'
import logger from './Logger.js'
import * as logger from './Logger.js'
import { config } from './config.js'
import fs from 'fs'
import * as QueryStringParser from 'querystring'
Expand All @@ -16,10 +16,13 @@ const __dirname = path.dirname(__filename)

export async function sanitize_all(argv: any) {
// extracting all arguments
const { articleList, addNamespaces, speed: _speed, adminEmail, mwUrl, customZimFavicon, optimisationCacheUrl, customZimLongDescription, customZimDescription } = argv
const { articleList, addNamespaces, speed: _speed, adminEmail, mwUrl, customZimFavicon, optimisationCacheUrl, verbose, customZimLongDescription, customZimDescription } = argv

sanitize_articlesList_addNamespaces(articleList, addNamespaces)

// sanitizing verbose
sanitize_verbose(verbose)

// sanitizing speed
sanitize_speed(_speed)

Expand Down Expand Up @@ -84,6 +87,12 @@ export function sanitizeStringMaxLength(text: string, key: string, length: numbe
}
}

export function sanitize_verbose(verbose: logger.LogLevel | true) {
if (verbose && verbose !== true && !logger.logLevels.includes(verbose)) {
throw new Error('verbose should be empty or one of [info, log, warn, error, quiet].')
}
}

export function sanitize_articlesList_addNamespaces(articlesList: string, addNamespaces: string) {
if (articlesList && addNamespaces) {
throw new Error('options --articlesList and --addNamespaces cannot be used together')
Expand Down
2 changes: 1 addition & 1 deletion src/util/articleRenderers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import domino from 'domino'
import { categoriesTemplate, leadSectionTemplate, sectionTemplate, subCategoriesTemplate, subPagesTemplate, subSectionTemplate } from '../Templates.js'
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import type { Dump } from '../Dump.js'
import { MWCapabilities } from '../Downloader.js'
import { getStrippedTitleFromHtml } from './misc.js'
Expand Down
2 changes: 1 addition & 1 deletion src/util/categories.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Downloader from '../Downloader.js'
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import { getArticlesByIds } from './mw-api.js'
import { deDup } from './misc.js'

Expand Down
2 changes: 1 addition & 1 deletion src/util/dump.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import urlParser from 'url'
import * as pathParser from 'path'
import async from 'async'
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import axios from 'axios'
import Downloader from '../Downloader.js'
import { getFullUrl, jsPath, cssPath } from './index.js'
Expand Down
2 changes: 1 addition & 1 deletion src/util/misc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import mkdirp from 'mkdirp'
import pathParser from 'path'
import { ZimCreator, ZimArticle } from '@openzim/libzim'
import { Config, config } from '../config.js'
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import {
LATEX_IMAGE_URL_REGEX,
FANDOM_IMAGE_URL_REGEX,
Expand Down
2 changes: 1 addition & 1 deletion src/util/mw-api.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pmap from 'p-map'
import deepmerge from 'deepmerge'
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import Downloader from '../Downloader.js'
import Timer from './Timer.js'

Expand Down
2 changes: 1 addition & 1 deletion src/util/rewriteUrls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { migrateChildren, getMediaBase, getFullUrl, getRelativeFilePath, encodeA
import { Dump } from '../Dump.js'
import MediaWiki from '../MediaWiki.js'
import DU from '../DOMUtils.js'
import logger from '../Logger.js'
import * as logger from '../Logger.js'

function rewriteUrlNoArticleCheck(articleId: string, mw: MediaWiki, dump: Dump, linkNode: DominoElement, mediaDependencies?: string[]): string {
let rel = linkNode.getAttribute('rel')
Expand Down
2 changes: 1 addition & 1 deletion src/util/saveArticles.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import logger from '../Logger.js'
import * as logger from '../Logger.js'
import Downloader from '../Downloader.js'
import MediaWiki from '../MediaWiki.js'
import { ZimArticle, ZimCreator } from '@openzim/libzim'
Expand Down
6 changes: 6 additions & 0 deletions test/e2e/cmd.e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,11 @@ describe('Exec Command With Bash', () => {
/options --articlesList and --addNamespaces cannot be used together/,
)
})

test('Exec Command With --verbose option', async () => {
await expect(execa(`${mwo} --verbose=anyString --mwUrl="https://en.wikipedia.org" --adminEmail="test@test.test"`, { shell: true })).rejects.toThrow(
/verbose should be empty or one of \[info, log, warn, error, quiet\]/,
)
})
})
})
Loading