mirror of
https://codeberg.org/andyscott/ziglings.git
synced 2024-12-22 06:03:09 -05:00
Ensure the exercises use the canonical format
Add the check-exercises.py tool in the new tools directory. It is used to check that the exercises are correctly formatted, printing on stderr the invalid ones and the diff in the unified format. Update the exercises that don't use the canonical zig fmt format. Update some patches that cause the generated zig file to be incorrectly formatted.
This commit is contained in:
parent
b59bef29b9
commit
6b17a18893
10 changed files with 127 additions and 30 deletions
|
@ -18,7 +18,7 @@
|
|||
const print = @import("std").debug.print;
|
||||
|
||||
pub fn main() void {
|
||||
var zig = [_]u8 {
|
||||
var zig = [_]u8{
|
||||
0o131, // octal
|
||||
0b1101000, // binary
|
||||
0x66, // hex
|
||||
|
|
|
@ -18,8 +18,8 @@ pub fn main() void {
|
|||
//
|
||||
// Don't change this part:
|
||||
//
|
||||
// = .{'h', 'e', 'l', 'l', 'o'};
|
||||
// = .{ 'h', 'e', 'l', 'l', 'o' };
|
||||
//
|
||||
const hello = .{'h', 'e', 'l', 'l', 'o'};
|
||||
const hello = .{ 'h', 'e', 'l', 'l', 'o' };
|
||||
print("I say {s}!\n", .{hello});
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ pub fn main() !void {
|
|||
var my_insects = [_]Insect{
|
||||
Insect{ .ant = Ant{ .still_alive = true } },
|
||||
Insect{ .bee = Bee{ .flowers_visited = 17 } },
|
||||
Insect{ .grasshopper = Grasshopper{ .distance_hopped = 32 }, },
|
||||
Insect{ .grasshopper = Grasshopper{ .distance_hopped = 32 } },
|
||||
};
|
||||
|
||||
std.debug.print("Daily Insect Report:\n", .{});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
23c23
|
||||
< const hello = .{'h', 'e', 'l', 'l', 'o'};
|
||||
< const hello = .{ 'h', 'e', 'l', 'l', 'o' };
|
||||
---
|
||||
> const hello: [5]u8 = .{'h', 'e', 'l', 'l', 'o'};
|
||||
> const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' };
|
||||
|
|
97
tools/check-exercises.py
Executable file
97
tools/check-exercises.py
Executable file
|
@ -0,0 +1,97 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import difflib
|
||||
import io
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
IGNORE = subprocess.DEVNULL
|
||||
PIPE = subprocess.PIPE
|
||||
|
||||
EXERCISES_PATH = "exercises"
|
||||
HEALED_PATH = "patches/healed"
|
||||
PATCHES_PATH = "patches/patches"
|
||||
|
||||
|
||||
# Heals all the exercises.
|
||||
def heal():
|
||||
maketree(HEALED_PATH)
|
||||
|
||||
with os.scandir(EXERCISES_PATH) as it:
|
||||
for entry in it:
|
||||
name = entry.name
|
||||
|
||||
original_path = entry.path
|
||||
patch_path = os.path.join(PATCHES_PATH, patch_name(name))
|
||||
output_path = os.path.join(HEALED_PATH, name)
|
||||
|
||||
patch(original_path, patch_path, output_path)
|
||||
|
||||
|
||||
# Yields all the healed exercises that are not correctly formatted.
|
||||
def check_healed():
|
||||
term = subprocess.run(
|
||||
["zig", "fmt", "--check", HEALED_PATH], stdout=PIPE, text=True
|
||||
)
|
||||
if term.stdout == "" and term.returncode != 0:
|
||||
term.check_returncode()
|
||||
|
||||
stream = io.StringIO(term.stdout)
|
||||
for line in stream:
|
||||
yield line.strip()
|
||||
|
||||
|
||||
def main():
|
||||
heal()
|
||||
|
||||
# Show the unified diff between the original example and the correctly
|
||||
# formatted one.
|
||||
for i, original in enumerate(check_healed()):
|
||||
if i > 0:
|
||||
print()
|
||||
|
||||
name = os.path.basename(original)
|
||||
print(f"checking exercise {name}...\n")
|
||||
|
||||
from_file = open(original)
|
||||
to_file = zig_fmt_file(original)
|
||||
|
||||
diff = difflib.unified_diff(
|
||||
from_file.readlines(), to_file.readlines(), name, name + "-fmt"
|
||||
)
|
||||
sys.stderr.writelines(diff)
|
||||
|
||||
|
||||
def maketree(path):
|
||||
return os.makedirs(path, exist_ok=True)
|
||||
|
||||
|
||||
# Returns path with the patch extension.
|
||||
def patch_name(path):
|
||||
name, _ = os.path.splitext(path)
|
||||
|
||||
return name + ".patch"
|
||||
|
||||
|
||||
# Applies patch to original, and write the file to output.
|
||||
def patch(original, patch, output):
|
||||
subprocess.run(
|
||||
["patch", "-i", patch, "-o", output, original], stdout=IGNORE, check=True
|
||||
)
|
||||
|
||||
|
||||
# Formats the Zig file at path, and returns the possibly reformatted file as a
|
||||
# file object.
|
||||
def zig_fmt_file(path):
|
||||
with open(path) as stdin:
|
||||
term = subprocess.run(
|
||||
["zig", "fmt", "--stdin"], stdin=stdin, stdout=PIPE, check=True, text=True
|
||||
)
|
||||
|
||||
return io.StringIO(term.stdout)
|
||||
|
||||
|
||||
main()
|
Loading…
Reference in a new issue