Commit d9e00e8e5bcad720c73d45c790857907898d3591

Authored by Jay Berkenbilt
1 parent 1355d95d

generate_auto_job: break out build_schema for refactor

Showing 2 changed files with 84 additions and 82 deletions
generate_auto_job
... ... @@ -484,6 +484,86 @@ class Main:
484 484 self.json_init.append(
485 485 f'doSetup("{key}", bindSetup(&Handlers::{method}));')
486 486  
  487 + def option_to_json_key(self, s):
  488 + return self.to_identifier(s, '', False)
  489 +
  490 + def build_schema(self, j, s, flag, path, expected, options_seen):
  491 + if flag:
  492 + identifier = self.to_identifier(path, '', False)
  493 + self.json_decls.append(f'void begin{identifier}(JSON);')
  494 + self.json_decls.append(f'void end{identifier}();')
  495 + self.json_init.append(
  496 + f'beginDict("{flag}",'
  497 + f' bindJSON(&Handlers::begin{identifier}),'
  498 + f' bindBare(&Handlers::end{identifier})); // {path}')
  499 + for k, v in j.items():
  500 + is_trivial = False
  501 + if k in expected:
  502 + is_trivial = True
  503 + common_config = None
  504 + for t in expected[k]['tables']:
  505 + tdata = self.by_table[t]
  506 + if k in tdata['manual']:
  507 + is_trivial = False
  508 + if common_config is None:
  509 + common_config = tdata['config']
  510 + elif common_config != tdata['config']:
  511 + is_trivial = False
  512 + elif not (k.startswith('_') or isinstance(v, str)):
  513 + raise Exception(f'json: unknown key {k}')
  514 + if k.startswith('_'):
  515 + schema_key = k[1:]
  516 + else:
  517 + schema_key = re.sub(r'[^\.]+\.', '', k)
  518 + schema_key = self.option_to_json_key(schema_key)
  519 + schema_value = v
  520 + is_dict = False
  521 + if k in expected:
  522 + options_seen.add(re.sub('^_', '', k))
  523 + if v is None:
  524 + schema_value = re.sub(
  525 + r'--(\S+)',
  526 + lambda x: self.option_to_json_key(x.group(1)),
  527 + expected[k]['help'])
  528 + if (isinstance(v, dict)):
  529 + is_dict = True
  530 + schema_value = {}
  531 + self.build_schema(v, schema_value,
  532 + schema_key, f'{path}.{schema_key}',
  533 + expected, options_seen)
  534 + elif (isinstance(v, list)):
  535 + if len(v) != 1:
  536 + raise Exception('json contains array with length != 1')
  537 + if isinstance(v[0], dict):
  538 + is_dict = True
  539 + schema_value = [{}]
  540 + subpath = f'{path}.{schema_key}'
  541 + identifier = self.to_identifier(subpath, '', False)
  542 + self.json_decls.append(
  543 + f'void begin{identifier}Array(JSON);')
  544 + self.json_decls.append(
  545 + f'void end{identifier}Array();')
  546 + self.json_init.append(
  547 + f'beginArray("{flag}",'
  548 + f' bindJSON(&Handlers::begin{identifier}Array),'
  549 + f' bindBare(&Handlers::end{identifier}Array));'
  550 + f' // {subpath}[]')
  551 + self.build_schema(v[0], schema_value[0],
  552 + schema_key, subpath,
  553 + expected, options_seen)
  554 + self.json_init.append(
  555 + f'endContainer(); // {subpath}[]')
  556 + elif schema_value is None:
  557 + raise Exception(f'unknown schema value for {k}')
  558 + s[schema_key] = schema_value
  559 + if not is_dict:
  560 + if is_trivial:
  561 + self.handle_json_trivial(schema_key, expected[k])
  562 + else:
  563 + self.handle_json_manual(schema_key, path)
  564 + if flag:
  565 + self.json_init.append(f'endContainer(); // {path}')
  566 +
