Skip to content

Commit f724782

Browse files
committed
Use python embedding instead of base64 encoding of template files
1 parent aca46f2 commit f724782

File tree

9 files changed

+47
-96
lines changed

9 files changed

+47
-96
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ repos:
44
hooks:
55
- id: jupytext
66
args: [--pipe, black]
7-
exclude: runbooks/binder/_template-deno.ipynb|.*\.md|tests/.*
7+
exclude: runbook/data/_template-deno.ipynb|.*\.md|tests/.*
88
additional_dependencies:
99
- black==23.3.0 # Matches hook
1010

Justfile

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ open NOTEBOOK:
99
uv run runbook edit {{NOTEBOOK}}
1010

1111
clear-binder-output:
12-
jupyter nbconvert --clear-output --inplace ./runbooks/binder/*.ipynb
12+
jupyter nbconvert --clear-output --inplace ./runbook/data/*.ipynb
1313

1414
clear-output *FILES:
1515
jupyter nbconvert --clear-output --inplace {{FILES}}
@@ -35,22 +35,6 @@ build:
3535
benchmark:
3636
hyperfine --export-markdown=docs/PERFORMANCE.md -- runbook
3737

38-
template-update:
39-
#!/usr/bin/env bash
40-
41-
set -eou pipefail
42-
43-
readonly UPDATED_AT="$(date -Iseconds)"
44-
export UPDATED_AT
45-
# Base 64 to avoid corruption during parsing/exporting
46-
readonly TEMPLATE_DENO="$(uv run jupyter nbconvert --log-level='ERROR' runbooks/binder/_template-deno.ipynb --stdout --clear-output --ClearMetadataPreprocessor.enabled=True \
47-
--ClearMetadataPreprocessor.preserve_cell_metadata_mask='[("tags")]' "--ClearMetadataPreprocessor.clear_notebook_metadata=False" | grep -E -v "^poetry-version-plugin" | base64)"
48-
export TEMPLATE_DENO
49-
readonly TEMPLATE_PYTHON="$(uv run jupyter nbconvert --log-level='ERROR' runbooks/binder/_template-python.ipynb --stdout --clear-output --ClearMetadataPreprocessor.enabled=True \
50-
--ClearMetadataPreprocessor.preserve_cell_metadata_mask='[("tags")]' "--ClearMetadataPreprocessor.clear_notebook_metadata=False" | grep -E -v "^poetry-version-plugin" | base64)"
51-
export TEMPLATE_PYTHON
52-
envsubst < runbook/template_builder.py | tee runbook/template.py
53-
5438
readme:
5539
.config/templating.sh
5640

docs/NOTES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Roadmap and Notes
22

33
## Triage
4+
- [x] Use better way to embed files in the runbook package (ie templates)
45
- [x] Read `runbook plan ...` support reading params from file
5-
- [ ] If no argument included for RUNBOOK TITLE in edit/plan/run then prompt with options
6+
- [x] If no argument included for RUNBOOK TITLE in edit/plan/run then prompt with options
67
- [x] Include field 'embeds' in the metadata to help with referencing them
78
- [ ] --- Add helper for referencing the embeds?
89
- [ ] Use execute and upload output to S3 for non-interactive: https://github.com/nteract/papermill/tree/main?tab=readme-ov-file#execute-via-cli

runbook/cli/commands/init.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import base64
21
import json
32
from pathlib import Path
43

@@ -55,11 +54,7 @@ def init(ctx, directory, skip_confirmation):
5554
with open(f"./{directory}/.runbook.json", "w") as f:
5655
f.write(json.dumps(cfg))
5756
with open(f"./{directory}/binder/_template-python.ipynb", "w") as f:
58-
fmt = "python"
59-
js = base64.b64decode(TEMPLATES[fmt]).decode("utf-8")
60-
f.write(js)
57+
f.write(TEMPLATES["python"])
6158

6259
with open(f"./{directory}/binder/_template-deno.ipynb", "w") as f:
63-
fmt = "deno"
64-
js = base64.b64decode(TEMPLATES[fmt]).decode("utf-8")
65-
f.write(js)
60+
f.write(TEMPLATES["deno"])

runbooks/binder/_template-deno.ipynb renamed to runbook/data/_template-deno.ipynb

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
},
8989
{
9090
"cell_type": "code",
91-
"execution_count": 1,
91+
"execution_count": null,
9292
"id": "9ae59b65",
9393
"metadata": {
9494
"execution": {
@@ -98,32 +98,14 @@
9898
"shell.execute_reply": "2024-07-04T22:11:09.435918Z"
9999
}
100100
},
101-
"outputs": [
102-
{
103-
"name": "stdout",
104-
"output_type": "stream",
105-
"text": [
106-
"AAAAAAAAAAAA yes\n"
107-
]
108-
},
109-
{
110-
"data": {
111-
"text/plain": [
112-
"\u001b[32m\"yes\"\u001b[39m"
113-
]
114-
},
115-
"execution_count": 1,
116-
"metadata": {},
117-
"output_type": "execute_result"
118-
}
119-
],
101+
"outputs": [],
120102
"source": [
121103
"prompt(\"AAAAAAAAAAAA\")"
122104
]
123105
},
124106
{
125107
"cell_type": "code",
126-
"execution_count": 1,
108+
"execution_count": null,
127109
"id": "02a9b324",
128110
"metadata": {
129111
"execution": {
@@ -133,15 +115,7 @@
133115
"shell.execute_reply": "2024-07-04T22:11:16.536815Z"
134116
}
135117
},
136-
"outputs": [
137-
{
138-
"name": "stdout",
139-
"output_type": "stream",
140-
"text": [
141-
"BBBBBBBBBBBB\n"
142-
]
143-
}
144-
],
118+
"outputs": [],
145119
"source": [
146120
"console.log(\"AAAAAAAAAA\")\n",
147121
"\n",
File renamed without changes.

runbook/template.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,33 @@
1-
TEMPLATES = {}
1+
import sys
22

3-
# PYTHON_TEMPLATE_START
4-
# 2025-01-20T16:15:23-08:00
5-
TEMPLATES[
6-
"python"
7-
] = """
8-
ewogImNlbGxzIjogWwogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJlMzY4MDEzYiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyBUSVRMRVxuIiwKICAgICJcbiIsCiAgICAiIyMgRGVzY3JpcHRpb24iCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIzMGQ5ZGNiOSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMgU2V0dXAiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICIxOWVmNjkwMy0yZmNkLTRiZGYtOTM1ZS05MmNlMjk0MGIyNzciLAogICAibWV0YWRhdGEiOiB7CiAgICAidGFncyI6IFsKICAgICAicGFyYW1ldGVycyIKICAgIF0KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICIjIFBBUkFNRVRFUlMgREVGQVVMVFNcbiIsCiAgICAiZHJ5X3J1biA9IFRydWUgICMgY29udHJvbHMgc2ggYmVoYXZpb3IgZm9yIHNhZmV0eVxuIiwKICAgICJhbl9hcnJheTogTGlzdFtzdHJdID0gW1wiYVwiLCBcImJcIl0gICMgYXJyYXkgb2Ygc3RyaW5ncyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImExZGI4NWQ1LTg5YTQtNDcyMS04MzdjLTJmMTdmNTU1ODFlYiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICIjIFNIRUxMIEhFTFBFUlNcbiIsCiAgICAiZnJvbSBydW5ib29rLnNoZWxsIGltcG9ydCBzaGVsbF9idWlsZGVyLCBnYXRoZXIsIGNvbmZpcm0sIHN0eWxlLCBxdW90ZVxuIiwKICAgICJcbiIsCiAgICAic2ggPSBzaGVsbF9idWlsZGVyKFxuIiwKICAgICIgICAgZHJ5X3J1biwgdGFnc19kZWZhdWx0PXtcImVudmlyb25tZW50XCI6IFwidGVzdGluZ1wifSwgY29uZmlybV9kZWZhdWx0PVRydWVcbiIsCiAgICAiKSIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImI2MGI2ZTcxLTEzZGEtNDBkMy05YTc0LTAxNmY3NWZiYWY0NiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICIjIFdpZGdldHNcbiIsCiAgICAiaW1wb3J0IGlweXdpZGdldHMgYXMgd2lkZ2V0c1xuIiwKICAgICJmcm9tIElQeXRob24uZGlzcGxheSBpbXBvcnQgZGlzcGxheVxuIiwKICAgICJcbiIsCiAgICAidyA9IHdpZGdldHMuRHJvcGRvd24oXG4iLAogICAgIiAgICBvcHRpb25zPVsoXCJQcm9kdWN0aW9uXCIsIDEpLCAoXCJTdGFnaW5nXCIsIDIpLCAoXCJEZXZlbG9wbWVudFwiLCAzKV0sXG4iLAogICAgIiAgICB2YWx1ZT0zLFxuIiwKICAgICIgICAgZGVzY3JpcHRpb249XCJFbnZpcm9ubWVudDpcIixcbiIsCiAgICAiKVxuIiwKICAgICJcbiIsCiAgICAidiA9IHdpZGdldHMuRHJvcGRvd24oXG4iLAogICAgIiAgICBvcHRpb25zPVtcIk15c3FsXCIsIFwiUmVkaXNcIiwgXCJNZW1jYWNoZWRcIl0sXG4iLAogICAgIiAgICB2YWx1ZT1cIlJlZGlzXCIsXG4iLAogICAgIiAgICBkZXNjcmlwdGlvbj1cIkRhdGFiYXNlOlwiLFxuIiwKICAgICIpXG4iLAogICAgImRpc3BsYXkodylcbiIsCiAgICAiZGlzcGxheSh2KSIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogIjc5YjE4MDc2LTM0MGYtNDJkMy1hMDIxLTk2YTY2MWRlN2UzYSIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgInByaW50KGZcIlZhbHVlIG9mIHdpZGdldDoge3cudmFsdWV9IHt2LnZhbHVlfVwiKSIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImY3NjEwMjk4IiwKICAgIm1ldGFkYXRhIjogewogICAgImVkaXRhYmxlIjogdHJ1ZSwKICAgICJzbGlkZXNob3ciOiB7CiAgICAgInNsaWRlX3R5cGUiOiAiIgogICAgfSwKICAgICJ0YWdzIjogW10KICAgfSwKICAgInNvdXJjZSI6IFsKICAgICIjIyBPcGVyYXRpb24iCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJhZGYyZGMzYyIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAic291cmNlIjogWwogICAgIiMjIyBTdGVwIDEgLSBHZXQgZ2l0IGluZm8iCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICI2ZWUxMjY2MS02MmI4LTQzYjctYjU1Ny0yYWNjOWEzNDZkODQiLAogICAibWV0YWRhdGEiOiB7fSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJvdXRwdXQgPSBhd2FpdCBzaChcImdpdCAtLXZlcnNpb24gJiYgZWNobyAzMzMgPiYyXCIsIGNvbmZpcm09VHJ1ZSkiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICI4MmM5MDYxNCIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMjIFN0ZXAgMiAtIFByaW50IgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiNWM5NDU0OGYtMjE5Ny00ZGU3LWI3MmMtYjFmZWIyOWJjMThjIiwKICAgIm1ldGFkYXRhIjoge30sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAicHJpbnQob3V0cHV0KSIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImYwZTllYWRlIiwKICAgIm1ldGFkYXRhIjoge30sCiAgICJzb3VyY2UiOiBbCiAgICAiPHNwYW4gc3R5bGU9J2NvbG9yOiByZWQ7Jz48Ym9sZD5EQU5HRVI8L2JvbGQ+PC9zcGFuPiA8c3BhbiBzdHlsZT0nY29sb3I6IHJlZDsnPjxib2xkPkRBTkdFUjwvYm9sZD48L3NwYW4+IDxzcGFuIHN0eWxlPSdjb2xvcjogcmVkOyc+PGJvbGQ+REFOR0VSPC9ib2xkPjwvc3Bhbj4gVGhlIGZvbGxvd2luZyBjb2RlIGlzIGdvaW5nIHRvIGJlIHJpc2t5LiBCZSBwcmVwYXJlZCB3aXRoIHJvbGxiYWNrIHByb2NlZHVyZXMuIgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiMGFkZDI4MTYtYTljYi00MTBjLTgzZjMtYTRhYWQ2YWFmZjVmIiwKICAgIm1ldGFkYXRhIjoge30sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAiY29uZmlybShzdHlsZShcIkRhbmdlciwgcmVhZHkgdG8gcHJvY2VlZD9cIiwgZmc9XCJyZWRcIiwgYm9sZD1UcnVlKSwgYWJvcnQ9VHJ1ZSlcbiIsCiAgICAiY21kcyA9IFtzaChcInNsZWVwIDE7IGVjaG8gMVwiKSwgc2goXCJzbGVlcCAyOyBlY2hvIDJcIiksIHNoKFwic2xlZXAgMzsgZWNobyAzXCIpXSIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImVmNTI1YjZkLTIwNTktNDEyZS1hMGNiLWMxZTkwOGNhNTRjNyIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgInJlc3VsdCA9IGF3YWl0IGdhdGhlcigqY21kcykiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICI3NGQ5NDFmMiIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAic291cmNlIjogWwogICAgIiMjIENsZWFudXAiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJkNWIxNmRiZSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMgUm9sbGJhY2siCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIzZTM3ODRmYy1lMDczLTQ5YTMtYTE3ZC1jNWY4MjczMzk0YjAiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIEFjdGlvbiBJdGVtcyAvIExlYXJuaW5ncyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImFkN2VkNTFmLTdlMGYtNGM3ZC05NWIzLWM3M2VjZGVhYTNhOCIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFtdCiAgfQogXSwKICJtZXRhZGF0YSI6IHsKICAia2VybmVsc3BlYyI6IHsKICAgImRpc3BsYXlfbmFtZSI6ICJQeXRob24gMyAoaXB5a2VybmVsKSIsCiAgICJsYW5ndWFnZSI6ICJweXRob24iLAogICAibmFtZSI6ICJweXRob24zIgogIH0sCiAgImxhbmd1YWdlX2luZm8iOiB7CiAgICJjb2RlbWlycm9yX21vZGUiOiB7CiAgICAibmFtZSI6ICJpcHl0aG9uIiwKICAgICJ2ZXJzaW9uIjogMwogICB9LAogICAiZmlsZV9leHRlbnNpb24iOiAiLnB5IiwKICAgIm1pbWV0eXBlIjogInRleHQveC1weXRob24iLAogICAibmFtZSI6ICJweXRob24iLAogICAibmJjb252ZXJ0X2V4cG9ydGVyIjogInB5dGhvbiIsCiAgICJweWdtZW50c19sZXhlciI6ICJpcHl0aG9uMyIsCiAgICJ2ZXJzaW9uIjogIjMuMTEuNyIKICB9LAogICJ3aWRnZXRzIjogewogICAiYXBwbGljYXRpb24vdm5kLmp1cHl0ZXIud2lkZ2V0LXN0YXRlK2pzb24iOiB7CiAgICAic3RhdGUiOiB7fSwKICAgICJ2ZXJzaW9uX21ham9yIjogMiwKICAgICJ2ZXJzaW9uX21pbm9yIjogMAogICB9CiAgfQogfSwKICJuYmZvcm1hdCI6IDQsCiAibmJmb3JtYXRfbWlub3IiOiA1Cn0K
9-
""".strip()
10-
# PYTHON_TEMPLATE_START
3+
if sys.version_info >= (3, 7):
4+
from importlib import resources as importlib_resources
5+
else:
6+
import pkgutil
117

12-
# DENO_TEMPLATE_START
13-
# 2025-01-20T16:15:23-08:00
14-
TEMPLATES[
15-
"deno"
16-
] = """
17-
ewogImNlbGxzIjogWwogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICI2ZmY4MDczNC04OTA2LTRmODUtOWFhYi02Y2VhY2U3YmE0MjUiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMgVElUTEVcbiIsCiAgICAiXG4iLAogICAgIiMjIERFU0NSSVBUSU9OXG4iLAogICAgIlxuIiwKICAgICJEZXNjcmlwdGlvbiBjb250aW51ZXMgaW4gbmFycmF0aXZlIGZvcm0iCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIwNWIzZTg4MC04NjAxLTQxMDctOTg5NS1kNzkyYmExZGNkMzAiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIFNldHVwIgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiMTE3MzA3ZTQtZTY2Zi00MDQ0LWI3ZTctOTE0ZGMwMjkyODIxIiwKICAgIm1ldGFkYXRhIjogewogICAgInRhZ3MiOiBbCiAgICAgInBhcmFtZXRlcnMiCiAgICBdCiAgIH0sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAiLy8gRGVmYXVsdCBQYXJhbXNcbiIsCiAgICAibGV0IHNlcnZlcjogc3RyaW5nID0gXCJtYWluLnhhcmdzLmlvXCI7XG4iLAogICAgImxldCBhcmc6IG51bWJlciA9IDE7XG4iLAogICAgImxldCBhbkFycmF5OiBzdHJpbmdbXSA9IFtcImFcIiwgXCJiXCJdOyAvLyBub3JtYWxseSBhIC8gYlxuIiwKICAgICJsZXQgX19SVU5CT09LX01FVEFEQVRBX18gPSB7fTsiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICI0YjMwNThkYSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJpbXBvcnQgeyAkLCBzaCB9IGZyb20gXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20venBoL3J1bmJvb2svbWFpbi9leHQvZGVuby9ydW5ib29rL21vZC50c1wiOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImIyN2RlZjU2LTAyMTktNDM4OS04MmM3LTQ0Yzc3YmFiNmIxOSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJhd2FpdCBzaChcImdpdCBsb2dcIik7IgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiOWFlNTliNjUiLAogICAibWV0YWRhdGEiOiB7fSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJwcm9tcHQoXCJBQUFBQUFBQUFBQUFcIikiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICIwMmE5YjMyNCIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgImNvbnNvbGUubG9nKFwiQUFBQUFBQUFBQVwiKVxuIiwKICAgICJcbiIsCiAgICAiY29uc29sZS5sb2coXCJCQkJCQkJCQkJCQkJcIikiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJiN2YxNTA5OC1kNTQwLTRjMjQtODNiYy03M2Y4YjgxNjg4YzciLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIE9wZXJhdGlvbiIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImE1Zjg1ZGRkLTY1ZTgtNGQwNC05NjkyLWU1MDcyNGYzYTY5NyIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMjIFN0ZXAgMS4gRWNobyBKU09OIgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiZTc3NGU3Y2EiLAogICAibWV0YWRhdGEiOiB7CiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAiYXdhaXQgJGBlY2hvICd7XCJhXCI6IDF9J2AuanNvbigpOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImM5N2EzMjFlLWRiZTctNGVkYS05MjliLTg3ZmM2YWEyOTA1MiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMjIFN0ZXAgMiBHZXQgR2l0IExvZyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogIjZlZWQ2ZTQ2IiwKICAgIm1ldGFkYXRhIjogewogICAgInRhZ3MiOiBbXQogICB9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgImF3YWl0ICRgZ2l0IGxvZ2AudGV4dCgpOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImVjYTMwZGUwLWJhNjUtNDNjNi1iMjIwLWNhYjBkYWUzNjNmZiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMgUm9sbGJhY2siCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJmY2UwODQwNC00ZWIxLTQ1ZDMtOGY5Yy0yZTU2MDE2NjI5NjIiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIENsZWFudXAiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIzNmNmZTQ2Mi1lNDI0LTQ1OWItOTU3YS0wZTA2ZDIzMWM5MjgiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIEFjdGlvbiBJdGVtcyAvIExlYXJuaW5ncyIKICAgXQogIH0KIF0sCiAibWV0YWRhdGEiOiB7CiAgImtlcm5lbHNwZWMiOiB7CiAgICJkaXNwbGF5X25hbWUiOiAiRGVubyIsCiAgICJsYW5ndWFnZSI6ICJ0eXBlc2NyaXB0IiwKICAgIm5hbWUiOiAiZGVubyIKICB9LAogICJsYW5ndWFnZV9pbmZvIjogewogICAiZmlsZV9leHRlbnNpb24iOiAiLnRzIiwKICAgIm1pbWV0eXBlIjogInRleHQveC50eXBlc2NyaXB0IiwKICAgIm5hbWUiOiAidHlwZXNjcmlwdCIsCiAgICJuYl9jb252ZXJ0ZXIiOiAic2NyaXB0IiwKICAgInB5Z21lbnRzX2xleGVyIjogInR5cGVzY3JpcHQiLAogICAidmVyc2lvbiI6ICI1LjQuNSIKICB9LAogICJ3aWRnZXRzIjogewogICAiYXBwbGljYXRpb24vdm5kLmp1cHl0ZXIud2lkZ2V0LXN0YXRlK2pzb24iOiB7CiAgICAic3RhdGUiOiB7fSwKICAgICJ2ZXJzaW9uX21ham9yIjogMiwKICAgICJ2ZXJzaW9uX21pbm9yIjogMAogICB9CiAgfQogfSwKICJuYmZvcm1hdCI6IDQsCiAibmJmb3JtYXRfbWlub3IiOiA1Cn0K
18-
""".strip()
19-
# DENO_TEMPLATE_START
8+
9+
def read_embedded_file(package: str, filename: str) -> str:
10+
"""
11+
Reads an embedded file from a given package using the appropriate method
12+
based on the Python version.
13+
14+
:param package: The package name where the file is located (e.g., "mypackage.data").
15+
:param filename: The name of the file inside the package (e.g., "myfile.txt").
16+
:return: The contents of the file as a string.
17+
"""
18+
if sys.version_info >= (3, 7):
19+
# Use importlib.resources (Python 3.7+)
20+
with importlib_resources.files(package).joinpath(filename).open(
21+
"r", encoding="utf-8"
22+
) as f:
23+
return f.read()
24+
else:
25+
# Use pkgutil.get_data() for older versions
26+
data = pkgutil.get_data(package, filename)
27+
return data.decode("utf-8") if data else None
28+
29+
30+
TEMPLATES = {
31+
"python": read_embedded_file("runbook.data", "_template-python.ipynb").strip(),
32+
"deno": read_embedded_file("runbook.data", "_template-deno.ipynb").strip(),
33+
}

runbook/template_builder.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

tests/__snapshots__/cli_test.ts.snap

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,19 @@ snapshot[`convert 2`] = `
4040
// + [markdown] editable=true slideshow={\\"slide_type\\": \\"\\"}
4141
// ## Setup
4242
43-
// + tags=[\\"parameters\\"]
43+
// + editable=true slideshow={\\"slide_type\\": \\"\\"} tags=[\\"parameters\\"]
4444
// Default Params
4545
let server: string = \\"main.xargs.io\\";
4646
let arg: number = 1;
4747
let anArray: string[] = [\\"a\\", \\"b\\"]; // normally a / b
4848
let __RUNBOOK_METADATA__ = {};
49-
// -
5049
50+
// + editable=true slideshow={\\"slide_type\\": \\"\\"}
5151
import { \$, sh } from \\"https://raw.githubusercontent.com/zph/runbook/main/ext/deno/runbook/mod.ts\\";
5252
53+
// + editable=true slideshow={\\"slide_type\\": \\"\\"}
5354
await sh(\\"git log\\");
55+
// -
5456
5557
prompt(\\"AAAAAAAAAAAA\\")
5658
@@ -64,14 +66,14 @@ console.log(\\"BBBBBBBBBBBB\\")
6466
6567
// + [markdown] editable=true slideshow={\\"slide_type\\": \\"\\"}
6668
// ### Step 1. Echo JSON
67-
// -
6869
70+
// + editable=true slideshow={\\"slide_type\\": \\"\\"}
6971
await \$\`echo '{\\"a\\": 1}'\`.json();
7072
7173
// + [markdown] editable=true slideshow={\\"slide_type\\": \\"\\"}
7274
// ### Step 2 Get Git Log
73-
// -
7475
76+
// + editable=true slideshow={\\"slide_type\\": \\"\\"}
7577
await \$\`git log\`.text();
7678
7779
// + [markdown] editable=true slideshow={\\"slide_type\\": \\"\\"}

0 commit comments

Comments
 (0)