Files
curl-converter-cli/curlconverter/generators/ruby.py
7000pctAUTO 55d9312f51
Some checks failed
CI / test (push) Has been cancelled
Fix CI issues: add workflow file and fix lint errors
2026-03-22 10:53:57 +00:00

94 lines
3.0 KiB
Python

{"""Ruby code generator."""
import json
from curlconverter.parser import ParsedCurl
from curlconverter.generators import register_generator
def _detect_content_type(headers: dict, data: str) -> str:
"""Detect content type from headers or data."""
if "Content-Type" in headers:
return headers["Content-Type"]
if "content-type" in headers:
return headers["content-type"]
if data:
try:
json.loads(data)
return "application/json"
except (json.JSONDecodeError, TypeError):
pass
return "application/x-www-form-urlencoded"
@register_generator("ruby")
def generate_ruby(parsed: ParsedCurl) -> str:
"""Generate Ruby Net::HTTP code from parsed curl data."""
lines = []
lines.append("require 'net/http'")
lines.append("require 'uri'")
lines.append("require 'json'")
lines.append("")
lines.append(f"url = URI({repr(parsed.url)})")
lines.append("http = Net::HTTP.new(url.host, url.port)")
lines.append("")
headers = dict(parsed.headers) if parsed.headers else {}
if parsed.user_agent and "User-Agent" not in headers and "user-agent" not in headers:
headers["User-Agent"] = parsed.user_agent
method_map = {
"GET" => "Get",
"POST" => "Post",
"PUT" => "Put",
"DELETE" => "Delete",
"PATCH" => "Patch"
}
request_class = f"Net::HTTP::{method_map.get(parsed.method, parsed.method)}"
if parsed.data:
content_type = _detect_content_type(headers, parsed.data)
if content_type == "application/json":
try:
json_data = json.loads(parsed.data)
lines.append("data = " + json.dumps(json_data))
request_str = "Net::HTTP::Post.new(url, {'Content-Type' => 'application/json'})"
except (json.JSONDecodeError, TypeError):
lines.append("data = " + repr(parsed.data))
request_str = "Net::HTTP::Post.new(url)"
else:
lines.append("data = " + repr(parsed.data))
request_str = "Net::HTTP::Post.new(url)"
if "Content-Type" not in headers and "content-type" not in headers:
headers["Content-Type"] = content_type
else:
request_str = f"{request_class}.new(url)"
lines.append(f"request = {request_str}")
lines.append("")
if headers:
for k, v in headers.items():
lines.append(f'request["{k}"] = "{v}"')
lines.append("")
if parsed.auth:
lines.append(f'request.basic_auth "{parsed.auth[0]}", "{parsed.auth[1]}"')
lines.append("")
if parsed.cookies:
lines.append(f'request["Cookie"] = "{parsed.cookies}"')
lines.append("")
if parsed.data:
lines.append("request.body = data")
lines.append("")
lines.append("response = http.request(request)")
lines.append("puts response.code")
lines.append("puts response.body")
return "\n".join(lines)