aboutsummaryrefslogtreecommitdiffstats
path: root/generate_auto_job
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-01-21 15:07:24 +0100
committerJay Berkenbilt <ejb@ql.org>2022-01-30 19:11:03 +0100
commit09e3b86fe4e1cfd7777f2659029855f2afae59b1 (patch)
treefd27a037f56f5c834459bd72237b3b760f88c5cc /generate_auto_job
parenta218ed488d2bb380fee7f653cb2dd32c1c88c348 (diff)
downloadqpdf-09e3b86fe4e1cfd7777f2659029855f2afae59b1.tar.zst
Refactor generate_auto_job to prepare for json
Diffstat (limited to 'generate_auto_job')
-rwxr-xr-xgenerate_auto_job195
1 files changed, 94 insertions, 101 deletions
diff --git a/generate_auto_job b/generate_auto_job
index d573f596..79abc8b9 100755
--- a/generate_auto_job
+++ b/generate_auto_job
@@ -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,136 +248,126 @@ class Main:
self.update_hashes()
# DON'T ADD CODE TO generate AFTER update_hashes
- def check_keys(self, what, d, exp):
- if not isinstance(d, dict):
- exit(f'{what} is not a dictionary')
- actual = set(d.keys())
- extra = actual - exp
- if extra:
- exit(f'{what}: unknown keys = {extra}')
-
- def validate(self, data):
- self.check_keys('top', data, set(['choices', 'options']))
- for o in data['options']:
- self.check_keys('top', o, set(
- ['table', 'prefix', 'bare', 'positional',
- 'optional_parameter', 'required_parameter',
- 'required_choices', 'optional_choices', 'from_table']))
+ def prepare(self, data):
+ self.decls = []
+ self.init = []
- def to_identifier(self, label, prefix, const):
- identifier = re.sub(r'[^a-zA-Z0-9]', '_', label)
- if const:
- identifier = identifier.upper()
- else:
- identifier = identifier.lower()
- identifier = re.sub(r'(?:^|_)([a-z])',
- lambda x: x.group(1).upper(),
- identifier).replace('_', '')
- return prefix + identifier
+ 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('')
- 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)
+ 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']
- 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)
+ self.init.append('this->ap.selectMainOptionTable();')
elif table == 'help':
- print('this->ap.selectHelpOptionTable();', file=f)
+ self.init.append('this->ap.selectHelpOptionTable();')
else:
identifier = self.to_identifier(table, 'argEnd', False)
- print(f'this->ap.registerOptionTable("{table}",'
- f' b(&ArgParser::{identifier}));', file=f)
+ self.init.append(f'this->ap.registerOptionTable("{table}",'
+ f' b(&ArgParser::{identifier}));')
prefix = 'arg' + o.get('prefix', '')
if o.get('positional', False):
- print('this->ap.addPositional('
- f'p(&ArgParser::{prefix}Positional));', file=f)
+ 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)
- print(f'this->ap.addBare("{i}", '
- f'b(&ArgParser::{identifier}));', file=f)
+ 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)
- 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)
+ 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':
- print('this->ap.selectMainOptionTable();', file=f)
+ self.init.append('this->ap.selectMainOptionTable();')
elif table == 'help':
- print('this->ap.selectHelpOptionTable();', file=f)
+ self.init.append('this->ap.selectHelpOptionTable();')
else:
- print(f'this->ap.selectOptionTable("{table}");', file=f)
+ self.init.append(f'this->ap.selectOptionTable("{table}");')
ft = o['from_table']
other_table = ft['table']
for j in ft['options']:
- print('this->ap.copyFromOtherTable'
- f'("{j}", "{other_table}");', file=f)
+ 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')
+ actual = set(d.keys())
+ extra = actual - exp
+ if extra:
+ exit(f'{what}: unknown keys = {extra}')
+
+ def validate(self, data):
+ self.check_keys('top', data, set(['choices', 'options']))
+ for o in data['options']:
+ self.check_keys('top', o, set(
+ ['table', 'prefix', 'bare', 'positional',
+ 'optional_parameter', 'required_parameter',
+ 'required_choices', 'optional_choices', 'from_table']))
+
+ def to_identifier(self, label, prefix, const):
+ identifier = re.sub(r'[^a-zA-Z0-9]', '_', label)
+ if const:
+ identifier = f'{prefix}_{identifier.upper()}'
+ else:
+ identifier = f'{prefix}_{identifier.lower()}'
+ identifier = re.sub(r'_([a-z])',
+ lambda x: x.group(1).upper(),
+ identifier).replace('_', '')
+ return identifier
if __name__ == '__main__':