18 Commits

Author SHA1 Message Date
fb76f28643 Added tests to hardware page 2024-05-29 12:33:45 -04:00
06262431da Updated some styles 2024-05-29 12:10:27 -04:00
e734d4077d Updated some styles 2024-05-29 12:08:58 -04:00
9617f4280d Fixed results table in test view 2024-05-29 12:04:08 -04:00
3ec5605c53 Fixed results table in test view 2024-05-29 12:02:45 -04:00
ed5232371c Fixed results table in test view 2024-05-29 12:00:04 -04:00
29d9cbc59c Fixed results table in test view 2024-05-29 11:57:49 -04:00
3eca29c2db Added back reference associations for result; added table of results to test view 2024-05-29 11:52:01 -04:00
8df9b7684f added missing import 2024-05-29 11:43:42 -04:00
7282d0a4b6 Fixed result form stuff 2024-05-29 11:43:17 -04:00
0525838f4b Fixed float variable types 2024-05-29 11:41:53 -04:00
958c72ee63 Added result creation route 2024-05-29 11:40:42 -04:00
fa92321176 Added result model; added form to submit results 2024-05-29 11:26:42 -04:00
458646ee8e Added result model; added form to submit results 2024-05-29 11:26:17 -04:00
9df8f6c9e1 Added result model; added form to submit results 2024-05-29 11:25:45 -04:00
7e294c8f72 Cleaned up runtime version 2024-05-29 11:09:55 -04:00
cefa79a8b8 Added Go runtime version to the layout footer 2024-05-29 11:05:02 -04:00
1e87466ccb Added Go runtime version to the layout footer 2024-05-29 11:04:31 -04:00
19 changed files with 232 additions and 17 deletions

View File

@ -4,7 +4,7 @@ VERSION=`git describe --tags`
.PHONY: build
## build: Compile the packages.
build:
@go build -o $(NAME) -ldflags "-X git.metaunix.net/bitgoblin/blt/app.Version=$(VERSION)"
@go build -o $(NAME) -ldflags "-X git.metaunix.net/bitgoblin/blt/app.AppVersion=$(VERSION)"
.PHONY: run
## run: Build and Run in development mode.

View File

@ -1,5 +1,15 @@
package app
var (
Version string = "N/a"
import (
"runtime"
)
var (
AppVersion string = "N/a"
RuntimeVersion string = runtimeVersion()
)
func runtimeVersion() string {
raw_string := runtime.Version()
return raw_string[2:]
}

View File

@ -11,5 +11,8 @@ type Benchmark struct {
Description string
// many-to-many test
Tests[] Test `gorm:"many2many:tests_benchmarks;"`
Tests []Test `gorm:"many2many:tests_benchmarks;"`
// has many results
Results []Result
}

View File

@ -10,5 +10,8 @@ type Hardware struct {
Type string
// has many tests
Tests[] Test
Tests []Test
// has many results
Results []Result
}

View File

@ -21,6 +21,6 @@ func Open() {
}
// Migrate the schema
DB.AutoMigrate(&Test{}, &Hardware{}, &Benchmark{})
DB.AutoMigrate(&Test{}, &Hardware{}, &Benchmark{}, &Result{})
log.Println("Database migrations complete.")
}

24
models/result.go Normal file
View File

@ -0,0 +1,24 @@
package models
import (
"gorm.io/gorm"
)
type Result struct {
gorm.Model
AverageScore float32
MinimumScore float32
MaximumScore float32
// belongs to Hardware
HardwareID int
Hardware Hardware
// belongs to Benchmark
BenchmarkID int
Benchmark Benchmark
// belongs to Test
TestID int
Test Test
}

View File

@ -14,5 +14,8 @@ type Test struct {
Hardware Hardware
// many-to-many benchmarks
Benchmarks[] Benchmark `gorm:"many2many:tests_benchmarks;"`
Benchmarks []Benchmark `gorm:"many2many:tests_benchmarks;"`
// has many results
Results []Result
}

View File

@ -11,7 +11,7 @@ body{
min-height: 100%;
box-sizing: border-box;
padding-top: 80px;
padding-bottom: 80px;
padding-bottom: 100px;
background: #eee;
}
@ -25,6 +25,32 @@ form select[multiple]{
min-height: 100px;
}
/* Material card styles */
.card-1 {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
}
.card-1:hover {
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);
}
.card-2 {
box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
}
.card-3 {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
}
.card-4 {
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);
}
.card-5 {
box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
}
.container{
max-width: 1024px;
}

View File

@ -7,9 +7,30 @@
<hr>
<h4>Latest Benchmark Results:</h4>
<h4>Tests Using This Component:</h4>
<p>There are currently no benchmarks recorded using this hardware component.</p>
{{ $length := len .hardware.Tests }} {{ if eq $length 0 }}
<p>There are currently no tests using this hardware component.</p>
{{ else }}
<table class="u-full-width">
<thead>
<tr>
<th>Test</th>
<th># of Benchmarks</th>
<th>Last Updated</th>
</tr>
</thead>
<tbody>
{{ range $test := .hardware.Tests }}
<tr>
<td><a href="/test/{{ $test.ID }}">{{ $test.Name }}</a></td>
<td>{{ len $test.Benchmarks }}</td>
<td>{{ $test.CreatedAt.Format "01/02/2006 15:04am" }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ end }}
<hr>

View File

