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,830 @@
|
|
|
1
|
+
# Database Domain Examples
|
|
2
|
+
|
|
3
|
+
Multishot prompting examples demonstrating practical database patterns covering PostgreSQL, MongoDB, Redis, and multi-database architectures.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Example 1: PostgreSQL Advanced Query Optimization
|
|
8
|
+
|
|
9
|
+
**Scenario**: Optimize a slow query for user analytics with proper indexing.
|
|
10
|
+
|
|
11
|
+
**Input**:
|
|
12
|
+
```sql
|
|
13
|
+
-- Slow query: Full table scan
|
|
14
|
+
SELECT u.id, u.name, u.email, COUNT(o.id) as order_count, SUM(o.total) as total_spent
|
|
15
|
+
FROM users u
|
|
16
|
+
LEFT JOIN orders o ON u.id = o.user_id
|
|
17
|
+
WHERE u.created_at > '2024-01-01'
|
|
18
|
+
AND u.status = 'active'
|
|
19
|
+
GROUP BY u.id
|
|
20
|
+
ORDER BY total_spent DESC
|
|
21
|
+
LIMIT 100;
|
|
22
|
+
|
|
23
|
+
-- Query takes 15+ seconds on 1M users, 5M orders
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Output**:
|
|
27
|
+
```sql
|
|
28
|
+
-- Step 1: Create optimized indexes
|
|
29
|
+
CREATE INDEX CONCURRENTLY idx_users_status_created
|
|
30
|
+
ON users (status, created_at DESC)
|
|
31
|
+
WHERE status = 'active';
|
|
32
|
+
|
|
33
|
+
CREATE INDEX CONCURRENTLY idx_orders_user_total
|
|
34
|
+
ON orders (user_id, total)
|
|
35
|
+
INCLUDE (id);
|
|
36
|
+
|
|
37
|
+
-- Step 2: Use materialized view for frequent analytics
|
|
38
|
+
CREATE MATERIALIZED VIEW user_order_stats AS
|
|
39
|
+
SELECT
|
|
40
|
+
u.id,
|
|
41
|
+
u.name,
|
|
42
|
+
u.email,
|
|
43
|
+
COUNT(o.id) as order_count,
|
|
44
|
+
COALESCE(SUM(o.total), 0) as total_spent,
|
|
45
|
+
MAX(o.created_at) as last_order_date
|
|
46
|
+
FROM users u
|
|
47
|
+
LEFT JOIN orders o ON u.id = o.user_id
|
|
48
|
+
WHERE u.status = 'active'
|
|
49
|
+
GROUP BY u.id, u.name, u.email;
|
|
50
|
+
|
|
51
|
+
CREATE UNIQUE INDEX idx_user_order_stats_id ON user_order_stats(id);
|
|
52
|
+
CREATE INDEX idx_user_order_stats_total ON user_order_stats(total_spent DESC);
|
|
53
|
+
|
|
54
|
+
-- Step 3: Refresh strategy
|
|
55
|
+
REFRESH MATERIALIZED VIEW CONCURRENTLY user_order_stats;
|
|
56
|
+
|
|
57
|
+
-- Step 4: Optimized query (now < 100ms)
|
|
58
|
+
SELECT id, name, email, order_count, total_spent
|
|
59
|
+
FROM user_order_stats
|
|
60
|
+
WHERE total_spent > 0
|
|
61
|
+
ORDER BY total_spent DESC
|
|
62
|
+
LIMIT 100;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Explanation**: The optimization combines partial indexes, materialized views, and covering indexes to reduce query time from 15 seconds to under 100ms.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Example 2: MongoDB Aggregation Pipeline for Analytics
|
|
70
|
+
|
|
71
|
+
**Scenario**: Build an analytics pipeline for e-commerce order analysis.
|
|
72
|
+
|
|
73
|
+
**Input**:
|
|
74
|
+
```python
|
|
75
|
+
from motor.motor_asyncio import AsyncIOMotorClient
|
|
76
|
+
from datetime import datetime, timedelta
|
|
77
|
+
|
|
78
|
+
# Sample order document structure
|
|
79
|
+
order_doc = {
|
|
80
|
+
"_id": "order_123",
|
|
81
|
+
"user_id": "user_456",
|
|
82
|
+
"status": "completed",
|
|
83
|
+
"items": [
|
|
84
|
+
{"product_id": "prod_1", "quantity": 2, "price": 29.99},
|
|
85
|
+
{"product_id": "prod_2", "quantity": 1, "price": 49.99}
|
|
86
|
+
],
|
|
87
|
+
"total": 109.97,
|
|
88
|
+
"created_at": datetime.utcnow(),
|
|
89
|
+
"shipping_address": {"city": "Seoul", "country": "KR"}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Output**:
|
|
94
|
+
```python
|
|
95
|
+
from motor.motor_asyncio import AsyncIOMotorClient
|
|
96
|
+
from datetime import datetime, timedelta
|
|
97
|
+
from typing import List, Dict
|
|
98
|
+
|
|
99
|
+
class OrderAnalytics:
|
|
100
|
+
def __init__(self, client: AsyncIOMotorClient):
|
|
101
|
+
self.db = client.ecommerce
|
|
102
|
+
self.orders = self.db.orders
|
|
103
|
+
|
|
104
|
+
async def setup_indexes(self):
|
|
105
|
+
"""Create optimized indexes for analytics queries."""
|
|
106
|
+
await self.orders.create_indexes([
|
|
107
|
+
{"keys": [("created_at", -1)]},
|
|
108
|
+
{"keys": [("user_id", 1), ("created_at", -1)]},
|
|
109
|
+
{"keys": [("status", 1), ("created_at", -1)]},
|
|
110
|
+
{"keys": [("shipping_address.country", 1), ("created_at", -1)]}
|
|
111
|
+
])
|
|
112
|
+
|
|
113
|
+
async def get_daily_revenue(
|
|
114
|
+
self,
|
|
115
|
+
start_date: datetime,
|
|
116
|
+
end_date: datetime
|
|
117
|
+
) -> List[Dict]:
|
|
118
|
+
"""Get daily revenue breakdown."""
|
|
119
|
+
pipeline = [
|
|
120
|
+
{
|
|
121
|
+
"$match": {
|
|
122
|
+
"status": "completed",
|
|
123
|
+
"created_at": {
|
|
124
|
+
"$gte": start_date,
|
|
125
|
+
"$lte": end_date
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"$group": {
|
|
131
|
+
"_id": {
|
|
132
|
+
"year": {"$year": "$created_at"},
|
|
133
|
+
"month": {"$month": "$created_at"},
|
|
134
|
+
"day": {"$dayOfMonth": "$created_at"}
|
|
135
|
+
},
|
|
136
|
+
"total_revenue": {"$sum": "$total"},
|
|
137
|
+
"order_count": {"$sum": 1},
|
|
138
|
+
"avg_order_value": {"$avg": "$total"}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"$sort": {"_id.year": 1, "_id.month": 1, "_id.day": 1}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"$project": {
|
|
146
|
+
"_id": 0,
|
|
147
|
+
"date": {
|
|
148
|
+
"$dateFromParts": {
|
|
149
|
+
"year": "$_id.year",
|
|
150
|
+
"month": "$_id.month",
|
|
151
|
+
"day": "$_id.day"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"total_revenue": {"$round": ["$total_revenue", 2]},
|
|
155
|
+
"order_count": 1,
|
|
156
|
+
"avg_order_value": {"$round": ["$avg_order_value", 2]}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
return await self.orders.aggregate(pipeline).to_list(None)
|
|
161
|
+
|
|
162
|
+
async def get_top_products(
|
|
163
|
+
self,
|
|
164
|
+
limit: int = 10,
|
|
165
|
+
days: int = 30
|
|
166
|
+
) -> List[Dict]:
|
|
167
|
+
"""Get top selling products."""
|
|
168
|
+
start_date = datetime.utcnow() - timedelta(days=days)
|
|
169
|
+
|
|
170
|
+
pipeline = [
|
|
171
|
+
{
|
|
172
|
+
"$match": {
|
|
173
|
+
"status": "completed",
|
|
174
|
+
"created_at": {"$gte": start_date}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
{"$unwind": "$items"},
|
|
178
|
+
{
|
|
179
|
+
"$group": {
|
|
180
|
+
"_id": "$items.product_id",
|
|
181
|
+
"total_quantity": {"$sum": "$items.quantity"},
|
|
182
|
+
"total_revenue": {
|
|
183
|
+
"$sum": {
|
|
184
|
+
"$multiply": ["$items.quantity", "$items.price"]
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"order_count": {"$sum": 1}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
{"$sort": {"total_revenue": -1}},
|
|
191
|
+
{"$limit": limit},
|
|
192
|
+
{
|
|
193
|
+
"$lookup": {
|
|
194
|
+
"from": "products",
|
|
195
|
+
"localField": "_id",
|
|
196
|
+
"foreignField": "_id",
|
|
197
|
+
"as": "product_info"
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"$project": {
|
|
202
|
+
"product_id": "$_id",
|
|
203
|
+
"product_name": {"$arrayElemAt": ["$product_info.name", 0]},
|
|
204
|
+
"total_quantity": 1,
|
|
205
|
+
"total_revenue": {"$round": ["$total_revenue", 2]},
|
|
206
|
+
"order_count": 1
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
return await self.orders.aggregate(pipeline).to_list(None)
|
|
211
|
+
|
|
212
|
+
async def get_customer_segments(self) -> List[Dict]:
|
|
213
|
+
"""Segment customers by order frequency and value."""
|
|
214
|
+
pipeline = [
|
|
215
|
+
{"$match": {"status": "completed"}},
|
|
216
|
+
{
|
|
217
|
+
"$group": {
|
|
218
|
+
"_id": "$user_id",
|
|
219
|
+
"total_orders": {"$sum": 1},
|
|
220
|
+
"total_spent": {"$sum": "$total"},
|
|
221
|
+
"avg_order_value": {"$avg": "$total"},
|
|
222
|
+
"first_order": {"$min": "$created_at"},
|
|
223
|
+
"last_order": {"$max": "$created_at"}
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"$addFields": {
|
|
228
|
+
"segment": {
|
|
229
|
+
"$switch": {
|
|
230
|
+
"branches": [
|
|
231
|
+
{
|
|
232
|
+
"case": {
|
|
233
|
+
"$and": [
|
|
234
|
+
{"$gte": ["$total_orders", 10]},
|
|
235
|
+
{"$gte": ["$total_spent", 1000]}
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
"then": "VIP"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"case": {
|
|
242
|
+
"$and": [
|
|
243
|
+
{"$gte": ["$total_orders", 5]},
|
|
244
|
+
{"$gte": ["$total_spent", 500]}
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"then": "Loyal"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"case": {"$gte": ["$total_orders", 2]},
|
|
251
|
+
"then": "Repeat"
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"default": "New"
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"$group": {
|
|
261
|
+
"_id": "$segment",
|
|
262
|
+
"customer_count": {"$sum": 1},
|
|
263
|
+
"total_revenue": {"$sum": "$total_spent"},
|
|
264
|
+
"avg_orders": {"$avg": "$total_orders"},
|
|
265
|
+
"avg_spent": {"$avg": "$total_spent"}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
{"$sort": {"total_revenue": -1}}
|
|
269
|
+
]
|
|
270
|
+
return await self.orders.aggregate(pipeline).to_list(None)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Explanation**: This pattern demonstrates MongoDB aggregation pipelines for complex analytics with proper indexing, customer segmentation, and revenue analysis.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Example 3: Redis Multi-Layer Caching Strategy
|
|
278
|
+
|
|
279
|
+
**Scenario**: Implement a sophisticated caching strategy with different TTLs and cache invalidation.
|
|
280
|
+
|
|
281
|
+
**Input**:
|
|
282
|
+
```python
|
|
283
|
+
import redis.asyncio as redis
|
|
284
|
+
from typing import Optional, Any
|
|
285
|
+
from dataclasses import dataclass
|
|
286
|
+
|
|
287
|
+
@dataclass
|
|
288
|
+
class CacheConfig:
|
|
289
|
+
host: str = "localhost"
|
|
290
|
+
port: int = 6379
|
|
291
|
+
db: int = 0
|
|
292
|
+
default_ttl: int = 3600
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Output**:
|
|
296
|
+
```python
|
|
297
|
+
import redis.asyncio as redis
|
|
298
|
+
from typing import Optional, Any, Callable
|
|
299
|
+
from dataclasses import dataclass
|
|
300
|
+
from functools import wraps
|
|
301
|
+
import json
|
|
302
|
+
import hashlib
|
|
303
|
+
import logging
|
|
304
|
+
|
|
305
|
+
logger = logging.getLogger(__name__)
|
|
306
|
+
|
|
307
|
+
@dataclass
|
|
308
|
+
class CacheConfig:
|
|
309
|
+
host: str = "localhost"
|
|
310
|
+
port: int = 6379
|
|
311
|
+
db: int = 0
|
|
312
|
+
default_ttl: int = 3600
|
|
313
|
+
|
|
314
|
+
class CacheLayer:
|
|
315
|
+
"""Multi-layer caching with different TTL strategies."""
|
|
316
|
+
|
|
317
|
+
# Cache TTL by layer
|
|
318
|
+
LAYER_TTL = {
|
|
319
|
+
"hot": 60, # 1 minute - frequently accessed
|
|
320
|
+
"warm": 300, # 5 minutes - moderately accessed
|
|
321
|
+
"cold": 3600, # 1 hour - rarely accessed
|
|
322
|
+
"persistent": 86400 # 24 hours - static data
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
def __init__(self, config: CacheConfig):
|
|
326
|
+
self.redis = redis.Redis(
|
|
327
|
+
host=config.host,
|
|
328
|
+
port=config.port,
|
|
329
|
+
db=config.db,
|
|
330
|
+
decode_responses=True
|
|
331
|
+
)
|
|
332
|
+
self.default_ttl = config.default_ttl
|
|
333
|
+
|
|
334
|
+
def _generate_key(
|
|
335
|
+
self,
|
|
336
|
+
prefix: str,
|
|
337
|
+
*args,
|
|
338
|
+
**kwargs
|
|
339
|
+
) -> str:
|
|
340
|
+
"""Generate consistent cache key."""
|
|
341
|
+
key_data = f"{args}:{sorted(kwargs.items())}"
|
|
342
|
+
key_hash = hashlib.md5(key_data.encode()).hexdigest()[:8]
|
|
343
|
+
return f"{prefix}:{key_hash}"
|
|
344
|
+
|
|
345
|
+
async def get(self, key: str) -> Optional[Any]:
|
|
346
|
+
"""Get value from cache."""
|
|
347
|
+
value = await self.redis.get(key)
|
|
348
|
+
if value:
|
|
349
|
+
return json.loads(value)
|
|
350
|
+
return None
|
|
351
|
+
|
|
352
|
+
async def set(
|
|
353
|
+
self,
|
|
354
|
+
key: str,
|
|
355
|
+
value: Any,
|
|
356
|
+
layer: str = "warm"
|
|
357
|
+
):
|
|
358
|
+
"""Set value in cache with layer-specific TTL."""
|
|
359
|
+
ttl = self.LAYER_TTL.get(layer, self.default_ttl)
|
|
360
|
+
await self.redis.setex(
|
|
361
|
+
key,
|
|
362
|
+
ttl,
|
|
363
|
+
json.dumps(value, default=str)
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
async def delete(self, key: str):
|
|
367
|
+
"""Delete specific key."""
|
|
368
|
+
await self.redis.delete(key)
|
|
369
|
+
|
|
370
|
+
async def delete_pattern(self, pattern: str):
|
|
371
|
+
"""Delete all keys matching pattern."""
|
|
372
|
+
cursor = 0
|
|
373
|
+
while True:
|
|
374
|
+
cursor, keys = await self.redis.scan(
|
|
375
|
+
cursor=cursor,
|
|
376
|
+
match=pattern,
|
|
377
|
+
count=100
|
|
378
|
+
)
|
|
379
|
+
if keys:
|
|
380
|
+
await self.redis.delete(*keys)
|
|
381
|
+
if cursor == 0:
|
|
382
|
+
break
|
|
383
|
+
|
|
384
|
+
def cached(
|
|
385
|
+
self,
|
|
386
|
+
prefix: str,
|
|
387
|
+
layer: str = "warm"
|
|
388
|
+
):
|
|
389
|
+
"""Decorator for caching function results."""
|
|
390
|
+
def decorator(func: Callable):
|
|
391
|
+
@wraps(func)
|
|
392
|
+
async def wrapper(*args, **kwargs):
|
|
393
|
+
cache_key = self._generate_key(prefix, *args, **kwargs)
|
|
394
|
+
|
|
395
|
+
# Try cache first
|
|
396
|
+
cached_value = await self.get(cache_key)
|
|
397
|
+
if cached_value is not None:
|
|
398
|
+
logger.debug(f"Cache hit: {cache_key}")
|
|
399
|
+
return cached_value
|
|
400
|
+
|
|
401
|
+
# Execute function
|
|
402
|
+
result = await func(*args, **kwargs)
|
|
403
|
+
|
|
404
|
+
# Cache result
|
|
405
|
+
if result is not None:
|
|
406
|
+
await self.set(cache_key, result, layer)
|
|
407
|
+
logger.debug(f"Cache set: {cache_key}")
|
|
408
|
+
|
|
409
|
+
return result
|
|
410
|
+
return wrapper
|
|
411
|
+
return decorator
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
class UserCacheService:
|
|
415
|
+
"""User-specific caching with invalidation patterns."""
|
|
416
|
+
|
|
417
|
+
def __init__(self, cache: CacheLayer, db_session):
|
|
418
|
+
self.cache = cache
|
|
419
|
+
self.db = db_session
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def _prefix(self) -> str:
|
|
423
|
+
return "user"
|
|
424
|
+
|
|
425
|
+
async def get_user(self, user_id: int) -> Optional[dict]:
|
|
426
|
+
"""Get user with caching."""
|
|
427
|
+
cache_key = f"{self._prefix}:{user_id}"
|
|
428
|
+
|
|
429
|
+
# Check cache
|
|
430
|
+
cached = await self.cache.get(cache_key)
|
|
431
|
+
if cached:
|
|
432
|
+
return cached
|
|
433
|
+
|
|
434
|
+
# Query database
|
|
435
|
+
user = await self.db.get_user(user_id)
|
|
436
|
+
if user:
|
|
437
|
+
await self.cache.set(cache_key, user.to_dict(), "warm")
|
|
438
|
+
|
|
439
|
+
return user.to_dict() if user else None
|
|
440
|
+
|
|
441
|
+
async def get_user_profile(self, user_id: int) -> Optional[dict]:
|
|
442
|
+
"""Get full user profile (cold cache for expensive queries)."""
|
|
443
|
+
cache_key = f"{self._prefix}:profile:{user_id}"
|
|
444
|
+
|
|
445
|
+
cached = await self.cache.get(cache_key)
|
|
446
|
+
if cached:
|
|
447
|
+
return cached
|
|
448
|
+
|
|
449
|
+
# Expensive query with joins
|
|
450
|
+
profile = await self.db.get_full_profile(user_id)
|
|
451
|
+
if profile:
|
|
452
|
+
await self.cache.set(cache_key, profile, "cold")
|
|
453
|
+
|
|
454
|
+
return profile
|
|
455
|
+
|
|
456
|
+
async def update_user(self, user_id: int, data: dict) -> dict:
|
|
457
|
+
"""Update user and invalidate related caches."""
|
|
458
|
+
# Update database
|
|
459
|
+
user = await self.db.update_user(user_id, data)
|
|
460
|
+
|
|
461
|
+
# Invalidate caches
|
|
462
|
+
await self.cache.delete(f"{self._prefix}:{user_id}")
|
|
463
|
+
await self.cache.delete(f"{self._prefix}:profile:{user_id}")
|
|
464
|
+
await self.cache.delete_pattern(f"users:list:*")
|
|
465
|
+
|
|
466
|
+
return user.to_dict()
|
|
467
|
+
|
|
468
|
+
async def get_active_users_count(self) -> int:
|
|
469
|
+
"""Get count with hot cache (frequently accessed)."""
|
|
470
|
+
cache_key = "users:count:active"
|
|
471
|
+
|
|
472
|
+
cached = await self.cache.get(cache_key)
|
|
473
|
+
if cached is not None:
|
|
474
|
+
return cached
|
|
475
|
+
|
|
476
|
+
count = await self.db.count_active_users()
|
|
477
|
+
await self.cache.set(cache_key, count, "hot")
|
|
478
|
+
|
|
479
|
+
return count
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
class DistributedLock:
|
|
483
|
+
"""Redis-based distributed locking."""
|
|
484
|
+
|
|
485
|
+
def __init__(self, redis_client: redis.Redis):
|
|
486
|
+
self.redis = redis_client
|
|
487
|
+
|
|
488
|
+
async def acquire(
|
|
489
|
+
self,
|
|
490
|
+
lock_name: str,
|
|
491
|
+
timeout: int = 10,
|
|
492
|
+
blocking: bool = True,
|
|
493
|
+
block_timeout: int = 5
|
|
494
|
+
) -> Optional[str]:
|
|
495
|
+
"""Acquire a distributed lock."""
|
|
496
|
+
import uuid
|
|
497
|
+
lock_id = str(uuid.uuid4())
|
|
498
|
+
lock_key = f"lock:{lock_name}"
|
|
499
|
+
|
|
500
|
+
if blocking:
|
|
501
|
+
end_time = asyncio.get_event_loop().time() + block_timeout
|
|
502
|
+
while asyncio.get_event_loop().time() < end_time:
|
|
503
|
+
acquired = await self.redis.set(
|
|
504
|
+
lock_key,
|
|
505
|
+
lock_id,
|
|
506
|
+
nx=True,
|
|
507
|
+
ex=timeout
|
|
508
|
+
)
|
|
509
|
+
if acquired:
|
|
510
|
+
return lock_id
|
|
511
|
+
await asyncio.sleep(0.1)
|
|
512
|
+
return None
|
|
513
|
+
else:
|
|
514
|
+
acquired = await self.redis.set(
|
|
515
|
+
lock_key,
|
|
516
|
+
lock_id,
|
|
517
|
+
nx=True,
|
|
518
|
+
ex=timeout
|
|
519
|
+
)
|
|
520
|
+
return lock_id if acquired else None
|
|
521
|
+
|
|
522
|
+
async def release(self, lock_name: str, lock_id: str) -> bool:
|
|
523
|
+
"""Release a distributed lock."""
|
|
524
|
+
lock_key = f"lock:{lock_name}"
|
|
525
|
+
|
|
526
|
+
# Lua script for atomic check-and-delete
|
|
527
|
+
script = """
|
|
528
|
+
if redis.call("get", KEYS[1]) == ARGV[1] then
|
|
529
|
+
return redis.call("del", KEYS[1])
|
|
530
|
+
else
|
|
531
|
+
return 0
|
|
532
|
+
end
|
|
533
|
+
"""
|
|
534
|
+
result = await self.redis.eval(script, 1, lock_key, lock_id)
|
|
535
|
+
return result == 1
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**Explanation**: This pattern demonstrates multi-layer caching with different TTLs, cache invalidation strategies, and distributed locking for concurrent access control.
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
## Common Patterns
|
|
543
|
+
|
|
544
|
+
### Pattern 1: Polyglot Persistence
|
|
545
|
+
|
|
546
|
+
Use the right database for each use case:
|
|
547
|
+
|
|
548
|
+
```python
|
|
549
|
+
class DataRouter:
|
|
550
|
+
"""Route data to appropriate database based on access pattern."""
|
|
551
|
+
|
|
552
|
+
def __init__(
|
|
553
|
+
self,
|
|
554
|
+
postgres: AsyncSession,
|
|
555
|
+
mongodb: AsyncIOMotorClient,
|
|
556
|
+
redis: redis.Redis
|
|
557
|
+
):
|
|
558
|
+
self.postgres = postgres # Relational data
|
|
559
|
+
self.mongodb = mongodb # Document data
|
|
560
|
+
self.redis = redis # Real-time data
|
|
561
|
+
|
|
562
|
+
async def get_user_complete(self, user_id: int) -> dict:
|
|
563
|
+
"""Aggregate data from multiple databases."""
|
|
564
|
+
|
|
565
|
+
# Structured user data from PostgreSQL
|
|
566
|
+
user = await self.postgres.execute(
|
|
567
|
+
select(User).where(User.id == user_id)
|
|
568
|
+
)
|
|
569
|
+
user_data = user.scalar_one_or_none()
|
|
570
|
+
|
|
571
|
+
if not user_data:
|
|
572
|
+
return None
|
|
573
|
+
|
|
574
|
+
# Flexible profile from MongoDB
|
|
575
|
+
profile = await self.mongodb.profiles.find_one(
|
|
576
|
+
{"user_id": str(user_id)}
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
# Real-time status from Redis
|
|
580
|
+
status = await self.redis.hgetall(f"user:status:{user_id}")
|
|
581
|
+
|
|
582
|
+
return {
|
|
583
|
+
"user": user_data.to_dict(),
|
|
584
|
+
"profile": profile,
|
|
585
|
+
"status": status
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
async def save_activity(self, user_id: int, activity: dict):
|
|
589
|
+
"""Save activity to appropriate store."""
|
|
590
|
+
|
|
591
|
+
# High-frequency real-time counter in Redis
|
|
592
|
+
await self.redis.hincrby(
|
|
593
|
+
f"user:activity:{user_id}",
|
|
594
|
+
"page_views",
|
|
595
|
+
1
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
# Activity log in MongoDB (flexible schema)
|
|
599
|
+
await self.mongodb.activities.insert_one({
|
|
600
|
+
"user_id": str(user_id),
|
|
601
|
+
**activity,
|
|
602
|
+
"timestamp": datetime.utcnow()
|
|
603
|
+
})
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
### Pattern 2: Connection Pool Management
|
|
607
|
+
|
|
608
|
+
```python
|
|
609
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
610
|
+
from motor.motor_asyncio import AsyncIOMotorClient
|
|
611
|
+
import redis.asyncio as redis
|
|
612
|
+
|
|
613
|
+
class DatabasePool:
|
|
614
|
+
"""Manage database connection pools."""
|
|
615
|
+
|
|
616
|
+
_instance = None
|
|
617
|
+
|
|
618
|
+
def __new__(cls):
|
|
619
|
+
if cls._instance is None:
|
|
620
|
+
cls._instance = super().__new__(cls)
|
|
621
|
+
return cls._instance
|
|
622
|
+
|
|
623
|
+
def __init__(self):
|
|
624
|
+
if hasattr(self, '_initialized'):
|
|
625
|
+
return
|
|
626
|
+
self._initialized = True
|
|
627
|
+
|
|
628
|
+
# PostgreSQL pool
|
|
629
|
+
self.postgres = create_async_engine(
|
|
630
|
+
DATABASE_URL,
|
|
631
|
+
pool_size=20,
|
|
632
|
+
max_overflow=30,
|
|
633
|
+
pool_pre_ping=True,
|
|
634
|
+
pool_recycle=3600
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
# MongoDB connection
|
|
638
|
+
self.mongodb = AsyncIOMotorClient(
|
|
639
|
+
MONGODB_URL,
|
|
640
|
+
maxPoolSize=50,
|
|
641
|
+
minPoolSize=10
|
|
642
|
+
)
|
|
643
|
+
|
|
644
|
+
# Redis pool
|
|
645
|
+
self.redis = redis.ConnectionPool.from_url(
|
|
646
|
+
REDIS_URL,
|
|
647
|
+
max_connections=100
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
async def health_check(self) -> dict:
|
|
651
|
+
"""Check all database connections."""
|
|
652
|
+
results = {}
|
|
653
|
+
|
|
654
|
+
# PostgreSQL
|
|
655
|
+
try:
|
|
656
|
+
async with self.postgres.connect() as conn:
|
|
657
|
+
await conn.execute("SELECT 1")
|
|
658
|
+
results["postgres"] = "healthy"
|
|
659
|
+
except Exception as e:
|
|
660
|
+
results["postgres"] = f"unhealthy: {e}"
|
|
661
|
+
|
|
662
|
+
# MongoDB
|
|
663
|
+
try:
|
|
664
|
+
await self.mongodb.admin.command("ping")
|
|
665
|
+
results["mongodb"] = "healthy"
|
|
666
|
+
except Exception as e:
|
|
667
|
+
results["mongodb"] = f"unhealthy: {e}"
|
|
668
|
+
|
|
669
|
+
# Redis
|
|
670
|
+
try:
|
|
671
|
+
r = redis.Redis(connection_pool=self.redis)
|
|
672
|
+
await r.ping()
|
|
673
|
+
results["redis"] = "healthy"
|
|
674
|
+
except Exception as e:
|
|
675
|
+
results["redis"] = f"unhealthy: {e}"
|
|
676
|
+
|
|
677
|
+
return results
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
### Pattern 3: Database Migration Strategy
|
|
681
|
+
|
|
682
|
+
```python
|
|
683
|
+
from alembic import command
|
|
684
|
+
from alembic.config import Config
|
|
685
|
+
|
|
686
|
+
class MigrationManager:
|
|
687
|
+
"""Manage database migrations safely."""
|
|
688
|
+
|
|
689
|
+
def __init__(self, alembic_cfg_path: str):
|
|
690
|
+
self.alembic_cfg = Config(alembic_cfg_path)
|
|
691
|
+
|
|
692
|
+
def upgrade(self, revision: str = "head"):
|
|
693
|
+
"""Apply pending migrations."""
|
|
694
|
+
command.upgrade(self.alembic_cfg, revision)
|
|
695
|
+
|
|
696
|
+
def downgrade(self, revision: str):
|
|
697
|
+
"""Rollback to specific revision."""
|
|
698
|
+
command.downgrade(self.alembic_cfg, revision)
|
|
699
|
+
|
|
700
|
+
def create_migration(self, message: str):
|
|
701
|
+
"""Auto-generate migration from model changes."""
|
|
702
|
+
command.revision(
|
|
703
|
+
self.alembic_cfg,
|
|
704
|
+
message=message,
|
|
705
|
+
autogenerate=True
|
|
706
|
+
)
|
|
707
|
+
|
|
708
|
+
def current(self) -> str:
|
|
709
|
+
"""Get current migration revision."""
|
|
710
|
+
return command.current(self.alembic_cfg)
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
---
|
|
714
|
+
|
|
715
|
+
## Anti-Patterns (Patterns to Avoid)
|
|
716
|
+
|
|
717
|
+
### Anti-Pattern 1: Missing Database Indexes
|
|
718
|
+
|
|
719
|
+
**Problem**: Queries without proper indexes cause full table scans.
|
|
720
|
+
|
|
721
|
+
```python
|
|
722
|
+
# Incorrect approach - no index consideration
|
|
723
|
+
async def find_users_by_email(email: str):
|
|
724
|
+
return await session.execute(
|
|
725
|
+
select(User).where(User.email == email)
|
|
726
|
+
)
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
**Solution**: Create appropriate indexes.
|
|
730
|
+
|
|
731
|
+
```sql
|
|
732
|
+
-- Correct approach - add index
|
|
733
|
+
CREATE UNIQUE INDEX idx_users_email ON users (email);
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
```python
|
|
737
|
+
# And verify query uses index
|
|
738
|
+
async def find_users_by_email(email: str):
|
|
739
|
+
# This will now use the index
|
|
740
|
+
return await session.execute(
|
|
741
|
+
select(User).where(User.email == email)
|
|
742
|
+
)
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
### Anti-Pattern 2: Ignoring Connection Limits
|
|
746
|
+
|
|
747
|
+
**Problem**: Opening unlimited database connections.
|
|
748
|
+
|
|
749
|
+
```python
|
|
750
|
+
# Incorrect approach - new connection per request
|
|
751
|
+
async def get_data():
|
|
752
|
+
engine = create_async_engine(DATABASE_URL)
|
|
753
|
+
async with engine.connect() as conn:
|
|
754
|
+
return await conn.execute(query)
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**Solution**: Use connection pooling.
|
|
758
|
+
|
|
759
|
+
```python
|
|
760
|
+
# Correct approach - shared connection pool
|
|
761
|
+
engine = create_async_engine(
|
|
762
|
+
DATABASE_URL,
|
|
763
|
+
pool_size=20,
|
|
764
|
+
max_overflow=10
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
async def get_data():
|
|
768
|
+
async with engine.connect() as conn:
|
|
769
|
+
return await conn.execute(query)
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
### Anti-Pattern 3: Caching Without Invalidation
|
|
773
|
+
|
|
774
|
+
**Problem**: Stale data in cache after updates.
|
|
775
|
+
|
|
776
|
+
```python
|
|
777
|
+
# Incorrect approach - cache without invalidation
|
|
778
|
+
async def update_user(user_id: int, data: dict):
|
|
779
|
+
await db.update_user(user_id, data)
|
|
780
|
+
# Cache still has old data!
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
**Solution**: Always invalidate cache on updates.
|
|
784
|
+
|
|
785
|
+
```python
|
|
786
|
+
# Correct approach - invalidate on update
|
|
787
|
+
async def update_user(user_id: int, data: dict):
|
|
788
|
+
await db.update_user(user_id, data)
|
|
789
|
+
|
|
790
|
+
# Invalidate related caches
|
|
791
|
+
await cache.delete(f"user:{user_id}")
|
|
792
|
+
await cache.delete(f"user:profile:{user_id}")
|
|
793
|
+
await cache.delete_pattern("users:list:*")
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
---
|
|
797
|
+
|
|
798
|
+
## Performance Benchmarks
|
|
799
|
+
|
|
800
|
+
### Query Performance Comparison
|
|
801
|
+
|
|
802
|
+
```python
|
|
803
|
+
# Before optimization: 15,000ms
|
|
804
|
+
# After indexing: 150ms
|
|
805
|
+
# With materialized view: 15ms
|
|
806
|
+
# With Redis cache: 1ms
|
|
807
|
+
|
|
808
|
+
async def benchmark_user_analytics():
|
|
809
|
+
import time
|
|
810
|
+
|
|
811
|
+
# Cold query (no cache)
|
|
812
|
+
start = time.time()
|
|
813
|
+
result = await get_user_analytics_no_cache(user_id=1)
|
|
814
|
+
cold_time = time.time() - start
|
|
815
|
+
|
|
816
|
+
# Warm query (cached)
|
|
817
|
+
start = time.time()
|
|
818
|
+
result = await get_user_analytics_cached(user_id=1)
|
|
819
|
+
warm_time = time.time() - start
|
|
820
|
+
|
|
821
|
+
return {
|
|
822
|
+
"cold_query_ms": cold_time * 1000,
|
|
823
|
+
"warm_query_ms": warm_time * 1000,
|
|
824
|
+
"speedup_factor": cold_time / warm_time
|
|
825
|
+
}
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
---
|
|
829
|
+
|
|
830
|
+
*For additional patterns and database-specific optimizations, see the `modules/` directory.*
|