Skip to content

Commit 11297a0

Browse files
committed
Rename explain() to friendlyExplain()
1 parent 9b1e6f9 commit 11297a0

File tree

7 files changed

+14
-16
lines changed

7 files changed

+14
-16
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
# Python Friendly Error Messages
22

33
- [ ] Ensure all strings in `src/` are localised
4-
- [ ] Consider renaming `explain()` to something like `friendlyExplain()`?
54
- [ ] Figure out where the built packages should live / be served from
65
- [ ] Set up automated testing and publishing through GitHub Actions
7-
- [ ] Improve (BEM-style) formatting for CSS classes
86
- [ ] Open source
97

108
A small, runtime-agnostic, library that explains Python error messages in a friendlier way, inspired by [p5.js's Friendly Error System](https://p5js.org/contribute/friendly_error_system/).
@@ -26,7 +24,7 @@ import {
2624
registerAdapter,
2725
skulptAdapter,
2826
pyodideAdapter,
29-
explain
27+
friendlyExplain
3028
} from "python-friendly-error-messages";
3129
3230
await loadCopydeckFor(navigator.language); // falls back to "en"
@@ -36,7 +34,7 @@ registerAdapter("skulpt", skulptAdapter);
3634
registerAdapter("pyodide", pyodideAdapter);
3735
3836
// later, when you have an error string and some code:
39-
const result = explain({
37+
const result = friendlyExplain({
4038
error: rawTracebackString,
4139
code: editorCode,
4240
audience: "beginner",

demo/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ <h1>Python Friendly Error Messages - Demo</h1>
1818
</div>
1919

2020
<script type="module">
21-
import { explain, loadCopydeck, registerAdapter, loadCopydeckFor, skulptAdapter, pyodideAdapter } from '../dist/index.browser.js';
21+
import { friendlyExplain, loadCopydeck, registerAdapter, loadCopydeckFor, skulptAdapter, pyodideAdapter } from '../dist/index.browser.js';
2222

2323
// example traces with corresponding code
2424
const examples = [
@@ -121,7 +121,7 @@ <h1>Python Friendly Error Messages - Demo</h1>
121121

122122
for (const example of examples) {
123123
try {
124-
const result = explain({
124+
const result = friendlyExplain({
125125
error: example.trace,
126126
code: example.code,
127127
audience: 'beginner',

src/engine.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ const pickVariant = (trace: Trace, code: string | undefined, audience: string) =
114114
return null;
115115
};
116116

117-
export const explain = (opts: ExplainOptions): ExplainResult => {
117+
export const friendlyExplain = (opts: ExplainOptions): ExplainResult => {
118118
if (!S.copy) throw new Error("Copydeck not loaded");
119119
const audience = opts.audience || "beginner";
120120
const verbosity = opts.verbosity || "standard";

src/index.browser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type { Trace, ExplainOptions, ExplainResult, CopyDeck, AdapterFn } from "./types.js";
2-
export { loadCopydeck, registerAdapter, explain } from "./engine.js";
2+
export { loadCopydeck, registerAdapter, friendlyExplain } from "./engine.js";
33
export { skulptAdapter } from "./adapters/skulpt.js";
44
export { pyodideAdapter } from "./adapters/pyodide.js";
55
export { loadCopydeckFor } from "./loaders.browser.js";

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type { Trace, ExplainOptions, ExplainResult, CopyDeck, AdapterFn } from "./types.js";
2-
export { loadCopydeck, registerAdapter, explain } from "./engine.js";
2+
export { loadCopydeck, registerAdapter, friendlyExplain } from "./engine.js";
33
export { skulptAdapter } from "./adapters/skulpt.js";
44
export { pyodideAdapter } from "./adapters/pyodide.js";
55
export { loadCopydeckFor } from "./loaders.js";

tests/engine.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, it, expect } from "vitest";
2-
import { explain, loadCopydeck, registerAdapter } from "../src/engine";
2+
import { friendlyExplain, loadCopydeck, registerAdapter } from "../src/engine";
33
import { skulptAdapter } from "../src/adapters/skulpt";
44

55
const copydeck = {
@@ -70,7 +70,7 @@ describe("engine", () => {
7070
const raw = `Traceback (most recent call last):
7171
File "main.py", line 2, in <module>
7272
NameError: name 'kittens' is not defined`;
73-
const res = explain({ error: raw, code, audience: "beginner" });
73+
const res = friendlyExplain({ error: raw, code, audience: "beginner" });
7474
expect(res.trace.type).toBe("NameError");
7575
expect(res.title).toMatch(/name/i);
7676
expect(res.summary).toMatch(/kittens/);
@@ -83,7 +83,7 @@ NameError: name 'kittens' is not defined`;
8383
const raw = `Traceback (most recent call last):
8484
File "main.py", line 1
8585
SyntaxError: invalid syntax`;
86-
const res = explain({ error: raw, code });
86+
const res = friendlyExplain({ error: raw, code });
8787
expect(res.trace.type).toBe("SyntaxError");
8888
expect(res.title).toMatch(/colon/i);
8989
expect(res.patch).toMatch(/:\s*$/);
@@ -94,7 +94,7 @@ SyntaxError: invalid syntax`;
9494
const raw = `Traceback (most recent call last):
9595
File "main.py", line 2
9696
AttributeError: 'list' object has no attribute 'push'`;
97-
const res = explain({ error: raw, code });
97+
const res = friendlyExplain({ error: raw, code });
9898
expect(res.trace.type).toBe("AttributeError");
9999
expect(res.patch).toContain(".append(");
100100
});

tests/loaders.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, expect, vi, beforeEach } from "vitest";
22
import { loadCopydeckFor } from "../src/loaders";
3-
import { explain, loadCopydeck, registerAdapter } from "../src/engine";
3+
import { friendlyExplain, loadCopydeck, registerAdapter } from "../src/engine";
44
import { skulptAdapter } from "../src/adapters/skulpt";
55

66
const makeRes = (ok: boolean, data?: any) =>
@@ -25,7 +25,7 @@ describe("loadCopydeckFor", () => {
2525
await loadCopydeckFor("en-GB");
2626
registerAdapter("skulpt", skulptAdapter);
2727

28-
const res = explain({ error: "TypeError: bad", code: "" });
28+
const res = friendlyExplain({ error: "TypeError: bad", code: "" });
2929
expect(res.title).toBe("Python error");
3030
expect((globalThis.fetch as any).mock.calls[0][0]).toMatch(/copydecks\/en-GB\/copydeck\.json/);
3131
expect((globalThis.fetch as any).mock.calls[1][0]).toMatch(/copydecks\/en\/copydeck\.json/);
@@ -41,7 +41,7 @@ describe("loadCopydeckFor", () => {
4141
it("still supports manual loadCopydeck for tests without fetch", () => {
4242
loadCopydeck(minimalDeck as any);
4343
registerAdapter("skulpt", skulptAdapter);
44-
const res = explain({ error: "NameError: name 'x' is not defined", code: "" });
44+
const res = friendlyExplain({ error: "NameError: name 'x' is not defined", code: "" });
4545
expect(res.title).toBe("Python error");
4646
});
4747
});

0 commit comments

Comments
 (0)