@ -3,7 +3,7 @@
<!-- footer -->
<nav id="main-footer">
<p>BLT version {{ .app_version }}</p>
<p>BLT version {{ .app_version }} | Built with Go {{ .runtime_version }}</p>
</nav>
</body>

View File

@ -16,5 +16,5 @@
{{ template "navbar" . }}
<!-- main content -->
<div id="main-content" class="container">
<div id="main-content" class="container card-5">
{{ end }}

View File

@ -1,5 +1,5 @@
{{ define "navbar" }}
<nav id="main-nav">
<nav id="main-nav" class="card-2">
<div class="nav-left">
<h4>BLT</h4>
<ul>

View File

@ -17,9 +17,79 @@
<hr>
<h4>Add new result:</h4>
<form class="u-full-width" action="/result/add" method="POST">
<div class="row">
<div class="columns four">
<label for="result_benchmark">
Benchmark:
<select id="result_benchmark" class="u-full-width" name="result_benchmark">
{{ range $bm := .test.Benchmarks }}
<option value="{{ $bm.ID }}">{{ $bm.Name }}</option>
{{ end }}
</select>
</label>
</div>
<div class="columns two">
<label for="result_avg">
Average score:
<input id="result_avg" class="u-full-width" type="number" name="result_avg" value="0">
</label>
</div>
<div class="columns two">
<label for="result_min">
Minimum score:
<input id="result_min" class="u-full-width" type="number" name="result_min" value="0">
</label>
</div>
<div class="columns two">
<label for="result_max">
Maximum score:
<input id="result_max" class="u-full-width" type="number" name="result_max" value="0">
</label>
</div>
<div class="columns two">
<button class="button-primary u-full-width" type="submit" name="button">Submit</button>
</div>
<input type="hidden" name="result_test" value="{{ .test.ID }}">
<input type="hidden" name="result_hardware" value="{{ .test.Hardware.ID }}">
</div>
</form>
<hr>
<h4>Latest Benchmark Results:</h4>
<p>There are currently no benchmarks recorded in this test.</p>
{{ $length := len .test.Results }} {{ if eq $length 0 }}
<p>There are currently no benchmarks recorded in this test.</p>
{{ else }}
<table class="u-full-width">
<thead>
<tr>
<th>Benchmark</th>
<th>Average</th>
<th>Minimum</th>
<th>Maximum</th>
</tr>
</thead>
<tbody>
{{ range $res := .test.Results }}
<tr>
<td>{{ $res.Benchmark.Name }}</td>
<td>{{ $res.AverageScore }}</td>
<td>{{ if eq $res.MinimumScore 0.0 }}N/a{{ else }}{{ $res.MinimumScore }}{{ end }}</td>
<td>{{ if eq $res.MaximumScore 0.0 }}N/a{{ else }}{{ $res.MaximumScore }}{{ end }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ end }}
<hr>

10
web/forms/result.go Normal file
View File

@ -0,0 +1,10 @@
package forms
type ResultForm struct {
Test int `form:"result_test" validate:"required"`
Hardware int `form:"result_hardware" validate:"required"`
Benchmark int `form:"result_benchmark" validate:"required"`
AverageScore float32 `form:"result_avg" validate:"required"`
MinimumScore float32 `form:"result_min"`
MaximumScore float32 `form:"result_max"`
}

View File

@ -7,5 +7,6 @@ import (
)
func CustomVars(data template.Data) {
data["app_version"] = app.Version
data["app_version"] = app.AppVersion
data["runtime_version"] = app.RuntimeVersion
}

View File

@ -53,4 +53,9 @@ func RegisterRoutes(f *flamego.Flame) {
f.Get("/{test_id}", routes.TestGetView)
})
// result routes
f.Group("/result", func() {
f.Post("/add", binding.Form(forms.ResultForm{}), routes.ResultPostCreate)
})
}

View File

@ -30,7 +30,7 @@ func HardwareGetView(c flamego.Context, t template.Template, data template.Data)
// find hardware from DB
var hardware models.Hardware
models.DB.First(&hardware, hardwareID)
models.DB.Preload("Tests.Benchmarks").First(&hardware, hardwareID)
data["hardware"] = hardware
data["title"] = hardware.Name

39
web/routes/result.go Normal file
View File

@ -0,0 +1,39 @@
package routes
import (
"fmt"
"log"
"github.com/flamego/binding"
"github.com/flamego/flamego"
"github.com/flamego/validator"
"git.metaunix.net/bitgoblin/blt/models"
"git.metaunix.net/bitgoblin/blt/web/forms"
)
func ResultPostCreate(c flamego.Context, form forms.ResultForm, errs binding.Errors) {
if len(errs) > 0 {
var err error
switch errs[0].Category {
case binding.ErrorCategoryValidation:
err = errs[0].Err.(validator.ValidationErrors)[0]
default:
err = errs[0].Err
}
log.Fatal(err)
}
result := models.Result{
TestID: form.Test,
HardwareID: form.Hardware,
BenchmarkID: form.Benchmark,
AverageScore: form.AverageScore,
MinimumScore: form.MinimumScore,
MaximumScore: form.MaximumScore,
}
_ = models.DB.Create(&result)
c.Redirect(fmt.Sprintf("/test/%d", result.TestID))
}

View File

@ -30,7 +30,7 @@ func TestGetView(c flamego.Context, t template.Template, data template.Data) {
// find hardware from DB
var test models.Test
models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID)
models.DB.Preload("Hardware").Preload("Benchmarks").Preload("Results.Benchmark").First(&test, testID)
data["test"] = test
data["title"] = test.Name