Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ repos:
hooks:
- id: jupytext
args: [--pipe, black]
exclude: runbooks/binder/_template-deno.ipynb|.*\.md|tests/.*
exclude: runbook/data/_template-deno.ipynb|.*\.md|tests/.*
additional_dependencies:
- black==23.3.0 # Matches hook

Expand Down
18 changes: 1 addition & 17 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ open NOTEBOOK:
uv run runbook edit {{NOTEBOOK}}

clear-binder-output:
jupyter nbconvert --clear-output --inplace ./runbooks/binder/*.ipynb
jupyter nbconvert --clear-output --inplace ./runbook/data/*.ipynb

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

template-update:
#!/usr/bin/env bash

set -eou pipefail

readonly UPDATED_AT="$(date -Iseconds)"
export UPDATED_AT
# Base 64 to avoid corruption during parsing/exporting
readonly TEMPLATE_DENO="$(uv run jupyter nbconvert --log-level='ERROR' runbooks/binder/_template-deno.ipynb --stdout --clear-output --ClearMetadataPreprocessor.enabled=True \
--ClearMetadataPreprocessor.preserve_cell_metadata_mask='[("tags")]' "--ClearMetadataPreprocessor.clear_notebook_metadata=False" | grep -E -v "^poetry-version-plugin" | base64)"
export TEMPLATE_DENO
readonly TEMPLATE_PYTHON="$(uv run jupyter nbconvert --log-level='ERROR' runbooks/binder/_template-python.ipynb --stdout --clear-output --ClearMetadataPreprocessor.enabled=True \
--ClearMetadataPreprocessor.preserve_cell_metadata_mask='[("tags")]' "--ClearMetadataPreprocessor.clear_notebook_metadata=False" | grep -E -v "^poetry-version-plugin" | base64)"
export TEMPLATE_PYTHON
envsubst < runbook/template_builder.py | tee runbook/template.py

readme:
.config/templating.sh

Expand Down
2 changes: 1 addition & 1 deletion deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion docs/NOTES.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Roadmap and Notes

## Triage
- [x] Use better way to embed files in the runbook package (ie templates)
- [x] Read `runbook plan ...` support reading params from file
- [ ] If no argument included for RUNBOOK TITLE in edit/plan/run then prompt with options
- [x] If no argument included for RUNBOOK TITLE in edit/plan/run then prompt with options
- [x] Include field 'embeds' in the metadata to help with referencing them
- [ ] --- Add helper for referencing the embeds?
- [ ] Use execute and upload output to S3 for non-interactive: https://github.com/nteract/papermill/tree/main?tab=readme-ov-file#execute-via-cli
Expand Down
9 changes: 2 additions & 7 deletions runbook/cli/commands/init.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import base64
import json
from pathlib import Path

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

with open(f"./{directory}/binder/_template-deno.ipynb", "w") as f:
fmt = "deno"
js = base64.b64decode(TEMPLATES[fmt]).decode("utf-8")
f.write(js)
f.write(TEMPLATES["deno"])
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": null,
"id": "9ae59b65",
"metadata": {
"execution": {
Expand All @@ -98,32 +98,14 @@
"shell.execute_reply": "2024-07-04T22:11:09.435918Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AAAAAAAAAAAA yes\n"
]
},
{
"data": {
"text/plain": [
"\u001b[32m\"yes\"\u001b[39m"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"prompt(\"AAAAAAAAAAAA\")"
]
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": null,
"id": "02a9b324",
"metadata": {
"execution": {
Expand All @@ -133,15 +115,7 @@
"shell.execute_reply": "2024-07-04T22:11:16.536815Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BBBBBBBBBBBB\n"
]
}
],
"outputs": [],
"source": [
"console.log(\"AAAAAAAAAA\")\n",
"\n",
Expand Down
48 changes: 31 additions & 17 deletions runbook/template.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
TEMPLATES = {}
import sys

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

# DENO_TEMPLATE_START
# 2025-01-20T16:15:23-08:00
TEMPLATES[
"deno"
] = """
ewogImNlbGxzIjogWwogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICI2ZmY4MDczNC04OTA2LTRmODUtOWFhYi02Y2VhY2U3YmE0MjUiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMgVElUTEVcbiIsCiAgICAiXG4iLAogICAgIiMjIERFU0NSSVBUSU9OXG4iLAogICAgIlxuIiwKICAgICJEZXNjcmlwdGlvbiBjb250aW51ZXMgaW4gbmFycmF0aXZlIGZvcm0iCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIwNWIzZTg4MC04NjAxLTQxMDctOTg5NS1kNzkyYmExZGNkMzAiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIFNldHVwIgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiMTE3MzA3ZTQtZTY2Zi00MDQ0LWI3ZTctOTE0ZGMwMjkyODIxIiwKICAgIm1ldGFkYXRhIjogewogICAgInRhZ3MiOiBbCiAgICAgInBhcmFtZXRlcnMiCiAgICBdCiAgIH0sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAiLy8gRGVmYXVsdCBQYXJhbXNcbiIsCiAgICAibGV0IHNlcnZlcjogc3RyaW5nID0gXCJtYWluLnhhcmdzLmlvXCI7XG4iLAogICAgImxldCBhcmc6IG51bWJlciA9IDE7XG4iLAogICAgImxldCBhbkFycmF5OiBzdHJpbmdbXSA9IFtcImFcIiwgXCJiXCJdOyAvLyBub3JtYWxseSBhIC8gYlxuIiwKICAgICJsZXQgX19SVU5CT09LX01FVEFEQVRBX18gPSB7fTsiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICI0YjMwNThkYSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJpbXBvcnQgeyAkLCBzaCB9IGZyb20gXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20venBoL3J1bmJvb2svbWFpbi9leHQvZGVuby9ydW5ib29rL21vZC50c1wiOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogImIyN2RlZjU2LTAyMTktNDM4OS04MmM3LTQ0Yzc3YmFiNmIxOSIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJ0YWdzIjogW10KICAgfSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJhd2FpdCBzaChcImdpdCBsb2dcIik7IgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiOWFlNTliNjUiLAogICAibWV0YWRhdGEiOiB7fSwKICAgIm91dHB1dHMiOiBbXSwKICAgInNvdXJjZSI6IFsKICAgICJwcm9tcHQoXCJBQUFBQUFBQUFBQUFcIikiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJjb2RlIiwKICAgImV4ZWN1dGlvbl9jb3VudCI6IG51bGwsCiAgICJpZCI6ICIwMmE5YjMyNCIsCiAgICJtZXRhZGF0YSI6IHt9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgImNvbnNvbGUubG9nKFwiQUFBQUFBQUFBQVwiKVxuIiwKICAgICJcbiIsCiAgICAiY29uc29sZS5sb2coXCJCQkJCQkJCQkJCQkJcIikiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJiN2YxNTA5OC1kNTQwLTRjMjQtODNiYy03M2Y4YjgxNjg4YzciLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIE9wZXJhdGlvbiIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImE1Zjg1ZGRkLTY1ZTgtNGQwNC05NjkyLWU1MDcyNGYzYTY5NyIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMjIFN0ZXAgMS4gRWNobyBKU09OIgogICBdCiAgfSwKICB7CiAgICJjZWxsX3R5cGUiOiAiY29kZSIsCiAgICJleGVjdXRpb25fY291bnQiOiBudWxsLAogICAiaWQiOiAiZTc3NGU3Y2EiLAogICAibWV0YWRhdGEiOiB7CiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJvdXRwdXRzIjogW10sCiAgICJzb3VyY2UiOiBbCiAgICAiYXdhaXQgJGBlY2hvICd7XCJhXCI6IDF9J2AuanNvbigpOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImM5N2EzMjFlLWRiZTctNGVkYS05MjliLTg3ZmM2YWEyOTA1MiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMjIFN0ZXAgMiBHZXQgR2l0IExvZyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogImNvZGUiLAogICAiZXhlY3V0aW9uX2NvdW50IjogbnVsbCwKICAgImlkIjogIjZlZWQ2ZTQ2IiwKICAgIm1ldGFkYXRhIjogewogICAgInRhZ3MiOiBbXQogICB9LAogICAib3V0cHV0cyI6IFtdLAogICAic291cmNlIjogWwogICAgImF3YWl0ICRgZ2l0IGxvZ2AudGV4dCgpOyIKICAgXQogIH0sCiAgewogICAiY2VsbF90eXBlIjogIm1hcmtkb3duIiwKICAgImlkIjogImVjYTMwZGUwLWJhNjUtNDNjNi1iMjIwLWNhYjBkYWUzNjNmZiIsCiAgICJtZXRhZGF0YSI6IHsKICAgICJlZGl0YWJsZSI6IHRydWUsCiAgICAic2xpZGVzaG93IjogewogICAgICJzbGlkZV90eXBlIjogIiIKICAgIH0sCiAgICAidGFncyI6IFtdCiAgIH0sCiAgICJzb3VyY2UiOiBbCiAgICAiIyMgUm9sbGJhY2siCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICJmY2UwODQwNC00ZWIxLTQ1ZDMtOGY5Yy0yZTU2MDE2NjI5NjIiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIENsZWFudXAiCiAgIF0KICB9LAogIHsKICAgImNlbGxfdHlwZSI6ICJtYXJrZG93biIsCiAgICJpZCI6ICIzNmNmZTQ2Mi1lNDI0LTQ1OWItOTU3YS0wZTA2ZDIzMWM5MjgiLAogICAibWV0YWRhdGEiOiB7CiAgICAiZWRpdGFibGUiOiB0cnVlLAogICAgInNsaWRlc2hvdyI6IHsKICAgICAic2xpZGVfdHlwZSI6ICIiCiAgICB9LAogICAgInRhZ3MiOiBbXQogICB9LAogICAic291cmNlIjogWwogICAgIiMjIEFjdGlvbiBJdGVtcyAvIExlYXJuaW5ncyIKICAgXQogIH0KIF0sCiAibWV0YWRhdGEiOiB7CiAgImtlcm5lbHNwZWMiOiB7CiAgICJkaXNwbGF5X25hbWUiOiAiRGVubyIsCiAgICJsYW5ndWFnZSI6ICJ0eXBlc2NyaXB0IiwKICAgIm5hbWUiOiAiZGVubyIKICB9LAogICJsYW5ndWFnZV9pbmZvIjogewogICAiZmlsZV9leHRlbnNpb24iOiAiLnRzIiwKICAgIm1pbWV0eXBlIjogInRleHQveC50eXBlc2NyaXB0IiwKICAgIm5hbWUiOiAidHlwZXNjcmlwdCIsCiAgICJuYl9jb252ZXJ0ZXIiOiAic2NyaXB0IiwKICAgInB5Z21lbnRzX2xleGVyIjogInR5cGVzY3JpcHQiLAogICAidmVyc2lvbiI6ICI1LjQuNSIKICB9LAogICJ3aWRnZXRzIjogewogICAiYXBwbGljYXRpb24vdm5kLmp1cHl0ZXIud2lkZ2V0LXN0YXRlK2pzb24iOiB7CiAgICAic3RhdGUiOiB7fSwKICAgICJ2ZXJzaW9uX21ham9yIjogMiwKICAgICJ2ZXJzaW9uX21pbm9yIjogMAogICB9CiAgfQogfSwKICJuYmZvcm1hdCI6IDQsCiAibmJmb3JtYXRfbWlub3IiOiA1Cn0K
""".strip()
# DENO_TEMPLATE_START

def read_embedded_file(package: str, filename: str) -> str:
"""
Reads an embedded file from a given package using the appropriate method
based on the Python version.

:param package: The package name where the file is located (e.g., "mypackage.data").
:param filename: The name of the file inside the package (e.g., "myfile.txt").
:return: The contents of the file as a string.
"""
if sys.version_info >= (3, 7):
# Use importlib.resources (Python 3.7+)
with importlib_resources.files(package).joinpath(filename).open(
"r", encoding="utf-8"
) as f:
return f.read()
else:
# Use pkgutil.get_data() for older versions
data = pkgutil.get_data(package, filename)
return data.decode("utf-8") if data else None


TEMPLATES = {
"python": read_embedded_file("runbook.data", "_template-python.ipynb").strip(),
"deno": read_embedded_file("runbook.data", "_template-deno.ipynb").strip(),
}
19 changes: 0 additions & 19 deletions runbook/template_builder.py

This file was deleted.

Loading