[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/microlinux/Docs/main/scripts/update_api_reference.py [Back]  [Original]

#!/usr/bin/env python3
"""
Fetch swagger.json from a local server and rename API endpoints to be more readable.
"""

import requests
import json
import re

# Define overrides for specific operationIds that need custom names
overrides = {
    "admin_profiles_update_quota_deadline": "Update Quota Deadline",
    "admin_profiles_used_quota": "Used Quota",
    "token-auth_create": "Create Auth Token",
    "projects_tasks_backup_list": "Get Tasks Backup"
}

def convert_operation_id_to_title(operation_id):
    """
    Convert an operation_id like 'presets_create' to 'Create Preset'.
    
    Examples:
        presets_create -> Create Preset
        presets_update -> Update Preset
        projects_tasks_read -> Read Task
        projects_tasks_list -> List Tasks
    """
    # Split by underscore
    parts = operation_id.split('_')
    
    if len(parts) < 2:
        return operation_id.title()
    
    # Last part is usually the action (create, update, read, list, delete, etc.)
    action = parts[-1]
    # Everything before is the resource
    resource_parts = parts[:-1]
    
    # Handle plurals - if action is not 'list', singularize the last resource part
    if action != 'list' and resource_parts:
        resource = ' '.join(word.capitalize() for word in resource_parts[:-1])
        last_part = resource_parts[-1].capitalize()
        if last_part.endswith('s') and len(last_part) > 1:
            last_part = last_part[:-1]
        resource = f"{resource} {last_part}".strip()
    else:
        resource = ' '.join(word.capitalize() for word in resource_parts)
    
    # Capitalize action
    action = action.capitalize()
    
    result = f"{action} {resource}".strip()

    # Manual replacements for special cases
    result = result.replace("Processingnode", "Processing Node")
    result = result.replace("Partial", "")
    result = result.replace("(partial)", "")
    result = result.replace("Projects Task", "Task")
    result = result.replace("Media Manage", "Media")
    result = result.replace("Read Workers", "Workers")
    result = result.replace("Permissions Project", "Permissions")
    result = result.replace("Permissions Project", "Permissions")
    result = result.replace(" Admin ", " ")
    
    return result.strip()


def analyze_swagger(swagger_data):
    """Analyze swagger.json and create a mapping dictionary."""
    mappings = {}
    
    for path, methods in swagger_data.get('paths', {}).items():
        for method, operation in methods.items():
            if isinstance(operation, dict) and 'operationId' in operation:
                operation_id = operation['operationId']
                suggested_name = convert_operation_id_to_title(operation_id)
                mappings[operation_id] = suggested_name
    
    return mappings


def apply_mappings(swagger_data, mappings):
    """Apply the mappings to the swagger data."""
    for path, methods in swagger_data.get('paths', {}).items():
        for method, operation in methods.items():
            if isinstance(operation, dict) and 'operationId' in operation:
                operation_id = operation['operationId']
                if operation_id in mappings:
                    operation['summary'] = mappings[operation_id]
    
    return swagger_data


def main():
    # Fetch swagger.json
    url = "http://localhost:8000/swagger?format=openapi"
    print(f"Fetching swagger.json from {url}...")
    
    try:
        response = requests.get(url)
        response.raise_for_status()
        swagger_data = response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching swagger.json: {e}")
        return
    
    # Analyze and create mappings
    print("\nAnalyzing swagger.json and creating mappings...")
    mappings = analyze_swagger(swagger_data)
    
    # Apply overrides
    if overrides:
        print("Applying overrides...")
        mappings.update(overrides)

    # Display mappings for user review
    print("\n" + "="*60)
    print("PROPOSED MAPPINGS (edit the overrides dictionary to make changes):")
    print("="*60)
    
    # Create a nicely formatted dictionary that users can edit
    print("\nmappings = {")
    for operation_id, suggested_name in sorted(mappings.items()):
        print(f'    "{operation_id}": "{suggested_name}",')
    print("}\n")
    
    # Apply mappings
    print("Applying mappings to swagger.json...")
    updated_swagger = apply_mappings(swagger_data, mappings)
    
    # Save to file
    output_file = "./swagger.json"
    print(f"Saving updated swagger.json to {output_file}...")
    
    with open(output_file, 'w') as f:
        json.dump(updated_swagger, f, indent=2)
    
    print(f"\n Successfully saved updated swagger.json to {output_file}")
    print(f"  Total endpoints updated: {len(mappings)}")


if __name__ == "__main__":
    main()

Web Proxy Viewer  |  New URL  |  Original Page