|
|
|
|
|
import sys |
|
|
import argparse |
|
|
import asyncio |
|
|
from flags import enable_flag, disable_flag, is_enabled, list_flags, delete_flag, get_flag_details |
|
|
|
|
|
async def enable_command(flag_name: str, description: str = ""): |
|
|
if await enable_flag(flag_name, description): |
|
|
print(f"β Enabled flag: {flag_name}") |
|
|
if description: |
|
|
print(f" Description: {description}") |
|
|
else: |
|
|
print(f"β Failed to enable flag: {flag_name}") |
|
|
|
|
|
|
|
|
async def disable_command(flag_name: str, description: str = ""): |
|
|
if await disable_flag(flag_name, description): |
|
|
print(f"β Disabled flag: {flag_name}") |
|
|
if description: |
|
|
print(f" Description: {description}") |
|
|
else: |
|
|
print(f"β Failed to disable flag: {flag_name}") |
|
|
|
|
|
|
|
|
async def list_command(): |
|
|
flags = await list_flags() |
|
|
|
|
|
if not flags: |
|
|
print("No feature flags found.") |
|
|
return |
|
|
|
|
|
print("Feature Flags:") |
|
|
print("-" * 50) |
|
|
|
|
|
for flag_name, enabled in flags.items(): |
|
|
details = await get_flag_details(flag_name) |
|
|
description = details.get('description', 'No description') if details else 'No description' |
|
|
updated_at = details.get('updated_at', 'Unknown') if details else 'Unknown' |
|
|
|
|
|
status_icon = "β" if enabled else "β" |
|
|
status_text = "ENABLED" if enabled else "DISABLED" |
|
|
|
|
|
print(f"{status_icon} {flag_name}: {status_text}") |
|
|
print(f" Description: {description}") |
|
|
print(f" Updated: {updated_at}") |
|
|
print() |
|
|
|
|
|
|
|
|
async def status_command(flag_name: str): |
|
|
details = await get_flag_details(flag_name) |
|
|
|
|
|
if not details: |
|
|
print(f"β Flag '{flag_name}' not found.") |
|
|
return |
|
|
|
|
|
enabled = await is_enabled(flag_name) |
|
|
status_icon = "β" if enabled else "β" |
|
|
status_text = "ENABLED" if enabled else "DISABLED" |
|
|
|
|
|
print(f"Flag: {flag_name}") |
|
|
print(f"Status: {status_icon} {status_text}") |
|
|
print(f"Description: {details.get('description', 'No description')}") |
|
|
print(f"Updated: {details.get('updated_at', 'Unknown')}") |
|
|
|
|
|
|
|
|
async def delete_command(flag_name: str): |
|
|
if not await get_flag_details(flag_name): |
|
|
print(f"β Flag '{flag_name}' not found.") |
|
|
return |
|
|
|
|
|
confirm = input(f"Are you sure you want to delete flag '{flag_name}'? (y/N): ") |
|
|
if confirm.lower() in ['y', 'yes']: |
|
|
if await delete_flag(flag_name): |
|
|
print(f"β Deleted flag: {flag_name}") |
|
|
else: |
|
|
print(f"β Failed to delete flag: {flag_name}") |
|
|
else: |
|
|
print("Cancelled.") |
|
|
|
|
|
|
|
|
async def toggle_command(flag_name: str, description: str = ""): |
|
|
current_status = await is_enabled(flag_name) |
|
|
|
|
|
if current_status: |
|
|
await disable_command(flag_name, description) |
|
|
else: |
|
|
await enable_command(flag_name, description) |
|
|
|
|
|
|
|
|
async def main(): |
|
|
parser = argparse.ArgumentParser( |
|
|
description="Feature Flag Management Tool", |
|
|
formatter_class=argparse.RawDescriptionHelpFormatter, |
|
|
epilog=""" |
|
|
Examples: |
|
|
python setup.py enable new_ui "Enable new user interface" |
|
|
python setup.py disable beta_features "Disable beta features" |
|
|
python setup.py list |
|
|
python setup.py status new_ui |
|
|
python setup.py toggle maintenance_mode "Toggle maintenance mode" |
|
|
python setup.py delete old_feature |
|
|
""" |
|
|
) |
|
|
|
|
|
subparsers = parser.add_subparsers(dest='command', help='Available commands') |
|
|
|
|
|
|
|
|
enable_parser = subparsers.add_parser('enable', help='Enable a feature flag') |
|
|
enable_parser.add_argument('flag_name', help='Name of the feature flag') |
|
|
enable_parser.add_argument('description', nargs='?', default='', help='Optional description') |
|
|
|
|
|
|
|
|
disable_parser = subparsers.add_parser('disable', help='Disable a feature flag') |
|
|
disable_parser.add_argument('flag_name', help='Name of the feature flag') |
|
|
disable_parser.add_argument('description', nargs='?', default='', help='Optional description') |
|
|
|
|
|
|
|
|
subparsers.add_parser('list', help='List all feature flags') |
|
|
|
|
|
|
|
|
status_parser = subparsers.add_parser('status', help='Show status of a feature flag') |
|
|
status_parser.add_argument('flag_name', help='Name of the feature flag') |
|
|
|
|
|
|
|
|
delete_parser = subparsers.add_parser('delete', help='Delete a feature flag') |
|
|
delete_parser.add_argument('flag_name', help='Name of the feature flag') |
|
|
|
|
|
|
|
|
toggle_parser = subparsers.add_parser('toggle', help='Toggle a feature flag') |
|
|
toggle_parser.add_argument('flag_name', help='Name of the feature flag') |
|
|
toggle_parser.add_argument('description', nargs='?', default='', help='Optional description') |
|
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
if not args.command: |
|
|
parser.print_help() |
|
|
return |
|
|
|
|
|
try: |
|
|
if args.command == 'enable': |
|
|
await enable_command(args.flag_name, args.description) |
|
|
elif args.command == 'disable': |
|
|
await disable_command(args.flag_name, args.description) |
|
|
elif args.command == 'list': |
|
|
await list_command() |
|
|
elif args.command == 'status': |
|
|
await status_command(args.flag_name) |
|
|
elif args.command == 'delete': |
|
|
await delete_command(args.flag_name) |
|
|
elif args.command == 'toggle': |
|
|
await toggle_command(args.flag_name, args.description) |
|
|
except KeyboardInterrupt: |
|
|
print("\nOperation cancelled.") |
|
|
except Exception as e: |
|
|
print(f"Error: {e}") |
|
|
sys.exit(1) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
asyncio.run(main()) |