blob: 2bde14eeff1a8731a1e182a87081eee3e244fee6 [file] [log] [blame] [edit]
#!/usr/bin/env python3
# Copyright (C) 2022 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Generate stdlib documentation JSON.
This tool generates documentation JSON for the Perfetto SQL standard library.
"""
import argparse
import json
import os
import sys
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(ROOT_DIR)
from python.generators.sql_processing.stdlib_parser import parse_all_modules, format_docs
def main():
parser = argparse.ArgumentParser(
description="Generate stdlib documentation JSON")
parser.add_argument('--json-out', required=True)
parser.add_argument('--input-list-file')
parser.add_argument(
'--minify',
action='store_true',
help='Minify JSON output (removes indentation and whitespace)')
parser.add_argument(
'--with-internal',
action='store_true',
help='Include internal artifacts (those starting with _) in output')
parser.add_argument('sql_files', nargs='*')
args = parser.parse_args()
if args.input_list_file and args.sql_files:
print(
"Only one of --input-list-file and list of SQL files expected",
file=sys.stderr)
return 1
# Get list of SQL files from either input-list-file or arguments
if args.input_list_file:
with open(args.input_list_file, 'r', encoding='utf-8') as f:
sql_files = [line.strip() for line in f.readlines() if line.strip()]
else:
sql_files = args.sql_files
if not sql_files:
print("No SQL files provided", file=sys.stderr)
return 1
# Find stdlib path from the common path of all files
# Unfortunately we cannot pass this in as an arg as soong does not provide
# us a way to get the path to the Perfetto source directory.
stdlib_path = os.path.commonpath(sql_files)
# Validate paths (check for ../)
for file_name in sql_files:
relpath = os.path.relpath(file_name, stdlib_path)
# We've had bugs (e.g. b/264711057) when Soong's common path logic breaks
# and ends up with a bunch of ../ prefixing the path: disallow any ../
# as this should never be a valid in our C++ output.
if '../' in relpath:
raise ValueError(
f"Invalid path with parent directory reference: {relpath}")
# Parse all modules using the library
try:
modules = parse_all_modules(
stdlib_path=stdlib_path,
include_internal=args.with_internal,
name_filter=None)
# Format as docs JSON
output_data = format_docs(modules)
# Write output
with open(args.json_out, 'w', encoding='utf-8') as f:
json.dump(output_data, f, indent=None if args.minify else 2)
return 0
except Exception as e:
print(f"Error generating docs JSON: {e}", file=sys.stderr)
import traceback
traceback.print_exc()
return 1
if __name__ == '__main__':
sys.exit(main())