mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Refactor generate_auto_job to prepare for json
This commit is contained in:
parent
a218ed488d
commit
09e3b86fe4
@ -229,12 +229,15 @@ class Main:
|
||||
self.options_without_help = set(
|
||||
['--completion-bash', '--completion-zsh', '--help']
|
||||
)
|
||||
self.prepare(data)
|
||||
with open(self.DESTS['decl'], 'w') as f:
|
||||
print(BANNER, file=f)
|
||||
self.generate_decl(data, f)
|
||||
for i in self.decls:
|
||||
print(i, file=f)
|
||||
with open(self.DESTS['init'], 'w') as f:
|
||||
print(BANNER, file=f)
|
||||
self.generate_init(data, f)
|
||||
for i in self.init:
|
||||
print(i, file=f)
|
||||
with open(self.DESTS['help'], 'w') as f:
|
||||
with open('manual/cli.rst', 'r') as df:
|
||||
print(BANNER, file=f)
|
||||
@ -245,6 +248,100 @@ class Main:
|
||||
self.update_hashes()
|
||||
# DON'T ADD CODE TO generate AFTER update_hashes
|
||||
|
||||
def prepare(self, data):
|
||||
self.decls = []
|
||||
self.init = []
|
||||
|
||||
self.init.append('auto b = [this](void (ArgParser::*f)()) {')
|
||||
self.init.append(' return QPDFArgParser::bindBare(f, this);')
|
||||
self.init.append('};')
|
||||
self.init.append('auto p = [this](void (ArgParser::*f)(char *)) {')
|
||||
self.init.append(' return QPDFArgParser::bindParam(f, this);')
|
||||
self.init.append('};')
|
||||
self.init.append('')
|
||||
for k, v in data['choices'].items():
|
||||
s = f'char const* {k}_choices[] = {{'
|
||||
for i in v:
|
||||
s += f'"{i}", '
|
||||
self.init.append(s + '0};')
|
||||
self.init.append('')
|
||||
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
if table in ('main', 'help'):
|
||||
continue
|
||||
i = self.to_identifier(table, 'O', True)
|
||||
self.decls.append(f'static constexpr char const* {i} = "{table}";')
|
||||
self.decls.append('')
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
|
||||
if table == 'main':
|
||||
self.init.append('this->ap.selectMainOptionTable();')
|
||||
elif table == 'help':
|
||||
self.init.append('this->ap.selectHelpOptionTable();')
|
||||
else:
|
||||
identifier = self.to_identifier(table, 'argEnd', False)
|
||||
self.init.append(f'this->ap.registerOptionTable("{table}",'
|
||||
f' b(&ArgParser::{identifier}));')
|
||||
prefix = 'arg' + o.get('prefix', '')
|
||||
if o.get('positional', False):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {prefix}Positional(char*);')
|
||||
self.init.append('this->ap.addPositional('
|
||||
f'p(&ArgParser::{prefix}Positional));')
|
||||
for i in o.get('bare', []):
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {identifier}();')
|
||||
self.init.append(f'this->ap.addBare("{i}", '
|
||||
f'b(&ArgParser::{identifier}));')
|
||||
for i in o.get('optional_parameter', []):
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {identifier}(char *);')
|
||||
self.init.append(f'this->ap.addOptionalParameter("{i}", '
|
||||
f'p(&ArgParser::{identifier}));')
|
||||
for i, v in o.get('required_parameter', {}).items():
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {identifier}(char *);')
|
||||
self.init.append(f'this->ap.addRequiredParameter("{i}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', "{v}");')
|
||||
for i, v in o.get('required_choices', {}).items():
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {identifier}(char *);')
|
||||
self.init.append(f'this->ap.addChoices("{i}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', true, {v}_choices);')
|
||||
for i, v in o.get('optional_choices', {}).items():
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
self.decls.append(f'void {identifier}(char *);')
|
||||
self.init.append(f'this->ap.addChoices("{i}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', false, {v}_choices);')
|
||||
if table not in ('main', 'help'):
|
||||
identifier = self.to_identifier(table, 'argEnd', False)
|
||||
self.decls.append(f'void {identifier}();')
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
if 'from_table' not in o:
|
||||
continue
|
||||
if table == 'main':
|
||||
self.init.append('this->ap.selectMainOptionTable();')
|
||||
elif table == 'help':
|
||||
self.init.append('this->ap.selectHelpOptionTable();')
|
||||
else:
|
||||
self.init.append(f'this->ap.selectOptionTable("{table}");')
|
||||
ft = o['from_table']
|
||||
other_table = ft['table']
|
||||
for j in ft['options']:
|
||||
self.init.append('this->ap.copyFromOtherTable'
|
||||
f'("{j}", "{other_table}");')
|
||||
|
||||
def check_keys(self, what, d, exp):
|
||||
if not isinstance(d, dict):
|
||||
exit(f'{what} is not a dictionary')
|
||||
@ -264,117 +361,13 @@ class Main:
|
||||
def to_identifier(self, label, prefix, const):
|
||||
identifier = re.sub(r'[^a-zA-Z0-9]', '_', label)
|
||||
if const:
|
||||
identifier = identifier.upper()
|
||||
identifier = f'{prefix}_{identifier.upper()}'
|
||||
else:
|
||||
identifier = identifier.lower()
|
||||
identifier = re.sub(r'(?:^|_)([a-z])',
|
||||
identifier = f'{prefix}_{identifier.lower()}'
|
||||
identifier = re.sub(r'_([a-z])',
|
||||
lambda x: x.group(1).upper(),
|
||||
identifier).replace('_', '')
|
||||
return prefix + identifier
|
||||
|
||||
def generate_decl(self, data, f):
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
if table in ('main', 'help'):
|
||||
continue
|
||||
i = self.to_identifier(table, 'O_', True)
|
||||
print(f'static constexpr char const* {i} = "{table}";', file=f)
|
||||
print('', file=f)
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
prefix = 'arg' + o.get('prefix', '')
|
||||
if o.get('positional', False):
|
||||
print(f'void {prefix}Positional(char*);', file=f)
|
||||
for i in o.get('bare', []):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'void {identifier}();', file=f)
|
||||
for i in o.get('optional_parameter', []):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'void {identifier}(char *);', file=f)
|
||||
for i in o.get('required_parameter', {}):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'void {identifier}(char *);', file=f)
|
||||
for i in o.get('required_choices', {}):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'void {identifier}(char *);', file=f)
|
||||
for i in o.get('optional_choices', {}):
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'void {identifier}(char *);', file=f)
|
||||
if table not in ('main', 'help'):
|
||||
identifier = self.to_identifier(table, 'argEnd', False)
|
||||
print(f'void {identifier}();', file=f)
|
||||
|
||||
def generate_init(self, data, f):
|
||||
print('auto b = [this](void (ArgParser::*f)()) {', file=f)
|
||||
print(' return QPDFArgParser::bindBare(f, this);', file=f)
|
||||
print('};', file=f)
|
||||
print('auto p = [this](void (ArgParser::*f)(char *)) {', file=f)
|
||||
print(' return QPDFArgParser::bindParam(f, this);', file=f)
|
||||
print('};', file=f)
|
||||
print('', file=f)
|
||||
for k, v in data['choices'].items():
|
||||
print(f'char const* {k}_choices[] = {{', file=f, end='')
|
||||
for i in v:
|
||||
print(f'"{i}", ', file=f, end='')
|
||||
print('0};', file=f)
|
||||
print('', file=f)
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
if table == 'main':
|
||||
print('this->ap.selectMainOptionTable();', file=f)
|
||||
elif table == 'help':
|
||||
print('this->ap.selectHelpOptionTable();', file=f)
|
||||
else:
|
||||
identifier = self.to_identifier(table, 'argEnd', False)
|
||||
print(f'this->ap.registerOptionTable("{table}",'
|
||||
f' b(&ArgParser::{identifier}));', file=f)
|
||||
prefix = 'arg' + o.get('prefix', '')
|
||||
if o.get('positional', False):
|
||||
print('this->ap.addPositional('
|
||||
f'p(&ArgParser::{prefix}Positional));', file=f)
|
||||
for i in o.get('bare', []):
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'this->ap.addBare("{i}", '
|
||||
f'b(&ArgParser::{identifier}));', file=f)
|
||||
for i in o.get('optional_parameter', []):
|
||||
self.options_without_help.add(f'--{i}')
|
||||
identifier = self.to_identifier(i, prefix, False)
|
||||
print(f'this->ap.addOptionalParameter("{i}", '
|
||||
f'p(&ArgParser::{identifier}));', file=f)
|
||||
for k, v in o.get('required_parameter', {}).items():
|
||||
self.options_without_help.add(f'--{k}')
|
||||
identifier = self.to_identifier(k, prefix, False)
|
||||
print(f'this->ap.addRequiredParameter("{k}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', "{v}");', file=f)
|
||||
for k, v in o.get('required_choices', {}).items():
|
||||
self.options_without_help.add(f'--{k}')
|
||||
identifier = self.to_identifier(k, prefix, False)
|
||||
print(f'this->ap.addChoices("{k}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', true, {v}_choices);', file=f)
|
||||
for k, v in o.get('optional_choices', {}).items():
|
||||
self.options_without_help.add(f'--{k}')
|
||||
identifier = self.to_identifier(k, prefix, False)
|
||||
print(f'this->ap.addChoices("{k}", '
|
||||
f'p(&ArgParser::{identifier})'
|
||||
f', false, {v}_choices);', file=f)
|
||||
for o in data['options']:
|
||||
table = o['table']
|
||||
if 'from_table' not in o:
|
||||
continue
|
||||
if table == 'main':
|
||||
print('this->ap.selectMainOptionTable();', file=f)
|
||||
elif table == 'help':
|
||||
print('this->ap.selectHelpOptionTable();', file=f)
|
||||
else:
|
||||
print(f'this->ap.selectOptionTable("{table}");', file=f)
|
||||
ft = o['from_table']
|
||||
other_table = ft['table']
|
||||
for j in ft['options']:
|
||||
print('this->ap.copyFromOtherTable'
|
||||
f'("{j}", "{other_table}");', file=f)
|
||||
return identifier
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
2
job.sums
2
job.sums
@ -1,5 +1,5 @@
|
||||
# Generated by generate_auto_job
|
||||
generate_auto_job 466aa9211549cebeb3fedc6413108981aeeddd89936621095f5f5223cee9880b
|
||||
generate_auto_job b70f64314f1ae1f100fa6a11975dee5f7669038e2a619b6c9da1e5230db1dd1b
|
||||
job.yml 8177cadf41096efdc174f04daadfe5d98c592ad44ad10cb96537521fd79a801a
|
||||
libqpdf/qpdf/auto_job_decl.hh 97395ecbe590b23ae04d6cce2080dbd0e998917ff5eeaa5c6aafa91041d3cd6a
|
||||
libqpdf/qpdf/auto_job_help.hh 9f4bd3e42510446a714771143e6a1db599a614818329d6c7126bb9fbcccd1f36
|
||||
|
Loading…
Reference in New Issue
Block a user