The script tries to automatically detect the format of the annotations
file (legacy or pure JSON).
However, if the legacy file contains a syntax error, the script will try
to parse the file as JSON (incorrectly) triggering another obscure
error, complaining that the JSON format is invalid.
This hides the capability to detect syntax errors properly in the
annotations file.
To prevent this, introduce a new option --json. In this way the caller
has complete control to decide which format needs to be used to parse
the annotations file.
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Parse body of annotations file
"""
Parse body of annotations file
"""
+ def __init__(self, fname, do_include=True, do_json=False):
+ self.do_json = do_json
+ super().__init__(fname, do_include=True)
+
def _parse_body(self, data: str, parent=True):
for line in data.splitlines():
# Replace tabs with spaces, squeeze multiple into singles and
def _parse_body(self, data: str, parent=True):
for line in data.splitlines():
# Replace tabs with spaces, squeeze multiple into singles and
self._json_parse(data, is_included=True)
def _parse(self, data: str):
self._json_parse(data, is_included=True)
def _parse(self, data: str):
- # Try to parse the legacy format first, otherwise use the new JSON
- # format.
- try:
- self._legacy_parse(data)
- except SyntaxError:
self._json_parse(data, is_included=False)
self._json_parse(data, is_included=False)
+ else:
+ self._legacy_parse(data)
def _remove_entry(self, config: str):
if self.config[config]:
def _remove_entry(self, config: str):
if self.config[config]:
action="store_true",
help="Do not process included annotations (stop at the main file)",
)
action="store_true",
help="Do not process included annotations (stop at the main file)",
)
+ parser.add_argument(
+ "--json",
+ action="store_true",
+ help="Try to parse annotations file in pure JSON format",
+ )
ga = parser.add_argument_group(title="Action").add_mutually_exclusive_group(
required=False
ga = parser.add_argument_group(title="Action").add_mutually_exclusive_group(
required=False
def do_query(args):
if args.arch is None and args.flavour is not None:
arg_fail(_ARGPARSER, "error: --flavour requires --arch")
def do_query(args):
if args.arch is None and args.flavour is not None:
arg_fail(_ARGPARSER, "error: --flavour requires --arch")
- a = Annotation(args.file, do_include=(not args.no_include))
+ a = Annotation(args.file, do_include=(not args.no_include), do_json=args.json)
res = a.search_config(config=args.config, arch=args.arch, flavour=args.flavour)
# If no arguments are specified dump the whole annotations structure
if args.config is None and args.arch is None and args.flavour is None:
res = a.search_config(config=args.config, arch=args.arch, flavour=args.flavour)
# If no arguments are specified dump the whole annotations structure
if args.config is None and args.arch is None and args.flavour is None: