From c5b9fe77a8a0e1c2e6a051b700c5a5d4b98ff6fb Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Sat, 15 Jan 2022 14:08:29 -0500 Subject: add randomizer --- app/controllers/machines_controller.rb | 4 ++-- app/controllers/pages_controller.rb | 35 ++++++++++++++++++++++++++++++++++ app/controllers/players_controller.rb | 4 ++-- app/helpers/pages_helper.rb | 3 +++ app/views/layouts/application.html.erb | 6 ++++-- app/views/machines/index.html.erb | 3 ++- app/views/machines/show.html.erb | 4 +--- app/views/pages/index.html.erb | 2 ++ app/views/pages/randomize.html.erb | 10 ++++++++++ app/views/players/index.html.erb | 3 ++- app/views/players/show.html.erb | 4 +--- config/routes.rb | 5 ++--- db/schema.rb | 25 ++++++++++++------------ test/system/machines_test.rb | 13 +++++-------- test/system/players_test.rb | 11 ++++------- 15 files changed, 88 insertions(+), 44 deletions(-) create mode 100644 app/controllers/pages_controller.rb create mode 100644 app/helpers/pages_helper.rb create mode 100644 app/views/pages/index.html.erb create mode 100644 app/views/pages/randomize.html.erb diff --git a/app/controllers/machines_controller.rb b/app/controllers/machines_controller.rb index 3ef5893..33dcd3b 100644 --- a/app/controllers/machines_controller.rb +++ b/app/controllers/machines_controller.rb @@ -25,7 +25,7 @@ class MachinesController < ApplicationController respond_to do |format| if @machine.save - format.html { redirect_to machines_url, notice: 'Machine was successfully created.' } + format.html { redirect_to machines_url, notice: "Added #{@machine.name} #{@machine.edition}." } format.json { render :show, status: :created, location: @machine } else format.html { render :new, status: :unprocessable_entity } @@ -38,7 +38,7 @@ class MachinesController < ApplicationController def update respond_to do |format| if @machine.update(machine_params) - format.html { redirect_to machines_url, notice: 'Machine was successfully updated.' } + format.html { redirect_to machines_url, notice: "Updated #{@machine.name} #{@machine.edition}." } format.json { render :show, status: :ok, location: @machine } else format.html { render :show, status: :unprocessable_entity } diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb new file mode 100644 index 0000000..91b5ebc --- /dev/null +++ b/app/controllers/pages_controller.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class PagesController < ApplicationController + def index; end + + def randomize + @groups = make_teams + @machines = Machine.limit(@groups.size).order(Arel.sql('RANDOM()')) + end + + private + + def make_teams + r = Player.order(Arel.sql('RANDOM()')).to_a + + teams = [] + until r.empty? + if (r.size % 4).zero? + teams << r.shift(4) + elsif r.size.even? && (r.size > 2) + teams << r.shift(3) + teams << r.shift(3) + elsif (r.size % 3).zero? + teams << r.shift(3) + elsif r.size == 5 + teams << r.shift(3) + teams << r.shift(2) + else + teams << r.shift(4) + end + end + + teams.sort { |a, b| b.length <=> a.length } + end +end diff --git a/app/controllers/players_controller.rb b/app/controllers/players_controller.rb index 44034e5..cebe2a1 100644 --- a/app/controllers/players_controller.rb +++ b/app/controllers/players_controller.rb @@ -22,7 +22,7 @@ class PlayersController < ApplicationController respond_to do |format| if @player.save - format.html { redirect_to players_url, notice: 'Player was successfully created.' } + format.html { redirect_to players_url, notice: "Added #{@player.name}." } format.json { render :show, status: :created, location: @player } else format.html { render :new, status: :unprocessable_entity } @@ -35,7 +35,7 @@ class PlayersController < ApplicationController def update respond_to do |format| if @player.update(player_params) - format.html { redirect_to players_url, notice: 'Player was successfully updated.' } + format.html { redirect_to players_url, notice: "Updated #{@player.name}." } format.json { render :show, status: :ok, location: @player } else format.html { render :show, status: :unprocessable_entity } diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb new file mode 100644 index 0000000..b7429d2 --- /dev/null +++ b/app/helpers/pages_helper.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true +module PagesHelper +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a21e612..cc2f6c2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,8 +12,10 @@ <%= yield %> diff --git a/app/views/machines/index.html.erb b/app/views/machines/index.html.erb index 2c99524..8237518 100644 --- a/app/views/machines/index.html.erb +++ b/app/views/machines/index.html.erb @@ -8,4 +8,5 @@ <% end %> -<%= link_to "New machine", new_machine_path %> +
+<%= link_to "Add a pin", new_machine_path %> diff --git a/app/views/machines/show.html.erb b/app/views/machines/show.html.erb index 7870783..19e5f19 100644 --- a/app/views/machines/show.html.erb +++ b/app/views/machines/show.html.erb @@ -3,7 +3,5 @@ <%= render "form", machine: @machine %>
- <%= link_to "Back to machines", machines_path %> - - <%= button_to "Destroy this machine", @machine, method: :delete %> + <%= button_to "Delete #{@machine.name}", @machine, method: :delete %>
diff --git a/app/views/pages/index.html.erb b/app/views/pages/index.html.erb new file mode 100644 index 0000000..809ea04 --- /dev/null +++ b/app/views/pages/index.html.erb @@ -0,0 +1,2 @@ +

