Initial commit: Clean DSS implementation
Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm
Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)
Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability
Migration completed: $(date)
🤖 Clean migration with full functionality preserved
This commit is contained in:
214
test_iteration1.py
Executable file
214
test_iteration1.py
Executable file
@@ -0,0 +1,214 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Iteration 1: Core Validation Test Suite
|
||||
Tests all token ingestion, analysis, and Storybook functionality
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import sys
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# Add tools to path
|
||||
sys.path.insert(0, str(Path(__file__).parent))
|
||||
|
||||
async def test_css_ingestion():
|
||||
"""Test CSS token ingestion"""
|
||||
print("\n=== Testing CSS Token Ingestion ===")
|
||||
from tools.ingest.css import CSSTokenSource
|
||||
|
||||
# Test CSS
|
||||
css_content = """
|
||||
:root {
|
||||
--primary-color: #3B82F6;
|
||||
--spacing-md: 16px;
|
||||
--font-size-base: 16px;
|
||||
}
|
||||
"""
|
||||
|
||||
try:
|
||||
parser = CSSTokenSource()
|
||||
collection = await parser.extract(css_content)
|
||||
print(f"✅ CSS: Parsed {len(collection.tokens)} tokens")
|
||||
for token in collection.tokens[:3]:
|
||||
print(f" - {token.name}: {token.value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ CSS Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
async def test_scss_ingestion():
|
||||
"""Test SCSS token ingestion"""
|
||||
print("\n=== Testing SCSS Token Ingestion ===")
|
||||
from tools.ingest.scss import SCSSTokenSource
|
||||
|
||||
scss_content = """
|
||||
$primary: #3B82F6;
|
||||
$spacing-md: 16px;
|
||||
$font-family: 'Inter', sans-serif;
|
||||
"""
|
||||
|
||||
try:
|
||||
parser = SCSSTokenSource()
|
||||
tokens = await parser.parse(scss_content)
|
||||
print(f"✅ SCSS: Parsed {len(tokens)} tokens")
|
||||
for token in tokens[:3]:
|
||||
print(f" - {token.name}: {token.value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ SCSS Error: {e}")
|
||||
return False
|
||||
|
||||
async def test_tailwind_ingestion():
|
||||
"""Test Tailwind config ingestion"""
|
||||
print("\n=== Testing Tailwind Token Ingestion ===")
|
||||
from tools.ingest.tailwind import TailwindTokenSource
|
||||
|
||||
config_content = """
|
||||
module.exports = {
|
||||
theme: {
|
||||
colors: {
|
||||
primary: '#3B82F6',
|
||||
secondary: '#10B981',
|
||||
},
|
||||
spacing: {
|
||||
'sm': '8px',
|
||||
'md': '16px',
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
try:
|
||||
parser = TailwindTokenSource()
|
||||
tokens = await parser.parse(config_content)
|
||||
print(f"✅ Tailwind: Parsed {len(tokens)} tokens")
|
||||
for token in tokens[:3]:
|
||||
print(f" - {token.name}: {token.value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Tailwind Error: {e}")
|
||||
return False
|
||||
|
||||
async def test_json_ingestion():
|
||||
"""Test JSON token ingestion"""
|
||||
print("\n=== Testing JSON Token Ingestion ===")
|
||||
from tools.ingest.json_tokens import JSONTokenSource
|
||||
|
||||
json_content = {
|
||||
"color": {
|
||||
"primary": {
|
||||
"500": {"value": "#3B82F6", "type": "color"}
|
||||
}
|
||||
},
|
||||
"spacing": {
|
||||
"md": {"value": "16px", "type": "dimension"}
|
||||
}
|
||||
}
|
||||
|
||||
try:
|
||||
parser = JSONTokenSource()
|
||||
tokens = await parser.parse(json.dumps(json_content))
|
||||
print(f"✅ JSON: Parsed {len(tokens)} tokens")
|
||||
for token in tokens[:3]:
|
||||
print(f" - {token.name}: {token.value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ JSON Error: {e}")
|
||||
return False
|
||||
|
||||
async def test_token_merge():
|
||||
"""Test token merging"""
|
||||
print("\n=== Testing Token Merge ===")
|
||||
from tools.ingest.merge import TokenMerger, MergeStrategy
|
||||
from tools.ingest.base import DesignToken
|
||||
|
||||
try:
|
||||
tokens_a = [
|
||||
DesignToken(name="color.primary", value="#FF0000", type="color", source="css"),
|
||||
DesignToken(name="spacing.md", value="16px", type="dimension", source="css"),
|
||||
]
|
||||
|
||||
tokens_b = [
|
||||
DesignToken(name="color.primary", value="#3B82F6", type="color", source="figma"),
|
||||
DesignToken(name="color.secondary", value="#10B981", type="color", source="figma"),
|
||||
]
|
||||
|
||||
merger = TokenMerger(strategy=MergeStrategy.PREFER_FIGMA)
|
||||
result = await merger.merge([tokens_a, tokens_b])
|
||||
|
||||
print(f"✅ Merge: {len(result.tokens)} tokens, {len(result.conflicts)} conflicts")
|
||||
if result.conflicts:
|
||||
print(f" Conflicts resolved:")
|
||||
for conflict in result.conflicts:
|
||||
print(f" - {conflict.token_name}: chose {conflict.chosen_value}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Merge Error: {e}")
|
||||
return False
|
||||
|
||||
async def test_figma_tools():
|
||||
"""Test Figma integration"""
|
||||
print("\n=== Testing Figma Integration ===")
|
||||
from tools.figma.figma_tools import FigmaToolSuite
|
||||
|
||||
try:
|
||||
# Test with mock mode (no API key)
|
||||
suite = FigmaToolSuite(output_dir="./test_output")
|
||||
print(f"✅ Figma: Mode = {suite.mode}")
|
||||
|
||||
# Test mock data
|
||||
file_key = "test123"
|
||||
components = await suite.extract_components(file_key)
|
||||
print(f" Components: {components.get('components_count', 0)}")
|
||||
|
||||
styles = await suite.extract_styles(file_key)
|
||||
print(f" Styles: {styles.get('styles_count', 0)}")
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Figma Error: {e}")
|
||||
return False
|
||||
|
||||
async def main():
|
||||
"""Run all tests"""
|
||||
print("=" * 60)
|
||||
print("DSS ITERATION 1: CORE VALIDATION")
|
||||
print("=" * 60)
|
||||
|
||||
results = []
|
||||
|
||||
# Token Ingestion Tests
|
||||
results.append(("CSS Ingestion", await test_css_ingestion()))
|
||||
results.append(("SCSS Ingestion", await test_scss_ingestion()))
|
||||
results.append(("Tailwind Ingestion", await test_tailwind_ingestion()))
|
||||
results.append(("JSON Ingestion", await test_json_ingestion()))
|
||||
results.append(("Token Merge", await test_token_merge()))
|
||||
results.append(("Figma Tools", await test_figma_tools()))
|
||||
|
||||
# Summary
|
||||
print("\n" + "=" * 60)
|
||||
print("TEST SUMMARY")
|
||||
print("=" * 60)
|
||||
|
||||
passed = sum(1 for _, result in results if result)
|
||||
total = len(results)
|
||||
|
||||
for name, result in results:
|
||||
status = "✅ PASS" if result else "❌ FAIL"
|
||||
print(f"{status}: {name}")
|
||||
|
||||
print(f"\nPassed: {passed}/{total} ({100*passed//total}%)")
|
||||
|
||||
if passed == total:
|
||||
print("\n🎉 ALL TESTS PASSED!")
|
||||
return 0
|
||||
else:
|
||||
print(f"\n⚠️ {total - passed} TEST(S) FAILED")
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit_code = asyncio.run(main())
|
||||
sys.exit(exit_code)
|
||||
Reference in New Issue
Block a user