Skip to content

Commit 4b8c0e2

Browse files
committed
Allow multiple Meetups on different services and link to them
1 parent 99e7f9f commit 4b8c0e2

File tree

5 files changed

+113
-18
lines changed

5 files changed

+113
-18
lines changed

_includes/meetup.html

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,52 @@
1-
<div class="list-item {{ meetup.date | date: '%Y%m' }} {% continent %}{{ meetup.location | split: ', ' | last }}{% endcontinent %}">
1+
{% comment %} Handle both single meetup and grouped meetups {% endcomment %}
2+
{% if meetup_group %}
3+
{% assign meetups_to_display = meetup_group %}
4+
{% else %}
5+
{% assign meetups_to_display = meetup | split: "" | push: meetup %}
6+
{% endif %}
7+
8+
{% assign first_meetup = meetups_to_display | first %}
9+
10+
<div class="list-item {{ first_meetup.date | date: '%Y%m' }} {% continent %}{{ first_meetup.location | split: ', ' | last }}{% endcontinent %}">
211
<dt>
3-
{% if meetup.url %}
4-
<a href="{{ meetup.url }}">{{ meetup.name }}</a>
12+
{% if first_meetup.url %}
13+
<a href="{{ first_meetup.url }}">{{ first_meetup.name }}</a>
514
{% else %}
6-
<a>{{ meetup.name }}</a>
15+
<a>{{ first_meetup.name }}</a>
716
{% endif %}
817

9-
{% if meetup.status %}
10-
<div class="status" data-phrase="{{ meetup.status }}"></div>
18+
{% if first_meetup.status %}
19+
<div class="status" data-phrase="{{ first_meetup.status }}"></div>
1120
{% endif %}
1221
</dt>
1322

1423
<dd>
1524
<ul>
16-
<li>{{ meetup.date | date: "%B %-d, %Y" }}</li>
17-
<li>{{ meetup.location }}</li>
25+
<li>{{ first_meetup.date | date: "%B %-d, %Y" }}</li>
26+
<li>{{ first_meetup.location }}</li>
27+
{% if meetups_to_display.size > 1 %}
28+
<li>
29+
{% for m in meetups_to_display %}
30+
{% assign detected_service = m.service %}
31+
{% unless detected_service %}
32+
{% if m.url contains "meetup.com" %}
33+
{% assign detected_service = "meetup" %}
34+
{% elsif m.url contains "lu.ma" or m.url contains "luma.com" %}
35+
{% assign detected_service = "luma" %}
36+
{% endif %}
37+
{% endunless %}
38+
39+
{% if detected_service == "meetup" %}
40+
<a href="{{ m.url }}">Meetup.com</a>
41+
{% elsif detected_service == "luma" %}
42+
<a href="{{ m.url }}">Luma.com</a>
43+
{% else %}
44+
<a href="{{ m.url }}">Link</a>
45+
{% endif %}
46+
{% unless forloop.last %} • {% endunless %}
47+
{% endfor %}
48+
</li>
49+
{% endif %}
1850
</ul>
1951
</dd>
2052
</div>

meetups/index.html

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,33 @@
99

1010
{% include filters.html %}
1111

12+
{% comment %} Group meetups by group name and date {% endcomment %}
13+
{% assign processed = "" | split: "" %}
14+
1215
{% for meetup in meetups %}
1316
{% assign date = meetup.date | date: "%s" | plus: 0 %}
1417
{% if date >= now %}
15-
{% include meetup.html %}
18+
{% assign group_name = meetup.name | split: " - " | first %}
19+
{% assign key = group_name | append: "|" | append: meetup.date %}
20+
21+
{% unless processed contains key %}
22+
{% assign processed = processed | push: key %}
23+
24+
{% comment %} Find all meetups for this group and date {% endcomment %}
25+
{% assign group_meetups = "" | split: "" %}
26+
{% for m in meetups %}
27+
{% assign m_date = m.date | date: "%s" | plus: 0 %}
28+
{% if m_date >= now %}
29+
{% assign m_group = m.name | split: " - " | first %}
30+
{% if m_group == group_name and m.date == meetup.date %}
31+
{% assign group_meetups = group_meetups | push: m %}
32+
{% endif %}
33+
{% endif %}
34+
{% endfor %}
35+
36+
{% assign meetup_group = group_meetups %}
37+
{% include meetup.html %}
38+
{% endunless %}
1639
{% endif %}
1740
{% endfor %}
1841
</dl>