Knockout

+

To start the tournament, add players and make sure that the pins are up to date. Then hit randomize to automatically pick teams!

diff --git a/app/views/pages/randomize.html.erb b/app/views/pages/randomize.html.erb new file mode 100644 index 0000000..1505ab5 --- /dev/null +++ b/app/views/pages/randomize.html.erb @@ -0,0 +1,10 @@ +

Randomize

+ +<% @groups.each.with_index do |slice, i| %> +

<%= @machines[i].name %> <%= @machines[i].edition %>

+
    + <% slice.each do |player| %> +
  1. <%= link_to player.name, player_path(player) %>
  2. + <% end %> +
+<% end %> diff --git a/app/views/players/index.html.erb b/app/views/players/index.html.erb index 5a2b9ef..c067483 100644 --- a/app/views/players/index.html.erb +++ b/app/views/players/index.html.erb @@ -8,4 +8,5 @@ <% end %> -<%= link_to "New player", new_player_path %> +
+<%= link_to "Add a player", new_player_path %> diff --git a/app/views/players/show.html.erb b/app/views/players/show.html.erb index 42dce9c..e031050 100644 --- a/app/views/players/show.html.erb +++ b/app/views/players/show.html.erb @@ -3,7 +3,5 @@ <%= render "form", player: @player %>
- <%= link_to "Back to players", players_path %> - - <%= button_to "Destroy this player", @player, method: :delete %> + <%= button_to "Delete #{@player.name}", @player, method: :delete %>
diff --git a/config/routes.rb b/config/routes.rb index 51f6574..2a7b6e1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,9 @@ # frozen_string_literal: true Rails.application.routes.draw do + get 'randomize', to: 'pages#randomize' resources :machines resources :players - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html - # Defines the root path route ("/") - # root "articles#index" + root 'pages#index' end diff --git a/db/schema.rb b/db/schema.rb index 308429d..7a3bd6b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -10,21 +11,21 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_01_15_164820) do +ActiveRecord::Schema.define(version: 20_220_115_164_820) do - create_table "machines", force: :cascade do |t| - t.string "name" - t.string "edition" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + create_table 'machines', force: :cascade do |t| + t.string 'name' + t.string 'edition' + t.datetime 'created_at', precision: 6, null: false + t.datetime 'updated_at', precision: 6, null: false end - create_table "players", force: :cascade do |t| - t.string "name" - t.boolean "paid" - t.integer "strikes" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + create_table 'players', force: :cascade do |t| + t.string 'name' + t.boolean 'paid' + t.integer 'strikes' + t.datetime 'created_at', precision: 6, null: false + t.datetime 'updated_at', precision: 6, null: false end end diff --git a/test/system/machines_test.rb b/test/system/machines_test.rb index 552b188..1a8414a 100644 --- a/test/system/machines_test.rb +++ b/test/system/machines_test.rb @@ -9,36 +9,33 @@ class MachinesTest < ApplicationSystemTestCase test 'visiting the index' do visit machines_url - assert_selector 'h1', text: 'Machines' + assert_selector 'h1', text: 'Pins' end test 'should create machine' do visit machines_url - click_on 'New machine' + click_on 'Add a pin' fill_in 'Edition', with: @machine.edition fill_in 'Name', with: @machine.name click_on 'Create Machine' - assert_text 'Machine was successfully created' - click_on 'Back' + assert_text "Added #{@machine.name} #{@machine.edition}." end test 'should update Machine' do visit machine_url(@machine) - click_on 'Edit this machine', match: :first fill_in 'Edition', with: @machine.edition fill_in 'Name', with: @machine.name click_on 'Update Machine' - assert_text 'Machine was successfully updated' - click_on 'Back' + assert_text "Updated #{@machine.name} #{@machine.edition}." end test 'should destroy Machine' do visit machine_url(@machine) - click_on 'Destroy this machine', match: :first + click_on "Delete #{@machine.name}", match: :first assert_text 'Machine was successfully destroyed' end diff --git a/test/system/players_test.rb b/test/system/players_test.rb index b00910c..69f08e9 100644 --- a/test/system/players_test.rb +++ b/test/system/players_test.rb @@ -14,33 +14,30 @@ class PlayersTest < ApplicationSystemTestCase test 'should create player' do visit players_url - click_on 'New player' + click_on 'Add a player' fill_in 'Name', with: @player.name check 'Paid' if @player.paid fill_in 'Strikes', with: @player.strikes click_on 'Create Player' - assert_text 'Player was successfully created' - click_on 'Back' + assert_text "Added #{@player.name}." end test 'should update Player' do visit player_url(@player) - click_on 'Edit this player', match: :first fill_in 'Name', with: @player.name check 'Paid' if @player.paid fill_in 'Strikes', with: @player.strikes click_on 'Update Player' - assert_text 'Player was successfully updated' - click_on 'Back' + assert_text "Updated #{@player.name}." end test 'should destroy Player' do visit player_url(@player) - click_on 'Destroy this player', match: :first + click_on "Delete #{@player.name}", match: :first assert_text 'Player was successfully destroyed' end -- cgit 1.4.1