implement CLI API using argparse

This commit is contained in:
cclecle
2023-04-01 13:13:49 +01:00
parent 74403896fb
commit 680230df35
4 changed files with 162 additions and 12 deletions

View File

@@ -1,4 +1,5 @@
eclipse.preferences.version=1
encoding//src/pysimpleini/__main__.py=utf-8
encoding//src/pysimpleini/document.py=utf-8
encoding//src/pysimpleini/exceptions.py=utf-8
encoding//src/pysimpleini/keys.py=utf-8

View File

@@ -10,15 +10,8 @@
Main module __init__ file.
"""
from importlib.metadata import version, PackageNotFoundError
try: # pragma: no cover
__version__ = version("pysimpleini")
except PackageNotFoundError: # pragma: no cover
import warnings
warnings.warn("can not read __version__, assuming local test context, setting it to ?.?.?")
__version__ = "?.?.?"
from importlib.metadata import distribution, version, PackageNotFoundError
import warnings
from .exceptions import (
PySimpleINIBaseError,
@@ -38,3 +31,23 @@ from .sections import (
)
from .simpleini import PySimpleINI
try: # pragma: no cover
__version__ = version("pysimpleini")
except PackageNotFoundError: # pragma: no cover
warnings.warn("can not read __version__, assuming local test context, setting it to ?.?.?")
__version__ = "?.?.?"
try: # pragma: no cover
dist = distribution("pysimpleini")
__Summuary__ = dist.metadata["Summary"]
except PackageNotFoundError: # pragma: no cover
warnings.warn('can not read dist.metadata["Summary"], assuming local test context, setting it to <pysimpleini description>')
__Summuary__ = "pysimpleini description"
try: # pragma: no cover
dist = distribution("pysimpleini")
__Name__ = dist.metadata["Name"]
except PackageNotFoundError: # pragma: no cover
warnings.warn('can not read dist.metadata["Name"], assuming local test context, setting it to <pysimpleini>')
__Name__ = "pysimpleini"

136
src/pysimpleini/__main__.py Normal file
View File

@@ -0,0 +1,136 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# PySimpleINI (c) by chacha
#
# PySimpleINI is licensed under a
# Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Unported License.
#
# You should have received a copy of the license along with this
# work. If not, see <https://creativecommons.org/licenses/by-nc-sa/4.0/>.
"""CLI interface module"""
from __future__ import annotations
from argparse import ArgumentParser, RawTextHelpFormatter
from os import linesep
from pathlib import Path
from . import __Summuary__, __Name__, PySimpleINI
class CLI:
"""CLI interface definition"""
def __init__(self):
"""CLI interface initialization"""
self.parser = ArgumentParser(description=__Summuary__, prog=__Name__, formatter_class=RawTextHelpFormatter)
self.parser.add_argument("-f", "--file", type=Path, help="INI file to parse", required=True)
self.parser.add_argument("-of", "--output-file", type=Path, help="Output INI file (in place if not set)")
self.parser.add_argument("--beautify", help="output a prettier ini file", action="store_true", default=False)
self.parser.add_argument("--wipe-comments", help="wipe all comments", action="store_true", default=False)
self.parser.add_argument("--strict", help="do not ignore line with non-parsable content", action="store_true", default=False)
self.createsubparsers()
self.args = self.parser.parse_args()
self.inifile = PySimpleINI(self.args.file, True, self.args.strict)
self.args.func()
def createsubparsers(self) -> None:
"""create subparsers"""
self.subparsers = self.parser.add_subparsers(help="command to be executed")
subparsers_list = []
parser_getkeyvalue = self.subparsers.add_parser("getkeyvalue", help="getkeyvalue help")
parser_getkeyvalue.set_defaults(func=self.cmd_getkeyvalue)
subparsers_list.append(parser_getkeyvalue)
parser_getkeyvalue.add_argument("sectionName", type=str)
parser_getkeyvalue.add_argument("keyName", type=str)
parser_getkeyvalue.add_argument("--index", type=int, action="store", default=None)
parser_getkeyvalue.add_argument("--value", type=str, action="store", default=None)
parser_setaddkeyvalue = self.subparsers.add_parser("setaddkeyvalue", help="setaddkeyvalue help")
parser_setaddkeyvalue.set_defaults(func=self.cmd_setaddkeyvalue)
subparsers_list.append(parser_setaddkeyvalue)
parser_setaddkeyvalue.add_argument("sectionName", type=str)
parser_setaddkeyvalue.add_argument("keyName", type=str)
parser_setaddkeyvalue.add_argument("keyValue", type=str)
parser_setaddkeyvalue.add_argument("--force-add-key", action="store_true", default=False)
parser_setaddkeyvalue.add_argument("--force-add-section", action="store_true", default=False)
parser_delkey = self.subparsers.add_parser("delkey", help="delkey help")
parser_delkey.set_defaults(func=self.cmd_delkey)
subparsers_list.append(parser_delkey)
parser_delkey.add_argument("sectionName", type=str)
parser_delkey.add_argument("keyName", type=str)
parser_delkey.add_argument("--index", type=int, action="store", default=None)
parser_delkey.add_argument("--value", type=str, action="store", default=None)
parser_getallkeynames = self.subparsers.add_parser("getallkeynames", help="getallkeynames help")
parser_getallkeynames.set_defaults(func=self.cmd_getallkeynames)
subparsers_list.append(parser_getallkeynames)
parser_getallkeynames.add_argument("sectionName", type=str)
parser_getallsectionnames = self.subparsers.add_parser("getallsectionnames", help="getallsectionnames help")
parser_getallsectionnames.set_defaults(func=self.cmd_getallsectionnames)
subparsers_list.append(parser_getallsectionnames)
parser_rewrite = self.subparsers.add_parser("rewrite", help="rewrite help")
parser_rewrite.set_defaults(func=self.cmd_rewrite)
subparsers_list.append(parser_rewrite)
parser_delsection = self.subparsers.add_parser("delsection", help="delsection help")
parser_delsection.set_defaults(func=self.cmd_delsection)
subparsers_list.append(parser_delsection)
parser_delsection.add_argument("sectionName", type=str)
parser_delsection.add_argument("--index", type=int, action="store", default=None)
self.parser.epilog = "commands usage:" + linesep
for subparser in subparsers_list:
self.parser.epilog = self.parser.epilog + subparser.format_usage()
def writefile(self) -> None:
"""write file helper"""
if self.args.output_file:
self.inifile.filepath = self.args.output_file
self.inifile.writefile(self.args.beautify, self.args.wipe_comments)
def cmd_getkeyvalue(self) -> None:
"""getkeyvalue cmd implementation"""
res = self.inifile.getkeyvalue_ex(self.args.sectionName, self.args.keyName, self.args.index, self.args.value)
print(linesep.join(res))
def cmd_setaddkeyvalue(self) -> None:
"""setaddkeyvalue cmd implementation"""
self.inifile.setaddkeyvalue(
self.args.sectionName, self.args.keyName, self.args.keyValue, self.args.force_add_key, self.args.force_add_section
)
self.writefile()
def cmd_delkey(self) -> None:
"""delkey cmd implementation"""
self.inifile.delkey_ex(self.args.sectionName, self.args.keyName, self.args.index, self.args.value)
self.writefile()
def cmd_getallkeynames(self) -> None:
"""getallkeynames cmd implementation"""
res = self.inifile.getallkeynames(self.args.sectionName)
print(linesep.join(res))
def cmd_getallsectionnames(self) -> None:
"""getallsectionnames cmd implementation"""
res = self.inifile.getallsectionnames()
print(linesep.join(res))
def cmd_rewrite(self) -> None:
"""rewrite cmd implementation"""
self.writefile()
def cmd_delsection(self) -> None:
"""delsection cmd implementation"""
self.inifile.delsection(self.args.sectionName, self.args.index)
self.writefile()
CLI()

View File

@@ -91,7 +91,7 @@ class Document:
self.sections.append(section)
return section
def delsection(self, name: str, index: Optional[int] = None) -> int:
def delsection(self, sectionName: str, index: Optional[int] = None) -> int:
"""Delete an existing Section.
- If index is set, this filter will be applied.
@@ -101,13 +101,13 @@ class Document:
///
Args:
name: The Section name
sectionName: The Section name
index: The Section instance index (in case of multiple section with same name)
Returns:
Number of deleted sections
"""
walker = Walker[SectionBase](targetname=name, targetindex=index, targettypes=Section)
walker = Walker[SectionBase](targetname=sectionName, targetindex=index, targettypes=Section)
walker.walk(self.sections, self.sections.remove)
ndeleted: int = walker.num_matched