Skip to content

Commit ff8ddba

Browse files
committed
Implement matrix model computation with metrics
- Created useMatrixModel hook with cell selection logic - Added BuildResult interface for normalized build results - Implemented semver comparison for release channel version selection - Added timestamp comparison for dev channel (most recent wins) - Created ExtensionMetrics (failures, successes, skipped, readiness %) - Built MatrixModel with columns, rows, and totals - Added validateMatrixModel() dev-only validation - Updated MatrixPage to display matrix stats - Fixed MatrixGrid to use ExtensionRow.extension instead of .name - Updated sample data with BuildResult entries (12 results) - Added matrix-stats CSS styling - Updated types for MatrixCell with status, category, extensionVersion, runUrl, artifactUrl
1 parent 33e08c8 commit ff8ddba

9 files changed

Lines changed: 644 additions & 107 deletions

File tree

public/sample-data/manifest.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,11 @@
1111
"url": "snapshots/latest.json",
1212
"timestamp": "2024-01-01T00:00:00Z"
1313
}
14-
]
14+
],
15+
"axes": {
16+
"php_versions": ["8.1", "8.2"],
17+
"channels": ["stable", "dev"],
18+
"platforms": ["alpine", "debian"],
19+
"arches": ["amd64", "arm64"]
20+
}
1521
}
Lines changed: 141 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,152 @@
11
{
22
"schema_version": "1.0",
33
"timestamp": "2024-01-01T00:00:00Z",
4-
"extensions": [
4+
"results": [
55
{
6-
"name": "gd",
7-
"availability": [
8-
{
9-
"channel": "stable",
10-
"platform": "linux",
11-
"platform_version": "alpine3.19",
12-
"arch": "amd64",
13-
"php_versions": ["8.1", "8.2"],
14-
"available": true
15-
},
16-
{
17-
"channel": "stable",
18-
"platform": "linux",
19-
"platform_version": "debian12",
20-
"arch": "amd64",
21-
"php_versions": ["8.1", "8.2"],
22-
"available": true
23-
}
24-
]
6+
"extension": "gd",
7+
"extension_version": "1.0.0",
8+
"channel": "stable",
9+
"php_version": "8.1",
10+
"platform": "alpine",
11+
"platform_version": "alpine3.19",
12+
"arch": "amd64",
13+
"status": "success",
14+
"finished_at": "2024-01-01T10:00:00Z",
15+
"run": {
16+
"url": "https://example.com/runs/1"
17+
},
18+
"artifact": {
19+
"url": "https://example.com/artifacts/gd-8.1.tar.gz"
20+
}
2521
},
2622
{
27-
"name": "pdo_mysql",
28-
"availability": [
29-
{
30-
"channel": "stable",
31-
"platform": "linux",
32-
"platform_version": "alpine3.19",
33-
"arch": "amd64",
34-
"php_versions": ["8.1", "8.2"],
35-
"available": true
36-
},
37-
{
38-
"channel": "stable",
39-
"platform": "linux",
40-
"platform_version": "debian12",
41-
"arch": "amd64",
42-
"php_versions": ["8.1", "8.2"],
43-
"available": true
44-
}
45-
]
23+
"extension": "gd",
24+
"extension_version": "1.0.0",
25+
"channel": "stable",
26+
"php_version": "8.2",
27+
"platform": "alpine",
28+
"platform_version": "alpine3.19",
29+
"arch": "amd64",
30+
"status": "success",
31+
"finished_at": "2024-01-01T10:05:00Z",
32+
"run": {
33+
"url": "https://example.com/runs/2"
34+
}
4635
},
4736
{
48-
"name": "redis",
49-
"availability": [
50-
{
51-
"channel": "stable",
52-
"platform": "linux",
53-
"platform_version": "alpine3.19",
54-
"arch": "amd64",
55-
"php_versions": ["8.1", "8.2"],
56-
"available": true
57-
},
58-
{
59-
"channel": "stable",
60-
"platform": "linux",
61-
"platform_version": "debian12",
62-
"arch": "amd64",
63-
"php_versions": ["8.2"],
64-
"available": true
65-
}
66-
]
37+
"extension": "gd",
38+
"extension_version": "1.0.0",
39+
"channel": "stable",
40+
"php_version": "8.1",
41+
"platform": "debian",
42+
"platform_version": "debian12",
43+
"arch": "amd64",
44+
"status": "success",
45+
"finished_at": "2024-01-01T10:10:00Z"
46+
},
47+
{
48+
"extension": "gd",
49+
"extension_version": "1.0.0",
50+
"channel": "stable",
51+
"php_version": "8.2",
52+
"platform": "debian",
53+
"platform_version": "debian12",
54+
"arch": "amd64",
55+
"status": "success",
56+
"finished_at": "2024-01-01T10:15:00Z"
57+
},
58+
{
59+
"extension": "pdo_mysql",
60+
"extension_version": "2.1.0",
61+
"channel": "stable",
62+
"php_version": "8.1",
63+
"platform": "alpine",
64+
"platform_version": "alpine3.19",
65+
"arch": "amd64",
66+
"status": "success",
67+
"finished_at": "2024-01-01T11:00:00Z"
68+
},
69+
{
70+
"extension": "pdo_mysql",
71+
"extension_version": "2.1.0",
72+
"channel": "stable",
73+
"php_version": "8.2",
74+
"platform": "alpine",
75+
"platform_version": "alpine3.19",
76+
"arch": "amd64",
77+
"status": "failure",
78+
"category": "build_error",
79+
"finished_at": "2024-01-01T11:05:00Z",
80+
"run": {
81+
"url": "https://example.com/runs/5"
82+
}
83+
},
84+
{
85+
"extension": "pdo_mysql",
86+
"extension_version": "2.1.0",
87+
"channel": "stable",
88+
"php_version": "8.1",
89+
"platform": "debian",
90+
"platform_version": "debian12",
91+
"arch": "amd64",
92+
"status": "success",
93+
"finished_at": "2024-01-01T11:10:00Z"
94+
},
95+
{
96+
"extension": "pdo_mysql",
97+
"extension_version": "2.1.0",
98+
"channel": "stable",
99+
"php_version": "8.2",
100+
"platform": "debian",
101+
"platform_version": "debian12",
102+
"arch": "amd64",
103+
"status": "success",
104+
"finished_at": "2024-01-01T11:15:00Z"
105+
},
106+
{
107+
"extension": "redis",
108+
"extension_version": "5.3.7",
109+
"channel": "stable",
110+
"php_version": "8.1",
111+
"platform": "alpine",
112+
"platform_version": "alpine3.19",
113+
"arch": "amd64",
114+
"status": "success",
115+
"finished_at": "2024-01-01T12:00:00Z"
116+
},
117+
{
118+
"extension": "redis",
119+
"extension_version": "5.3.7",
120+
"channel": "stable",
121+
"php_version": "8.2",
122+
"platform": "alpine",
123+
"platform_version": "alpine3.19",
124+
"arch": "amd64",
125+
"status": "skipped",
126+
"category": "incompatible",
127+
"finished_at": "2024-01-01T12:05:00Z"
128+
},
129+
{
130+
"extension": "redis",
131+
"extension_version": "5.3.7",
132+
"channel": "stable",
133+
"php_version": "8.1",
134+
"platform": "debian",
135+
"platform_version": "debian12",
136+
"arch": "amd64",
137+
"status": "success",
138+
"finished_at": "2024-01-01T12:10:00Z"
139+
},
140+
{
141+
"extension": "redis",
142+
"extension_version": "5.3.7",
143+
"channel": "stable",
144+
"php_version": "8.2",
145+
"platform": "debian",
146+
"platform_version": "debian12",
147+
"arch": "amd64",
148+
"status": "success",
149+
"finished_at": "2024-01-01T12:15:00Z"
67150
}
68151
]
69152
}

src/components/MatrixGrid.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,21 @@ const Row = memo(({ index, style, data }: RowProps) => {
2828
<div style={style} className="matrix-row">
2929
<div
3030
className="extension-name"
31-
onClick={() => onExtensionClick(row.name)}
31+
onClick={() => onExtensionClick(row.extension)}
3232
role="button"
3333
tabIndex={0}
3434
>
35-
{row.name}
35+
{row.extension}
3636
</div>
3737
<div className="cells">
3838
{row.cells.map((cell, i) => (
3939
<div
4040
key={phpVersions[i]}
4141
className={`cell ${cell.available ? 'available' : 'unavailable'}`}
42-
onClick={() => onCellClick(row.name, cell.phpVersion)}
42+
onClick={() => onCellClick(row.extension, cell.phpVersion)}
4343
role="button"
4444
tabIndex={0}
45-
title={`${row.name} - PHP ${cell.phpVersion}: ${cell.available ? 'Available' : 'Not Available'}`}
45+
title={`${row.extension} - PHP ${cell.phpVersion}: ${cell.available ? 'Available' : 'Not Available'}`}
4646
/>
4747
))}
4848
</div>

0 commit comments

Comments
 (0)