moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
# Data Format Examples
|
|
2
|
+
|
|
3
|
+
Multishot prompting examples demonstrating practical data format patterns covering TOON encoding, JSON/YAML optimization, serialization, and validation.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Example 1: TOON Encoding for LLM Token Optimization
|
|
8
|
+
|
|
9
|
+
**Scenario**: Reduce token usage when sending structured data to LLMs.
|
|
10
|
+
|
|
11
|
+
**Input**:
|
|
12
|
+
```python
|
|
13
|
+
# Original JSON data - high token count
|
|
14
|
+
user_data = {
|
|
15
|
+
"id": 12345,
|
|
16
|
+
"name": "John Doe",
|
|
17
|
+
"email": "john@example.com",
|
|
18
|
+
"active": True,
|
|
19
|
+
"balance": 1250.50,
|
|
20
|
+
"created_at": "2024-01-15T10:30:00Z",
|
|
21
|
+
"tags": ["premium", "verified", "developer"],
|
|
22
|
+
"metadata": None
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# JSON representation: ~85 tokens
|
|
26
|
+
json_output = json.dumps(user_data)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Output**:
|
|
30
|
+
```python
|
|
31
|
+
from moai_formats_data import TOONEncoder
|
|
32
|
+
from datetime import datetime
|
|
33
|
+
|
|
34
|
+
class TOONEncoder:
|
|
35
|
+
"""Token-Optimized Object Notation encoder."""
|
|
36
|
+
|
|
37
|
+
TYPE_MARKERS = {
|
|
38
|
+
'number': '#',
|
|
39
|
+
'boolean': '!',
|
|
40
|
+
'timestamp': '@',
|
|
41
|
+
'null': '~'
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
def encode(self, data: dict) -> str:
|
|
45
|
+
"""Encode data to TOON format."""
|
|
46
|
+
return self._encode_value(data)
|
|
47
|
+
|
|
48
|
+
def _encode_value(self, value) -> str:
|
|
49
|
+
if value is None:
|
|
50
|
+
return '~'
|
|
51
|
+
elif isinstance(value, bool):
|
|
52
|
+
return f"!{'1' if value else '0'}"
|
|
53
|
+
elif isinstance(value, (int, float)):
|
|
54
|
+
return f"#{value}"
|
|
55
|
+
elif isinstance(value, datetime):
|
|
56
|
+
return f"@{value.isoformat()}"
|
|
57
|
+
elif isinstance(value, str):
|
|
58
|
+
return value
|
|
59
|
+
elif isinstance(value, list):
|
|
60
|
+
items = [self._encode_value(item) for item in value]
|
|
61
|
+
return f"[{','.join(items)}]"
|
|
62
|
+
elif isinstance(value, dict):
|
|
63
|
+
pairs = [f"{k}:{self._encode_value(v)}" for k, v in value.items()]
|
|
64
|
+
return f"{{{','.join(pairs)}}}"
|
|
65
|
+
return str(value)
|
|
66
|
+
|
|
67
|
+
def decode(self, toon_string: str) -> dict:
|
|
68
|
+
"""Decode TOON format back to Python dict."""
|
|
69
|
+
return self._parse_value(toon_string)
|
|
70
|
+
|
|
71
|
+
def _parse_value(self, s: str):
|
|
72
|
+
s = s.strip()
|
|
73
|
+
|
|
74
|
+
if s == '~':
|
|
75
|
+
return None
|
|
76
|
+
elif s.startswith('!'):
|
|
77
|
+
return s[1] == '1'
|
|
78
|
+
elif s.startswith('#'):
|
|
79
|
+
num_str = s[1:]
|
|
80
|
+
return float(num_str) if '.' in num_str else int(num_str)
|
|
81
|
+
elif s.startswith('@'):
|
|
82
|
+
return datetime.fromisoformat(s[1:])
|
|
83
|
+
elif s.startswith('{'):
|
|
84
|
+
return self._parse_object(s)
|
|
85
|
+
elif s.startswith('['):
|
|
86
|
+
return self._parse_array(s)
|
|
87
|
+
return s
|
|
88
|
+
|
|
89
|
+
# Usage example
|
|
90
|
+
encoder = TOONEncoder()
|
|
91
|
+
|
|
92
|
+
user_data = {
|
|
93
|
+
"id": 12345,
|
|
94
|
+
"name": "John Doe",
|
|
95
|
+
"email": "john@example.com",
|
|
96
|
+
"active": True,
|
|
97
|
+
"balance": 1250.50,
|
|
98
|
+
"created_at": datetime(2024, 1, 15, 10, 30, 0),
|
|
99
|
+
"tags": ["premium", "verified", "developer"],
|
|
100
|
+
"metadata": None
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Encode to TOON
|
|
104
|
+
toon_output = encoder.encode(user_data)
|
|
105
|
+
# Result: {id:#12345,name:John Doe,email:john@example.com,active:!1,balance:#1250.5,created_at:@2024-01-15T10:30:00,tags:[premium,verified,developer],metadata:~}
|
|
106
|
+
|
|
107
|
+
# Token comparison
|
|
108
|
+
import tiktoken
|
|
109
|
+
encoding = tiktoken.get_encoding("cl100k_base")
|
|
110
|
+
|
|
111
|
+
json_tokens = len(encoding.encode(json.dumps(user_data, default=str)))
|
|
112
|
+
toon_tokens = len(encoding.encode(toon_output))
|
|
113
|
+
|
|
114
|
+
print(f"JSON tokens: {json_tokens}") # ~85 tokens
|
|
115
|
+
print(f"TOON tokens: {toon_tokens}") # ~45 tokens
|
|
116
|
+
print(f"Reduction: {((json_tokens - toon_tokens) / json_tokens) * 100:.1f}%") # ~47% reduction
|
|
117
|
+
|
|
118
|
+
# Decode back to Python
|
|
119
|
+
decoded = encoder.decode(toon_output)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Explanation**: TOON encoding uses type markers and removes unnecessary syntax to achieve 40-60% token reduction while maintaining lossless round-trip conversion.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Example 2: High-Performance JSON Processing
|
|
127
|
+
|
|
128
|
+
**Scenario**: Process large JSON files efficiently with streaming and optimization.
|
|
129
|
+
|
|
130
|
+
**Input**:
|
|
131
|
+
```python
|
|
132
|
+
# Need to process a 500MB JSON file with millions of records
|
|
133
|
+
# Standard json.load() causes memory issues
|
|
134
|
+
import json
|
|
135
|
+
|
|
136
|
+
# This fails with large files
|
|
137
|
+
with open('large_dataset.json', 'r') as f:
|
|
138
|
+
data = json.load(f) # MemoryError on 500MB+ files
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Output**:
|
|
142
|
+
```python
|
|
143
|
+
from moai_formats_data import JSONOptimizer, StreamProcessor
|
|
144
|
+
import orjson
|
|
145
|
+
from typing import Iterator, Dict, Any, Callable
|
|
146
|
+
from pathlib import Path
|
|
147
|
+
|
|
148
|
+
class JSONOptimizer:
|
|
149
|
+
"""High-performance JSON processing with orjson."""
|
|
150
|
+
|
|
151
|
+
def serialize_fast(self, data: Any) -> bytes:
|
|
152
|
+
"""Ultra-fast JSON serialization (5x faster than json)."""
|
|
153
|
+
return orjson.dumps(
|
|
154
|
+
data,
|
|
155
|
+
option=orjson.OPT_SERIALIZE_NUMPY |
|
|
156
|
+
orjson.OPT_SERIALIZE_DATACLASS |
|
|
157
|
+
orjson.OPT_UTC_Z
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def deserialize_fast(self, json_bytes: bytes) -> Any:
|
|
161
|
+
"""Ultra-fast JSON deserialization."""
|
|
162
|
+
return orjson.loads(json_bytes)
|
|
163
|
+
|
|
164
|
+
def serialize_pretty(self, data: Any) -> bytes:
|
|
165
|
+
"""Pretty-printed JSON for debugging."""
|
|
166
|
+
return orjson.dumps(
|
|
167
|
+
data,
|
|
168
|
+
option=orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class StreamProcessor:
|
|
173
|
+
"""Stream large JSON files without loading into memory."""
|
|
174
|
+
|
|
175
|
+
def __init__(self, chunk_size: int = 8192):
|
|
176
|
+
self.chunk_size = chunk_size
|
|
177
|
+
|
|
178
|
+
def process_json_array(
|
|
179
|
+
self,
|
|
180
|
+
file_path: str,
|
|
181
|
+
processor: Callable[[Dict], Any]
|
|
182
|
+
) -> Iterator[Any]:
|
|
183
|
+
"""Stream process JSON array file."""
|
|
184
|
+
import ijson
|
|
185
|
+
|
|
186
|
+
with open(file_path, 'rb') as f:
|
|
187
|
+
parser = ijson.items(f, 'item')
|
|
188
|
+
for item in parser:
|
|
189
|
+
yield processor(item)
|
|
190
|
+
|
|
191
|
+
def process_json_lines(
|
|
192
|
+
self,
|
|
193
|
+
file_path: str,
|
|
194
|
+
processor: Callable[[Dict], Any]
|
|
195
|
+
) -> Iterator[Any]:
|
|
196
|
+
"""Process JSON Lines (JSONL) format."""
|
|
197
|
+
with open(file_path, 'r') as f:
|
|
198
|
+
for line in f:
|
|
199
|
+
if line.strip():
|
|
200
|
+
item = orjson.loads(line)
|
|
201
|
+
yield processor(item)
|
|
202
|
+
|
|
203
|
+
def batch_process(
|
|
204
|
+
self,
|
|
205
|
+
file_path: str,
|
|
206
|
+
processor: Callable[[Dict], Any],
|
|
207
|
+
batch_size: int = 1000
|
|
208
|
+
) -> Iterator[list]:
|
|
209
|
+
"""Process items in batches for efficiency."""
|
|
210
|
+
batch = []
|
|
211
|
+
|
|
212
|
+
for item in self.process_json_array(file_path, lambda x: x):
|
|
213
|
+
batch.append(processor(item))
|
|
214
|
+
|
|
215
|
+
if len(batch) >= batch_size:
|
|
216
|
+
yield batch
|
|
217
|
+
batch = []
|
|
218
|
+
|
|
219
|
+
if batch:
|
|
220
|
+
yield batch
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# Usage example
|
|
224
|
+
optimizer = JSONOptimizer()
|
|
225
|
+
stream_processor = StreamProcessor()
|
|
226
|
+
|
|
227
|
+
# Fast serialization
|
|
228
|
+
data = {"users": [{"id": i, "name": f"User {i}"} for i in range(10000)]}
|
|
229
|
+
fast_json = optimizer.serialize_fast(data)
|
|
230
|
+
|
|
231
|
+
# Process large file
|
|
232
|
+
def process_user(user: dict) -> dict:
|
|
233
|
+
return {
|
|
234
|
+
"id": user["id"],
|
|
235
|
+
"name_upper": user["name"].upper(),
|
|
236
|
+
"processed": True
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
# Stream process without memory issues
|
|
240
|
+
results = []
|
|
241
|
+
for batch in stream_processor.batch_process("large_users.json", process_user, batch_size=5000):
|
|
242
|
+
results.extend(batch)
|
|
243
|
+
print(f"Processed batch of {len(batch)} items")
|
|
244
|
+
|
|
245
|
+
# Memory-efficient aggregation
|
|
246
|
+
total = 0
|
|
247
|
+
for user in stream_processor.process_json_array("large_users.json", lambda x: x):
|
|
248
|
+
total += user.get("balance", 0)
|
|
249
|
+
print(f"Total balance: {total}")
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Explanation**: This pattern uses orjson for 5x faster serialization and ijson for memory-efficient streaming of large files, enabling processing of gigabyte-scale JSON data.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Example 3: Advanced Data Validation with Schema Evolution
|
|
257
|
+
|
|
258
|
+
**Scenario**: Implement robust data validation with support for schema versioning and migration.
|
|
259
|
+
|
|
260
|
+
**Input**:
|
|
261
|
+
```python
|
|
262
|
+
# Need validation system that:
|
|
263
|
+
# - Validates complex nested data
|
|
264
|
+
# - Supports schema evolution
|
|
265
|
+
# - Provides clear error messages
|
|
266
|
+
# - Handles migrations between versions
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Output**:
|
|
270
|
+
```python
|
|
271
|
+
from moai_formats_data import DataValidator, SchemaEvolution
|
|
272
|
+
from typing import Dict, Any, List, Optional
|
|
273
|
+
from dataclasses import dataclass
|
|
274
|
+
import re
|
|
275
|
+
|
|
276
|
+
@dataclass
|
|
277
|
+
class ValidationResult:
|
|
278
|
+
valid: bool
|
|
279
|
+
errors: Dict[str, List[str]]
|
|
280
|
+
sanitized_data: Optional[Dict[str, Any]] = None
|
|
281
|
+
warnings: List[str] = None
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class DataValidator:
|
|
285
|
+
"""Advanced data validation with type coercion and custom rules."""
|
|
286
|
+
|
|
287
|
+
def __init__(self):
|
|
288
|
+
self.type_validators = {
|
|
289
|
+
'string': self._validate_string,
|
|
290
|
+
'integer': self._validate_integer,
|
|
291
|
+
'float': self._validate_float,
|
|
292
|
+
'boolean': self._validate_boolean,
|
|
293
|
+
'email': self._validate_email,
|
|
294
|
+
'url': self._validate_url,
|
|
295
|
+
'array': self._validate_array,
|
|
296
|
+
'object': self._validate_object
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
def create_schema(self, schema_dict: Dict) -> Dict:
|
|
300
|
+
"""Create a compiled schema for efficient validation."""
|
|
301
|
+
compiled = {}
|
|
302
|
+
for field, rules in schema_dict.items():
|
|
303
|
+
compiled[field] = self._compile_field_rules(rules)
|
|
304
|
+
return compiled
|
|
305
|
+
|
|
306
|
+
def _compile_field_rules(self, rules: Dict) -> Dict:
|
|
307
|
+
"""Pre-compile validation rules for performance."""
|
|
308
|
+
compiled = rules.copy()
|
|
309
|
+
|
|
310
|
+
# Pre-compile regex patterns
|
|
311
|
+
if 'pattern' in rules:
|
|
312
|
+
compiled['_compiled_pattern'] = re.compile(rules['pattern'])
|
|
313
|
+
|
|
314
|
+
return compiled
|
|
315
|
+
|
|
316
|
+
def validate(self, data: Dict, schema: Dict) -> ValidationResult:
|
|
317
|
+
"""Validate data against schema."""
|
|
318
|
+
errors = {}
|
|
319
|
+
sanitized = {}
|
|
320
|
+
warnings = []
|
|
321
|
+
|
|
322
|
+
for field, rules in schema.items():
|
|
323
|
+
value = data.get(field)
|
|
324
|
+
|
|
325
|
+
# Check required
|
|
326
|
+
if rules.get('required', False) and value is None:
|
|
327
|
+
errors.setdefault(field, []).append(f"Field '{field}' is required")
|
|
328
|
+
continue
|
|
329
|
+
|
|
330
|
+
if value is None:
|
|
331
|
+
if 'default' in rules:
|
|
332
|
+
sanitized[field] = rules['default']
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
# Type validation
|
|
336
|
+
field_type = rules.get('type', 'string')
|
|
337
|
+
validator = self.type_validators.get(field_type)
|
|
338
|
+
|
|
339
|
+
if validator:
|
|
340
|
+
is_valid, sanitized_value, error = validator(value, rules)
|
|
341
|
+
if not is_valid:
|
|
342
|
+
errors.setdefault(field, []).append(error)
|
|
343
|
+
else:
|
|
344
|
+
sanitized[field] = sanitized_value
|
|
345
|
+
|
|
346
|
+
return ValidationResult(
|
|
347
|
+
valid=len(errors) == 0,
|
|
348
|
+
errors=errors,
|
|
349
|
+
sanitized_data=sanitized if len(errors) == 0 else None,
|
|
350
|
+
warnings=warnings
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
def _validate_string(self, value, rules) -> tuple:
|
|
354
|
+
if not isinstance(value, str):
|
|
355
|
+
return False, None, "Must be a string"
|
|
356
|
+
|
|
357
|
+
if 'min_length' in rules and len(value) < rules['min_length']:
|
|
358
|
+
return False, None, f"Minimum length is {rules['min_length']}"
|
|
359
|
+
|
|
360
|
+
if 'max_length' in rules and len(value) > rules['max_length']:
|
|
361
|
+
return False, None, f"Maximum length is {rules['max_length']}"
|
|
362
|
+
|
|
363
|
+
if '_compiled_pattern' in rules:
|
|
364
|
+
if not rules['_compiled_pattern'].match(value):
|
|
365
|
+
return False, None, f"Does not match pattern"
|
|
366
|
+
|
|
367
|
+
return True, value.strip(), None
|
|
368
|
+
|
|
369
|
+
def _validate_integer(self, value, rules) -> tuple:
|
|
370
|
+
try:
|
|
371
|
+
int_value = int(value)
|
|
372
|
+
except (ValueError, TypeError):
|
|
373
|
+
return False, None, "Must be an integer"
|
|
374
|
+
|
|
375
|
+
if 'min_value' in rules and int_value < rules['min_value']:
|
|
376
|
+
return False, None, f"Minimum value is {rules['min_value']}"
|
|
377
|
+
|
|
378
|
+
if 'max_value' in rules and int_value > rules['max_value']:
|
|
379
|
+
return False, None, f"Maximum value is {rules['max_value']}"
|
|
380
|
+
|
|
381
|
+
return True, int_value, None
|
|
382
|
+
|
|
383
|
+
def _validate_email(self, value, rules) -> tuple:
|
|
384
|
+
if not isinstance(value, str):
|
|
385
|
+
return False, None, "Must be a string"
|
|
386
|
+
|
|
387
|
+
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
|
388
|
+
if not re.match(email_pattern, value):
|
|
389
|
+
return False, None, "Invalid email format"
|
|
390
|
+
|
|
391
|
+
return True, value.lower().strip(), None
|
|
392
|
+
|
|
393
|
+
def _validate_float(self, value, rules) -> tuple:
|
|
394
|
+
try:
|
|
395
|
+
float_value = float(value)
|
|
396
|
+
except (ValueError, TypeError):
|
|
397
|
+
return False, None, "Must be a number"
|
|
398
|
+
return True, float_value, None
|
|
399
|
+
|
|
400
|
+
def _validate_boolean(self, value, rules) -> tuple:
|
|
401
|
+
if isinstance(value, bool):
|
|
402
|
+
return True, value, None
|
|
403
|
+
if value in ('true', 'True', '1', 1):
|
|
404
|
+
return True, True, None
|
|
405
|
+
if value in ('false', 'False', '0', 0):
|
|
406
|
+
return True, False, None
|
|
407
|
+
return False, None, "Must be a boolean"
|
|
408
|
+
|
|
409
|
+
def _validate_url(self, value, rules) -> tuple:
|
|
410
|
+
if not isinstance(value, str):
|
|
411
|
+
return False, None, "Must be a string"
|
|
412
|
+
url_pattern = r'^https?://[^\s/$.?#].[^\s]*$'
|
|
413
|
+
if not re.match(url_pattern, value):
|
|
414
|
+
return False, None, "Invalid URL format"
|
|
415
|
+
return True, value, None
|
|
416
|
+
|
|
417
|
+
def _validate_array(self, value, rules) -> tuple:
|
|
418
|
+
if not isinstance(value, list):
|
|
419
|
+
return False, None, "Must be an array"
|
|
420
|
+
return True, value, None
|
|
421
|
+
|
|
422
|
+
def _validate_object(self, value, rules) -> tuple:
|
|
423
|
+
if not isinstance(value, dict):
|
|
424
|
+
return False, None, "Must be an object"
|
|
425
|
+
return True, value, None
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
class SchemaEvolution:
|
|
429
|
+
"""Handle schema versioning and data migration."""
|
|
430
|
+
|
|
431
|
+
def __init__(self):
|
|
432
|
+
self.schemas = {}
|
|
433
|
+
self.migrations = {}
|
|
434
|
+
|
|
435
|
+
def register_schema(self, version: str, schema: Dict):
|
|
436
|
+
"""Register a schema version."""
|
|
437
|
+
self.schemas[version] = schema
|
|
438
|
+
|
|
439
|
+
def add_migration(
|
|
440
|
+
self,
|
|
441
|
+
from_version: str,
|
|
442
|
+
to_version: str,
|
|
443
|
+
migration_fn: callable
|
|
444
|
+
):
|
|
445
|
+
"""Add migration function between versions."""
|
|
446
|
+
key = f"{from_version}:{to_version}"
|
|
447
|
+
self.migrations[key] = migration_fn
|
|
448
|
+
|
|
449
|
+
def migrate_data(
|
|
450
|
+
self,
|
|
451
|
+
data: Dict,
|
|
452
|
+
from_version: str,
|
|
453
|
+
to_version: str
|
|
454
|
+
) -> Dict:
|
|
455
|
+
"""Migrate data between schema versions."""
|
|
456
|
+
key = f"{from_version}:{to_version}"
|
|
457
|
+
|
|
458
|
+
if key not in self.migrations:
|
|
459
|
+
raise ValueError(f"No migration path from {from_version} to {to_version}")
|
|
460
|
+
|
|
461
|
+
return self.migrations[key](data)
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
# Usage example
|
|
465
|
+
validator = DataValidator()
|
|
466
|
+
|
|
467
|
+
# Define schema
|
|
468
|
+
user_schema = validator.create_schema({
|
|
469
|
+
"username": {
|
|
470
|
+
"type": "string",
|
|
471
|
+
"required": True,
|
|
472
|
+
"min_length": 3,
|
|
473
|
+
"max_length": 50,
|
|
474
|
+
"pattern": r"^[a-zA-Z0-9_]+$"
|
|
475
|
+
},
|
|
476
|
+
"email": {
|
|
477
|
+
"type": "email",
|
|
478
|
+
"required": True
|
|
479
|
+
},
|
|
480
|
+
"age": {
|
|
481
|
+
"type": "integer",
|
|
482
|
+
"required": False,
|
|
483
|
+
"min_value": 13,
|
|
484
|
+
"max_value": 120
|
|
485
|
+
},
|
|
486
|
+
"website": {
|
|
487
|
+
"type": "url",
|
|
488
|
+
"required": False
|
|
489
|
+
}
|
|
490
|
+
})
|
|
491
|
+
|
|
492
|
+
# Validate data
|
|
493
|
+
user_data = {
|
|
494
|
+
"username": "john_doe",
|
|
495
|
+
"email": "JOHN@Example.COM",
|
|
496
|
+
"age": 25
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
result = validator.validate(user_data, user_schema)
|
|
500
|
+
|
|
501
|
+
if result.valid:
|
|
502
|
+
print("Valid data:", result.sanitized_data)
|
|
503
|
+
# {'username': 'john_doe', 'email': 'john@example.com', 'age': 25}
|
|
504
|
+
else:
|
|
505
|
+
print("Validation errors:", result.errors)
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
# Schema evolution example
|
|
509
|
+
evolution = SchemaEvolution()
|
|
510
|
+
|
|
511
|
+
v1_schema = {"name": {"type": "string"}, "age": {"type": "integer"}}
|
|
512
|
+
v2_schema = {"full_name": {"type": "string"}, "age": {"type": "integer"}, "email": {"type": "email"}}
|
|
513
|
+
|
|
514
|
+
evolution.register_schema("v1", v1_schema)
|
|
515
|
+
evolution.register_schema("v2", v2_schema)
|
|
516
|
+
|
|
517
|
+
def migrate_v1_to_v2(data: Dict) -> Dict:
|
|
518
|
+
return {
|
|
519
|
+
"full_name": data.get("name", ""),
|
|
520
|
+
"age": data.get("age", 0),
|
|
521
|
+
"email": None # New required field needs default
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
evolution.add_migration("v1", "v2", migrate_v1_to_v2)
|
|
525
|
+
|
|
526
|
+
# Migrate old data
|
|
527
|
+
old_data = {"name": "John Doe", "age": 30}
|
|
528
|
+
new_data = evolution.migrate_data(old_data, "v1", "v2")
|
|
529
|
+
# {'full_name': 'John Doe', 'age': 30, 'email': None}
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
**Explanation**: This pattern provides comprehensive data validation with type coercion, pattern matching, and schema evolution support for backward compatibility.
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## Common Patterns
|
|
537
|
+
|
|
538
|
+
### Pattern 1: Intelligent Caching with Format Optimization
|
|
539
|
+
|
|
540
|
+
```python
|
|
541
|
+
from functools import lru_cache
|
|
542
|
+
import hashlib
|
|
543
|
+
import time
|
|
544
|
+
|
|
545
|
+
class SmartCache:
|
|
546
|
+
"""Memory-aware caching with format optimization."""
|
|
547
|
+
|
|
548
|
+
def __init__(self, max_memory_mb: int = 50, max_items: int = 10000):
|
|
549
|
+
self.max_memory = max_memory_mb * 1024 * 1024
|
|
550
|
+
self.max_items = max_items
|
|
551
|
+
self.cache = {}
|
|
552
|
+
self.access_times = {}
|
|
553
|
+
self.sizes = {}
|
|
554
|
+
|
|
555
|
+
def _generate_key(self, data: dict) -> str:
|
|
556
|
+
"""Generate deterministic cache key."""
|
|
557
|
+
serialized = orjson.dumps(data, option=orjson.OPT_SORT_KEYS)
|
|
558
|
+
return hashlib.sha256(serialized).hexdigest()[:16]
|
|
559
|
+
|
|
560
|
+
def get(self, key: str) -> Any:
|
|
561
|
+
"""Get from cache with access tracking."""
|
|
562
|
+
if key in self.cache:
|
|
563
|
+
self.access_times[key] = time.time()
|
|
564
|
+
return self.cache[key]
|
|
565
|
+
return None
|
|
566
|
+
|
|
567
|
+
def set(self, key: str, value: Any, ttl: int = 3600):
|
|
568
|
+
"""Set cache with memory management."""
|
|
569
|
+
serialized = orjson.dumps(value)
|
|
570
|
+
size = len(serialized)
|
|
571
|
+
|
|
572
|
+
# Evict if needed
|
|
573
|
+
while self._total_size() + size > self.max_memory:
|
|
574
|
+
self._evict_lru()
|
|
575
|
+
|
|
576
|
+
self.cache[key] = value
|
|
577
|
+
self.sizes[key] = size
|
|
578
|
+
self.access_times[key] = time.time()
|
|
579
|
+
|
|
580
|
+
def _total_size(self) -> int:
|
|
581
|
+
return sum(self.sizes.values())
|
|
582
|
+
|
|
583
|
+
def _evict_lru(self):
|
|
584
|
+
"""Evict least recently used item."""
|
|
585
|
+
if not self.access_times:
|
|
586
|
+
return
|
|
587
|
+
|
|
588
|
+
oldest_key = min(self.access_times, key=self.access_times.get)
|
|
589
|
+
del self.cache[oldest_key]
|
|
590
|
+
del self.sizes[oldest_key]
|
|
591
|
+
del self.access_times[oldest_key]
|
|
592
|
+
|
|
593
|
+
def cache_result(self, ttl: int = 3600):
|
|
594
|
+
"""Decorator for caching function results."""
|
|
595
|
+
def decorator(func):
|
|
596
|
+
def wrapper(*args, **kwargs):
|
|
597
|
+
key = self._generate_key({"args": args, "kwargs": kwargs})
|
|
598
|
+
cached = self.get(key)
|
|
599
|
+
if cached is not None:
|
|
600
|
+
return cached
|
|
601
|
+
|
|
602
|
+
result = func(*args, **kwargs)
|
|
603
|
+
self.set(key, result, ttl)
|
|
604
|
+
return result
|
|
605
|
+
return wrapper
|
|
606
|
+
return decorator
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Pattern 2: Format Conversion Pipeline
|
|
610
|
+
|
|
611
|
+
```python
|
|
612
|
+
class FormatConverter:
|
|
613
|
+
"""Convert between different data formats."""
|
|
614
|
+
|
|
615
|
+
@staticmethod
|
|
616
|
+
def json_to_yaml(json_data: str) -> str:
|
|
617
|
+
"""Convert JSON to YAML."""
|
|
618
|
+
import yaml
|
|
619
|
+
data = orjson.loads(json_data)
|
|
620
|
+
return yaml.dump(data, default_flow_style=False, allow_unicode=True)
|
|
621
|
+
|
|
622
|
+
@staticmethod
|
|
623
|
+
def yaml_to_json(yaml_data: str) -> str:
|
|
624
|
+
"""Convert YAML to JSON."""
|
|
625
|
+
import yaml
|
|
626
|
+
data = yaml.safe_load(yaml_data)
|
|
627
|
+
return orjson.dumps(data).decode()
|
|
628
|
+
|
|
629
|
+
@staticmethod
|
|
630
|
+
def json_to_toon(json_data: str) -> str:
|
|
631
|
+
"""Convert JSON to TOON."""
|
|
632
|
+
data = orjson.loads(json_data)
|
|
633
|
+
encoder = TOONEncoder()
|
|
634
|
+
return encoder.encode(data)
|
|
635
|
+
|
|
636
|
+
@staticmethod
|
|
637
|
+
def csv_to_json(csv_data: str) -> str:
|
|
638
|
+
"""Convert CSV to JSON array."""
|
|
639
|
+
import csv
|
|
640
|
+
from io import StringIO
|
|
641
|
+
|
|
642
|
+
reader = csv.DictReader(StringIO(csv_data))
|
|
643
|
+
records = list(reader)
|
|
644
|
+
return orjson.dumps(records).decode()
|
|
645
|
+
|
|
646
|
+
# Usage
|
|
647
|
+
converter = FormatConverter()
|
|
648
|
+
|
|
649
|
+
json_data = '{"name": "John", "age": 30}'
|
|
650
|
+
yaml_output = converter.json_to_yaml(json_data)
|
|
651
|
+
toon_output = converter.json_to_toon(json_data)
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
### Pattern 3: Batch Validation with Error Aggregation
|
|
655
|
+
|
|
656
|
+
```python
|
|
657
|
+
def validate_batch(
|
|
658
|
+
items: list,
|
|
659
|
+
schema: dict,
|
|
660
|
+
stop_on_first_error: bool = False
|
|
661
|
+
) -> dict:
|
|
662
|
+
"""Validate a batch of items with aggregated results."""
|
|
663
|
+
validator = DataValidator()
|
|
664
|
+
results = {
|
|
665
|
+
"total": len(items),
|
|
666
|
+
"valid": 0,
|
|
667
|
+
"invalid": 0,
|
|
668
|
+
"errors": []
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
for index, item in enumerate(items):
|
|
672
|
+
result = validator.validate(item, schema)
|
|
673
|
+
|
|
674
|
+
if result.valid:
|
|
675
|
+
results["valid"] += 1
|
|
676
|
+
else:
|
|
677
|
+
results["invalid"] += 1
|
|
678
|
+
results["errors"].append({
|
|
679
|
+
"index": index,
|
|
680
|
+
"item": item,
|
|
681
|
+
"errors": result.errors
|
|
682
|
+
})
|
|
683
|
+
|
|
684
|
+
if stop_on_first_error:
|
|
685
|
+
break
|
|
686
|
+
|
|
687
|
+
return results
|
|
688
|
+
|
|
689
|
+
# Usage
|
|
690
|
+
items = [
|
|
691
|
+
{"username": "john", "email": "john@example.com"},
|
|
692
|
+
{"username": "ab", "email": "invalid"}, # Both fields invalid
|
|
693
|
+
{"username": "jane_doe", "email": "jane@example.com"}
|
|
694
|
+
]
|
|
695
|
+
|
|
696
|
+
batch_result = validate_batch(items, user_schema)
|
|
697
|
+
# {'total': 3, 'valid': 2, 'invalid': 1, 'errors': [...]}
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
## Anti-Patterns (Patterns to Avoid)
|
|
703
|
+
|
|
704
|
+
### Anti-Pattern 1: Loading Entire Files Into Memory
|
|
705
|
+
|
|
706
|
+
**Problem**: Loading large files completely causes memory exhaustion.
|
|
707
|
+
|
|
708
|
+
```python
|
|
709
|
+
# Incorrect approach
|
|
710
|
+
with open('huge_file.json', 'r') as f:
|
|
711
|
+
data = json.load(f) # Loads entire file into memory
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
**Solution**: Use streaming for large files.
|
|
715
|
+
|
|
716
|
+
```python
|
|
717
|
+
# Correct approach
|
|
718
|
+
import ijson
|
|
719
|
+
|
|
720
|
+
with open('huge_file.json', 'rb') as f:
|
|
721
|
+
for item in ijson.items(f, 'item'):
|
|
722
|
+
process(item) # Process one item at a time
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
### Anti-Pattern 2: Inconsistent Serialization
|
|
726
|
+
|
|
727
|
+
**Problem**: Different serialization methods produce inconsistent output.
|
|
728
|
+
|
|
729
|
+
```python
|
|
730
|
+
# Incorrect approach - inconsistent key ordering
|
|
731
|
+
json.dumps({"b": 2, "a": 1}) # '{"b": 2, "a": 1}' sometimes '{"a": 1, "b": 2}'
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
**Solution**: Use consistent serialization options.
|
|
735
|
+
|
|
736
|
+
```python
|
|
737
|
+
# Correct approach
|
|
738
|
+
orjson.dumps(data, option=orjson.OPT_SORT_KEYS)
|
|
739
|
+
# Always produces consistent, sorted output
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
### Anti-Pattern 3: No Validation Before Processing
|
|
743
|
+
|
|
744
|
+
**Problem**: Processing invalid data leads to runtime errors.
|
|
745
|
+
|
|
746
|
+
```python
|
|
747
|
+
# Incorrect approach
|
|
748
|
+
def process_user(user_data: dict):
|
|
749
|
+
email = user_data['email'].lower() # KeyError if missing
|
|
750
|
+
age = int(user_data['age']) # ValueError if not numeric
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
**Solution**: Validate before processing.
|
|
754
|
+
|
|
755
|
+
```python
|
|
756
|
+
# Correct approach
|
|
757
|
+
def process_user(user_data: dict):
|
|
758
|
+
result = validator.validate(user_data, user_schema)
|
|
759
|
+
if not result.valid:
|
|
760
|
+
raise ValidationError(result.errors)
|
|
761
|
+
|
|
762
|
+
data = result.sanitized_data
|
|
763
|
+
email = data['email'] # Already validated and sanitized
|
|
764
|
+
age = data['age'] # Already converted to int
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
---
|
|
768
|
+
|
|
769
|
+
## Performance Benchmarks
|
|
770
|
+
|
|
771
|
+
```python
|
|
772
|
+
import time
|
|
773
|
+
|
|
774
|
+
def benchmark_serialization():
|
|
775
|
+
"""Compare serialization performance."""
|
|
776
|
+
data = {"users": [{"id": i, "name": f"User {i}"} for i in range(10000)]}
|
|
777
|
+
|
|
778
|
+
# Standard json
|
|
779
|
+
start = time.time()
|
|
780
|
+
for _ in range(100):
|
|
781
|
+
json.dumps(data)
|
|
782
|
+
json_time = time.time() - start
|
|
783
|
+
|
|
784
|
+
# orjson
|
|
785
|
+
start = time.time()
|
|
786
|
+
for _ in range(100):
|
|
787
|
+
orjson.dumps(data)
|
|
788
|
+
orjson_time = time.time() - start
|
|
789
|
+
|
|
790
|
+
# TOON
|
|
791
|
+
encoder = TOONEncoder()
|
|
792
|
+
start = time.time()
|
|
793
|
+
for _ in range(100):
|
|
794
|
+
encoder.encode(data)
|
|
795
|
+
toon_time = time.time() - start
|
|
796
|
+
|
|
797
|
+
print(f"json: {json_time:.3f}s") # ~2.5s
|
|
798
|
+
print(f"orjson: {orjson_time:.3f}s") # ~0.5s (5x faster)
|
|
799
|
+
print(f"TOON: {toon_time:.3f}s") # ~0.8s (with 40% smaller output)
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
---
|
|
803
|
+
|
|
804
|
+
*For additional patterns and format-specific optimizations, see the `modules/` directory.*
|