diff --git a/config/defaults.yaml b/config/defaults.yaml index 8f173a4..baff6cc 100644 --- a/config/defaults.yaml +++ b/config/defaults.yaml @@ -1,3 +1,6 @@ database: adapter: 'sqlite' database: 'data/gamedata.db' + +testing: + minimum_results_required: 3 diff --git a/db/migrations/0003_add_tests_table.rb b/db/migrations/0003_add_tests_table.rb new file mode 100644 index 0000000..31fb3cc --- /dev/null +++ b/db/migrations/0003_add_tests_table.rb @@ -0,0 +1,31 @@ +Sequel.migration do + + up do + # create tests table + create_table(:tests) do + primary_key :id + String :date_tag, null: false + DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP + DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP + end + + # add foreign keys to tests table + alter_table(:tests) do + add_foreign_key(:benchmark_id, :benchmarks, null: false) + add_foreign_key(:hardware_id, :hardware, null: false) + end + + # add the test ID link to results table; remove old links to hardware and benchmarks tables + alter_table(:results) do + add_foreign_key(:test_id, :tests, null: false) + drop_column(:benchmark_id) + drop_column(:hardware_id) + end + end + + down do + drop_column(:results, :test_id) + drop_table(:tests) + end + +end diff --git a/public/css/remmington.css b/public/css/remmington.css index f002ff9..1c8d256 100644 --- a/public/css/remmington.css +++ b/public/css/remmington.css @@ -1,3 +1,7 @@ #main-nav{ margin-bottom: 15px; } + +h1.invalid{ + color: red; +} diff --git a/src/models/benchmark.rb b/src/models/benchmark.rb index bef091f..5943e19 100644 --- a/src/models/benchmark.rb +++ b/src/models/benchmark.rb @@ -1,5 +1,5 @@ class Benchmark < Sequel::Model - one_to_many :results + one_to_many :tests end diff --git a/src/models/hardware.rb b/src/models/hardware.rb index 0bdff73..ed2ac8a 100644 --- a/src/models/hardware.rb +++ b/src/models/hardware.rb @@ -1,5 +1,5 @@ class Hardware < Sequel::Model(:hardware) - one_to_many :results + one_to_many :tests end diff --git a/src/models/init.rb b/src/models/init.rb index fb936c7..3a9103b 100644 --- a/src/models/init.rb +++ b/src/models/init.rb @@ -1,3 +1,4 @@ require_relative 'hardware' require_relative 'benchmark' require_relative 'result' +require_relative 'test' diff --git a/src/models/result.rb b/src/models/result.rb index d7ecac8..74fca67 100644 --- a/src/models/result.rb +++ b/src/models/result.rb @@ -1,7 +1,6 @@ class Result < Sequel::Model - many_to_one :hardware - many_to_one :benchmark + many_to_one :test def formatted_score() return self.score diff --git a/src/models/test.rb b/src/models/test.rb new file mode 100644 index 0000000..0d1576e --- /dev/null +++ b/src/models/test.rb @@ -0,0 +1,27 @@ +class Test < Sequel::Model + + one_to_many :results # link Test model to its related results + many_to_one :benchmark # link Test model back to its benchmark + many_to_one :hardware # link Test model back to hardware used in test + + # formats the name of the test for display in the web UI + def formatted_name() + return "#{self.date_tag} - #{self.hardware.name} / #{self.benchmark.name}" + end + + # formats the name of the test for use in a graph + def graph_name() + return "#{self.hardware.name} (#{self.date_tag})" + end + + # determines whether the test has enough results to fulfill the requirement + def valid?() + return (self.results.length >= $conf.get('testing.minimum_results_required')) + end + + # determines how many results are still missing for a test + def missing_results() + return ($conf.get('testing.minimum_results_required') - self.results.length) + end + +end diff --git a/src/routes/index.rb b/src/routes/index.rb index 9201127..dfa08be 100644 --- a/src/routes/index.rb +++ b/src/routes/index.rb @@ -1,9 +1,11 @@ class GameData < Sinatra::Base get '/' do + tests = Test.reverse(:updated_at).limit(10).all() results = Result.reverse(:updated_at).limit(10).all() erb :'index/index', locals: { title: 'Dashboard', + tests: tests, results: results } end diff --git a/src/routes/init.rb b/src/routes/init.rb index f0f96cb..1c178d2 100644 --- a/src/routes/init.rb +++ b/src/routes/init.rb @@ -2,3 +2,4 @@ require_relative 'index' require_relative 'hardware' require_relative 'benchmark' require_relative 'result' +require_relative 'test' diff --git a/src/routes/test.rb b/src/routes/test.rb new file mode 100644 index 0000000..92d0517 --- /dev/null +++ b/src/routes/test.rb @@ -0,0 +1,48 @@ +class GameData < Sinatra::Base + get '/test' do + tests = Test.reverse(:updated_at).limit(10).all() + + erb :'test/index', locals: { + title: 'List of Tests', + tests: tests + } + end + + get '/test/:test_id' do + test = Test.where(id: params[:test_id]).first() + erb :'test/view', locals: { + title: "Test: #{test.date_tag}", + test: test + } + end + + get '/test/add' do + hardware = Hardware.all() + benchmarks = Benchmark.all() + + erb :'test/add', locals: { + title: 'Add Test', + hardware: hardware, + benchmarks: benchmarks + } + end + post '/test/add' do + date_tag = params[:test_date_tag] + + # make sure the date tag field is formatting properly + unless date_tag.start_with?('(') + date_tag = '(' + date_tag + end + unless date_tag.end_with?(')') + date_tag = date_tag + ')' + end + + test = Test.create( + date_tag: params[:test_date_tag], + hardware_id: params[:test_hardware], + benchmark_id: params[:test_benchmark] + ) + + redirect "/test/#{test.id}" + end +end diff --git a/views/index/index.erb b/views/index/index.erb index 3490a5d..17ed43e 100644 --- a/views/index/index.erb +++ b/views/index/index.erb @@ -1,12 +1,43 @@
- <% if results.length > 0 %> + <% if tests.length > 0 %>
+

