@gracexwho/model-card-generator
Version:
Tool for generating model cards for Jupyter Notebook.
99 lines (85 loc) • 2.85 kB
text/typescript
import * as py from "../python-parser";
import { parse, walk } from "../python-parser";
describe("python parser", () => {
// The next two tests were because the lexer was confused about how to handle dots. It
// couldn't read a dot followed by digits as a floating point number.
it("can parse floats that have no digits before the dot", () => {
parse("a = .2\n");
});
it("can also parse calls on objects", () => {
parse("obj.prop\n");
});
it("can parse comments", () => {
const tree = parse("#\n");
expect(tree.code).toBeInstanceOf(Array);
expect(tree.code.length).toBe(0);
});
it("can parse scientific notation", () => {
parse("1e5\n");
});
it("can parse imaginary numbers", () => {
parse("x = 12j\n");
});
it("can parse lambdas with keyword", () => {
parse("f = (lambda document, **variety: document)\n");
});
it("parses a dictionary with a `comp_for`", () => {
let mod = parse("{k: v for (k, v) in d.items()}\n");
expect(mod).toBeDefined();
let node = mod.code[0] as py.DictExpr;
expect(node.entries.length).toBe(1);
expect(node.comp_for).toBeDefined();
});
it("can parse line continuations", () => {
parse(["a = b\\", ".func(1, 2)\\", ".func(3, 4)", ""].join("\n"));
});
it("produces the full location of a line for a call statement", () => {
let node = parse(["obj.func()", ""].join("\n")).code[0];
expect(node.location).toEqual({
first_line: 1,
first_column: 0,
last_line: 1,
last_column: 10
});
});
it("does not crash on correct code after parsing bad code", () => {
expect(() => parse("print(1\n")).toThrow();
expect(() => parse("a + 1\nb = a\n")).not.toThrow();
});
it("handles docstrings", () => {
let node = parse(
[
"def foo():",
' """',
" this function",
" does nothing",
' """',
" pass\n"
].join("\n")
);
expect(node).toBeDefined();
expect(node.code).toHaveLength(1);
expect(node.code[0].type).toBe("def");
const def = node.code[0] as py.Def;
expect(def.code).toHaveLength(2);
expect(def.code[0].type).toBe("literal");
expect(def.code[1].type).toBe("pass");
const docstring = def.code[0] as py.Literal;
expect(docstring).toBeDefined();
expect(docstring.type).toBe("literal");
});
});
describe("ast walker", () => {
it("doesn't crash on try-execpt blocks", () => {
let tree = parse(
["try:", " pass", "except:", " pass", ""].join("\n")
);
walk(tree);
});
it("doesn't crash on with-statements", () => {
let tree = parse(
['with sns.axes_style("white"):', " pass", ""].join("\n")
);
walk(tree);
});
});