diff --git a/README.md b/README.md index 60a9c9c8..be67d64b 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,9 @@ Fill in the environment variables Install this project with: ```sh bundle install + yarn install --frozen-lockfile + yarn build:css + gem install foreman rails db:create db:migrate db:seed ``` @@ -145,6 +148,11 @@ To run the project, execute the following command: ``` Open `http://localhost:3000/` on your browser. +`bin/dev` builds the stylesheet, then runs Rails, the CSS watcher, and Sidekiq +using `Procfile.dev`. Node.js, Yarn, and Foreman must be installed. +If you start Rails directly with `bin/rails server`, run `yarn build:css` first +and use `yarn build:css --watch` in another terminal while editing styles. + ### Run tests To run tests, run the following command: diff --git a/app/assets/images/addisu.jpeg b/app/assets/images/addisu.jpeg new file mode 100644 index 00000000..76427535 Binary files /dev/null and b/app/assets/images/addisu.jpeg differ diff --git a/app/assets/images/arturo.jpeg b/app/assets/images/arturo.jpeg new file mode 100644 index 00000000..d83e3c1f Binary files /dev/null and b/app/assets/images/arturo.jpeg differ diff --git a/app/assets/images/brenda.jpeg b/app/assets/images/brenda.jpeg new file mode 100644 index 00000000..c73e0102 Binary files /dev/null and b/app/assets/images/brenda.jpeg differ diff --git a/app/assets/images/darik.jpg b/app/assets/images/darik.jpg new file mode 100755 index 00000000..102f5539 Binary files /dev/null and b/app/assets/images/darik.jpg differ diff --git a/app/assets/images/david.jpg b/app/assets/images/david.jpg new file mode 100755 index 00000000..337c7e86 Binary files /dev/null and b/app/assets/images/david.jpg differ diff --git a/app/assets/images/elson.jpeg b/app/assets/images/elson.jpeg new file mode 100644 index 00000000..7653c9e5 Binary files /dev/null and b/app/assets/images/elson.jpeg differ diff --git a/app/assets/images/gabriel.jpg b/app/assets/images/gabriel.jpg new file mode 100755 index 00000000..992ed7df Binary files /dev/null and b/app/assets/images/gabriel.jpg differ diff --git a/app/assets/images/jesus.jpg b/app/assets/images/jesus.jpg new file mode 100755 index 00000000..44e68bf3 Binary files /dev/null and b/app/assets/images/jesus.jpg differ diff --git a/app/assets/images/santo.jpeg b/app/assets/images/santo.jpeg new file mode 100644 index 00000000..6726058a Binary files /dev/null and b/app/assets/images/santo.jpeg differ diff --git a/app/assets/images/tinashe.jpeg b/app/assets/images/tinashe.jpeg new file mode 100644 index 00000000..fddef885 Binary files /dev/null and b/app/assets/images/tinashe.jpeg differ diff --git a/app/assets/images/worash.jpg b/app/assets/images/worash.jpg new file mode 100755 index 00000000..0a92fafe Binary files /dev/null and b/app/assets/images/worash.jpg differ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5286a5f7..371ae20f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -8,7 +8,7 @@ def current_user end def current_visitor - session[:visitor_id] ? Visitor.find(session[:visitor_id]) : create_current_visitor + Visitor.find_by(id: session[:visitor_id]) || create_current_visitor end def posts_per_page diff --git a/bin/dev b/bin/dev index 5f91c205..f33a1912 100755 --- a/bin/dev +++ b/bin/dev @@ -1,2 +1,6 @@ #!/usr/bin/env ruby -exec "./bin/rails", "server", *ARGV +Dir.chdir(File.expand_path("..", __dir__)) do + # Build once before Rails starts so the first request has a stylesheet. + system("yarn", "build:css", exception: true) + exec "foreman", "start", "-f", "Procfile.dev", *ARGV +end diff --git a/bin/setup b/bin/setup index be3db3c0..708da830 100755 --- a/bin/setup +++ b/bin/setup @@ -15,6 +15,10 @@ FileUtils.chdir APP_ROOT do puts "== Installing dependencies ==" system("bundle check") || system!("bundle install") + puts "\n== Installing and building stylesheets ==" + system! "yarn install --frozen-lockfile" + system! "yarn build:css" + # puts "\n== Copying sample files ==" # unless File.exist?("config/database.yml") # FileUtils.cp "config/database.yml.sample", "config/database.yml" diff --git a/db/seeds.rb b/db/seeds.rb index 9e503879..0a0d9c3c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -7,17 +7,31 @@ # Character.create(name: 'Luke', movie: movies.first) unless Member.any? - Member.create!(name: 'Elson', bio: 'Student from Brazil', email: 'elson@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Worash', bio: 'Student from Ethiopia', email: 'worash@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Jesus', bio: 'Student from Mexico', email: 'jesus@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Darik', bio: 'Student from Ethiopia', email: 'darik@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Gabriel', bio: 'Student from Brazil', email: 'gabriel@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'David', bio: 'Student from Ecuador', email: 'david@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Brenda', bio: 'Student from Rwanda', email: 'brenda@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Addisu', bio: 'Student from Ethiopia', email: 'addisu@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Tinashe', bio: 'Student from Zimbabwe', email: 'tinashe@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Gabriel', bio: 'Student from Brazil', email: 'santo@blog.com', password: 'foobar', password_confirmation: 'foobar') - Member.create!(name: 'Arturo', bio: 'Student from Ecuador', email: 'arturo@blog.com', password: 'foobar', password_confirmation: 'foobar') + members = [ + { name: 'Elson', bio: 'Student from Brazil', email: 'elson@blog.com' }, + { name: 'Worash', bio: 'Student from Ethiopia', email: 'worash@blog.com' }, + { name: 'Jesus', bio: 'Student from Mexico', email: 'jesus@blog.com' }, + { name: 'Darik', bio: 'Student from Ethiopia', email: 'darik@blog.com' }, + { name: 'Gabriel', bio: 'Student from Brazil', email: 'gabriel@blog.com' }, + { name: 'David', bio: 'Student from Ecuador', email: 'david@blog.com' }, + { name: 'Brenda', bio: 'Student from Rwanda', email: 'brenda@blog.com' }, + { name: 'Addisu', bio: 'Student from Ethiopia', email: 'addisu@blog.com' }, + { name: 'Tinashe', bio: 'Student from Zimbabwe', email: 'tinashe@blog.com' }, + { name: 'Gabriel', bio: 'Student from Brazil', email: 'santo@blog.com' }, + { name: 'Arturo', bio: 'Student from Ecuador', email: 'arturo@blog.com' } + ] + + members.each do |attributes| + member = Member.new(attributes.merge(password: 'foobar', password_confirmation: 'foobar')) + email_name = member.email.split('@').first + avatar_path = Rails.root.join('app/assets/images').glob("#{email_name}.{jpg,jpeg,png}").first + raise "Avatar image not found for #{member.email}" unless avatar_path + + File.open(avatar_path, 'rb') do |file| + member.avatar.attach(io: file, filename: avatar_path.basename.to_s) + member.save! + end + end end unless Post.any? diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb new file mode 100644 index 00000000..2437c778 --- /dev/null +++ b/spec/controllers/application_controller_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +RSpec.describe ApplicationController, type: :controller do + describe '#current_visitor' do + it 'reuses the visitor stored in the session' do + visitor = Visitor.create!(user_agent: 'Test browser') + session[:visitor_id] = visitor.id + + expect { expect(controller.current_visitor).to eq(visitor) }.not_to change(Visitor, :count) + end + + it 'creates a visitor when the session has no visitor ID' do + request.env['HTTP_USER_AGENT'] = 'Test browser' + + expect { controller.current_visitor }.to change(Visitor, :count).by(1) + + visitor = Visitor.find(session[:visitor_id]) + expect(visitor.user_agent).to eq('Test browser') + expect(controller.current_visitor).to eq(visitor) + end + + it 'replaces a stale visitor ID in the session' do + visitor = Visitor.create!(user_agent: 'Old browser') + session[:visitor_id] = visitor.id + visitor.destroy! + request.env['HTTP_USER_AGENT'] = 'Test browser' + + expect { controller.current_visitor }.to change(Visitor, :count).by(1) + + replacement = Visitor.find(session[:visitor_id]) + expect(replacement.id).not_to eq(visitor.id) + expect(replacement.user_agent).to eq('Test browser') + expect(controller.current_visitor).to eq(replacement) + end + end +end