implement CLI API using argparse
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
136
src/pysimpleini/__main__.py
Normal 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()
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user