Skip to content
Merged
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 Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ gem "jekyll-seo-tag"

group :test do
gem "rspec"
gem "timecop"
gem "capybara"
gem "cuprite"
gem "rackup"
Expand Down
7 changes: 2 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,6 @@ GEM
matrix (0.4.3)
mercenary (0.4.0)
mini_mime (1.1.5)
mini_portile2 (2.8.9)
nokogiri (1.19.4)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
nokogiri (1.19.4-arm64-darwin)
racc (~> 1.4)
nokogiri (1.19.4-x86_64-linux-gnu)
Expand Down Expand Up @@ -133,6 +129,7 @@ GEM
google-protobuf (~> 4.31)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
timecop (0.9.11)
unicode-display_width (2.6.0)
webrick (1.9.2)
websocket-driver (0.8.2)
Expand All @@ -146,7 +143,6 @@ PLATFORMS
arm64-darwin-21
arm64-darwin-22
arm64-darwin-25
ruby
x86_64-linux

DEPENDENCIES
Expand All @@ -156,6 +152,7 @@ DEPENDENCIES
jekyll-seo-tag
rackup
rspec
timecop
webrick

RUBY VERSION
Expand Down
35 changes: 31 additions & 4 deletions _layouts/citycamp-city.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,39 @@ <h1 class="mb-1">{{ page.city }}</h1>
<div class="container">
<p><a href="/citycamp">&larr; All CityCamp cities</a></p>

{% if page.events.size > 0 %}
{% if page.upcoming_events.size > 0 %}
<header class="page-header mt-4">
<h2 class="page-title">Future and past events</h2>
<h2 class="page-title">Upcoming events</h2>
</header>
{% assign sorted_events = page.events | sort: "date" | reverse %}
{% for event in sorted_events %}
{% for event in page.upcoming_events %}
<div class="card mb-3">
<div class="card-body">
<div class="text-danger fw-bold small text-uppercase">{{ event.date | date: "%B %-d, %Y" }}</div>
<h5 class="mb-1">{{ event.name }}</h5>
{% if event.venue %}
<div class="text-muted">{{ event.venue }}{% if event.address %} &mdash; {{ event.address }}{% endif %}</div>
{% endif %}
{% if event.organizer %}
<div class="small text-secondary mt-1">Organized by {% if event.organizer_website %}<a href="{{ event.organizer_website }}" target="_blank" rel="noopener">{{ event.organizer }}</a>{% else %}{{ event.organizer }}{% endif %}</div>
{% endif %}
{% if event.website %}
<div class="mt-2">
<a href="{{ event.website }}" class="btn btn-primary btn-sm" target="_blank" rel="noopener">Register &rarr;</a>
</div>
{% endif %}
{% if event.about %}
<div class="mt-2">{{ event.about | markdownify }}</div>
{% endif %}
</div>
</div>
{% endfor %}
{% endif %}

{% if page.past_events.size > 0 %}
<header class="page-header mt-4">
<h2 class="page-title">Past events</h2>
</header>
{% for event in page.past_events %}
<div class="card mb-3">
<div class="card-body">
<div class="text-danger fw-bold small text-uppercase">{{ event.date | date: "%B %-d, %Y" }}</div>
Expand Down
9 changes: 6 additions & 3 deletions _plugins/citycamp_latest_event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@

past_events = []
site.collections["citycamp"]&.docs&.each do |doc|
(doc.data["events"] || []).each do |event|
events = doc.data["events"] || []
upcoming, past = events.partition { |e| e["date"] && e["date"].strftime("%Y-%m-%d") >= today_str }
doc.data["upcoming_events"] = upcoming.sort_by { |e| e["date"].strftime("%Y-%m-%d") }
doc.data["past_events"] = past.sort_by { |e| e["date"].strftime("%Y-%m-%d") }.reverse

past.each do |event|
next unless event["date"]
date_str = event["date"].strftime("%Y-%m-%d")
next if date_str >= today_str

past_events << {
"city" => doc.data["city"],
Expand Down
80 changes: 80 additions & 0 deletions spec/citycamp_events_split_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
require "jekyll"
require "timecop"
require "tmpdir"
require "fileutils"

RSpec.describe "citycamp upcoming/past events split" do
Jekyll.logger.log_level = :error

def build_site(today:)
source = Dir.mktmpdir
FileUtils.mkdir_p(File.join(source, "_citycamp"))
FileUtils.mkdir_p(File.join(source, "_layouts"))
FileUtils.mkdir_p(File.join(source, "_plugins"))

File.write(File.join(source, "_layouts", "citycamp-city.html"), "---\n---\n{{ page.city }}")
FileUtils.cp(
File.join(__dir__, "..", "_plugins", "citycamp_latest_event.rb"),
File.join(source, "_plugins", "citycamp_latest_event.rb")
)
FileUtils.cp(
File.join(__dir__, "..", "_plugins", "current_date.rb"),
File.join(source, "_plugins", "current_date.rb")
)

File.write(File.join(source, "_citycamp", "testville.md"), <<~MARKDOWN)
---
layout: citycamp-city
city: "Testville"
country: "United States"
latitude: 1.0
longitude: 1.0
events:
- name: "Old Event"
date: 2020-01-01
- name: "Today Event"
date: 2024-06-15
- name: "Future Event"
date: 2099-01-01
---
MARKDOWN

config = Jekyll.configuration(
"source" => source,
"destination" => File.join(source, "_site"),
"collections" => { "citycamp" => { "output" => true, "permalink" => "/citycamp/:name" } }
)

site = Timecop.freeze(today) do
site = Jekyll::Site.new(config)
site.read
site.render
site
end

site.collections["citycamp"].docs.find { |doc| doc.data["city"] == "Testville" }
ensure
FileUtils.remove_entry(source) if source
end

it "splits events into upcoming and past relative to the current date" do
doc = build_site(today: Date.new(2024, 6, 20))

expect(doc.data["upcoming_events"].map { |e| e["name"] }).to eq(["Future Event"])
expect(doc.data["past_events"].map { |e| e["name"] }).to eq(["Today Event", "Old Event"])
end

it "treats an event dated today as upcoming" do
doc = build_site(today: Date.new(2024, 6, 15))

expect(doc.data["upcoming_events"].map { |e| e["name"] }).to eq(["Today Event", "Future Event"])
expect(doc.data["past_events"].map { |e| e["name"] }).to eq(["Old Event"])
end

it "sorts upcoming events soonest-first and past events most-recent-first" do
doc = build_site(today: Date.new(2019, 1, 1))

expect(doc.data["upcoming_events"].map { |e| e["name"] }).to eq(["Old Event", "Today Event", "Future Event"])
expect(doc.data["past_events"]).to eq([])
end
end