{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "gonb", "display_name": "Go (gonb)" } }, "cells": [ { "cell_type": "markdown", "source": [ "# GoNB - A Go Notebook Kernel for Jupyter\n", "\n", "See the [tutorial in github](https://github.com/janpfeifer/gonb/blob/e15ac2e8e3fe/examples/tutorial.ipynb). The repository is in [github.com/janpfeifer/gonb](https://github.com/janpfeifer/gonb).\n", "\n", "\n", "## Installation in Google's Colab\n", "\n", "1. Run the installation cell just below once only. It will install Go, GoNB and a couple of Go tools needed to provide auto-complete.\n", "\n", " It takes a couple of minutes ... but only needs to be done once.\n", "\n", " When creating other GoNB notebooks with Google's Colab, you will have to copy the cell below (or do something similar).\n", "\n", "2. Restart the session: under `Runtime` menu, click on `Restart Session`\n", "\n", "3. After it restarts, if you should be able to change the runtim to **GoNB**. Under the `Runtime` menu, click on the entry `Change Runtime Type`. Don't change the hardware accelerator (otherwise you'll have to restart the installation), but change the runtime type to `Go (gonb)`\n", "\n", "4. Restart the session again: under `Runtime` menu, click on `Restart Session`\n", "\n", "**Disclaimer**: this is highly not documented or official, but seems to be supported by Colab (it works). This method has broken before without notice. Please reach out to project in [github.com/janpfeifer/gonb](https://github.com/janpfeifer/gonb) if there are any issues.\n", "\n", "\n" ], "metadata": { "id": "FWzjioUI63tT" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "3PaXSu67xkrg", "outputId": "bc7a90b5-cd54-4091-8c26-d69212559a13", "colab": { "base_uri": "https://localhost:8080/" }, "cellView": "form" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Installing go ...env: GOROOT=/content/go\n", " done.\n", "go version go1.23.1 linux/amd64\n", "Installing gonb ... done.\n", "Installing goimports ... done.\n", "Installing gopls ... done.\n", "I0923 20:27:38.817564 7307 install.go:121] \u001b[7;39;32m[a14e2312]\u001b[0m Go (gonb) kernel configuration installed in \"/root/.local/share/jupyter/kernels/gonb/kernel.json\".\n", "Done!\n" ] } ], "source": [ "#@title Install Go, `goimports` and GoNB code.\n", "\n", "# Install Go and goimports.\n", "!echo -n \"Installing go ...\"\n", "!mkdir -p cache\n", "!wget -q -O cache/go.tar.gz 'https://go.dev/dl/go1.23.1.linux-amd64.tar.gz'\n", "!tar xzf cache/go.tar.gz\n", "%env GOROOT=/content/go\n", "!ln -sf \"/content/go/bin/go\" /usr/bin/go\n", "!echo \" done.\"\n", "!go version\n", "\n", "# Install gonb, goimports, gopls.\n", "!echo -n \"Installing gonb ...\"\n", "!go install github.com/janpfeifer/gonb@latest >& /tmp/output || cat /tmp/output\n", "!echo \" done.\"\n", "!ln -sf /root/go/bin/gonb /usr/bin/gonb\n", "\n", "!echo -n \"Installing goimports ...\"\n", "!go install golang.org/x/tools/cmd/goimports@latest >& /tmp/output || cat /tmp/output\n", "!echo \" done.\"\n", "!ln -sf /root/go/bin/goimports /usr/bin/goimports\n", "\n", "!echo -n \"Installing gopls ...\"\n", "!go install golang.org/x/tools/gopls@latest >& /tmp/output || cat /tmp/output\n", "!echo \" done.\"\n", "!ln -sf /root/go/bin/gopls /usr/bin/gopls\n", "\n", "# Install gonb kernel configuration.\n", "!gonb --install --logtostderr\n", "!echo \"Done!\"" ] }, { "cell_type": "markdown", "source": [ "The cell above shoudl be run only once, and then followed by a change of runtime to `Go (gonb)`. See detailed instructions above." ], "metadata": { "id": "lbPHZ_rjOavo" } }, { "cell_type": "markdown", "source": [ "## Demo\n", "\n", "From here below you can delete and put your own code.\n", "\n", "\n", "First ..." ], "metadata": { "id": "izIU9VTs-Fc4" } }, { "cell_type": "code", "source": [ "%%\n", "fmt.Printf(\"Hello World!\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XH7zQH3D7TmR", "outputId": "362d4597-e91d-491f-c72a-fc08e3685abf" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Hello World!" ] } ] }, { "cell_type": "code", "source": [ "import \"bytes\"\n", "import svgo \"github.com/ajstarks/svgo\"\n", "import \"github.com/janpfeifer/gonb/gonbui\"\n", "\n", "func Shining(width, height int) string {\n", " buf := bytes.NewBuffer(nil)\n", " canvas := svgo.New(buf)\n", " xp := []int{50, 70, 70, 50, 30, 30}\n", " yp := []int{40, 50, 75, 85, 75, 50}\n", " xl := []int{0, 0, 50, 100, 100}\n", " yl := []int{100, 40, 10, 40, 100}\n", " bgcolor := \"rgb(227,78,25)\"\n", " bkcolor := \"rgb(153,29,40)\"\n", " stcolor := \"rgb(65,52,44)\"\n", " stwidth := 12\n", " stylefmt := \"stroke:%s;stroke-width:%d;fill:%s\"\n", " canvas.Start(width, height)\n", " canvas.Def()\n", " canvas.Gid(\"unit\")\n", " canvas.Polyline(xl, yl, \"fill:none\")\n", " canvas.Polygon(xp, yp)\n", " canvas.Gend()\n", " canvas.Gid(\"runit\")\n", " canvas.TranslateRotate(150, 180, 180)\n", " canvas.Use(0, 0, \"#unit\")\n", " canvas.Gend()\n", " canvas.Gend()\n", " canvas.DefEnd()\n", " canvas.Rect(0, 0, width, height, \"fill:\"+bgcolor)\n", " canvas.Gstyle(fmt.Sprintf(stylefmt, stcolor, stwidth, bkcolor))\n", " for y := 0; y < height; y += 130 {\n", " for x := -50; x < width; x += 100 {\n", " canvas.Use(x, y, \"#unit\")\n", " canvas.Use(x, y, \"#runit\")\n", " }\n", " }\n", " canvas.Gend()\n", " canvas.End()\n", " return buf.String()\n", "}\n", "\n", "%%\n", "gonbui.DisplaySVG(Shining(500, 500))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 522 }, "id": "nqvhyQ-F_0kA", "outputId": "ca3add57-fee4-48bd-a4db-e725b46a1c83" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "import \"github.com/benc-uk/gofract/pkg/fractals\"\n", "import \"github.com/benc-uk/gofract/pkg/colors\"\n", "\n", "%%\n", "imgWidth := 320\n", "\n", "// Default fractal\n", "f := fractals.Fractal{\n", " FractType: \"mandelbrot\",\n", " Center: fractals.ComplexPair{-0.6, 0.0},\n", " MagFactor: 1.0,\n", " MaxIter: 90,\n", " W: 3.0,\n", " H: 2.0,\n", " ImgWidth: imgWidth,\n", " JuliaSeed: fractals.ComplexPair{0.355, 0.355},\n", " InnerColor: \"#000000\",\n", " FullScreen: false,\n", " ColorRepeats: 2,\n", "}\n", "gradient := colors.GradientTable{}\n", "gradient.AddToTable(\"#000762\", 0.0)\n", "gradient.AddToTable(\"#0B48C3\", 0.2)\n", "gradient.AddToTable(\"#ffffff\", 0.4)\n", "gradient.AddToTable(\"#E3A000\", 0.5)\n", "gradient.AddToTable(\"#000762\", 0.9)\n", "imgHeight := int(float64(imgWidth) * float64(f.H/f.W))\n", "img := image.NewRGBA(image.Rect(0, 0, f.ImgWidth, imgHeight))\n", "lastRenderTime := f.Render(img, gradient)\n", "fmt.Printf(\"lastRenderTime=%v\\n\", lastRenderTime)\n", "gonbui.DisplayImage(img)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "d2Ne-RIYAk6z", "outputId": "b2aa576e-71da-48ab-866d-53f33495a846" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "lastRenderTime=26.491124\n" ] }, { "output_type": "display_data", "data": { "image/png": "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" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "import \"bytes\"\n", "import \"github.com/janpfeifer/gonb/gonbui\"\n", "import mg \"github.com/erkkah/margaid\"\n", "\n", "func mgPlot(width, height int) string {\n", " randomSeries := mg.NewSeries()\n", " rand.Seed(time.Now().Unix())\n", " for i := float64(0); i < 10; i++ {\n", " randomSeries.Add(mg.MakeValue(i+1, 200*rand.Float64()))\n", " }\n", "\n", " testSeries := mg.NewSeries()\n", " multiplier := 2.1\n", " v := 0.33\n", " for i := float64(0); i < 10; i++ {\n", " v *= multiplier\n", " testSeries.Add(mg.MakeValue(i+1, v))\n", " }\n", "\n", " diagram := mg.New(width, height,\n", " mg.WithAutorange(mg.XAxis, testSeries),\n", " mg.WithAutorange(mg.YAxis, testSeries),\n", " mg.WithAutorange(mg.Y2Axis, testSeries),\n", " mg.WithProjection(mg.YAxis, mg.Log),\n", " mg.WithInset(70),\n", " mg.WithPadding(2),\n", " mg.WithColorScheme(90),\n", " mg.WithBackgroundColor(\"#f8f8f8\"),\n", " )\n", "\n", " diagram.Line(testSeries, mg.UsingAxes(mg.XAxis, mg.YAxis), mg.UsingMarker(\"square\"), mg.UsingStrokeWidth(1))\n", " diagram.Smooth(testSeries, mg.UsingAxes(mg.XAxis, mg.Y2Axis), mg.UsingStrokeWidth(3.14))\n", " diagram.Smooth(randomSeries, mg.UsingAxes(mg.XAxis, mg.YAxis), mg.UsingMarker(\"filled-circle\"))\n", " diagram.Axis(testSeries, mg.XAxis, diagram.ValueTicker('f', 0, 10), false, \"X\")\n", " diagram.Axis(testSeries, mg.YAxis, diagram.ValueTicker('f', 1, 2), true, \"Y\")\n", "\n", " diagram.Frame()\n", " diagram.Title(\"A diagram of sorts 📊 📈\")\n", " buf := bytes.NewBuffer(nil)\n", " diagram.Render(buf)\n", " return buf.String()\n", "}\n", "\n", "%%\n", "gonbui.DisplaySVG(mgPlot(640, 480))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 502 }, "id": "Gc9kRoENA8yv", "outputId": "513a555b-d37d-4a03-9f5f-9e919b6801c1" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
12345678910X1.02.04.08.016.032.064.0128.0256.0512.0YA diagram of sorts 📊 📈
" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "import (\n", "\t\"math/rand\"\n", "\t\"github.com/go-echarts/go-echarts/v2/charts\"\n", "\t\"github.com/go-echarts/go-echarts/v2/opts\"\n", "\t\"github.com/go-echarts/go-echarts/v2/types\"\n", " gonb_echarts \"github.com/janpfeifer/gonb-echarts\"\n", " \"github.com/janpfeifer/must\"\n", ")\n", "\n", "func toLineData[In any](data []In) []opts.LineData {\n", " r := make([]opts.LineData, len(data))\n", " for ii, v := range data {\n", " r[ii].Value = v\n", " }\n", " return r\n", "}\n", "\n", "%%\n", "stackedLine := charts.NewLine()\n", "stackedLine.SetGlobalOptions(\n", " charts.WithTitleOpts(opts.Title{Title: \"Stacked Line\",}),\n", " charts.WithTooltipOpts(opts.Tooltip{Show: opts.Bool(true), Trigger: \"axis\"}),\n", ")\n", "seriesOpt := charts.WithLineChartOpts(opts.LineChart{\n", " Stack: \"Total\",\n", " ShowSymbol: opts.Bool(true),\n", "})\n", "\n", "stackedLine.\n", " SetGlobalOptions(charts.WithYAxisOpts(opts.YAxis{Type: \"value\"}))\n", "stackedLine.\n", " SetXAxis([]string{\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"}).\n", " AddSeries(\"Email\", toLineData([]int{120, 132, 101, 134, 90, 230, 210}), seriesOpt).\n", " AddSeries(\"Union Ads\", toLineData([]int{220, 182, 191, 234, 290, 330, 310}), seriesOpt).\n", " AddSeries(\"Video Ads\", toLineData([]int{150, 232, 201, 154, 190, 330, 410}), seriesOpt).\n", " AddSeries(\"Direct\", toLineData([]int{320, 332, 301, 334, 390, 330, 320}), seriesOpt).\n", " AddSeries(\"Search Engine\", toLineData([]int{820, 932, 901, 934, 1290, 1330, 1320}), seriesOpt)\n", "\n", "must.M(gonb_echarts.Display(stackedLine, \"width: 1024px; height:400px; background: white;\"))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 417 }, "id": "piKyK1e9LmNu", "outputId": "c59c6fd4-9db1-4891-e946-475e9fa8e067" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ] }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "# More ... and Help" ], "metadata": { "id": "kE40IkXiBMVo" } }, { "cell_type": "code", "source": [ "%help" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "DMucr82cBItc", "outputId": "b8612706-f610-4895-cffa-fe704eeaca8b" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/markdown": "## GoNB Help Page\n\n**GoNB** is a Go kernel that compiles and executes on-the-fly Go code.\n\nWhen executing a cell, **GoNB** will save the cell contents (except non-Go commands see\nbelow) into a `main.go` file, compile and execute it.\n\nIt also saves any global declarations (imports, functions, types, variables, constants)\nand reuse them at the next cell execution -- so you can define a function in one\ncell, and reuse in the next one. Just the `func main()` is not reused.\n\nA `hello world` example would look like:\n\n```go\nfunc main() {\n fmt.Printf(`Hello world!\\n`);\n}\n\n```\n\nBut to avoid having to type `func main()` all the time, you can use `%%` and everything\nafter is wrapped inside a `func main() { ... }`. \nSo our revised `hello world` looks like:\n\n```go\n%%\nfmt.Printf(`Hello world!\\n`)\n\n```\n\n\n### Init Functions -- `func init()`\n\nSince there is always only one definition per function name, it's not possible for\neach cell to have its own init() function. \nInstead, **GoNB** converts any function named `init_something()` to `init()` before \ncompiling and executing. \nThis way each cell can create its own `init_...()` and have it called at every cell execution.\n\n\n### Special non-Go Commands\n\n- `%% []` or `%main []`: Marks the lines as follows to be wrapped in a `func main() {...}` during\n execution. A shortcut to quickly execute code. It also automatically includes `flag.Parse()`\n as the very first statement. Anything after`%%` or `%main` are taken as arguments\n to be passed to the program -- it resets previous values given by `%args`.\n- `%args `: Sets arguments to be passed when executing the Go code. This allows one to\n use flags as a normal program. Notice that if a value after `%%` or `%main` is given, it will\n overwrite the values here.\n- `%exec []`: this will call the function `my_func()`, and optionally set the program arguments.\n Behind the scenes it creates a trivial `func main()` that parses the flags and calls `my_func()` (without any\n parameters or return values).\n- `%autoget` and `%noautoget`: Default is `%autoget`, which automatically does `go get` for\n packages not yet available.\n- `%cd []`: Change current directory of the Go kernel, and the directory from where\n the cells are executed. If no directory is given it reports the current directory.\n- `%env VAR value`: Sets the environment variable VAR to the given value. These variables\n will be available both for Go code and for shell scripts.\n- `%goflags `: Configures list of extra arguments to pass to `go build` when compiling the\n code for execution of a cell.\n If no values are given, it simply shows the current setting.\n To reset its value, use `%goflags \"\"\"`.\n See example on how to use this in the [tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb). \n- `%with_inputs`: will prompt for inputs for the next shell command. Use this if\n the next shell command (`!`) you execute reads the stdin. Jupyter will require\n you to enter one last value after the shell script executes.\n- `%with_password`: will prompt for a password passed to the next shell command.\n Do this is if your next shell command requires a password.\n\n**Notes**: \n\n1. The special commands below can be used in the start of the line as is, or prefixed by a `//gonb:`, which may be easier\non some IDEs if editing the code externally (since these special commands are not proper Go). \nSo `//gonb:%%` is the same as `%%` \n2. All these commands are executed **before** any Go code in the same cell.\n\n\n### Managing Memorized Definitions\n\n- `%list` (or `%ls`): Lists all memorized definitions (imports, constants, types, variables and\n functions) that are carried from one cell to another.\n- `%remove ` (or `%rm `): Removes (forgets) given definition(s). Use as key the\n value(s) listed with `%ls`.\n- `%reset [go.mod]` clears all memorized definitions (imports, constants, types, functions, etc.)\n as well as re-initializes the `go.mod` file. \n If the optional `go.mod` parameter is given, it will re-initialize only the `go.mod` file -- \n useful when testing different set up of versions of libraries.\n\n\n### Executing Shell Commands\n\n- `!`: executes the given command on a new shell. It makes it easy to run\n commands on the kernels box, for instance to install requirements, or quickly\n check contents of directories or files. Lines ending in `\\` are continued on\n the next line -- so multi-line commands can be entered. But each command is\n executed in its own shell, that is, variables and state is not carried over.\n- `!*`: same as `!` except it first changes directory to\n the temporary directory used to compile the go code -- the latest execution\n is always saved in the file `main.go`. It's also where the `go.mod` file for\n the notebook is created and maintained. Useful for manipulating `go.mod`,\n for instance to get a package from some specific version, something\n like `!*go get github.com/my/package@v3`.\n\nNotice that when the cell is executed, first all shell commands are executed, and only after that, if there is\nany Go code in the cell, it is executed.\n\n### Running a Debugger\n\nWhile **GoNB** doesn't (yet) talk the debug protocol with JupyterLab, it's easy to start a GUI debugger\nfrom a cell, if being executed on the same machine as the browser.\n\nThe common Go debugger recommendation is [delve](https://github.com/go-delve/delve), and in particular its front-end\n[gdlv](https://github.com/aarzilli/gdlv). And to make it simpler **GoNB** includes a small wrapper script \n[`ndlv`](https://github.com/janpfeifer/gonb/blob/main/cmd/ndlv/ndlv) to\nset the directory and program name to the last cell executed. Copy or link that script somewhere in your `PATH`\n(maybe `${HOME}/bin` if you have such directory set up).\n\nTo open the debugger, after executing a cell you want to debug, you create and execute a new cell with this single shell command:\n\n```\n!ndlv\n```\n\n### Tracking of Go Files In Development:\n\nA convenient way to develop programs or libraries in **GoNB** is to use replace\nrules in **GoNB**'s `go.mod` to your program or library being developed and test\nyour program from **GoNB** -- see the \n[Tutorial]((https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb))'s\nsection \"Developing Go libraries with a notebook\" for different ways of achieving this.\n\nTo manipulate the list of files tracked for changes:\n\n- `%track [file_or_directory]`: add file or directory to list of tracked files,\n which are monitored by **GoNB** (and 'gopls') for auto-complete or contextual help.\n If no file is given, it lists the currently tracked files.\n- `%untrack [file_or_directory][...]`: remove file or directory from list of tracked files.\n If suffixed with `...` it will remove all files prefixed with the string given (without the\n `...`). If no file is given, it lists the currently tracked files.\n\n\n### Environment Variables\n\nFor convenience, **GoNB** defines the following environment variables -- available for the shell\nscripts (`!` and `!*`) and for the Go cells:\n\n- `GONB_DIR`: the directory where commands are executed from. This can be changed with `%cd`.\n- `GONB_TMP_DIR`: the directory where the temporary Go code, with the cell code, is stored\n and compiled. This is the directory where `!*` scripts are executed. It only changes when a kernel\n is restarted, and a new temporary directory is created.\n- `GONB_PIPE`: is the _named pipe_ directory used to communicate rich content (HTML, images)\n to the kernel. Only available for _Go_ cells, and a new one is created at every execution.\n This is used by the `**GoNB**ui`` functions described above, and doesn't need to be accessed directly.\n\n### Widgets\n\nThe package `gonbui/widgets` offers widgets that can be used to interact in a more\ndynamic way, using the HTML element in the browser. E.g.: buttons, sliders.\n\nIt's not necessary to do anything, but, to help debug the communication system\nwith the front-end, **GoNB** offers a couple of special commands:\n\n- `%widgets` - install the javascript needed to communicate with the frontend.\n This is usually not needed, since it happens automatically when using Widgets.\n- `%widgets_hb` - send a _heartbeat_ signal to the front-end and wait for the\n reply.\n Used for debugging only.\n\n### Writing for WASM (WebAssembly) (Experimental)\n\n**GoNB** can also compile to WASM and run in the notebook. This is experimental, and likely to change\n(feedback is very welcome), and can be used to write interactive widgets in Go, in the notebook.\n\nWhen a cell with `%wasm` is executed, a temporary directory is created under the Jupyter root directory\ncalled `jupyter_files//` and the cell is compiled to a wasm file and put in that \ndirectory.\n\nThen **GONB** outputs the javascript needed to run the compiled wam.\n\nIn the Go code, the following extra constants/variables are created in the global namespace, and can be used\nin your Go code:\n\n- `GonbWasmDir`, `GonbWasmUrl`: the directory and url (served by Jupyter) where the generated `.wasm` files are read.\n Potentially, the user can use it to serve other files.\n These are unique for the kernel, but shared among cells.\n- `GonbWasmDivId`: When a `%wasm` cell is executed, an empty `
\">
`\n is created with a unique id -- every cell will have a different one.\n This is where the Wasm code can dynamically create content.\n\nThe following environment variables are set when `%wasm` is created:\n\n- `GONB_WASM_SUBDIR`, `GONB_WASM_URL`: the directory and url (served by Jupyter) where the generated `.wasm` files are read.\n Potentially, the user can use it to serve other files.\n These environment variables are available for shell scripts (`!...` and `!*...` special commands) and non-wasm \n programs if they want to serve different files from there.\n\n\n### Writing Tests and Benchmarks\n\nIf a cell includes the `%test` command (anywhere in cell), it is compiled with `go test`\n(as opposed to `go build`).\nThis can be very useful both to demonstrate tests, or simply help develop/debug them in a notebook.\n\nIf `%test` is given without any flags, it uses by default the flags `-test.v` (verbose) and `-test.run` defined\nwith the list of the tests defined in the current cell. \nThat is, it will run only the tests in the current cell. \nAlso, if there are any benchmarks in the current cell, it appends the flag `-test.bench=.` and runs the benchmarks\ndefined in the current cell.\n\nAlternatively one can use `%test `, and the `flags` are passed to the binary compiled with `go test`. \nRemember that test flags require to be prefixed with `test.`. \nSo for a verbose output, use `%test -test.v`. \nFor benchmarks, run `%test -test.bench=. -test.run=Benchmark`. \n\nSee examples in the [`gotest.ipynb` notebook here](https://github.com/janpfeifer/gonb/blob/main/examples/tests/gotest.ipynb).\n\n\n### Cell Magic\n\nThe following are special commands that change how the cell is interpreted, so they are prefixed with `%%` (two '%'\nsymbols). They try to follow [IPython's Cell Magic](https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics).\n\nThey must always appear as the first line of the cell.\n\nThe contents in the cells are not assumed to be Go, so auto-complete and contextual help are disabled in those cells.\n\n#### `%%writefile`\n\n```\n%%writefile [-a] \n```\n\nWrite contents of the cell (except the first line with the '%%writefile') to the given ``. If `-a` is given\nit will append the cell contents to the file.\n\nThis can be handy if for instance the notebook needs to write a configuration file, or simply to dump the code inside\nthe cell into some file.\n\nFile path passes through a tilde (`~`) expansion to the user's home directory, as well as environment variable substitution (e.g.: `${HOME}` or `$MY_DIR/a/b`). \n\n### `%%script`, `%%bash` and `%%sh`\n\n```\n%%script \n```\n\nExecute `` and feed it (`STDIN`) with the contents of the cell. The `%%bash` and `%%sh` magic is an alias to `%%script bash` and `%%script sh` respectively.\n\nGenerally, a convenient way to run larger scripts.\n\n\n### Other\n\n- `%goworkfix`: work around 'go get' inability to handle 'go.work' files. If you are\n using 'go.work' file to point to locally modified modules, consider using this. It creates\n 'go mod edit --replace' rules to point to the modules pointed to the 'use' rules in 'go.work'\n file.\n It overwrites/updates 'replace' rules for those modules, if they already exist. See \n [tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb) for an example.\n\n### Links\n\n- [github.com/janpfeifer/gonb](https://github.com/janpfeifer/gonb) - GitHub page.\n- [Tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb).\n- [go.dev](https://pkg.go.dev/github.com/janpfeifer/gonb) package reference." }, "metadata": {} } ] } ] }