fix for number input, new integer input
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Timo Hocker 2020-07-19 11:41:06 +02:00
parent 7395241329
commit 7ad999878a
11 changed files with 75 additions and 10 deletions

View File

@ -17,7 +17,8 @@ const {
BooleanOption,
NumberOption,
ArrayOption,
FolderOption
FolderOption,
IntegerOption
} = require ('./dist/lib/index.js');
(async () => {
@ -27,12 +28,14 @@ const {
.parse ();
const num = await new NumberOption ({ name: 'num' })
.parse ();
const int = await new IntegerOption ({ name: 'num' })
.parse ();
const arr = await new ArrayOption ({ name: 'arr' })
.parse ();
const fld = await new FolderOption ({ name: 'fld' })
.parse ();
const data = { str, bool, num, arr, fld };
const data = { str, bool, num, int, arr, fld };
console.log (data);
}) ();

View File

@ -1,5 +1,10 @@
# Changelog
## 2.1.0
- Fix for NumberOption: do not cut off float values
- New type IntegerOption: only allows integer values
## 2.0.0
Restructuring to split different Option types and keep specific parameters separate

View File

@ -1,6 +1,6 @@
# @sapphirecode/console-app
version: 2.0.x
version: 2.1.x
read parameters from env, config files, console args or interactively
@ -22,7 +22,8 @@ const {
BooleanOption,
FileOption, // paths that exist and are a file
FolderOption, // paths that exist and are a folder
NumberOption,
NumberOption, // integer and float values
IntegerOption, // only integer values
PathOption, // paths that exist in the file system
StringOption,
} = require('@sapphirecode/console-app');

View File

@ -8,6 +8,7 @@
export type OptionType =
'string'
| 'number'
| 'int'
| 'boolean'
| 'file'
| 'folder'

View File

@ -0,0 +1,8 @@
import { TypeValidation } from '../TypeValidation/TypeValidation';
import { BaseOption } from './BaseOption';
export class IntegerOption extends BaseOption<number> {
protected get validation ():TypeValidation {
return new TypeValidation ('int');
}
}

View File

@ -0,0 +1,19 @@
import { NumberPrompt } from 'enquirer';
import { InteractiveSubSource } from './InteractiveSubSource';
export class NumberSubSource extends InteractiveSubSource {
protected condition ():boolean {
return this.val.type_validation.option_type === 'number';
}
protected async run ():Promise<void> {
await this.val.assign_arg (
this.opt,
await new NumberPrompt ({
message: this.get_message (),
default: this.opt.default
})
.run ()
);
}
}

View File

@ -2,10 +2,12 @@ import { ArraySubSource } from './ArraySubSource';
import { BooleanSubSource } from './BooleanSubSource';
import { PresetSubSource } from './PresetSubSource';
import { StringSubSource } from './StringSubSource';
import { NumberSubSource } from './NumberSubSource';
export const sources = [
ArraySubSource,
BooleanSubSource,
PresetSubSource,
NumberSubSource,
StringSubSource
];

View File

@ -40,6 +40,13 @@ export class TypeValidation {
return Promise.resolve (String (value));
if (this.option_type === 'number') {
const as_num = parseFloat (String (value));
if (isNaN (as_num))
throw new Error ('value is not a number');
return Promise.resolve (as_num);
}
if (this.option_type === 'int') {
const as_num = parseInt (String (value));
if (isNaN (as_num))
throw new Error ('value is not a number');

View File

@ -12,3 +12,4 @@ export { FolderOption } from './Options/FolderOption';
export { NumberOption } from './Options/NumberOption';
export { PathOption } from './Options/PathOption';
export { StringOption } from './Options/StringOption';
export { IntegerOption } from './Options/IntegerOption';

View File

@ -1,13 +1,17 @@
{
"name": "@sapphirecode/console-app",
"version": "2.0.10",
"version": "2.1.0",
"main": "dist/lib/index.js",
"author": "Timo Hocker <timo@scode.ovh>",
"author": {
"name": "Timo Hocker",
"email": "timo@scode.ovh"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "git@git.scode.ovh:timo/console-app"
"url": "https://git.scode.ovh:timo/console-app.git"
},
"bugs": "https://redmine.scode.ovh/projects/console-app",
"description": "read parameters from env, console args or interactively",
"devDependencies": {
"@ava/typescript": "^1.1.1",
@ -37,5 +41,13 @@
"fs-extra": "^9.0.0",
"hjson": "^3.2.1",
"yargs": "^15.3.1"
}
}
},
"keywords": [
"interactive",
"console input",
"config",
"command line args",
"environment variables",
"parsing"
]
}

View File

@ -24,7 +24,13 @@ test ('no number', (t) => {
test ('number', async (t) => {
const validator = new TypeValidation ('number');
const res = await validator.to_type ('123');
const res = await validator.to_type ('123.4');
t.is (res, 123.4);
});
test ('int', async (t) => {
const validator = new TypeValidation ('int');
const res = await validator.to_type ('123.4');
t.is (res, 123);
});