Latest tests:

+
+
+ + + + + + + + + + <% tests.each do |t| %> + + + + + + <% end %> + +
Hardware testedBenchmark used# results
<%= t.hardware.name %><%= t.benchmark.name %><%= t.results.length %>
+
+ <% else %> +
+

I'm sorry, there don't appear to be any tests created yet. Check again later!

+
+ <% end %> + + <% if results.length > 0 %> +
``

Latest benchmark results:

+ @@ -15,8 +46,9 @@ <% results.each do |r| %> - - + + + <% end %> diff --git a/views/partials/navbar.erb b/views/partials/navbar.erb index 45058f1..d71f762 100644 --- a/views/partials/navbar.erb +++ b/views/partials/navbar.erb @@ -4,6 +4,7 @@
  • Dashboard
  • Hardware
  • Benchmarks
  • +
  • Tests
  • Results
  • Comparisons
  • diff --git a/views/test/add.erb b/views/test/add.erb new file mode 100644 index 0000000..c6a5136 --- /dev/null +++ b/views/test/add.erb @@ -0,0 +1,46 @@ +
    +
    +

    Add new test

    +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + + + + +
    diff --git a/views/test/index.erb b/views/test/index.erb new file mode 100644 index 0000000..67c7bfe --- /dev/null +++ b/views/test/index.erb @@ -0,0 +1,42 @@ +
    +
    +

    List of tests

    +
    + +
    +

    + Add new test +

    +
    +
    + +
    + <% if tests.length > 0 %> +
    +
    Test Hardware tested Benchmark used Score
    <%= r.hardware.name %><%= r.benchmark.name %><%= r.test.name %><%= r.test.hardware.name %><%= r.test.benchmark.name %> <%= r.formatted_score() %>
    + + + + + + + + + + <% tests.each do |t| %> + + + + + + + <% end %> + +
    Test name# of resultsDate addedDate modified
    <%= t.name %><%= t.results.length %><%= date_format(t.created_at) %><%= date_format(t.updated_at) %>
    +
    + <% else %> +
    +

    I'm sorry, there don't appear to be any tests added yet. Check again later!

    +
    + <% end %> +
    diff --git a/views/test/view.erb b/views/test/view.erb new file mode 100644 index 0000000..17fdf25 --- /dev/null +++ b/views/test/view.erb @@ -0,0 +1,22 @@ +
    +
    +

    class="invalid"<% end %>><%= test.formatted_name %>

    + <% unless test.valid? %> +

    Missing <%= test.missing_results %> results!

    + <% end %> +
    + +
    +

    Test results

    + + <% if test.results.length > 0 %> + + <% else %> +

    There are no results

    + <% end %> +
    +