Skip to content

Commit 9bfae68

Browse files
authored
zig update - v0.15.1 (#29)
* feat: update test-runner * feat: update for Zig 0.15.1 * fix: ArrayList usage * feat: migrate to Zig 0.15 HTTP client/server APIs * fix: make build.zig match runall.zig for numerical_methods/newton_raphson (remove "_root") * docs: update zig version to 0.15.1
1 parent 4268fe3 commit 9bfae68

File tree

9 files changed

+91
-80
lines changed

9 files changed

+91
-80
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
### How to build
3636

3737
**Require:**
38-
- [Zig v0.14 or higher](https://ziglang.org/download), self-hosting (stage3) compiler.
38+
- [Zig v0.15.1 or higher](https://ziglang.org/download), self-hosting (stage3) compiler.
3939

4040
### Test all
4141

build.zig

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ pub fn build(b: *std.Build) void {
217217
.category = "machine_learning",
218218
});
219219
// Numerical Methods
220-
if (std.mem.eql(u8, op, "numerical_methods/newton_raphson_root"))
220+
if (std.mem.eql(u8, op, "numerical_methods/newton_raphson"))
221221
buildAlgorithm(b, .{
222222
.optimize = optimize,
223223
.target = target,
@@ -235,11 +235,15 @@ fn buildAlgorithm(b: *std.Build, info: BInfo) void {
235235

236236
const runner = b.dependency("runner", .{}).path("test_runner.zig");
237237

238-
const exe_tests = b.addTest(.{
239-
.name = info.name,
238+
const mod = b.addModule(info.name, .{
239+
.root_source_file = b.path(src),
240240
.target = info.target,
241241
.optimize = info.optimize,
242-
.root_source_file = b.path(src),
242+
});
243+
244+
const exe_tests = b.addTest(.{
245+
.name = info.name,
246+
.root_module = mod,
243247
.test_runner = .{ .path = runner, .mode = .simple },
244248
});
245249

build.zig.zon

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
// Tracks the earliest Zig version that the package considers to be a
3030
// supported use case.
31-
.minimum_zig_version = "0.14.0",
31+
.minimum_zig_version = "0.15.1",
3232

3333
// This field is optional.
3434
// Each dependency must either provide a `url` and `hash`, or a `path`.
@@ -38,8 +38,8 @@
3838
.dependencies = .{
3939
// Custom test-runner: see tests output
4040
.runner = .{
41-
.url = "git+https://gist.github.com/karlseguin/c6bea5b35e4e8d26af6f81c22cb5d76b/#1f317ebc9cd09bc50fd5591d09c34255e15d1d85",
42-
.hash = "N-V-__8AANwlAADW-4Yu_sYSZkL_6wcz13gOf9pkOLCjct-F",
41+
.url = "git+https://gist.github.com/karlseguin/c6bea5b35e4e8d26af6f81c22cb5d76b#eb15512d6ae49663fa9df6c7a9725b20dab43edd",
42+
.hash = "N-V-__8AAHMkAAC4CUVVTX0UMBJXtfOubskbF9EJ7X6qAGYR",
4343
},
4444
},
4545
.paths = .{

dynamicProgramming/longestIncreasingSubsequence.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ pub fn lowerBound(arr: []const i32, key: i32) usize {
3030
// arr: the passed array
3131
// allocator: Any std.heap type allocator
3232
pub fn lis(arr: []const i32, allocator: anytype) usize {
33-
var v = ArrayList(i32).init(allocator);
34-
defer v.deinit();
33+
var v: ArrayList(i32) = .empty;
34+
defer v.deinit(allocator);
3535

3636
const n = arr.len;
3737

3838
for (0..n) |i| {
3939
const it = lowerBound(v.items, arr[i]);
4040
if (it == v.items.len) {
41-
_ = v.append(arr[i]) catch return 0;
41+
_ = v.append(allocator, arr[i]) catch return 0;
4242
} else {
4343
v.items[it] = arr[i];
4444
}

runall.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ fn runTest(allocator: std.mem.Allocator, comptime algorithm: []const u8) !void {
6161
"-Dalgorithm=" ++ algorithm,
6262
} ++ args, allocator);
6363

64-
child.stderr = std.io.getStdErr();
65-
child.stdout = std.io.getStdOut();
64+
child.stderr = std.fs.File.stderr();
65+
child.stdout = std.fs.File.stdout();
6666

6767
_ = try child.spawnAndWait();
6868
}

search/binarySearchTree.zig

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const std = @import("std");
22
const print = std.debug.print;
33
const ArrayList = std.ArrayList;
4+
const Allocator = std.mem.Allocator;
45
const testing = std.testing;
56

67
// Returns a binary search tree instance.
@@ -22,7 +23,7 @@ pub fn BinarySearchTree(comptime T: type) type {
2223
left: ?*node = null,
2324
};
2425

25-
allocator: *std.mem.Allocator,
26+
allocator: *Allocator,
2627
root: ?*node = null,
2728
size: usize = 0,
2829

@@ -56,27 +57,27 @@ pub fn BinarySearchTree(comptime T: type) type {
5657
}
5758

5859
// Function that performs inorder traversal of the tree
59-
pub fn inorder(self: *Self, path: *ArrayList(T)) !void {
60+
pub fn inorder(self: *Self, allocator: Allocator, path: *ArrayList(T)) !void {
6061
if (self.root == null) {
6162
return;
6263
}
63-
try self._inorder(self.root, path);
64+
try self._inorder(allocator, self.root, path);
6465
}
6566

6667
// Function that performs preorder traversal of the tree
67-
pub fn preorder(self: *Self, path: *ArrayList(T)) !void {
68+
pub fn preorder(self: *Self, allocator: Allocator, path: *ArrayList(T)) !void {
6869
if (self.root == null) {
6970
return;
7071
}
71-
try self._preorder(self.root, path);
72+
try self._preorder(allocator, self.root, path);
7273
}
7374

7475
// Function that performs postorder traversal of the tree
75-
pub fn postorder(self: *Self, path: *ArrayList(T)) !void {
76+
pub fn postorder(self: *Self, allocator: Allocator, path: *ArrayList(T)) !void {
7677
if (self.root == null) {
7778
return;
7879
}
79-
try self._postorder(self.root, path);
80+
try self._postorder(allocator, self.root, path);
8081
}
8182

8283
// Function that destroys the allocated memory of the whole tree
@@ -159,27 +160,27 @@ pub fn BinarySearchTree(comptime T: type) type {
159160
return false;
160161
}
161162

162-
fn _inorder(self: *Self, root: ?*node, path: *ArrayList(T)) !void {
163+
fn _inorder(self: *Self, allocator: Allocator, root: ?*node, path: *ArrayList(T)) !void {
163164
if (root != null) {
164-
try self._inorder(root.?.left, path);
165-
try path.append(root.?.info);
166-
try self._inorder(root.?.right, path);
165+
try self._inorder(allocator, root.?.left, path);
166+
try path.append(allocator, root.?.info);
167+
try self._inorder(allocator, root.?.right, path);
167168
}
168169
}
169170

170-
fn _preorder(self: *Self, root: ?*node, path: *ArrayList(T)) !void {
171+
fn _preorder(self: *Self, allocator: Allocator, root: ?*node, path: *ArrayList(T)) !void {
171172
if (root != null) {
172-
try path.append(root.?.info);
173-
try self._preorder(root.?.left, path);
174-
try self._preorder(root.?.right, path);
173+
try path.append(allocator, root.?.info);
174+
try self._preorder(allocator, root.?.left, path);
175+
try self._preorder(allocator, root.?.right, path);
175176
}
176177
}
177178

178-
fn _postorder(self: *Self, root: ?*node, path: *ArrayList(T)) !void {
179+
fn _postorder(self: *Self, allocator: Allocator, root: ?*node, path: *ArrayList(T)) !void {
179180
if (root != null) {
180-
try self._postorder(root.?.left, path);
181-
try self._postorder(root.?.right, path);
182-
try path.append(root.?.info);
181+
try self._postorder(allocator, root.?.left, path);
182+
try self._postorder(allocator, root.?.right, path);
183+
try path.append(allocator, root.?.info);
183184
}
184185
}
185186

@@ -244,26 +245,26 @@ test "Testing traversal methods" {
244245
try t.insert(12);
245246
try t.insert(15);
246247

247-
var ino = ArrayList(i32).init(allocator);
248-
defer ino.deinit();
248+
var ino: ArrayList(i32) = .empty;
249+
defer ino.deinit(allocator);
249250

250251
const check_ino = [_]i32{ 3, 5, 12, 15, 25 };
251-
try t.inorder(&ino);
252+
try t.inorder(allocator, &ino);
252253
try testing.expect(std.mem.eql(i32, ino.items, &check_ino));
253254

254-
var pre = ArrayList(i32).init(allocator);
255-
defer pre.deinit();
255+
var pre: ArrayList(i32) = .empty;
256+
defer pre.deinit(allocator);
256257

257258
const check_pre = [_]i32{ 5, 3, 25, 12, 15 };
258-
try t.preorder(&pre);
259+
try t.preorder(allocator, &pre);
259260

260261
try testing.expect(std.mem.eql(i32, pre.items, &check_pre));
261262

262-
var post = ArrayList(i32).init(allocator);
263-
defer post.deinit();
263+
var post: ArrayList(i32) = .empty;
264+
defer post.deinit(allocator);
264265

265266
const check_post = [_]i32{ 3, 15, 12, 25, 5 };
266-
try t.postorder(&post);
267+
try t.postorder(allocator, &post);
267268

268269
try testing.expect(std.mem.eql(i32, post.items, &check_post));
269270
}

web/http/client.zig

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ test "Status == 200" {
66
.allocator = std.testing.allocator,
77
};
88
defer client.deinit();
9-
var buffer: [4 * 1024]u8 = undefined;
10-
var req = try client.open(.GET, uri, .{
11-
.server_header_buffer = &buffer,
12-
});
9+
10+
var req = try client.request(.GET, uri, .{});
1311
defer req.deinit();
1412

15-
try req.send();
16-
try req.wait();
13+
try req.sendBodiless();
14+
const response = try req.receiveHead(&.{});
1715

18-
try std.testing.expectEqual(req.response.status, .ok);
19-
try std.testing.expectEqual(req.response.version, .@"HTTP/1.1");
16+
try std.testing.expectEqual(response.head.status, .ok);
17+
try std.testing.expectEqual(response.head.version, .@"HTTP/1.1");
2018
}

web/http/server.zig

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
//! ref: https://github.com/ziglang/zig/blob/master/lib/std/http/test.zig
2-
//! ref: https://ziglang.org/download/0.12.0/release-notes.html#Reworked-HTTP
2+
//! ref: https://ziglang.org/download/0.15.1/release-notes.html#HTTP-Client-and-Server
33

44
const std = @import("std");
55
const expect = std.testing.expect;
66

77
test "client requests server" {
88
const builtin = @import("builtin");
99

10+
const allocator = std.testing.allocator;
11+
1012
// This test requires spawning threads.
1113
if (builtin.single_threaded) {
1214
return error.SkipZigTest;
@@ -24,7 +26,7 @@ test "client requests server" {
2426
const address = try std.net.Address.parseIp4("127.0.0.1", 0);
2527

2628
var http_server = try address.listen(.{
27-
.reuse_port = true,
29+
.reuse_address = true,
2830
});
2931
const server_port = http_server.listen_address.getPort();
3032
defer http_server.deinit();
@@ -34,16 +36,20 @@ test "client requests server" {
3436
const connection = try s.accept();
3537
defer connection.stream.close();
3638

37-
var read_buffer: [8000]u8 = undefined;
38-
var server = std.http.Server.init(connection, &read_buffer);
39+
var recv_buffer: [4000]u8 = undefined;
40+
var sead_buffer: [4000]u8 = undefined;
41+
var conn_reader = connection.stream.reader(&recv_buffer);
42+
var conn_writer = connection.stream.writer(&sead_buffer);
43+
var server = std.http.Server.init(conn_reader.interface(), &conn_writer.interface);
3944

4045
var request = try server.receiveHead();
4146

4247
// Accept request
43-
const reader = try request.reader();
44-
var buffer: [100]u8 = undefined;
45-
const read_num = try reader.readAll(&buffer);
46-
try std.testing.expectEqualStrings(buffer[0..read_num], "Hello, World!\n");
48+
var reader = try request.readerExpectContinue(&.{});
49+
const body = try reader.allocRemaining(allocator, .unlimited);
50+
defer allocator.free(body);
51+
52+
try std.testing.expectEqualStrings(body, "Hello, World!\n");
4753

4854
// Respond
4955
const server_body: []const u8 = "message from server!\n";
@@ -60,7 +66,7 @@ test "client requests server" {
6066
// Make requests to server
6167

6268
var client = std.http.Client{
63-
.allocator = std.testing.allocator,
69+
.allocator = allocator,
6470
};
6571
defer client.deinit();
6672
const uri = uri: {
@@ -70,22 +76,19 @@ test "client requests server" {
7076
break :uri uri;
7177
};
7278

73-
var buffer: [4 * 1024]u8 = undefined;
74-
var req = try client.open(.POST, uri, .{
75-
.server_header_buffer = &buffer,
76-
});
79+
var req = try client.request(.POST, uri, .{});
7780
req.transfer_encoding = .{ .content_length = 14 };
7881
defer req.deinit();
7982

80-
try req.send();
81-
try req.writeAll("Hello, ");
82-
try req.writeAll("World!\n");
83-
try req.finish();
83+
var body_writer = try req.sendBody(&.{});
8484

85-
try req.wait();
85+
try body_writer.writer.writeAll("Hello, ");
86+
try body_writer.writer.writeAll("World!\n");
87+
try body_writer.end();
8688

87-
var read_buffer: [100]u8 = undefined;
88-
const read_num = try req.readAll(&read_buffer);
89+
var response = try req.receiveHead(&.{});
90+
const body = try response.reader(&.{}).allocRemaining(allocator, .unlimited);
91+
defer allocator.free(body);
8992

90-
try std.testing.expectEqualStrings(read_buffer[0..read_num], "message from server!\n");
93+
try std.testing.expectEqualStrings(body, "message from server!\n");
9194
}

web/tls/X25519+Kyber768Draft00.zig

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@
22
//! by: https://github.com/bwesterb
33

44
test "HTTPS Client - X25519+Kyber768Draft00" {
5-
var buf: [1000]u8 = undefined;
6-
var header_buf: [8192]u8 = undefined;
75
const uri = try std.Uri.parse("https://cloudflare.com/cdn-cgi/trace");
86
var client = std.http.Client{
97
.allocator = testing.allocator,
108
};
119
defer client.deinit();
1210

13-
var req = try client.open(.POST, uri, .{
14-
.server_header_buffer = &header_buf,
11+
var req = try client.request(.GET, uri, .{
12+
.headers = .{
13+
.accept_encoding = .{ .override = "text/plain" },
14+
},
1515
});
1616
defer req.deinit();
17-
try req.send();
18-
try req.wait();
19-
const read = try req.read(&buf);
2017

21-
var strings = std.mem.splitAny(u8, buf[0..read], "\n");
18+
try req.sendBodiless();
19+
var response = try req.receiveHead(&.{});
20+
21+
var reader_buffer: [1000]u8 = undefined;
22+
const body_reader = response.reader(&reader_buffer);
23+
const body = try body_reader.allocRemaining(testing.allocator, .unlimited);
24+
defer testing.allocator.free(body);
25+
26+
var strings = std.mem.splitAny(u8, body, "\n");
2227
var index = strings.index.?;
2328
while (index < strings.rest().len) : (index += 1) {
2429
const content = strings.next().?;
@@ -29,8 +34,7 @@ test "HTTPS Client - X25519+Kyber768Draft00" {
2934
if (startW(u8, content, "http="))
3035
try testing.expectEqualStrings("http=http/1.1", content);
3136
if (startW(u8, content, "uag="))
32-
try testing.expectEqualStrings("uag=zig/0.14.0 (std.http)", content);
33-
// zig master/nightly change per build (e.g.: zig/0.11.0-dev.2868+1a455b2dd (std.http))
37+
try testing.expectEqualStrings("uag=zig/" ++ zig_version_string ++ " (std.http)", content);
3438
if (startW(u8, content, "tls="))
3539
try testing.expectEqualStrings("tls=TLSv1.3", content);
3640
}
@@ -39,3 +43,4 @@ test "HTTPS Client - X25519+Kyber768Draft00" {
3943
const std = @import("std");
4044
const testing = std.testing;
4145
const startW = std.mem.startsWith;
46+
const zig_version_string = @import("builtin").zig_version_string;

0 commit comments

Comments
 (0)