92 lines
2.5 kB
1
defmodule BlogWeb.PythonLive.Index do
2
use BlogWeb, :live_view
3
alias Blog.PythonRunner
4
require Logger
5
6
@python_example """
7
import random
8
9
# Roll some dice
10
dice = [random.randint(1, 6) for _ in range(3)]
11
f"You rolled: {dice} (sum: {sum(dice)})"
12
"""
13
14
@impl true
15
def mount(_params, _session, socket) do
16
# Initialize the Python environment - now returns :ok instead of {:ok, _}
17
python_status = case PythonRunner.init() do
18
:ok -> :available
19
{:error, reason} -> {:unavailable, reason}
20
end
21
22
# Get the hello world result
23
24
{:ok, assign(socket,
25
code: @python_example,
26
result: "",
27
python_status: python_status
28
)}
29
end
30
31
@impl true
32
def handle_event("run-code", %{"code" => code}, socket) do
33
result = if socket.assigns.python_status == :available do
34
try do
35
PythonRunner.run_code(code)
36
rescue
37
e ->
38
Logger.error("Error executing Python code: #{inspect(e)}")
39
"Error: #{inspect(e)}"
40
end
41
else
42
"Python is unavailable"
43
end
44
45
Logger.info("Python code execution result: #{inspect(result)}")
46
{:noreply, assign(socket, result: result)}
47
end
48
49
@impl true
50
def render(assigns) do
51
~H"""
52
<div class="container mx-auto p-4">
53
<h1 class="text-2xl font-bold mb-4">Python Integration Demo</h1>
54
55
<div class="mb-6 p-4 rounded bg-gray-100">
56
<h2 class="text-xl font-semibold mb-2">Python Status</h2>
57
</div>
58
59
<div class="mb-6">
60
<h2 class="text-xl font-semibold mb-2">Try Python Code</h2>
61
<form phx-submit="run-code">
62
<div class="mb-4">
63
<textarea
64
name="code"
65
rows="10"
66
class="w-full p-2 border rounded font-mono"
67
placeholder="Enter Python code here"
68
disabled={@python_status != :available}
69
><%= @code %></textarea>
70
</div>
71
<button
72
type="submit"
73
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
74
disabled={@python_status != :available}
75
>
76
Run Code
77
</button>
78
</form>
79
</div>
80
81
<%= if @result != "" do %>
82
<div class="mt-4">
83
<h3 class="text-lg font-semibold mb-2">Result</h3>
84
<div class="p-4 bg-gray-100 rounded font-mono whitespace-pre-wrap">
85
<%= @result %>
86
</div>
87
</div>
88
<% end %>
89
</div>
90
"""
91
end
92
end
93