Parsing data types
Data types
nuclear supports typed values for parameters or positional arguments.
By default, all values have string types.
It can be changed by defining type parameter.
There are 2 possible type values:
- type name itself (e.g. int, str, float)
- reference for a parser which returns a value
In both cases, the internal variable value is calculated by invoking type(str_value).
When argument value has invalid format, there is syntax error raised.
Basic types (int, float, etc.)
#!/usr/bin/env python3
from nuclear import CliBuilder, argument
def print_it(count: int):
print(count * 2)
CliBuilder(run=print_it).has(
argument('count', type=int),
).run()
foo@bar:~$ ./example.py 21
42
foo@bar:~$ ./example.py dupa
[ERROR] Syntax error: parsing positional argument "count": invalid literal for int() with base 10: 'dupa'
Usage:
./pyt.py [OPTIONS] COUNT
Options:
-h, --help [SUBCOMMANDS...] - Display this help and exit
foo@bar:~$ ./example.py
[ERROR] Syntax error: required positional argument "count" is not given
Usage:
./pyt.py [OPTIONS] COUNT
Options:
-h, --help [SUBCOMMANDS...] - Display this help and exit
Built-in data types
nuclear has built-in parsers / validators for some types
boolean type
boolean converts string value (eg. true, True, 1, yes) to Pythonic bool type.
from nuclear.cli.types.boolean import boolean
parameter('enabled', type=boolean)
Filesystem types
-
nuclear.types.filesystem.existing_filevalidates if given string is an existing regular file (not a directory). After validation, the value is internally stored asstr.from nuclear.cli.types.filesystem import existing_file argument('file', type=existing_file) -
nuclear.types.filesystem.existing_directoryvalidates if given string is an existing directory. After validation, the value is internally stored asstr.from nuclear.cli.types.filesystem import existing_directory argument('file', type=existing_directory)
Datetime types
-
nuclear.types.time.iso_dateparses / validates given string as a date in ISO format:%Y-%m-%d. After validation, the value is internally stored asdatetime.datetime.from nuclear.cli.types.time import iso_date argument('date', type=iso_date) -
nuclear.types.time.iso_timeparses / validates given string as a time in ISO format:%H:%M:%S. After validation, the value is internally stored asdatetime.datetime.from nuclear.cli.types.time import iso_time argument('time', type=iso_time) -
nuclear.types.time.iso_timeparses / validates given string as a datetime in ISO format:%Y-%m-%d %H:%M:%S. After validation, the value is internally stored asdatetime.datetime.Example:from nuclear.cli.types.time import iso_datetime argument('datetime', type=iso_datetime)#!/usr/bin/env python3 from nuclear import CliBuilder, argument from nuclear.cli.types.time import iso_datetime from datetime import datetime def print_it(to: datetime): print(to) CliBuilder(run=print_it).has( argument('to', type=iso_datetime), ).run()foo@bar:~$ ./example.py 2019-07-13 [ERROR] Syntax error: invalid datetime format: 2019-07-13 Usage: ./pyt.py [OPTIONS] TO Options: -h, --help [SUBCOMMANDS...] - Display this help and exit foo@bar:~$ ./example.py "2019-07-13 20:00:05" 2019-07-13 20:00:05 -
nuclear.types.time.datetime_formatparses / validates given string as a datetime in custom formats specified by user. You may specify multiple formats and the CLI argument will be parsed sequentially for each format. The first successfully parsed datetime is returned. After that, the value is internally stored asdatetime.datetime.
#!/usr/bin/env python3
from nuclear import CliBuilder, argument
from nuclear.cli.types.time import datetime_format
from datetime import datetime
def print_it(to: datetime):
print(to)
CliBuilder(run=print_it).has(
argument('to', type=datetime_format('%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d')),
).run()
foo@bar:~$ ./example.py "2019-07-13 20:00:05"
2019-07-13 20:00:05
foo@bar:~$ ./example.py 2019-07-13
2019-07-13 00:00:00
nuclear.types.time.today_formatparses / validates given string as a time in custom formats specified by user. It gets time from input and combines it with the today date. You may specify multiple formats and the CLI argument will be parsed sequentially for each format. The first successfully parsed datetime is returned. After that, the value is internally stored asdatetime.datetime.
#!/usr/bin/env python3
from nuclear import CliBuilder, argument
from nuclear.cli.types.time import today_format
from datetime import datetime
def print_it(to: datetime):
print(to)
CliBuilder(run=print_it).has(
argument('to', type=today_format('%H:%M:%S', '%H:%M')),
).run()
foo@bar:~$ ./example.py 12:42
2019-07-13 12:15:00
Custom type parsers
You can define custom parser/validator function.
It should take one str argument and return expected value type.
#!/usr/bin/env python3
import re
from dataclasses import dataclass
from nuclear import CliBuilder, argument
@dataclass
class Person:
name: str
age: int
@staticmethod
def parse(arg: str) -> 'Person':
match = re.compile('(.+)-([0-9]+)').match(arg)
return Person(match.group(1), int(match.group(2)))
def print_it(human: Person):
print(human)
CliBuilder(run=print_it).has(
argument('human', type=Person.parse),
).run()
foo@bar:~$ ./example.py Eric-33
Person(name='Eric', age=33)