Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ class SnippetForm(FlaskForm):
language = SelectField("Language", choices=LANGUAGES)
code = TextAreaField("Code", validators=[DataRequired()])
description = StringField("Description", validators=[Length(max=200)])
collection = StringField("Collection", validators=[Length(max=50)])
tags = StringField("Tags (comma separated)")
3 changes: 2 additions & 1 deletion app/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from datetime import datetime, UTC

def make_snippet(title, language, code, description, tags):
def make_snippet(title, language, code, description, tags, collection=""):
"""
Returns a clean snippet document ready to insert into MongoDB.
Centralizing this means if we ever change the schema,
Expand All @@ -12,6 +12,7 @@ def make_snippet(title, language, code, description, tags):
"code": code,
"description": description,
"tags": tags,
"collection": collection,
"created_at": datetime.now(UTC),
"updated_at": datetime.now(UTC)

Expand Down
10 changes: 10 additions & 0 deletions app/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def index():
query = request.args.get("q", "")
tag = request.args.get("tag", "")
language = request.args.get("language", "")
collection = request.args.get("collection", "")
page = request.args.get("page", 1, type=int)
page = max(page, 1)

Expand All @@ -32,6 +33,8 @@ def index():
filters["tags"] = tag
if language:
filters["language"] = language
if collection:
filters["collection"] = collection

total_snippets = snippets_collection.count_documents(filters)
total_pages = ceil(total_snippets / PAGE_SIZE) if total_snippets else 0
Expand All @@ -47,12 +50,14 @@ def index():
)

languages = snippets_collection.distinct("language")
collections = snippets_collection.distinct("collection")
pagination_params = {
key: value
for key, value in {
"q": query,
"tag": tag,
"language": language,
"collection": collection,
}.items()
if value
}
Expand All @@ -64,7 +69,9 @@ def index():
query=query,
tag=tag,
language=language,
collection=collection,
languages=languages,
collections=[c for c in collections if c],
page=page,
total_pages=total_pages,
pagination_params=pagination_params,
Expand All @@ -82,6 +89,7 @@ def add_snippet():
code=form.code.data,
description=form.description.data,
tags=tags,
collection=form.collection.data,
)
snippets_collection.insert_one(snippet)
flash("Snip saved successfully!", "success")
Expand Down Expand Up @@ -120,6 +128,7 @@ def edit_snippet(id):
"language": form.language.data,
"code": form.code.data,
"description": form.description.data,
"collection": form.collection.data,
"tags": tags,
"updated_at": datetime.now(UTC),
}
Expand All @@ -133,6 +142,7 @@ def edit_snippet(id):
form.language.data = snippet["language"]
form.code.data = snippet["code"]
form.description.data = snippet.get("description", "")
form.collection.data = snippet.get("collection", "")
form.tags.data = ", ".join(snippet.get("tags", []))

return render_template("edit.html", form=form, snippet=snippet)
5 changes: 5 additions & 0 deletions app/templates/add.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ <h1>New Snip</h1>
{{ form.description(placeholder="What does this snippet do?") }}
</div>

<div class="form-group">
{{ form.collection.label }}
{{ form.collection(placeholder="e.g. Work, Side Project, Personal") }}
</div>

<div class="form-group">
{{ form.code.label }}
{{ form.code(placeholder="Paste your code here...", rows=12) }}
Expand Down
5 changes: 5 additions & 0 deletions app/templates/edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ <h1>Edit Snip</h1>
{{ form.description() }}
</div>

<div class="form-group">
{{ form.collection.label }}
{{ form.collection() }}
</div>

<div class="form-group">
{{ form.code.label }}
{{ form.code(rows=12) }}
Expand Down
11 changes: 10 additions & 1 deletion app/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,14 @@ <h1>My Snips</h1>
<option value="{{ lang }}" {% if lang == language %}selected{% endif %}>{{ lang }}</option>
{% endfor %}
</select>
<select name="collection">
<option value="">All Collections</option>
{% for coll in collections %}
<option value="{{ coll }}" {% if coll == collection %}selected{% endif %}>{{ coll }}</option>
{% endfor %}
</select>
<button type="submit">Search</button>
{% if query or tag or language %}
{% if query or tag or language or collection %}
<a href="/" class="clear-btn">Clear</a>
{% endif %}
</form>
Expand Down Expand Up @@ -49,6 +55,9 @@ <h1>My Snips</h1>
</div>
<div class="card-header">
<span class="language-badge">{{ snippet.language }}</span>
{% if snippet.collection %}
<span class="language-badge" style="background-color: var(--bg-alt); color: var(--text-muted); border: 1px solid var(--border);">{{ snippet.collection }}</span>
{% endif %}
<a href="/snippet/{{ snippet._id }}" class="card-title">{{ snippet.title }}</a>
</div>
{% if snippet.description %}
Expand Down
3 changes: 3 additions & 0 deletions app/templates/snippet.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
<div class="detail-header">
<div>
<span class="language-badge">{{ snippet.language }}</span>
{% if snippet.collection %}
<span class="language-badge" style="background-color: var(--bg-alt); color: var(--text-muted); border: 1px solid var(--border);">{{ snippet.collection }}</span>
{% endif %}
<h1>{{ snippet.title }}</h1>
{% if snippet.description %}
<p class="description">{{ snippet.description }}</p>
Expand Down
16 changes: 16 additions & 0 deletions tests/test_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,19 @@ def test_pagination_handles_empty_results(client, fake_collection):
assert response.status_code == 200
assert b"0 snippets found" in response.data
assert b"Page 1 of" not in response.data


def test_filter_by_collection(client, fake_collection):
"""Home page should filter snippets by collection"""
snip1 = make_test_snippet(1)
snip1["collection"] = "Work"
snip2 = make_test_snippet(2)
snip2["collection"] = "Personal"
fake_collection.documents = [snip1, snip2]

response = client.get("/?collection=Work")
assert response.status_code == 200
assert b"1 snippet found" in response.data
assert b"Snippet 01" in response.data
assert b"Snippet 02" not in response.data