487 567 def generate_schema(self, data):
488 568 # Check to make sure that every command-line option is
489 569 # represented either in data['json'] or data['no-json'].
... ... @@ -504,91 +584,13 @@ class Main:
504 584 expected[f'{t}.{k}'] = {**v}
505 585 options_seen = set(data['no-json'])
506 586  
507   - self.schema = {}
508   -
509   - def option_to_json_key(s):
510   - return self.to_identifier(s, '', False)
511   -
512 587 # Walk through the json information building the schema as we
513 588 # go. This verifies consistency between command-line options
514 589 # and the json section of the data and builds up a schema by
515 590 # populating with help information as available.
516   - def build_schema(j, s, flag, path):
517   - if flag:
518   - identifier = self.to_identifier(path, '', False)
519   - self.json_decls.append(f'void begin{identifier}(JSON);')
520   - self.json_decls.append(f'void end{identifier}();')
521   - self.json_init.append(
522   - f'beginDict("{flag}",'
523   - f' bindJSON(&Handlers::begin{identifier}),'
524   - f' bindBare(&Handlers::end{identifier})); // {path}')
525   - for k, v in j.items():
526   - is_trivial = False
527   - if k in expected:
528   - is_trivial = True
529   - common_config = None
530   - for t in expected[k]['tables']:
531   - tdata = self.by_table[t]
532   - if k in tdata['manual']:
533   - is_trivial = False
534   - if common_config is None:
535   - common_config = tdata['config']
536   - elif common_config != tdata['config']:
537   - is_trivial = False
538   - elif not (k.startswith('_') or isinstance(v, str)):
539   - raise Exception(f'json: unknown key {k}')
540   - if k.startswith('_'):
541   - schema_key = k[1:]
542   - else:
543   - schema_key = re.sub(r'[^\.]+\.', '', k)
544   - schema_key = option_to_json_key(schema_key)
545   - schema_value = v
546   - is_dict = False
547   - if k in expected:
548   - options_seen.add(re.sub('^_', '', k))
549   - if v is None:
550   - schema_value = re.sub(
551   - r'--(\S+)',
552   - lambda x: option_to_json_key(x.group(1)),
553   - expected[k]['help'])
554   - if (isinstance(v, dict)):
555   - is_dict = True
556   - schema_value = {}
557   - build_schema(v, schema_value,
558   - schema_key, f'{path}.{schema_key}')
559   - elif (isinstance(v, list)):
560   - if len(v) != 1:
561   - raise Exception('json contains array with length != 1')
562   - if isinstance(v[0], dict):
563   - is_dict = True
564   - schema_value = [{}]
565   - subpath = f'{path}.{schema_key}'
566   - identifier = self.to_identifier(subpath, '', False)
567   - self.json_decls.append(
568   - f'void begin{identifier}Array(JSON);')
569   - self.json_decls.append(
570   - f'void end{identifier}Array();')
571   - self.json_init.append(
572   - f'beginArray("{flag}",'
573   - f' bindJSON(&Handlers::begin{identifier}Array),'
574   - f' bindBare(&Handlers::end{identifier}Array));'
575   - f' // {subpath}[]')
576   - build_schema(v[0], schema_value[0],
577   - schema_key, subpath)
578   - self.json_init.append(
579   - f'endContainer(); // {subpath}[]')
580   - elif schema_value is None:
581   - raise Exception(f'unknown schema value for {k}')
582   - s[schema_key] = schema_value
583   - if not is_dict:
584   - if is_trivial:
585   - self.handle_json_trivial(schema_key, expected[k])
586   - else:
587   - self.handle_json_manual(schema_key, path)
588   - if flag:
589   - self.json_init.append(f'endContainer(); // {path}')
590   -
591   - build_schema(data['json'], self.schema, '', '')
  591 + self.schema = {}
  592 + self.build_schema(data['json'], self.schema, '', '',
  593 + expected, options_seen)
592 594 if options_seen != set(expected.keys()):
593 595 raise Exception('missing from json: ' +
594 596 str(set(expected.keys()) - options_seen))
... ...
job.sums
1 1 # Generated by generate_auto_job
2   -generate_auto_job 68c39a9f6d1f10c1b9cf9af539036621589d6b0bbf3d05a2e1ddd1c9919d7383
  2 +generate_auto_job 8c88accfa988c8d6035c3e7e012bbde3da0c76fdfaba8e1460112bf344dc7b4f
3 3 include/qpdf/auto_job_c_att.hh 7ad43bb374c1370ef32ebdcdcb7b73a61d281f7f4e3f12755585872ab30fb60e
4 4 include/qpdf/auto_job_c_copy_att.hh 32275d03cdc69b703dd7e02ba0bbe15756e714e9ad185484773a6178dc09e1ee
5 5 include/qpdf/auto_job_c_enc.hh 72e138c7b96ed5aacdce78c1dec04b1c20d361faec4f8faf52f64c1d6be99265
... ...