forked from retoor/devplacepy
feat: add plug-and-play devRant API client examples with Python and JavaScript
Add complete set of example scripts for the devRant REST protocol under examples/devrant/, including reusable client libraries, a rant poster, a live feed watcher with keyword-based auto-upvote, and an end-to-end smoke test that exercises every endpoint. Both Python (stdlib-only) and JavaScript (Node 18+ global fetch) implementations are provided.
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import sys
|
||||
import xmlrpc.client
|
||||
from pathlib import Path
|
||||
|
||||
from client import DevPlace
|
||||
|
||||
URL = os.environ.get("DEVPLACE_URL", "https://devplace.net")
|
||||
API_KEY = os.environ.get("DEVPLACE_API_KEY", "YOUR_API_KEY")
|
||||
SOURCE = Path(os.environ.get("DEVPLACE_SOURCE") or (sys.argv[1] if len(sys.argv) > 1 else "."))
|
||||
TITLE = os.environ.get("DEVPLACE_PROJECT_TITLE") or (sys.argv[2] if len(sys.argv) > 2 else SOURCE.resolve().name)
|
||||
|
||||
SKIP_DIRS = {".git", "__pycache__", "node_modules", ".venv", "venv"}
|
||||
MAX_BYTES = 512 * 1024
|
||||
|
||||
|
||||
def text_files(root: Path):
|
||||
for path in sorted(root.rglob("*")):
|
||||
if not path.is_file():
|
||||
continue
|
||||
if any(part in SKIP_DIRS for part in path.relative_to(root).parts):
|
||||
continue
|
||||
if path.stat().st_size > MAX_BYTES:
|
||||
print("skip (too big):", path)
|
||||
continue
|
||||
try:
|
||||
content = path.read_text(encoding="utf-8")
|
||||
except UnicodeDecodeError:
|
||||
print("skip (binary):", path)
|
||||
continue
|
||||
yield path.relative_to(root).as_posix(), content
|
||||
|
||||
|
||||
def main() -> None:
|
||||
dp = DevPlace(URL, api_key=API_KEY)
|
||||
created = dp.call(
|
||||
"projects.create",
|
||||
title=TITLE,
|
||||
description=f"Deployed from {SOURCE} via the XML-RPC bridge.",
|
||||
project_type="software",
|
||||
)
|
||||
slug = created["data"]["slug"]
|
||||
print("created project:", slug)
|
||||
count = 0
|
||||
for rel_path, content in text_files(SOURCE):
|
||||
try:
|
||||
dp.call("project.files.write", project_slug=slug, path=rel_path, content=content)
|
||||
count += 1
|
||||
print("wrote", rel_path)
|
||||
except xmlrpc.client.Fault as fault:
|
||||
print("failed", rel_path, "-", fault.faultCode, fault.faultString)
|
||||
print(f"deployed {count} files to {URL}/projects/{slug}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user