feat: complete 2.0.7.12 platform overhaul
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"kind": "cpu",
|
||||
"version": "2026.08",
|
||||
"generatedAt": "2026-08-16T00:00:00Z",
|
||||
"source": {
|
||||
"name": "YMhut Box hardware reference",
|
||||
"url": "https://update.ymhut.cn/api/client/reference-data/cpu",
|
||||
"disclaimer": "Relative scores summarize public multi-core and gaming results. Actual performance depends on power limits, memory, cooling and workload."
|
||||
},
|
||||
"checksum": "sha256:eca642fe4223c6fc53cf9fabce94d905cfcecc878d5ebd403fd66e1b06de429c",
|
||||
"items": [
|
||||
{ "rank": 1, "vendor": "AMD", "model": "Ryzen 9 9950X3D", "score": 100, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 2, "vendor": "AMD", "model": "Ryzen 9 9950X", "score": 96, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 3, "vendor": "Intel", "model": "Core Ultra 9 285K", "score": 90, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 4, "vendor": "AMD", "model": "Ryzen 9 9900X3D", "score": 86, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 5, "vendor": "AMD", "model": "Ryzen 7 9800X3D", "score": 81, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 6, "vendor": "Intel", "model": "Core i9-14900KS", "score": 79, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 7, "vendor": "AMD", "model": "Ryzen 9 7950X3D", "score": 77, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 8, "vendor": "Intel", "model": "Core i9-14900K", "score": 75, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 9, "vendor": "AMD", "model": "Ryzen 9 9900X", "score": 73, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 10, "vendor": "Intel", "model": "Core Ultra 7 265K", "score": 69, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 11, "vendor": "AMD", "model": "Ryzen 7 9700X", "score": 64, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 12, "vendor": "Intel", "model": "Core i7-14700K", "score": 62, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 13, "vendor": "AMD", "model": "Ryzen 7 7800X3D", "score": 60, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 14, "vendor": "AMD", "model": "Ryzen AI 9 HX 370", "score": 54, "tier": "移动高端", "segment": "mobile" },
|
||||
{ "rank": 15, "vendor": "Intel", "model": "Core Ultra 9 185H", "score": 50, "tier": "移动高端", "segment": "mobile" },
|
||||
{ "rank": 16, "vendor": "AMD", "model": "Ryzen 5 9600X", "score": 47, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 17, "vendor": "Intel", "model": "Core Ultra 5 245K", "score": 46, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 18, "vendor": "Intel", "model": "Core i5-14600K", "score": 44, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 19, "vendor": "AMD", "model": "Ryzen 5 7600", "score": 36, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 20, "vendor": "Intel", "model": "Core Ultra 7 155H", "score": 35, "tier": "移动主流", "segment": "mobile" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"kind": "gpu",
|
||||
"version": "2026.08",
|
||||
"generatedAt": "2026-08-16T00:00:00Z",
|
||||
"source": {
|
||||
"name": "YMhut Box hardware reference",
|
||||
"url": "https://update.ymhut.cn/api/client/reference-data/gpu",
|
||||
"disclaimer": "Relative scores summarize public gaming and compute results. Actual performance depends on power, cooling, drivers and workload."
|
||||
},
|
||||
"checksum": "sha256:a8258fa438b830446322750cd71435fd8e0ff65102eede3ca006bea6b61f3361",
|
||||
"items": [
|
||||
{ "rank": 1, "vendor": "NVIDIA", "model": "GeForce RTX 5090", "score": 100, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 2, "vendor": "NVIDIA", "model": "GeForce RTX 4090", "score": 82, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 3, "vendor": "NVIDIA", "model": "GeForce RTX 5080", "score": 78, "tier": "旗舰", "segment": "desktop" },
|
||||
{ "rank": 4, "vendor": "AMD", "model": "Radeon RX 9070 XT", "score": 67, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 5, "vendor": "NVIDIA", "model": "GeForce RTX 5070 Ti", "score": 65, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 6, "vendor": "AMD", "model": "Radeon RX 7900 XTX", "score": 63, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 7, "vendor": "NVIDIA", "model": "GeForce RTX 4080 SUPER", "score": 62, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 8, "vendor": "AMD", "model": "Radeon RX 9070", "score": 57, "tier": "高端", "segment": "desktop" },
|
||||
{ "rank": 9, "vendor": "NVIDIA", "model": "GeForce RTX 5070", "score": 52, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 10, "vendor": "AMD", "model": "Radeon RX 7900 XT", "score": 51, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 11, "vendor": "NVIDIA", "model": "GeForce RTX 4070 Ti SUPER", "score": 49, "tier": "中高端", "segment": "desktop" },
|
||||
{ "rank": 12, "vendor": "Intel", "model": "Arc B580", "score": 31, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 13, "vendor": "NVIDIA", "model": "GeForce RTX 5060 Ti", "score": 30, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 14, "vendor": "AMD", "model": "Radeon RX 7800 XT", "score": 29, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 15, "vendor": "NVIDIA", "model": "GeForce RTX 4060 Ti", "score": 24, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 16, "vendor": "Intel", "model": "Arc B570", "score": 23, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 17, "vendor": "AMD", "model": "Radeon RX 7700 XT", "score": 22, "tier": "主流", "segment": "desktop" },
|
||||
{ "rank": 18, "vendor": "NVIDIA", "model": "GeForce RTX 5060 Laptop", "score": 20, "tier": "移动主流", "segment": "mobile" },
|
||||
{ "rank": 19, "vendor": "AMD", "model": "Radeon RX 7600", "score": 17, "tier": "入门", "segment": "desktop" },
|
||||
{ "rank": 20, "vendor": "NVIDIA", "model": "GeForce RTX 4060 Laptop", "score": 16, "tier": "移动主流", "segment": "mobile" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package reference
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
//go:embed data/*.json
|
||||
var bundled embed.FS
|
||||
|
||||
var ErrNotFound = errors.New("reference data not found")
|
||||
|
||||
type Service struct {
|
||||
overrideRoot string
|
||||
}
|
||||
|
||||
func NewService(overrideRoot string) *Service {
|
||||
return &Service{overrideRoot: strings.TrimSpace(overrideRoot)}
|
||||
}
|
||||
|
||||
func (s *Service) Read(kind string) (map[string]any, error) {
|
||||
name, ok := fileName(kind)
|
||||
if !ok {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
var data []byte
|
||||
var err error
|
||||
if s.overrideRoot != "" {
|
||||
data, err = os.ReadFile(filepath.Join(s.overrideRoot, "reference-data", name))
|
||||
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if len(data) == 0 {
|
||||
data, err = bundled.ReadFile("data/" + name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var payload map[string]any
|
||||
if err := json.Unmarshal(data, &payload); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if payload["schemaVersion"] == nil || payload["items"] == nil {
|
||||
return nil, errors.New("reference data schema is invalid")
|
||||
}
|
||||
return payload, nil
|
||||
}
|
||||
|
||||
func (s *Service) Descriptors() map[string]any {
|
||||
return map[string]any{
|
||||
"cpu": map[string]any{
|
||||
"url": "/api/client/reference-data/cpu",
|
||||
"bundledFallback": true,
|
||||
},
|
||||
"gpu": map[string]any{
|
||||
"url": "/api/client/reference-data/gpu",
|
||||
"bundledFallback": true,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func fileName(kind string) (string, bool) {
|
||||
switch strings.ToLower(strings.TrimSpace(kind)) {
|
||||
case "cpu", "cpu-ranking":
|
||||
return "cpu-ranking.json", true
|
||||
case "gpu", "gpu-ranking":
|
||||
return "gpu-ranking.json", true
|
||||
default:
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package reference
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestReadUsesBundledSnapshot(t *testing.T) {
|
||||
service := NewService(t.TempDir())
|
||||
payload, err := service.Read("gpu")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if payload["kind"] != "gpu" {
|
||||
t.Fatalf("kind = %#v", payload["kind"])
|
||||
}
|
||||
items, ok := payload["items"].([]any)
|
||||
if !ok || len(items) < 10 {
|
||||
t.Fatalf("unexpected items: %#v", payload["items"])
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadPrefersValidOverride(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
dir := filepath.Join(root, "reference-data")
|
||||
if err := os.MkdirAll(dir, 0o750); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(dir, "cpu-ranking.json"), []byte(`{"schemaVersion":1,"kind":"cpu","version":"override","items":[]}`), 0o640); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
payload, err := NewService(root).Read("cpu")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if payload["version"] != "override" {
|
||||
t.Fatalf("version = %#v", payload["version"])
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadRejectsUnknownKind(t *testing.T) {
|
||||
if _, err := NewService("").Read("unknown"); err != ErrNotFound {
|
||||
t.Fatalf("err = %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user