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
|
+
# Python 3.13+ Complete Reference
|
|
2
|
+
|
|
3
|
+
## Language Features Reference
|
|
4
|
+
|
|
5
|
+
### Python 3.13 Feature Matrix
|
|
6
|
+
|
|
7
|
+
| Feature | Status | PEP | Production Ready |
|
|
8
|
+
|---------|--------|-----|------------------|
|
|
9
|
+
| JIT Compiler | Experimental | PEP 744 | No |
|
|
10
|
+
| Free Threading (GIL-free) | Experimental | PEP 703 | No |
|
|
11
|
+
| Pattern Matching | Stable | PEP 634-636 | Yes |
|
|
12
|
+
| Type Parameter Syntax | Stable | PEP 695 | Yes |
|
|
13
|
+
| Exception Groups | Stable | PEP 654 | Yes |
|
|
14
|
+
|
|
15
|
+
### JIT Compiler Details (PEP 744)
|
|
16
|
+
|
|
17
|
+
Build Configuration:
|
|
18
|
+
```bash
|
|
19
|
+
# Build Python with JIT support
|
|
20
|
+
./configure --enable-experimental-jit
|
|
21
|
+
make
|
|
22
|
+
|
|
23
|
+
# Or with "disabled by default" mode
|
|
24
|
+
./configure --enable-experimental-jit=yes-off
|
|
25
|
+
make
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Runtime Activation:
|
|
29
|
+
```bash
|
|
30
|
+
# Enable JIT at runtime
|
|
31
|
+
PYTHON_JIT=1 python my_script.py
|
|
32
|
+
|
|
33
|
+
# With debugging info
|
|
34
|
+
PYTHON_JIT=1 PYTHON_JIT_DEBUG=1 python my_script.py
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Expected Benefits:
|
|
38
|
+
- 5-10% performance improvement for CPU-bound code
|
|
39
|
+
- Better optimization for hot loops
|
|
40
|
+
- Future foundation for more aggressive optimizations
|
|
41
|
+
|
|
42
|
+
### Free Threading (PEP 703)
|
|
43
|
+
|
|
44
|
+
Installation:
|
|
45
|
+
```bash
|
|
46
|
+
# macOS/Windows: Use official installers with free-threaded option
|
|
47
|
+
# Linux: Build from source
|
|
48
|
+
./configure --disable-gil
|
|
49
|
+
make
|
|
50
|
+
|
|
51
|
+
# Verify installation
|
|
52
|
+
python3.13t -c "import sys; print(sys._is_gil_enabled())"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Thread-Safe Patterns:
|
|
56
|
+
```python
|
|
57
|
+
import threading
|
|
58
|
+
from queue import Queue
|
|
59
|
+
|
|
60
|
+
def parallel_processing(items: list[str], workers: int = 4) -> list[str]:
|
|
61
|
+
results = Queue()
|
|
62
|
+
threads = []
|
|
63
|
+
|
|
64
|
+
def worker(chunk: list[str]):
|
|
65
|
+
for item in chunk:
|
|
66
|
+
processed = heavy_computation(item)
|
|
67
|
+
results.put(processed)
|
|
68
|
+
|
|
69
|
+
chunk_size = len(items) // workers
|
|
70
|
+
for i in range(workers):
|
|
71
|
+
start = i * chunk_size
|
|
72
|
+
end = start + chunk_size if i < workers - 1 else len(items)
|
|
73
|
+
t = threading.Thread(target=worker, args=(items[start:end],))
|
|
74
|
+
threads.append(t)
|
|
75
|
+
t.start()
|
|
76
|
+
|
|
77
|
+
for t in threads:
|
|
78
|
+
t.join()
|
|
79
|
+
|
|
80
|
+
return [results.get() for _ in range(results.qsize())]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Pattern Matching Complete Guide
|
|
84
|
+
|
|
85
|
+
Literal Patterns:
|
|
86
|
+
```python
|
|
87
|
+
def http_status(status: int) -> str:
|
|
88
|
+
match status:
|
|
89
|
+
case 200:
|
|
90
|
+
return "OK"
|
|
91
|
+
case 201:
|
|
92
|
+
return "Created"
|
|
93
|
+
case 400:
|
|
94
|
+
return "Bad Request"
|
|
95
|
+
case 404:
|
|
96
|
+
return "Not Found"
|
|
97
|
+
case 500:
|
|
98
|
+
return "Internal Server Error"
|
|
99
|
+
case _:
|
|
100
|
+
return f"Unknown status: {status}"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Structural Patterns:
|
|
104
|
+
```python
|
|
105
|
+
def process_event(event: dict) -> None:
|
|
106
|
+
match event:
|
|
107
|
+
case {"type": "click", "x": x, "y": y}:
|
|
108
|
+
handle_click(x, y)
|
|
109
|
+
case {"type": "keypress", "key": key, "modifiers": [*mods]}:
|
|
110
|
+
handle_keypress(key, mods)
|
|
111
|
+
case {"type": "scroll", "delta": delta, **rest}:
|
|
112
|
+
handle_scroll(delta, rest)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Class Patterns:
|
|
116
|
+
```python
|
|
117
|
+
from dataclasses import dataclass
|
|
118
|
+
|
|
119
|
+
@dataclass
|
|
120
|
+
class Point:
|
|
121
|
+
x: float
|
|
122
|
+
y: float
|
|
123
|
+
|
|
124
|
+
@dataclass
|
|
125
|
+
class Circle:
|
|
126
|
+
center: Point
|
|
127
|
+
radius: float
|
|
128
|
+
|
|
129
|
+
@dataclass
|
|
130
|
+
class Rectangle:
|
|
131
|
+
top_left: Point
|
|
132
|
+
width: float
|
|
133
|
+
height: float
|
|
134
|
+
|
|
135
|
+
def area(shape) -> float:
|
|
136
|
+
match shape:
|
|
137
|
+
case Circle(center=_, radius=r):
|
|
138
|
+
return 3.14159 * r ** 2
|
|
139
|
+
case Rectangle(width=w, height=h):
|
|
140
|
+
return w * h
|
|
141
|
+
case Point():
|
|
142
|
+
return 0.0
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Guard Clauses:
|
|
146
|
+
```python
|
|
147
|
+
def validate_user(user: dict) -> str:
|
|
148
|
+
match user:
|
|
149
|
+
case {"age": age} if age < 0:
|
|
150
|
+
return "Invalid age"
|
|
151
|
+
case {"age": age} if age < 18:
|
|
152
|
+
return "Minor"
|
|
153
|
+
case {"age": age, "verified": True} if age >= 18:
|
|
154
|
+
return "Verified adult"
|
|
155
|
+
case {"age": age} if age >= 18:
|
|
156
|
+
return "Unverified adult"
|
|
157
|
+
case _:
|
|
158
|
+
return "Invalid user data"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Web Framework Reference
|
|
164
|
+
|
|
165
|
+
### FastAPI 0.115+ Complete Reference
|
|
166
|
+
|
|
167
|
+
Application Structure:
|
|
168
|
+
```
|
|
169
|
+
project/
|
|
170
|
+
├── app/
|
|
171
|
+
│ ├── __init__.py
|
|
172
|
+
│ ├── main.py # Application entry point
|
|
173
|
+
│ ├── config.py # Settings and configuration
|
|
174
|
+
│ ├── dependencies.py # Shared dependencies
|
|
175
|
+
│ ├── api/
|
|
176
|
+
│ │ ├── __init__.py
|
|
177
|
+
│ │ ├── v1/
|
|
178
|
+
│ │ │ ├── __init__.py
|
|
179
|
+
│ │ │ ├── router.py # API router
|
|
180
|
+
│ │ │ └── endpoints/
|
|
181
|
+
│ │ │ ├── users.py
|
|
182
|
+
│ │ │ └── items.py
|
|
183
|
+
│ ├── core/
|
|
184
|
+
│ │ ├── security.py # Auth and security
|
|
185
|
+
│ │ └── exceptions.py # Custom exceptions
|
|
186
|
+
│ ├── models/
|
|
187
|
+
│ │ ├── __init__.py
|
|
188
|
+
│ │ ├── user.py # SQLAlchemy models
|
|
189
|
+
│ │ └── item.py
|
|
190
|
+
│ ├── schemas/
|
|
191
|
+
│ │ ├── __init__.py
|
|
192
|
+
│ │ ├── user.py # Pydantic schemas
|
|
193
|
+
│ │ └── item.py
|
|
194
|
+
│ ├── services/
|
|
195
|
+
│ │ ├── __init__.py
|
|
196
|
+
│ │ └── user_service.py # Business logic
|
|
197
|
+
│ └── repositories/
|
|
198
|
+
│ ├── __init__.py
|
|
199
|
+
│ └── user_repo.py # Data access
|
|
200
|
+
├── tests/
|
|
201
|
+
├── pyproject.toml
|
|
202
|
+
└── Dockerfile
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Configuration with Pydantic Settings:
|
|
206
|
+
```python
|
|
207
|
+
# app/config.py
|
|
208
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
209
|
+
from functools import lru_cache
|
|
210
|
+
|
|
211
|
+
class Settings(BaseSettings):
|
|
212
|
+
model_config = SettingsConfigDict(
|
|
213
|
+
env_file=".env",
|
|
214
|
+
env_file_encoding="utf-8",
|
|
215
|
+
case_sensitive=False,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Application
|
|
219
|
+
app_name: str = "My API"
|
|
220
|
+
debug: bool = False
|
|
221
|
+
api_v1_prefix: str = "/api/v1"
|
|
222
|
+
|
|
223
|
+
# Database
|
|
224
|
+
database_url: str
|
|
225
|
+
db_pool_size: int = 5
|
|
226
|
+
db_max_overflow: int = 10
|
|
227
|
+
|
|
228
|
+
# Security
|
|
229
|
+
secret_key: str
|
|
230
|
+
access_token_expire_minutes: int = 30
|
|
231
|
+
algorithm: str = "HS256"
|
|
232
|
+
|
|
233
|
+
# External Services
|
|
234
|
+
redis_url: str | None = None
|
|
235
|
+
|
|
236
|
+
@lru_cache
|
|
237
|
+
def get_settings() -> Settings:
|
|
238
|
+
return Settings()
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Advanced Dependency Injection:
|
|
242
|
+
```python
|
|
243
|
+
# app/dependencies.py
|
|
244
|
+
from fastapi import Depends, HTTPException, status
|
|
245
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
246
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
247
|
+
from jose import jwt, JWTError
|
|
248
|
+
|
|
249
|
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth/token")
|
|
250
|
+
|
|
251
|
+
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
|
252
|
+
async with async_session() as session:
|
|
253
|
+
try:
|
|
254
|
+
yield session
|
|
255
|
+
await session.commit()
|
|
256
|
+
except Exception:
|
|
257
|
+
await session.rollback()
|
|
258
|
+
raise
|
|
259
|
+
|
|
260
|
+
async def get_current_user(
|
|
261
|
+
token: str = Depends(oauth2_scheme),
|
|
262
|
+
db: AsyncSession = Depends(get_db),
|
|
263
|
+
) -> User:
|
|
264
|
+
credentials_exception = HTTPException(
|
|
265
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
266
|
+
detail="Could not validate credentials",
|
|
267
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
268
|
+
)
|
|
269
|
+
try:
|
|
270
|
+
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
|
|
271
|
+
user_id: int = payload.get("sub")
|
|
272
|
+
if user_id is None:
|
|
273
|
+
raise credentials_exception
|
|
274
|
+
except JWTError:
|
|
275
|
+
raise credentials_exception
|
|
276
|
+
|
|
277
|
+
user = await UserRepository(db).get_by_id(user_id)
|
|
278
|
+
if user is None:
|
|
279
|
+
raise credentials_exception
|
|
280
|
+
return user
|
|
281
|
+
|
|
282
|
+
async def get_current_active_user(
|
|
283
|
+
current_user: User = Depends(get_current_user),
|
|
284
|
+
) -> User:
|
|
285
|
+
if not current_user.is_active:
|
|
286
|
+
raise HTTPException(status_code=400, detail="Inactive user")
|
|
287
|
+
return current_user
|
|
288
|
+
|
|
289
|
+
def require_role(required_role: str):
|
|
290
|
+
async def role_checker(
|
|
291
|
+
current_user: User = Depends(get_current_active_user),
|
|
292
|
+
) -> User:
|
|
293
|
+
if current_user.role != required_role:
|
|
294
|
+
raise HTTPException(
|
|
295
|
+
status_code=status.HTTP_403_FORBIDDEN,
|
|
296
|
+
detail="Insufficient permissions",
|
|
297
|
+
)
|
|
298
|
+
return current_user
|
|
299
|
+
return role_checker
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Background Tasks:
|
|
303
|
+
```python
|
|
304
|
+
from fastapi import BackgroundTasks
|
|
305
|
+
|
|
306
|
+
async def send_notification(email: str, message: str):
|
|
307
|
+
# Simulate email sending
|
|
308
|
+
await asyncio.sleep(1)
|
|
309
|
+
print(f"Sent to {email}: {message}")
|
|
310
|
+
|
|
311
|
+
@app.post("/users/")
|
|
312
|
+
async def create_user(
|
|
313
|
+
user: UserCreate,
|
|
314
|
+
background_tasks: BackgroundTasks,
|
|
315
|
+
db: AsyncSession = Depends(get_db),
|
|
316
|
+
) -> User:
|
|
317
|
+
db_user = await UserRepository(db).create(user)
|
|
318
|
+
background_tasks.add_task(
|
|
319
|
+
send_notification,
|
|
320
|
+
db_user.email,
|
|
321
|
+
"Welcome to our platform!",
|
|
322
|
+
)
|
|
323
|
+
return db_user
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Django 5.2 LTS Reference
|
|
327
|
+
|
|
328
|
+
Composite Primary Keys:
|
|
329
|
+
```python
|
|
330
|
+
# models.py
|
|
331
|
+
from django.db import models
|
|
332
|
+
|
|
333
|
+
class Enrollment(models.Model):
|
|
334
|
+
student = models.ForeignKey("Student", on_delete=models.CASCADE)
|
|
335
|
+
course = models.ForeignKey("Course", on_delete=models.CASCADE)
|
|
336
|
+
enrolled_at = models.DateTimeField(auto_now_add=True)
|
|
337
|
+
grade = models.CharField(max_length=2, blank=True)
|
|
338
|
+
|
|
339
|
+
class Meta:
|
|
340
|
+
pk = models.CompositePrimaryKey("student", "course")
|
|
341
|
+
verbose_name = "Enrollment"
|
|
342
|
+
verbose_name_plural = "Enrollments"
|
|
343
|
+
|
|
344
|
+
# Usage
|
|
345
|
+
enrollment = Enrollment.objects.get(pk=(student_id, course_id))
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Async Views and ORM:
|
|
349
|
+
```python
|
|
350
|
+
# views.py
|
|
351
|
+
from django.http import JsonResponse
|
|
352
|
+
from asgiref.sync import sync_to_async
|
|
353
|
+
|
|
354
|
+
async def async_user_list(request):
|
|
355
|
+
users = await sync_to_async(list)(User.objects.all()[:100])
|
|
356
|
+
return JsonResponse({"users": [u.to_dict() for u in users]})
|
|
357
|
+
|
|
358
|
+
# With Django 5.2 async ORM support
|
|
359
|
+
async def async_user_detail(request, user_id):
|
|
360
|
+
user = await User.objects.aget(pk=user_id)
|
|
361
|
+
return JsonResponse(user.to_dict())
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Custom Form Rendering:
|
|
365
|
+
```python
|
|
366
|
+
# forms.py
|
|
367
|
+
from django import forms
|
|
368
|
+
|
|
369
|
+
class CustomBoundField(forms.BoundField):
|
|
370
|
+
def label_tag(self, contents=None, attrs=None, label_suffix=None):
|
|
371
|
+
attrs = attrs or {}
|
|
372
|
+
attrs["class"] = attrs.get("class", "") + " custom-label"
|
|
373
|
+
return super().label_tag(contents, attrs, label_suffix)
|
|
374
|
+
|
|
375
|
+
class CustomFormMixin:
|
|
376
|
+
def get_bound_field(self, field, field_name):
|
|
377
|
+
return CustomBoundField(self, field, field_name)
|
|
378
|
+
|
|
379
|
+
class UserForm(CustomFormMixin, forms.ModelForm):
|
|
380
|
+
class Meta:
|
|
381
|
+
model = User
|
|
382
|
+
fields = ["name", "email"]
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## Data Validation Reference
|
|
388
|
+
|
|
389
|
+
### Pydantic v2.9 Complete Patterns
|
|
390
|
+
|
|
391
|
+
Discriminated Unions:
|
|
392
|
+
```python
|
|
393
|
+
from typing import Literal, Union
|
|
394
|
+
from pydantic import BaseModel, Field
|
|
395
|
+
|
|
396
|
+
class EmailNotification(BaseModel):
|
|
397
|
+
type: Literal["email"] = "email"
|
|
398
|
+
recipient: str
|
|
399
|
+
subject: str
|
|
400
|
+
body: str
|
|
401
|
+
|
|
402
|
+
class SMSNotification(BaseModel):
|
|
403
|
+
type: Literal["sms"] = "sms"
|
|
404
|
+
phone_number: str
|
|
405
|
+
message: str
|
|
406
|
+
|
|
407
|
+
class PushNotification(BaseModel):
|
|
408
|
+
type: Literal["push"] = "push"
|
|
409
|
+
device_token: str
|
|
410
|
+
title: str
|
|
411
|
+
body: str
|
|
412
|
+
|
|
413
|
+
Notification = Union[EmailNotification, SMSNotification, PushNotification]
|
|
414
|
+
|
|
415
|
+
class NotificationRequest(BaseModel):
|
|
416
|
+
notification: Notification = Field(discriminator="type")
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Computed Fields:
|
|
420
|
+
```python
|
|
421
|
+
from pydantic import BaseModel, computed_field
|
|
422
|
+
|
|
423
|
+
class Product(BaseModel):
|
|
424
|
+
name: str
|
|
425
|
+
price: float
|
|
426
|
+
quantity: int
|
|
427
|
+
tax_rate: float = 0.1
|
|
428
|
+
|
|
429
|
+
@computed_field
|
|
430
|
+
@property
|
|
431
|
+
def subtotal(self) -> float:
|
|
432
|
+
return self.price * self.quantity
|
|
433
|
+
|
|
434
|
+
@computed_field
|
|
435
|
+
@property
|
|
436
|
+
def tax(self) -> float:
|
|
437
|
+
return self.subtotal * self.tax_rate
|
|
438
|
+
|
|
439
|
+
@computed_field
|
|
440
|
+
@property
|
|
441
|
+
def total(self) -> float:
|
|
442
|
+
return self.subtotal + self.tax
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
Custom JSON Serialization:
|
|
446
|
+
```python
|
|
447
|
+
from pydantic import BaseModel, field_serializer
|
|
448
|
+
from datetime import datetime
|
|
449
|
+
from decimal import Decimal
|
|
450
|
+
|
|
451
|
+
class Transaction(BaseModel):
|
|
452
|
+
id: int
|
|
453
|
+
amount: Decimal
|
|
454
|
+
created_at: datetime
|
|
455
|
+
|
|
456
|
+
@field_serializer("amount")
|
|
457
|
+
def serialize_amount(self, amount: Decimal) -> str:
|
|
458
|
+
return f"${amount:.2f}"
|
|
459
|
+
|
|
460
|
+
@field_serializer("created_at")
|
|
461
|
+
def serialize_datetime(self, dt: datetime) -> str:
|
|
462
|
+
return dt.isoformat()
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
TypeAdapter for Dynamic Validation:
|
|
466
|
+
```python
|
|
467
|
+
from pydantic import TypeAdapter
|
|
468
|
+
from typing import Any
|
|
469
|
+
|
|
470
|
+
# Validate arbitrary data without a model
|
|
471
|
+
int_adapter = TypeAdapter(int)
|
|
472
|
+
validated_int = int_adapter.validate_python("42") # Returns 42
|
|
473
|
+
|
|
474
|
+
# Validate complex types
|
|
475
|
+
list_adapter = TypeAdapter(list[dict[str, int]])
|
|
476
|
+
validated_list = list_adapter.validate_json('[{"a": 1}, {"b": 2}]')
|
|
477
|
+
|
|
478
|
+
# Validate with custom types
|
|
479
|
+
UserListAdapter = TypeAdapter(list[User])
|
|
480
|
+
users = UserListAdapter.validate_python(raw_data)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## ORM Reference
|
|
486
|
+
|
|
487
|
+
### SQLAlchemy 2.0 Complete Patterns
|
|
488
|
+
|
|
489
|
+
Declarative Models with Type Hints:
|
|
490
|
+
```python
|
|
491
|
+
from sqlalchemy import String, ForeignKey
|
|
492
|
+
from sqlalchemy.orm import (
|
|
493
|
+
DeclarativeBase,
|
|
494
|
+
Mapped,
|
|
495
|
+
mapped_column,
|
|
496
|
+
relationship,
|
|
497
|
+
)
|
|
498
|
+
from datetime import datetime
|
|
499
|
+
|
|
500
|
+
class Base(DeclarativeBase):
|
|
501
|
+
pass
|
|
502
|
+
|
|
503
|
+
class User(Base):
|
|
504
|
+
__tablename__ = "users"
|
|
505
|
+
|
|
506
|
+
id: Mapped[int] = mapped_column(primary_key=True)
|
|
507
|
+
email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
|
|
508
|
+
name: Mapped[str] = mapped_column(String(100))
|
|
509
|
+
created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)
|
|
510
|
+
|
|
511
|
+
# Relationships
|
|
512
|
+
posts: Mapped[list["Post"]] = relationship(back_populates="author")
|
|
513
|
+
|
|
514
|
+
class Post(Base):
|
|
515
|
+
__tablename__ = "posts"
|
|
516
|
+
|
|
517
|
+
id: Mapped[int] = mapped_column(primary_key=True)
|
|
518
|
+
title: Mapped[str] = mapped_column(String(200))
|
|
519
|
+
content: Mapped[str]
|
|
520
|
+
author_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
|
|
521
|
+
|
|
522
|
+
author: Mapped["User"] = relationship(back_populates="posts")
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
Advanced Queries:
|
|
526
|
+
```python
|
|
527
|
+
from sqlalchemy import select, func, and_, or_
|
|
528
|
+
from sqlalchemy.orm import selectinload, joinedload
|
|
529
|
+
|
|
530
|
+
# Eager loading
|
|
531
|
+
async def get_user_with_posts(db: AsyncSession, user_id: int) -> User | None:
|
|
532
|
+
result = await db.execute(
|
|
533
|
+
select(User)
|
|
534
|
+
.options(selectinload(User.posts))
|
|
535
|
+
.where(User.id == user_id)
|
|
536
|
+
)
|
|
537
|
+
return result.scalar_one_or_none()
|
|
538
|
+
|
|
539
|
+
# Aggregations
|
|
540
|
+
async def get_post_counts_by_user(db: AsyncSession) -> list[tuple[str, int]]:
|
|
541
|
+
result = await db.execute(
|
|
542
|
+
select(User.name, func.count(Post.id).label("post_count"))
|
|
543
|
+
.join(Post, isouter=True)
|
|
544
|
+
.group_by(User.id)
|
|
545
|
+
.order_by(func.count(Post.id).desc())
|
|
546
|
+
)
|
|
547
|
+
return result.all()
|
|
548
|
+
|
|
549
|
+
# Complex filtering
|
|
550
|
+
async def search_posts(
|
|
551
|
+
db: AsyncSession,
|
|
552
|
+
search: str | None = None,
|
|
553
|
+
author_id: int | None = None,
|
|
554
|
+
limit: int = 20,
|
|
555
|
+
) -> list[Post]:
|
|
556
|
+
query = select(Post).options(joinedload(Post.author))
|
|
557
|
+
|
|
558
|
+
conditions = []
|
|
559
|
+
if search:
|
|
560
|
+
conditions.append(
|
|
561
|
+
or_(
|
|
562
|
+
Post.title.ilike(f"%{search}%"),
|
|
563
|
+
Post.content.ilike(f"%{search}%"),
|
|
564
|
+
)
|
|
565
|
+
)
|
|
566
|
+
if author_id:
|
|
567
|
+
conditions.append(Post.author_id == author_id)
|
|
568
|
+
|
|
569
|
+
if conditions:
|
|
570
|
+
query = query.where(and_(*conditions))
|
|
571
|
+
|
|
572
|
+
result = await db.execute(query.limit(limit))
|
|
573
|
+
return result.scalars().unique().all()
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
Upsert (Insert or Update):
|
|
577
|
+
```python
|
|
578
|
+
from sqlalchemy.dialects.postgresql import insert
|
|
579
|
+
|
|
580
|
+
async def upsert_user(db: AsyncSession, user_data: dict) -> User:
|
|
581
|
+
stmt = insert(User).values(**user_data)
|
|
582
|
+
stmt = stmt.on_conflict_do_update(
|
|
583
|
+
index_elements=[User.email],
|
|
584
|
+
set_={
|
|
585
|
+
"name": stmt.excluded.name,
|
|
586
|
+
"updated_at": datetime.utcnow(),
|
|
587
|
+
},
|
|
588
|
+
)
|
|
589
|
+
await db.execute(stmt)
|
|
590
|
+
await db.commit()
|
|
591
|
+
|
|
592
|
+
return await db.execute(
|
|
593
|
+
select(User).where(User.email == user_data["email"])
|
|
594
|
+
).scalar_one()
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## Testing Reference
|
|
600
|
+
|
|
601
|
+
### pytest Complete Patterns
|
|
602
|
+
|
|
603
|
+
Conftest Configuration:
|
|
604
|
+
```python
|
|
605
|
+
# conftest.py
|
|
606
|
+
import pytest
|
|
607
|
+
import pytest_asyncio
|
|
608
|
+
from httpx import AsyncClient, ASGITransport
|
|
609
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
610
|
+
from sqlalchemy.orm import sessionmaker
|
|
611
|
+
|
|
612
|
+
@pytest.fixture(scope="session")
|
|
613
|
+
def event_loop():
|
|
614
|
+
"""Create event loop for async tests."""
|
|
615
|
+
import asyncio
|
|
616
|
+
loop = asyncio.new_event_loop()
|
|
617
|
+
yield loop
|
|
618
|
+
loop.close()
|
|
619
|
+
|
|
620
|
+
@pytest_asyncio.fixture(scope="session")
|
|
621
|
+
async def engine():
|
|
622
|
+
"""Create test database engine."""
|
|
623
|
+
engine = create_async_engine(
|
|
624
|
+
"sqlite+aiosqlite:///:memory:",
|
|
625
|
+
echo=True,
|
|
626
|
+
)
|
|
627
|
+
async with engine.begin() as conn:
|
|
628
|
+
await conn.run_sync(Base.metadata.create_all)
|
|
629
|
+
yield engine
|
|
630
|
+
await engine.dispose()
|
|
631
|
+
|
|
632
|
+
@pytest_asyncio.fixture
|
|
633
|
+
async def db_session(engine) -> AsyncGenerator[AsyncSession, None]:
|
|
634
|
+
"""Create isolated database session for each test."""
|
|
635
|
+
async_session = sessionmaker(
|
|
636
|
+
engine, class_=AsyncSession, expire_on_commit=False
|
|
637
|
+
)
|
|
638
|
+
async with async_session() as session:
|
|
639
|
+
async with session.begin():
|
|
640
|
+
yield session
|
|
641
|
+
await session.rollback()
|
|
642
|
+
|
|
643
|
+
@pytest_asyncio.fixture
|
|
644
|
+
async def async_client(db_session) -> AsyncGenerator[AsyncClient, None]:
|
|
645
|
+
"""Create async HTTP client for API testing."""
|
|
646
|
+
def get_db_override():
|
|
647
|
+
return db_session
|
|
648
|
+
|
|
649
|
+
app.dependency_overrides[get_db] = get_db_override
|
|
650
|
+
|
|
651
|
+
async with AsyncClient(
|
|
652
|
+
transport=ASGITransport(app=app),
|
|
653
|
+
base_url="http://test",
|
|
654
|
+
) as client:
|
|
655
|
+
yield client
|
|
656
|
+
|
|
657
|
+
app.dependency_overrides.clear()
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
Advanced Fixtures:
|
|
661
|
+
```python
|
|
662
|
+
@pytest.fixture
|
|
663
|
+
def user_factory(db_session):
|
|
664
|
+
"""Factory for creating test users."""
|
|
665
|
+
created_users = []
|
|
666
|
+
|
|
667
|
+
async def _create(**kwargs) -> User:
|
|
668
|
+
defaults = {
|
|
669
|
+
"name": f"User {len(created_users)}",
|
|
670
|
+
"email": f"user{len(created_users)}@test.com",
|
|
671
|
+
}
|
|
672
|
+
user = User(**(defaults | kwargs))
|
|
673
|
+
db_session.add(user)
|
|
674
|
+
await db_session.flush()
|
|
675
|
+
created_users.append(user)
|
|
676
|
+
return user
|
|
677
|
+
|
|
678
|
+
return _create
|
|
679
|
+
|
|
680
|
+
@pytest.fixture
|
|
681
|
+
def mock_external_api(mocker):
|
|
682
|
+
"""Mock external API calls."""
|
|
683
|
+
return mocker.patch(
|
|
684
|
+
"app.services.external_api.fetch_data",
|
|
685
|
+
return_value={"status": "ok", "data": []},
|
|
686
|
+
)
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
Hypothesis Property-Based Testing:
|
|
690
|
+
```python
|
|
691
|
+
from hypothesis import given, strategies as st
|
|
692
|
+
from hypothesis.extra.pydantic import from_model
|
|
693
|
+
|
|
694
|
+
@given(from_model(UserCreate))
|
|
695
|
+
def test_user_create_validation(user_data: UserCreate):
|
|
696
|
+
"""Test that any valid UserCreate can be processed."""
|
|
697
|
+
assert user_data.name
|
|
698
|
+
assert "@" in user_data.email
|
|
699
|
+
|
|
700
|
+
@given(st.lists(st.integers(min_value=0, max_value=100), min_size=1))
|
|
701
|
+
def test_calculate_average(numbers: list[int]):
|
|
702
|
+
"""Property: average is always between min and max."""
|
|
703
|
+
avg = calculate_average(numbers)
|
|
704
|
+
assert min(numbers) <= avg <= max(numbers)
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
---
|
|
708
|
+
|
|
709
|
+
## Type Hints Reference
|
|
710
|
+
|
|
711
|
+
### Modern Type Patterns
|
|
712
|
+
|
|
713
|
+
Generic Classes:
|
|
714
|
+
```python
|
|
715
|
+
from typing import Generic, TypeVar
|
|
716
|
+
|
|
717
|
+
T = TypeVar("T")
|
|
718
|
+
K = TypeVar("K")
|
|
719
|
+
|
|
720
|
+
class Cache(Generic[K, T]):
|
|
721
|
+
def __init__(self, max_size: int = 100):
|
|
722
|
+
self._cache: dict[K, T] = {}
|
|
723
|
+
self._max_size = max_size
|
|
724
|
+
|
|
725
|
+
def get(self, key: K) -> T | None:
|
|
726
|
+
return self._cache.get(key)
|
|
727
|
+
|
|
728
|
+
def set(self, key: K, value: T) -> None:
|
|
729
|
+
if len(self._cache) >= self._max_size:
|
|
730
|
+
oldest_key = next(iter(self._cache))
|
|
731
|
+
del self._cache[oldest_key]
|
|
732
|
+
self._cache[key] = value
|
|
733
|
+
|
|
734
|
+
# Usage
|
|
735
|
+
user_cache: Cache[int, User] = Cache(max_size=1000)
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
TypeVar with Bounds:
|
|
739
|
+
```python
|
|
740
|
+
from typing import TypeVar
|
|
741
|
+
from pydantic import BaseModel
|
|
742
|
+
|
|
743
|
+
ModelT = TypeVar("ModelT", bound=BaseModel)
|
|
744
|
+
|
|
745
|
+
def validate_and_create(model_class: type[ModelT], data: dict) -> ModelT:
|
|
746
|
+
return model_class.model_validate(data)
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
Self Type:
|
|
750
|
+
```python
|
|
751
|
+
from typing import Self
|
|
752
|
+
|
|
753
|
+
class Builder:
|
|
754
|
+
def __init__(self):
|
|
755
|
+
self._config: dict = {}
|
|
756
|
+
|
|
757
|
+
def with_option(self, key: str, value: str) -> Self:
|
|
758
|
+
self._config[key] = value
|
|
759
|
+
return self
|
|
760
|
+
|
|
761
|
+
def build(self) -> dict:
|
|
762
|
+
return self._config.copy()
|
|
763
|
+
|
|
764
|
+
# Subclassing works correctly
|
|
765
|
+
class AdvancedBuilder(Builder):
|
|
766
|
+
def with_advanced_option(self, value: int) -> Self:
|
|
767
|
+
self._config["advanced"] = value
|
|
768
|
+
return self
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
---
|
|
772
|
+
|
|
773
|
+
## Context7 Integration
|
|
774
|
+
|
|
775
|
+
Library ID Resolution:
|
|
776
|
+
```python
|
|
777
|
+
# Step 1: Resolve library ID
|
|
778
|
+
library_id = await mcp__context7__resolve_library_id("fastapi")
|
|
779
|
+
# Returns: /tiangolo/fastapi
|
|
780
|
+
|
|
781
|
+
# Step 2: Get documentation
|
|
782
|
+
docs = await mcp__context7__get_library_docs(
|
|
783
|
+
context7CompatibleLibraryID="/tiangolo/fastapi",
|
|
784
|
+
topic="dependency injection async",
|
|
785
|
+
tokens=5000,
|
|
786
|
+
)
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
Available Libraries:
|
|
790
|
+
| Library | Context7 ID | Topics |
|
|
791
|
+
|---------|-------------|--------|
|
|
792
|
+
| FastAPI | /tiangolo/fastapi | async, dependencies, security, websockets |
|
|
793
|
+
| Django | /django/django | views, models, forms, admin |
|
|
794
|
+
| Pydantic | /pydantic/pydantic | validation, serialization, settings |
|
|
795
|
+
| SQLAlchemy | /sqlalchemy/sqlalchemy | orm, async, queries, migrations |
|
|
796
|
+
| pytest | /pytest-dev/pytest | fixtures, markers, plugins |
|
|
797
|
+
| numpy | /numpy/numpy | arrays, broadcasting, ufuncs |
|
|
798
|
+
| pandas | /pandas-dev/pandas | dataframe, series, io |
|
|
799
|
+
| polars | /pola-rs/polars | lazy, expressions, streaming |
|
|
800
|
+
|
|
801
|
+
---
|
|
802
|
+
|
|
803
|
+
Last Updated: 2025-12-07
|
|
804
|
+
Version: 1.0.0
|