@tinkcarlos/skillora 0.2.0
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.
- package/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
# Python-Specific Review Patterns
|
|
2
|
+
|
|
3
|
+
Comprehensive Python code review patterns covering Django, Flask, FastAPI, and core Python.
|
|
4
|
+
|
|
5
|
+
## Core Python Issues
|
|
6
|
+
|
|
7
|
+
### Type Hints & Mypy
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
# 🚫 Missing type hints
|
|
11
|
+
def process(data):
|
|
12
|
+
return data['value'] * 2
|
|
13
|
+
|
|
14
|
+
# ✅ Proper type hints
|
|
15
|
+
from typing import TypedDict
|
|
16
|
+
|
|
17
|
+
class DataInput(TypedDict):
|
|
18
|
+
value: int
|
|
19
|
+
|
|
20
|
+
def process(data: DataInput) -> int:
|
|
21
|
+
return data['value'] * 2
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
# 🚫 Using Any unnecessarily
|
|
26
|
+
from typing import Any
|
|
27
|
+
def handler(event: Any) -> Any: ...
|
|
28
|
+
|
|
29
|
+
# ✅ Proper typing with generics
|
|
30
|
+
from typing import TypeVar, Generic
|
|
31
|
+
T = TypeVar('T')
|
|
32
|
+
def handler(event: Event[T]) -> Response[T]: ...
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Context Managers
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
# 🚫 Resource leak
|
|
39
|
+
file = open('data.txt')
|
|
40
|
+
data = file.read()
|
|
41
|
+
# file never closed if exception
|
|
42
|
+
|
|
43
|
+
# ✅ Proper context manager
|
|
44
|
+
with open('data.txt') as file:
|
|
45
|
+
data = file.read()
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
# 🚫 Manual lock management
|
|
50
|
+
lock.acquire()
|
|
51
|
+
try:
|
|
52
|
+
do_work()
|
|
53
|
+
finally:
|
|
54
|
+
lock.release()
|
|
55
|
+
|
|
56
|
+
# ✅ Context manager
|
|
57
|
+
with lock:
|
|
58
|
+
do_work()
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Generators & Memory
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
# 🚫 Loading all into memory
|
|
65
|
+
def get_users():
|
|
66
|
+
return [process(u) for u in db.query_all_users()] # Millions of users!
|
|
67
|
+
|
|
68
|
+
# ✅ Generator for streaming
|
|
69
|
+
def get_users():
|
|
70
|
+
for user in db.query_users_cursor():
|
|
71
|
+
yield process(user)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
# 🚫 String concatenation in loop
|
|
76
|
+
result = ""
|
|
77
|
+
for item in large_list:
|
|
78
|
+
result += str(item) # O(n²) memory copies
|
|
79
|
+
|
|
80
|
+
# ✅ Join pattern
|
|
81
|
+
result = "".join(str(item) for item in large_list)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Mutable Default Arguments
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
# 🚫 CRITICAL BUG: Mutable default
|
|
88
|
+
def add_item(item, items=[]):
|
|
89
|
+
items.append(item)
|
|
90
|
+
return items
|
|
91
|
+
# add_item(1) → [1]
|
|
92
|
+
# add_item(2) → [1, 2] # Shared state!
|
|
93
|
+
|
|
94
|
+
# ✅ None default
|
|
95
|
+
def add_item(item, items=None):
|
|
96
|
+
if items is None:
|
|
97
|
+
items = []
|
|
98
|
+
items.append(item)
|
|
99
|
+
return items
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Mutable Class Attributes (Critical Hidden Bug)
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
# 🚫 CRITICAL BUG: Class attribute shared across ALL instances
|
|
106
|
+
class User:
|
|
107
|
+
permissions = [] # 💀 Shared across all instances!
|
|
108
|
+
tags = {} # 💀 Same problem with dict
|
|
109
|
+
|
|
110
|
+
user1 = User()
|
|
111
|
+
user2 = User()
|
|
112
|
+
user1.permissions.append("admin")
|
|
113
|
+
print(user2.permissions) # ['admin'] - user2 also has admin!
|
|
114
|
+
|
|
115
|
+
# ✅ Initialize in __init__
|
|
116
|
+
class User:
|
|
117
|
+
def __init__(self):
|
|
118
|
+
self.permissions = [] # Each instance gets its own list
|
|
119
|
+
self.tags = {}
|
|
120
|
+
|
|
121
|
+
# ✅ Or use dataclasses with field()
|
|
122
|
+
from dataclasses import dataclass, field
|
|
123
|
+
|
|
124
|
+
@dataclass
|
|
125
|
+
class User:
|
|
126
|
+
permissions: list = field(default_factory=list)
|
|
127
|
+
tags: dict = field(default_factory=dict)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Detection command**:
|
|
131
|
+
```bash
|
|
132
|
+
# Search for class-level mutable attributes
|
|
133
|
+
grep -rn "class.*:" --include="*.py" -A 10 | grep -E "^\s+\w+\s*=\s*(\[\]|\{\}|set\(\))"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Exception Handling
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
# 🚫 Bare except
|
|
140
|
+
try:
|
|
141
|
+
risky_operation()
|
|
142
|
+
except: # Catches KeyboardInterrupt, SystemExit!
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
# ✅ Specific exceptions
|
|
146
|
+
try:
|
|
147
|
+
risky_operation()
|
|
148
|
+
except (ValueError, TypeError) as e:
|
|
149
|
+
logger.error(f"Operation failed: {e}")
|
|
150
|
+
raise
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
# 🚫 Lost traceback
|
|
155
|
+
try:
|
|
156
|
+
risky_operation()
|
|
157
|
+
except Exception as e:
|
|
158
|
+
raise CustomError(str(e)) # Loses original traceback
|
|
159
|
+
|
|
160
|
+
# ✅ Chain exceptions
|
|
161
|
+
try:
|
|
162
|
+
risky_operation()
|
|
163
|
+
except Exception as e:
|
|
164
|
+
raise CustomError(f"Operation failed") from e
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Asyncio Issues
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
# 🚫 Blocking in async code
|
|
171
|
+
async def fetch_data():
|
|
172
|
+
response = requests.get(url) # Blocks event loop!
|
|
173
|
+
return response.json()
|
|
174
|
+
|
|
175
|
+
# ✅ Use async libraries
|
|
176
|
+
async def fetch_data():
|
|
177
|
+
async with aiohttp.ClientSession() as session:
|
|
178
|
+
async with session.get(url) as response:
|
|
179
|
+
return await response.json()
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
# 🚫 Creating tasks without awaiting
|
|
184
|
+
async def handler():
|
|
185
|
+
asyncio.create_task(background_job()) # Fire and forget, errors lost
|
|
186
|
+
|
|
187
|
+
# ✅ Track tasks
|
|
188
|
+
async def handler():
|
|
189
|
+
task = asyncio.create_task(background_job())
|
|
190
|
+
# Either await or add error handler
|
|
191
|
+
task.add_done_callback(handle_task_result)
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
# 🚫 Sequential async calls
|
|
196
|
+
async def fetch_all():
|
|
197
|
+
user = await get_user()
|
|
198
|
+
posts = await get_posts() # Waits for user first
|
|
199
|
+
|
|
200
|
+
# ✅ Concurrent execution
|
|
201
|
+
async def fetch_all():
|
|
202
|
+
user, posts = await asyncio.gather(
|
|
203
|
+
get_user(),
|
|
204
|
+
get_posts()
|
|
205
|
+
)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Django Patterns
|
|
209
|
+
|
|
210
|
+
### ORM Issues
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# 🚫 N+1 Query
|
|
214
|
+
def get_posts():
|
|
215
|
+
posts = Post.objects.all()
|
|
216
|
+
for post in posts:
|
|
217
|
+
print(post.author.name) # Query per iteration!
|
|
218
|
+
|
|
219
|
+
# ✅ Select related
|
|
220
|
+
def get_posts():
|
|
221
|
+
posts = Post.objects.select_related('author').all()
|
|
222
|
+
for post in posts:
|
|
223
|
+
print(post.author.name) # Single query
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
```python
|
|
227
|
+
# 🚫 Prefetch without optimization
|
|
228
|
+
posts = Post.objects.prefetch_related('comments').all()
|
|
229
|
+
for post in posts:
|
|
230
|
+
recent = post.comments.filter(created__gt=cutoff) # New query!
|
|
231
|
+
|
|
232
|
+
# ✅ Prefetch with filter
|
|
233
|
+
from django.db.models import Prefetch
|
|
234
|
+
posts = Post.objects.prefetch_related(
|
|
235
|
+
Prefetch('comments', queryset=Comment.objects.filter(created__gt=cutoff))
|
|
236
|
+
).all()
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# 🚫 Counting with len()
|
|
241
|
+
count = len(Post.objects.all()) # Fetches all objects!
|
|
242
|
+
|
|
243
|
+
# ✅ Use count()
|
|
244
|
+
count = Post.objects.count() # COUNT(*) query
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Security
|
|
248
|
+
|
|
249
|
+
```python
|
|
250
|
+
# 🚫 Raw SQL injection
|
|
251
|
+
Post.objects.raw(f"SELECT * FROM posts WHERE title = '{user_input}'")
|
|
252
|
+
|
|
253
|
+
# ✅ Parameterized query
|
|
254
|
+
Post.objects.raw("SELECT * FROM posts WHERE title = %s", [user_input])
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
```python
|
|
258
|
+
# 🚫 Missing CSRF protection
|
|
259
|
+
@csrf_exempt # Why?
|
|
260
|
+
def update_profile(request): ...
|
|
261
|
+
|
|
262
|
+
# ✅ Only exempt when necessary (e.g., API with token auth)
|
|
263
|
+
@csrf_exempt
|
|
264
|
+
@require_api_key # Alternative protection
|
|
265
|
+
def api_webhook(request): ...
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Views
|
|
269
|
+
|
|
270
|
+
```python
|
|
271
|
+
# 🚫 Business logic in views
|
|
272
|
+
def create_order(request):
|
|
273
|
+
order = Order.objects.create(user=request.user)
|
|
274
|
+
order.total = sum(item.price for item in cart)
|
|
275
|
+
# Send email
|
|
276
|
+
# Update inventory
|
|
277
|
+
# 200 lines later...
|
|
278
|
+
|
|
279
|
+
# ✅ Service layer
|
|
280
|
+
def create_order(request):
|
|
281
|
+
order = OrderService.create_from_cart(request.user, cart)
|
|
282
|
+
return JsonResponse(OrderSerializer(order).data)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## FastAPI Patterns
|
|
286
|
+
|
|
287
|
+
### Dependency Injection
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
# 🚫 Hardcoded dependencies
|
|
291
|
+
@app.get("/users")
|
|
292
|
+
async def get_users():
|
|
293
|
+
db = Database() # Created every request
|
|
294
|
+
return await db.get_users()
|
|
295
|
+
|
|
296
|
+
# ✅ Dependency injection
|
|
297
|
+
async def get_db():
|
|
298
|
+
async with AsyncSession() as session:
|
|
299
|
+
yield session
|
|
300
|
+
|
|
301
|
+
@app.get("/users")
|
|
302
|
+
async def get_users(db: AsyncSession = Depends(get_db)):
|
|
303
|
+
return await db.execute(select(User))
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Validation
|
|
307
|
+
|
|
308
|
+
```python
|
|
309
|
+
# 🚫 Manual validation
|
|
310
|
+
@app.post("/users")
|
|
311
|
+
async def create_user(request: Request):
|
|
312
|
+
data = await request.json()
|
|
313
|
+
if 'email' not in data:
|
|
314
|
+
raise HTTPException(400, "Email required")
|
|
315
|
+
|
|
316
|
+
# ✅ Pydantic models
|
|
317
|
+
class UserCreate(BaseModel):
|
|
318
|
+
email: EmailStr
|
|
319
|
+
name: str = Field(min_length=1, max_length=100)
|
|
320
|
+
|
|
321
|
+
@app.post("/users")
|
|
322
|
+
async def create_user(user: UserCreate):
|
|
323
|
+
# Validated automatically
|
|
324
|
+
return await UserService.create(user)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Background Tasks
|
|
328
|
+
|
|
329
|
+
```python
|
|
330
|
+
# 🚫 Long operation in request
|
|
331
|
+
@app.post("/reports")
|
|
332
|
+
async def generate_report():
|
|
333
|
+
report = await heavy_computation() # Client timeout!
|
|
334
|
+
return report
|
|
335
|
+
|
|
336
|
+
# ✅ Background task
|
|
337
|
+
@app.post("/reports")
|
|
338
|
+
async def generate_report(background_tasks: BackgroundTasks):
|
|
339
|
+
task_id = str(uuid4())
|
|
340
|
+
background_tasks.add_task(generate_report_task, task_id)
|
|
341
|
+
return {"task_id": task_id, "status": "processing"}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Python Security
|
|
345
|
+
|
|
346
|
+
### Dangerous Functions
|
|
347
|
+
|
|
348
|
+
```python
|
|
349
|
+
# 🚫 CRITICAL: eval/exec with user input
|
|
350
|
+
result = eval(user_expression) # Remote code execution!
|
|
351
|
+
|
|
352
|
+
# ✅ Use safe alternatives
|
|
353
|
+
import ast
|
|
354
|
+
result = ast.literal_eval(user_expression) # Only literals
|
|
355
|
+
|
|
356
|
+
# Or use a proper expression parser
|
|
357
|
+
from simpleeval import simple_eval
|
|
358
|
+
result = simple_eval(user_expression)
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
# 🚫 Pickle with untrusted data
|
|
363
|
+
import pickle
|
|
364
|
+
data = pickle.loads(user_data) # Arbitrary code execution!
|
|
365
|
+
|
|
366
|
+
# ✅ Use JSON or safe formats
|
|
367
|
+
import json
|
|
368
|
+
data = json.loads(user_data)
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
```python
|
|
372
|
+
# 🚫 Subprocess with shell=True
|
|
373
|
+
import subprocess
|
|
374
|
+
subprocess.run(f"ls {user_path}", shell=True) # Command injection!
|
|
375
|
+
|
|
376
|
+
# ✅ Pass args as list
|
|
377
|
+
subprocess.run(["ls", user_path])
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Path Traversal
|
|
381
|
+
|
|
382
|
+
```python
|
|
383
|
+
# 🚫 Path traversal vulnerability
|
|
384
|
+
def read_file(filename):
|
|
385
|
+
with open(f"/data/{filename}") as f: # ../../../etc/passwd
|
|
386
|
+
return f.read()
|
|
387
|
+
|
|
388
|
+
# ✅ Validate and resolve path
|
|
389
|
+
from pathlib import Path
|
|
390
|
+
|
|
391
|
+
def read_file(filename):
|
|
392
|
+
base = Path("/data").resolve()
|
|
393
|
+
file_path = (base / filename).resolve()
|
|
394
|
+
if not file_path.is_relative_to(base):
|
|
395
|
+
raise ValueError("Invalid path")
|
|
396
|
+
return file_path.read_text()
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## Performance Patterns
|
|
400
|
+
|
|
401
|
+
### List Comprehensions vs Loops
|
|
402
|
+
|
|
403
|
+
```python
|
|
404
|
+
# 🚫 Slow loop with append
|
|
405
|
+
result = []
|
|
406
|
+
for item in items:
|
|
407
|
+
if item.active:
|
|
408
|
+
result.append(item.value)
|
|
409
|
+
|
|
410
|
+
# ✅ List comprehension (faster)
|
|
411
|
+
result = [item.value for item in items if item.active]
|
|
412
|
+
|
|
413
|
+
# ✅ Generator for large data
|
|
414
|
+
result = (item.value for item in items if item.active)
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Dictionary Operations
|
|
418
|
+
|
|
419
|
+
```python
|
|
420
|
+
# 🚫 Checking then getting
|
|
421
|
+
if key in dictionary:
|
|
422
|
+
value = dictionary[key]
|
|
423
|
+
else:
|
|
424
|
+
value = default
|
|
425
|
+
|
|
426
|
+
# ✅ get() method
|
|
427
|
+
value = dictionary.get(key, default)
|
|
428
|
+
|
|
429
|
+
# 🚫 Multiple key lookups
|
|
430
|
+
for key in keys:
|
|
431
|
+
if key in large_dict:
|
|
432
|
+
process(large_dict[key])
|
|
433
|
+
|
|
434
|
+
# ✅ Use items() or single lookup
|
|
435
|
+
for key in keys:
|
|
436
|
+
value = large_dict.get(key)
|
|
437
|
+
if value is not None:
|
|
438
|
+
process(value)
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Caching
|
|
442
|
+
|
|
443
|
+
```python
|
|
444
|
+
# 🚫 Repeated expensive computation
|
|
445
|
+
def get_expensive_result(user_id):
|
|
446
|
+
return expensive_computation(user_id) # Called every time
|
|
447
|
+
|
|
448
|
+
# ✅ Use functools.lru_cache
|
|
449
|
+
from functools import lru_cache
|
|
450
|
+
|
|
451
|
+
@lru_cache(maxsize=1000)
|
|
452
|
+
def get_expensive_result(user_id):
|
|
453
|
+
return expensive_computation(user_id)
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
## Testing Patterns
|
|
457
|
+
|
|
458
|
+
### Fixtures
|
|
459
|
+
|
|
460
|
+
```python
|
|
461
|
+
# 🚫 Test database pollution
|
|
462
|
+
def test_create_user():
|
|
463
|
+
user = User.objects.create(email="test@test.com")
|
|
464
|
+
# Persists after test!
|
|
465
|
+
|
|
466
|
+
# ✅ Use pytest fixtures with cleanup
|
|
467
|
+
@pytest.fixture
|
|
468
|
+
def user(db):
|
|
469
|
+
user = User.objects.create(email="test@test.com")
|
|
470
|
+
yield user
|
|
471
|
+
user.delete()
|
|
472
|
+
|
|
473
|
+
# Or use transactional tests
|
|
474
|
+
@pytest.mark.django_db(transaction=True)
|
|
475
|
+
def test_create_user():
|
|
476
|
+
# Rolled back after test
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Mocking
|
|
480
|
+
|
|
481
|
+
```python
|
|
482
|
+
# 🚫 Mocking too deep
|
|
483
|
+
@patch('myapp.services.user.repository.db.session')
|
|
484
|
+
def test_create_user(mock_session):
|
|
485
|
+
# Testing implementation, not behavior
|
|
486
|
+
|
|
487
|
+
# ✅ Mock at boundaries
|
|
488
|
+
@patch('myapp.services.user.external_api.verify_email')
|
|
489
|
+
def test_create_user(mock_verify):
|
|
490
|
+
mock_verify.return_value = True
|
|
491
|
+
result = UserService.create(user_data)
|
|
492
|
+
assert result.verified
|
|
493
|
+
```
|
|
494
|
+
|