Skip to content

Commit 7b264ff

Browse files
authored
Merge pull request #2499 from mroderick/feature/seeds-performance-data
feat(seeds): generate more workshops for performance testing
2 parents f7ea200 + a5e5fdf commit 7b264ff

File tree

1 file changed

+107
-62
lines changed

1 file changed

+107
-62
lines changed

db/seeds.rb

Lines changed: 107 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,159 @@
11
if Rails.env.development?
22
# Check for ImageMagick before seeding
33
imagemagick_available = system('convert --version > /dev/null 2>&1') ||
4-
system('magick --version > /dev/null 2>&1')
4+
system('magick --version > /dev/null 2>&1')
55

66
unless imagemagick_available
7-
Rails.logger.error "=" * 80
8-
Rails.logger.error "ERROR: ImageMagick is required to run db:seed"
9-
Rails.logger.error "=" * 80
10-
Rails.logger.error ""
11-
Rails.logger.error "The seed task processes sponsor logo images, which requires ImageMagick."
12-
Rails.logger.error ""
13-
Rails.logger.error "Install ImageMagick:"
14-
Rails.logger.error " macOS: brew install imagemagick"
15-
Rails.logger.error " Ubuntu/Debian: apt-get install imagemagick"
16-
Rails.logger.error " Windows: https://imagemagick.org/script/download.php"
17-
Rails.logger.error ""
18-
Rails.logger.error "See native-installation-instructions.md for details."
19-
Rails.logger.error "=" * 80
7+
Rails.logger.error '=' * 80
8+
Rails.logger.error 'ERROR: ImageMagick is required to run db:seed'
9+
Rails.logger.error '=' * 80
10+
Rails.logger.error ''
11+
Rails.logger.error 'The seed task processes sponsor logo images, which requires ImageMagick.'
12+
Rails.logger.error ''
13+
Rails.logger.error 'Install ImageMagick:'
14+
Rails.logger.error ' macOS: brew install imagemagick'
15+
Rails.logger.error ' Ubuntu/Debian: apt-get install imagemagick'
16+
Rails.logger.error ' Windows: https://imagemagick.org/script/download.php'
17+
Rails.logger.error ''
18+
Rails.logger.error 'See native-installation-instructions.md for details.'
19+
Rails.logger.error '=' * 80
2020
exit 1
2121
end
2222

2323
begin
2424
Rails.logger.info 'Running migrations...'
2525
Rails.application.config.log_level = :info
26-
Rails.logger.info "Creating chapters..."
27-
chapters = ['London', 'Brighton', 'Cambridge', 'Barcelona', 'Paris', 'Merlbourne', 'Berlin', 'New York'].map do |name|
26+
Rails.logger.info 'Creating chapters...'
27+
chapters = ['London', 'Brighton', 'Cambridge', 'Barcelona', 'Paris', 'Merlbourne', 'Berlin',
28+
'New York'].map do |name|
2829
Fabricate(:chapter_with_groups, name: name)
2930
end
3031

31-
Rails.logger.info "Creating workshops..."
32-
workshops = 6.times.map do |n|
33-
start = Time.zone.now + 1.month - n.weeks
34-
ends_at = start + 3.hours
35-
Fabricate(:workshop, title: 'Workshop',
32+
Rails.logger.info 'Creating workshops...'
33+
34+
Rails.logger.info 'Creating 1000 past workshops...'
35+
past_workshops = []
36+
1000.times do
37+
months_ago = rand(0..60)
38+
start = Time.zone.now - months_ago.months + rand(0..28).days + rand(0..23).hours
39+
workshop = Fabricate(:workshop,
40+
title: 'Workshop',
3641
chapter: chapters.sample,
3742
date_and_time: start,
38-
ends_at: ends_at)
43+
ends_at: start + 3.hours)
44+
past_workshops << workshop
3945
end
4046

41-
workshops.concat Fabricate.times(2, :workshop, title: 'Workshop', chapter: chapters.sample)
42-
43-
Rails.logger.info "Creating a lot of old workshops..."
44-
past_workshops_since_n_months = 5 * 12
45-
past_workshops_one_per_n_months = 6
46-
past_workshops_count = past_workshops_since_n_months/past_workshops_one_per_n_months
47-
48-
past_workshops = past_workshops_count.times.map do |n|
49-
Fabricate(:workshop, title: 'Workshop',
47+
Rails.logger.info 'Creating 100 future workshops...'
48+
future_workshops = []
49+
100.times do
50+
months_ahead = rand(1..3)
51+
start = Time.zone.now + months_ahead.months + rand(0..28).days + rand(0..23).hours
52+
workshop = Fabricate(:workshop,
53+
title: 'Workshop',
5054
chapter: chapters.sample,
51-
date_and_time: Time.zone.now - past_workshops_since_n_months.months + (past_workshops_one_per_n_months * n).months)
55+
date_and_time: start,
56+
ends_at: start + 3.hours)
57+
future_workshops << workshop
5258
end
5359

