Skip to content

Commit

Permalink
feat: optimize command line arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
JinnLynn committed Jun 12, 2024
1 parent d9ee592 commit 6dd1d17
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 25 deletions.
45 changes: 28 additions & 17 deletions src/genpac/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,33 @@ def run():
exit_error(e)


def register_option(parser, options, flag, *args,
def register_option(parser, options, flag, *args, ignore_option=False,
conv=None, default=None, **kwargs):
flag = flag.lstrip('-').replace('_', '-')
# NOTE:
# 1. flag *args **kwargs 都是传递给add_argument
# 2. default是option的,argparse的default永远不指定,
# 否则命令行中即使没指定该参数,也会覆盖配置文件中的值
# 3. conv也是option的,argparse需要转换,需另外设置add_argument的type参数
# 4. ignore_option=True 则不加入option kwargs为空则不加入argparse
flag = flag.strip('- \n\t').lower()
if len(flag) <= 1:
raise FatalError('配置项的名称必须是两个字符及以上')
flag = flag.replace('_', '-')

if kwargs:
parser.add_argument(f'--{flag}', *args, **kwargs)
options[flag] = dict(conv=conv, default=default)
if not ignore_option:
if flag[0] == '-':
flag = flag.replace('-', '_', 1)
options[flag] = dict(conv=conv, default=default)


class GenPAC(object):
# 格式化器列表
_formaters = OrderedDict()

def __init__(self, config_file=None, argv_enabled=True):
def __init__(self, config_file=None):
self.config_file = config_file
self.argv_enabled = argv_enabled

self.init_dest = None
self.jobs = []
Expand All @@ -72,9 +84,6 @@ def walk_formaters(cls, attr, *args, **kwargs):
getattr(fmter['cls'], attr)(*args, **kwargs)

def init_options(self):
# 如果某选项同时可以在配置文件和命令行中设定,则必须使default=None
# 以避免命令行中即使没指定该参数,也会覆盖配置文件中的值
# 原因见parse_config() -> update(name, key, default=None)
options = {}
parser = argparse.ArgumentParser(
prog='genpac',
Expand All @@ -92,13 +101,14 @@ def init_options(self):

group = parser.add_argument_group(title='通用参数')

register_option(group, options, 'format', conv=conv_lower,
type=lambda s: s.lower(), choices=GenPAC._formaters.keys(),
help='生成格式, 只有指定了格式, 相应格式的参数才作用')
register_option(group, options, 'format', '-f', conv=conv_lower,
metavar='FMT', type=lambda s: s.lower(), choices=GenPAC._formaters.keys(),
help='生成格式, 只有指定了格式, 相应格式的参数才可用\n'
f'可选: {",".join(GenPAC._formaters.keys())}')
register_option(group, options, 'output', '-o',
metavar='FILE',
help='输出到文件, 无此参数或FILE为-, 则输出到stdout')
register_option(group, options, 'config-from', '-c', conv=conv_path,
register_option(group, options, 'config', '-c', ignore_option=True,
metavar='FILE',
help='从文件中读取配置信息')
register_option(group, options, 'proxy',
Expand Down Expand Up @@ -184,11 +194,11 @@ def update_opt(self, args, cfgs, key,

return dest, v

def parse_options(self):
def parse_options(self, cli=True):
parser, opts = self.init_options()
args = parser.parse_args() if self.argv_enabled else Namespace()
args = parser.parse_args() if cli else Namespace()
self.init_dest = args.init if hasattr(args, 'init') else None
config_file = args.config_from if hasattr(args, 'config_from') else \
config_file = args.config if hasattr(args, 'config') else \
self.config_file

for fmter in self.__class__._formaters.values():
Expand Down Expand Up @@ -236,6 +246,7 @@ def generate_all(self):
logger.debug(f'Job done: {job.format} => {job.output}')

def generate(self, job):
pprint(job)
if not job.format:
raise FatalError('生成的格式不能为空, 检查命令参数--format或配置项format')
if job.format not in self._formaters:
Expand All @@ -244,8 +255,8 @@ def generate(self, job):
generator = Generator(job, self._formaters[job.format]['cls'])
generator.generate()

def run(self):
self.parse_options()
def run(self, cli=True):
self.parse_options(cli=cli)

if self.init_dest:
return self.init(self.init_dest)
Expand Down
3 changes: 1 addition & 2 deletions src/genpac/format/copy.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ def __init__(self, *args, **kwargs):
@classmethod
def prepare(cls, parser):
super().prepare(parser)
cls.register_option('from',
metavar='SRC', help='来源, 网址或文件路径')
cls.register_option('from', metavar='SRC', help='来源, 网址或文件路径')

def generate(self, replacements):
content = ''
Expand Down
2 changes: 1 addition & 1 deletion src/genpac/format/deprecated.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
'''


@formater('wingy', desc='Wingy是iOS下基于NEKit的代理App无可用参数\n* 注意: 即将废弃 *')
@formater('wingy', desc='Wingy是iOS下基于NEKit的代理App, 无可用参数\n* 注意: 即将废弃 *')
class FmtWingy(FmtBase):
_default_tpl = _TPL_WINGY

Expand Down
5 changes: 2 additions & 3 deletions src/genpac/server/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ def build(app):
options = app.config.options
try:
Generator.clear_cache()
gp = GenPAC(config_file=options.config_file,
argv_enabled=False)
gp = GenPAC(config_file=options.config_file)
gp.add_job({'format': 'genpac-server-domains',
'output': options._private.domain_file,
'_order': -100})
Expand All @@ -31,7 +30,7 @@ def build(app):
with open(options.server_rule_file, 'r') as fp:
for line in fp.readlines():
gp.add_rule(line.strip())
gp.run()
gp.run(cli=False)
except Exception:
logger.error('GenPAC build fail.', exc_info=True)
else:
Expand Down
4 changes: 2 additions & 2 deletions src/genpac/server/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,14 @@ def _update(attr, *convs, **kwargs):

# 如果允许监控文件更改
if options.watch_enabled:
gp = GenPAC(config_file=options.config_file, argv_enabled=False)
gp = GenPAC(config_file=options.config_file)
# 添加config_file到监控列表
options.watch_files.add(options.config_file)
if options.server_rule_enabled:
# 添加服务器上的规则文件
options.watch_files.add(options.server_rule_file)
# 添加user_rule_from到监控文件列表
gp.parse_options()
gp.parse_options(cli=False)
for job in gp.walk_jobs():
options.watch_files.update(job.user_rule_from)

Expand Down

0 comments on commit 6dd1d17

Please sign in to comment.