From f5bb8dea2ca906567dd5d5dbe82eaacab72d182e Mon Sep 17 00:00:00 2001 From: refaktor Date: Thu, 1 Jan 2026 21:42:00 +0100 Subject: [PATCH] added github api merge example --- evaldo/builtins_io.go | 4 +- evaldo/builtins_term.go | 1 + examples/github/merge-dependabots.py | 58 +++++++++++++++++++++++++++ examples/github/merge-dependabots.rye | 26 ++++++++++++ examples/makedirs.rye | 5 +++ 5 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 examples/github/merge-dependabots.py create mode 100644 examples/github/merge-dependabots.rye create mode 100644 examples/makedirs.rye diff --git a/evaldo/builtins_io.go b/evaldo/builtins_io.go index 2b094e00..7ffee6a0 100755 --- a/evaldo/builtins_io.go +++ b/evaldo/builtins_io.go @@ -1294,7 +1294,7 @@ var Builtins_io = map[string]*env.Builtin{ // Args: // * url: uri representing the HTTPS URL to request - // * method: word specifying the HTTP method (e.g., 'GET', 'POST') + // * method: word specifying the HTTP method (e.g., 'GET', 'POST', 'PUT', 'DELETE') // * data: string containing the request body // Returns: // * native https-request object @@ -1307,7 +1307,7 @@ var Builtins_io = map[string]*env.Builtin{ switch method := arg1.(type) { case env.Word: method1 := ps.Idx.GetWord(method.Index) - if !(method1 == "GET" || method1 == "POST") { + if !(method1 == "GET" || method1 == "POST" || method1 == "PUT" || method1 == "DELETE") { ps.FailureFlag = true return MakeBuiltinError(ps, "Wrong method.", "https-uri//Request") } diff --git a/evaldo/builtins_term.go b/evaldo/builtins_term.go index ae4fb36a..33599e2f 100644 --- a/evaldo/builtins_term.go +++ b/evaldo/builtins_term.go @@ -720,6 +720,7 @@ var Builtins_term = map[string]*env.Builtin{ // Wait for the spinner to finish <-spinnerDone + fmt.Println("") return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "spin-it") diff --git a/examples/github/merge-dependabots.py b/examples/github/merge-dependabots.py new file mode 100644 index 00000000..4de9826d --- /dev/null +++ b/examples/github/merge-dependabots.py @@ -0,0 +1,58 @@ +import time +import requests +from rich.console import Console + +# 1. Configuration +try: + with open(".apitoken", "r") as f: + TOK = f.read().strip() +except FileNotFoundError: + print("Error: .apitoken file not found.") + exit(1) + +BOT = "dependabot[bot]" +REPO = "refaktor/rye" +URL = "https://api.github.com/repos/" +HEADERS = { + "Authorization": f"Bearer {TOK}", + "Accept": "application/vnd.github+json" +} + +console = Console() + +def do_merge(num): + """Merges a specific PR number using the squash method.""" + merge_url = f"{URL}{REPO}/pulls/{num}/merge" + data = {"merge_method": "squash"} + response = requests.put(merge_url, headers=HEADERS, json=data) + return response.status_code + +def main(): + # 2. Fetch Open PRs + with console.status("[bold blue]Fetching pull requests...") as status: + response = requests.get(f"{URL}{REPO}/pulls?state=open", headers=HEADERS) + response.raise_for_status() + prs = response.json() + + # 3. Filter for the bot + bot_prs = [pr for pr in prs if pr["user"]["login"] == BOT] + console.print(f"[green]{len(bot_prs)} pull requests found.") + + # 4. Loop and Merge + for pr in bot_prs: + num = pr["number"] + + # Merge action with spinner + with console.status(f"[bold yellow]Merging #{num}...") as status: + status_code = do_merge(num) + if status_code == 200: + console.print(f"Successfully merged #{num} :white_check_mark:") + else: + console.print(f"Failed to merge #{num} (Status: {status_code}) :x:") + + # Sleep action with spinner + with console.status("[bold cyan]Sleeping for rebase...") as status: + time.sleep(60) + +if __name__ == "__main__": + main() diff --git a/examples/github/merge-dependabots.rye b/examples/github/merge-dependabots.rye new file mode 100644 index 00000000..8f0a5164 --- /dev/null +++ b/examples/github/merge-dependabots.rye @@ -0,0 +1,26 @@ +; # Script that merges all dependabot PR-s + +tok: trim Read %.apitoken +bot: "dependabot[bot]" +repo: "refaktor/rye" +url: https://api.github.com/repos/ + +set-headers: fn { req } { + .Header! 'Authorization join [ "Bearer " tok ] + |Header! 'Accept "application/vnd.github+json" +} + +do-merge: fn { num } { + Request ( url ++ repo ++ "/pulls/" ++ num ++ "/merge" ) 'PUT `{ "merge_method": "squash" }` + |set-headers |Call |Reader +} + +Request ( url ++ repo ++ "/pulls?state=open" ) 'GET "" +|set-headers +|Call .Reader .Read\string .parse-json +|filter { -> "user" -> "login" |= bot } +|pass { .length? .embed "{} pull requests found" |print } +|for { -> "number" ::num , + term/spin-it "Merging " ++ num { do-merge num } + term/spin-it "Sleeping for rebases to happen" { sleep 1 .minutes } +} diff --git a/examples/makedirs.rye b/examples/makedirs.rye new file mode 100644 index 00000000..b8a665e1 --- /dev/null +++ b/examples/makedirs.rye @@ -0,0 +1,5 @@ + + +a:: split "one/two/three" "/" +path:: "" +walk a { ::b ( "/" ++ first b ) .append! 'path , os/mkdir to-uri path , b .rest }