54-
Rails.logger.info "Creating events..."
60+
future_workshops.first(10)
61+
62+
Rails.logger.info 'Creating events...'
5563
events = 20.times.map do |n|
5664
Fabricate(:event, name: 'Event',
5765
chapters: chapters.sample(4),
5866
date_and_time: Time.zone.now + 2.months - n.months)
5967
end
6068

61-
Rails.logger.info "Creating meetings..."
69+
Rails.logger.info 'Creating meetings...'
6270

6371
20.times.map do |n|
6472
Fabricate(:meeting, name: 'Meeting',
6573
date_and_time: Time.zone.now + 1.month - n.months)
6674
end
6775

68-
Rails.logger.info "Creating coaches..."
69-
coaches = 50.times.map { Fabricate(:coach, groups: Group.coaches.order('RANDOM()').limit(2)) }
76+
Rails.logger.info 'Creating coaches...'
77+
coaches_group = Group.coaches.to_a
78+
students_group = Group.students.to_a
79+
coaches = 500.times.map { Fabricate(:coach, groups: coaches_group.sample(2)) }
7080
tutorials = Fabricate.times(20, :tutorial)
7181
30.times { Fabricate(:feedback_request, workshop: past_workshops.sample) }
7282
20.times { Fabricate(:feedback, tutorial: tutorials.sample, coach: coaches.sample) }
7383
10.times { Fabricate(:testimonial, member: coaches.sample) }
7484

75-
job_titles = [
76-
'Software Engineer',
77-
'Software Developer',
78-
'Front-end Developer',
79-
'Back-end Developer',
80-
'Full-stack Developer'
85+
# Add skills to some coaches using acts_as_taggable_on
86+
skill_lists = [
87+
'javascript, ruby, rails',
88+
'python, django, sql',
89+
'react, typescript, node',
90+
'java, spring, kotlin',
91+
'css, html, bootstrap',
92+
'go, kubernetes, docker',
93+
'c++, rust, systems',
94+
'swift, ios, android',
95+
'php, laravel, mysql',
96+
'git, linux, devops'
8197
]
8298

83-
job_companies = %w[
84-
ACME
85-
Globex
86-
Soylent
87-
Initech
88-
Umbrella
89-
Wonka
90-
]
99+
coaches.each do |coach|
100+
next if rand > 0.7 # 70% of coaches get skills
101+
102+
coach.skill_list.add(skill_lists.sample(rand(1..4)).split(', '))
103+
coach.save(validate: false)
104+
end
91105

92-
Rails.logger.info "Creating students..."
93-
students = 50.times.map { Fabricate(:student, groups: Group.students.order('RANDOM()').limit(2)) }
106+
Rails.logger.info 'Creating students...'
107+
students = 500.times.map { Fabricate(:student, groups: students_group.sample(2)) }
94108

95-
Rails.logger.info "Creating event invitations..."
96-
10.times do |n|
109+
Rails.logger.info 'Creating event invitations...'
110+
10.times do |_n|
97111
Fabricate(:invitation, member: students.sample, event: events.sample)
98112
Fabricate(:coach_invitation, member: coaches.sample, event: events.sample)
99113
end
100114

101-
Rails.logger.info "Creating attended by coach workshop invitations..."
102-
coaches.sample(15).each do |coach|
103-
past_workshops.sample(3).each do |workshop|
104-
Fabricate(:attended_coach, workshop: workshop, member: coach)
115+
Rails.logger.info 'Creating workshop invitations for past workshops...'
116+
past_workshops.each do |workshop|
117+
invitation_count = rand(8..15)
118+
invitation_count.times do
119+
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshop)
120+
rescue StandardError
121+
nil
122+
end
123+
invitation_count.times do
124+
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshop)
125+
rescue StandardError
126+
nil
127+
end
128+
129+
# Create some attended invitations so coaches appear on wall_of_fame
130+
# Track which coaches already have invitations to avoid duplicates
131+
existing_invitees = WorkshopInvitation.where(workshop: workshop, role: 'Coach').pluck(:member_id)
132+
available_coaches = coaches.reject { |c| existing_invitees.include?(c.id) }
133+
rand(3..8).times do
134+
break if available_coaches.empty?
135+
136+
coach = available_coaches.sample
137+
available_coaches.delete(coach)
138+
Fabricate(:attended_coach, member: coach, workshop: workshop)
139+
rescue StandardError
140+
nil
105141
end
106142
end
107143

108-
Rails.logger.info "Creating workshop invitations..."
109-
30.times do |n|
110-
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshops.sample) rescue nil
111-
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshops.sample) rescue nil
144+
Rails.logger.info 'Creating workshop invitations for future workshops...'
145+
future_workshops.each do |workshop|
146+
invitation_count = rand(10..20)
147+
invitation_count.times do
148+
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshop)
149+
rescue StandardError
150+
nil
151+
end
152+
invitation_count.times do
153+
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshop)
154+
rescue StandardError
155+
nil
156+
end
112157
end
113158
Rails.logger.info '..done!'
114159
rescue Exception => e

0 commit comments

Comments
 (0)