src/data_file_validator.rb

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,24 @@ def validate
3737
end
3838

3939
if @type == :meetup
40-
event_groups_by_date = events.map { |event| [event["name"].split(" - ").first, event["date"]] }
40+
events_by_group_and_date = events.group_by { |event|
41+
[event["name"].split(" - ").first, event["date"]]
42+
}
4143

42-
duplicate_events = event_groups_by_date.tally.select { |group, count| count > 1 }
44+
events_by_group_and_date.each do |(group, date), group_events|
45+
next if group_events.size == 1
46+
47+
services = group_events.map { |event|
48+
event["service"] || detect_service_from_url(event["url"])
49+
}.compact
50+
51+
if services.uniq.size == services.size
52+
next
53+
end
4354

44-
duplicate_events.each do |(group, date), count|
4555
@duplicate_events_error = true
46-
puts "Meetup Group '#{group}' has #{count} events on #{date.iso8601}"
56+
duplicate_services = services.group_by { |s| s }.select { |_, v| v.size > 1 }.keys
57+
puts "Meetup Group '#{group}' has multiple events on #{date.iso8601} from the same service(s): #{duplicate_services.join(', ')}"
4758
end
4859
end
4960
end
@@ -76,4 +87,17 @@ def required_keys(type = @type)
7687
raise "required_keys: unknown type '#{type}'"
7788
end
7889
end
90+
91+
def detect_service_from_url(url)
92+
return nil unless url
93+
94+
case url
95+
when /meetup\.com/
96+
"meetup"
97+
when /lu\.ma/, /luma\.com/
98+
"luma"
99+
else
100+
nil
101+
end
102+
end
79103
end

src/events/luma_event.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ def event_end_time
3636
end
3737

3838
def event_url
39-
object.description.scan(/https:\/\/lu.ma\/.+/).first
39+
object.description.scan(/https:\/\/lu.ma\/.+/).first || object.description.scan(/https:\/\/luma\.com\/.+/).first
4040
end
4141
end

src/meetups_file_entry.rb

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
MeetupsFileEntry = Data.define(:name, :location, :date, :start_time, :end_time, :url, :status) do
1+
MeetupsFileEntry = Data.define(:name, :location, :date, :start_time, :end_time, :url, :status, :service) do
22
attr_reader :group
33

4-
def initialize(name:, location:, date:, start_time:, end_time:, url:, status: nil, group: nil)
4+
def initialize(name:, location:, date:, start_time:, end_time:, url:, status: nil, service: nil, group: nil)
55
date = date.is_a?(Date) ? date : Date.parse(date)
66
@group = group
7-
super(name:, location:, date:, start_time:, end_time:, url:, status:)
7+
service ||= detect_service(url)
8+
super(name:, location:, date:, start_time:, end_time:, url:, status:, service:)
89
end
910

1011
def self.from_yaml_item(hash)
@@ -16,14 +17,28 @@ def self.from_yaml_item(hash)
1617
end_time: hash["end_time"],
1718
url: hash["url"],
1819
group: hash["group"],
19-
status: hash["status"]
20+
status: hash["status"],
21+
service: hash["service"]
2022
)
2123
end
2224

2325
def service_id
2426
AbstractEvent.service_id_for_url(url)
2527
end
2628

29+
def detect_service(url)
30+
return nil unless url
31+
32+
case url
33+
when /meetup\.com/
34+
"meetup"
35+
when /lu\.ma/, /luma\.com/
36+
"luma"
37+
else
38+
nil
39+
end
40+
end
41+
2742
def to_hash
2843
hash = {
2944
"name" => name,
@@ -35,6 +50,7 @@ def to_hash
3550
}
3651

3752
hash["status"] = status if status.present?
53+
hash["service"] = service if service.present?
3854

3955
hash
4056
end

0 commit comments

Comments
 (0)