diff --git a/src/core/generator.py b/src/core/generator.py new file mode 100644 index 0000000..c4b3904 --- /dev/null +++ b/src/core/generator.py @@ -0,0 +1,70 @@ +import json +import os +from pathlib import Path +from .parser import parse_openapi_spec, load_spec_file +from .models import Endpoint, APISpec + + +def generate_docs(spec_file: str, output: str = None, format: str = 'html', open_browser: bool = False): + """Generate documentation in the specified format. + + Args: + spec_file: Path to the OpenAPI spec file + output: Output file path or directory + format: Output format (html, markdown, json, all) + open_browser: Whether to open the generated file in browser + """ + result = parse_openapi_spec(spec_file) + + if not result.get('valid'): + raise ValueError(f"Invalid spec: {result.get('errors')}") + + spec = result['spec'] + + if format == 'all': + for fmt in ['html', 'markdown', 'json']: + generate_docs(spec_file, output, fmt, open_browser and fmt == 'html') + return + + if not output: + base_name = Path(spec_file).stem + if format == 'html': + output = f"{base_name}.html" + elif format == 'markdown': + output = f"{base_name}.md" + elif format == 'json': + output = f"{base_name}_docs.json" + + if format == 'html': + from .templates.html_template import generate_html + generate_html(spec, output) + elif format == 'markdown': + from .templates.markdown_template import generate_markdown + generate_markdown(spec, output) + elif format == 'json': + generate_json_docs(spec, output) + + print(f"Generated {format} documentation: {output}") + + if open_browser and format == 'html': + import webbrowser + webbrowser.open(f'file://{os.path.abspath(output)}') + + +def generate_json_docs(spec: dict, output: str): + """Generate JSON documentation.""" + from .parser import extract_endpoints + + endpoints = extract_endpoints(spec) + + docs = { + 'title': spec.get('info', {}).get('title', 'API Documentation'), + 'version': spec.get('info', {}).get('version', '1.0.0'), + 'description': spec.get('info', {}).get('description', ''), + 'endpoints': endpoints, + 'tags': spec.get('tags', []), + 'servers': spec.get('servers', []) + } + + with open(output, 'w') as f: + json.dump(docs, f, indent=2)