demo_improvements.py•6.52 kB
#!/usr/bin/env python
"""
Demo script showcasing Aseprite MCP improvements.
This script demonstrates:
- Configuration management
- Error handling
- Logging
- Batch processing
- Palette management
"""
import asyncio
import sys
from pathlib import Path
# Add parent directory to path for imports
sys.path.insert(0, str(Path(__file__).parent.parent))
from aseprite_mcp.core.config import AsepriteConfig, get_config, set_config
from aseprite_mcp.core.logging import get_logger, Timer
from aseprite_mcp.tools import canvas, drawing, palette, batch, export
async def demo_configuration():
"""Demonstrate configuration management."""
print("\n=== Configuration Demo ===")
# Get default configuration
config = get_config()
print(f"Default log level: {config.log_level}")
print(f"Max canvas size: {config.canvas.max_width}x{config.canvas.max_height}")
# Create custom configuration
custom_config = AsepriteConfig(
log_level="DEBUG",
canvas={"max_width": 5000, "max_height": 5000},
batch={"max_parallel_jobs": 2}
)
# Save configuration
config_file = Path("custom_config.json")
custom_config.save_to_file(config_file)
print(f"Saved config to {config_file}")
# Load configuration
loaded_config = AsepriteConfig.load_from_file(config_file)
print(f"Loaded config - Log level: {loaded_config.log_level}")
# Clean up
config_file.unlink()
async def demo_error_handling():
"""Demonstrate improved error handling."""
print("\n=== Error Handling Demo ===")
# Try to create canvas with invalid dimensions
result = await canvas.create_canvas(-100, 200, "test.aseprite")
print(f"Invalid dimensions result: {result}")
# Try to access non-existent file
result = await drawing.draw_line("non_existent.aseprite", 0, 0, 100, 100)
print(f"Non-existent file result: {result}")
# Try invalid color
result = await drawing.draw_pixels("test.aseprite", [
{"x": 10, "y": 10, "color": "INVALID"}
])
print(f"Invalid color result: {result}")
async def demo_logging():
"""Demonstrate logging capabilities."""
print("\n=== Logging Demo ===")
# Get logger
logger = get_logger("demo")
# Different log levels
logger.debug("Debug message", extra_data="test")
logger.info("Info message", operation="demo")
logger.warning("Warning message", code="W001")
# Performance logging with Timer
with Timer("expensive_operation", custom_field="demo"):
# Simulate work
await asyncio.sleep(0.1)
# Log operation
logger.log_operation("create_sprite", "demo.aseprite", width=100, height=100)
# Log error
try:
raise ValueError("Demo error")
except Exception as e:
logger.log_error("Demo error occurred", e, "demo_operation")
async def demo_palette_management():
"""Demonstrate palette management tools."""
print("\n=== Palette Management Demo ===")
# Create a test sprite
await canvas.create_canvas(32, 32, "palette_demo.aseprite")
# Apply preset palette
result = await palette.apply_preset_palette("palette_demo.aseprite", "gameboy")
print(f"Apply preset result: {result}")
# Get palette info
result = await palette.get_palette_info("palette_demo.aseprite")
print(f"Palette info: {result[:200]}...") # Truncate for readability
# Create custom palette
custom_colors = ["FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF"]
result = await palette.create_palette("palette_demo.aseprite", custom_colors)
print(f"Custom palette result: {result}")
# Clean up
Path("palette_demo.aseprite").unlink(missing_ok=True)
async def demo_batch_processing():
"""Demonstrate batch processing capabilities."""
print("\n=== Batch Processing Demo ===")
# Create test directory and files
test_dir = Path("batch_test")
test_dir.mkdir(exist_ok=True)
output_dir = Path("batch_output")
output_dir.mkdir(exist_ok=True)
# Create test sprites
for i in range(3):
await canvas.create_canvas(
100 + i * 50,
100 + i * 50,
str(test_dir / f"sprite_{i}.aseprite")
)
# Batch resize
result = await batch.batch_resize(
str(test_dir),
str(output_dir),
scale=0.5,
file_pattern="*.aseprite"
)
print(f"Batch resize result:\n{result}")
# Batch export
result = await batch.batch_export(
str(test_dir),
str(output_dir),
format="png",
scale=2.0
)
print(f"\nBatch export result:\n{result}")
# Clean up
import shutil
shutil.rmtree(test_dir)
shutil.rmtree(output_dir)
async def demo_lua_builder():
"""Demonstrate Lua builder usage."""
print("\n=== Lua Builder Demo ===")
from aseprite_mcp.core.lua_builder import LuaBuilder
# Build a complex script
builder = LuaBuilder()
builder.create_sprite(200, 200)
builder.add_comment("Create gradient effect")
builder.begin_transaction()
# Create gradient
builder.for_loop("y", 0, 199)
builder.for_loop("x", 0, 199)
# Calculate color based on position
builder.add_line("local intensity = math.floor((x + y) / 2 * 255 / 199)")
builder.add_line("local color = Color{r=intensity, g=intensity, b=255-intensity, a=255}")
builder.add_line("app.fgColor = color")
builder.draw_pixel("x", "y")
builder.end_loop()
builder.end_loop()
builder.end_transaction()
builder.save_sprite("gradient_demo.aseprite")
# Show generated script
script = builder.build()
print("Generated Lua script:")
print(script[:500] + "..." if len(script) > 500 else script)
# Clean up
Path("gradient_demo.aseprite").unlink(missing_ok=True)
async def main():
"""Run all demos."""
print("Aseprite MCP Improvements Demo")
print("==============================")
try:
await demo_configuration()
await demo_error_handling()
await demo_logging()
await demo_palette_management()
await demo_batch_processing()
await demo_lua_builder()
print("\n✅ All demos completed successfully!")
except Exception as e:
print(f"\n❌ Demo failed: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
asyncio.run(main())