-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
155 lines (118 loc) Β· 4.57 KB
/
app.py
File metadata and controls
155 lines (118 loc) Β· 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from flask import Flask, render_template, request, jsonify, session, redirect, url_for
from dotenv import load_dotenv
import os
from google.genai import Client
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
import secrets
from pathlib import Path
app = Flask(__name__)
load_dotenv()
limiter = Limiter(
key_func=get_remote_address,
default_limits=["200 per day", "50 per hour"]
)
limiter.init_app(app)
app.secret_key = os.getenv("FLASK_SECRET_KEY")
API_KEY = os.getenv("GOOGLE_API_KEY")
if not app.secret_key:
raise RuntimeError("FLASK_SECRET_KEY is not set in environment")
if not API_KEY:
raise RuntimeError("GOOGLE_API_KEY is not set in environment")
client = Client(api_key=API_KEY)
class CodeFarm:
@staticmethod
def challenge(level, language):
prompt = f"""
Create a coding challenge for a {level} level who learn {language}.
Use farming metaphors and keep it appropriate for their level. Format:
**π± Challenge:** [Title with farming theme]
**π Task:** [What they need to code]
**π― Goal:** [Expected output]
**π‘ Hint:** [One helpful hint]
**πΎ Example:** [Small example if helpful]
Make it fun! Adjust difficulty for {level} level.
"""
try:
response = client.models.generate_content(
model='gemini-2.0-flash-exp',
contents=prompt
)
return response.text
except Exception as e:
print(f"Error generating challenge: {e}")
return "Error growing challenge. Try again!"
@staticmethod
def inspect_code(code, challenge_desc=""):
prompt = f"""
You're a coach reviewing this code. Use farming language and be direct.
Challenge context: {challenge_desc}
Code Harvest:
```
{code}
```
Give feedback like:
**π What grew well:**
[List positive aspects]
**π± What needs more water:**
[Suggestions for improvement]
**π Farming tip:**
[One key learning point or best practice]
**β Harvest rating:** [1-5 stars] - [Brief explanation]
**π― Next crop to plant:** [Suggestion for what to learn/practice next]
Keep it encouraging and use farming metaphors throughout!
"""
try:
response = client.models.generate_content(
model='gemini-2.0-flash-exp',
contents=prompt
)
return response.text
except Exception as e:
print(f"Error inspecting harvest: {e}")
return "Error inspecting harvest. Try again!"
def init_session():
if 'farmer' not in session:
session['farmer'] = {
'level': 'seedling',
'language': 'python'
}
@app.route('/', methods=['GET', 'POST'])
@limiter.limit("5 per minute")
def home():
if request.method == 'POST':
if 'code' in request.form:
code = request.form['code']
challenge_desc = request.form.get('challenge_desc', '')
review = CodeFarm.inspect_code(code, challenge_desc)
return render_template('review.html', review=review)
return render_template('home.html')
@app.route('/challenge', methods=['GET', 'POST'])
@limiter.limit("5 per minute")
def challenge():
init_session()
if request.method == 'POST':
level = request.form['level']
language = request.form['language']
session['farmer']['level'] = level
session['farmer']['language'] = language
session.modified = True
challenge = CodeFarm.challenge(level, language)
farmer = session['farmer']
return render_template('show_challenge.html',
challenge=challenge,
level=farmer['level'],
language=farmer['language'])
return render_template('challenge.html')
@app.route('/review', methods=['GET', 'POST'])
@limiter.limit("5 per minute")
def review():
init_session()
if request.method == 'POST':
code = request.form['code']
challenge_desc = request.form.get('challenge_desc', '')
review = CodeFarm.inspect_code(code, challenge_desc)
return render_template('review.html', review=review)
return render_template('submit.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=int(os.getenv("PORT", 5008)))