Skip to content

Commit 21fe43b

Browse files
committed
Update Reach lockfile
1 parent 5954616 commit 21fe43b

4 files changed

Lines changed: 108 additions & 122 deletions

File tree

packages/bridge/lib/pi/eval.ex

Lines changed: 32 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,10 @@ defmodule Pi.Eval do
33

44
alias Pi.Bridge.Info
55
alias Pi.Eval.{Evaluator, ExceptionInfo, Sandbox, Supervisor}
6+
alias Pi.Eval.Output, as: EvalOutput
67
alias Pi.Output
78
alias Pi.Protocol.Tool.Eval, as: EvalPayload
89
alias Pi.Protocol.Tool.OutputPart
9-
alias Pi.Protocol.UI.Block
10-
alias Pi.Protocol.UI.Display
11-
12-
@inspect_opts [charlists: :as_lists, limit: 50, pretty: true]
13-
@preview_inspect_opts [
14-
charlists: :as_lists,
15-
limit: 20,
16-
pretty: false,
17-
printable_limit: 200,
18-
width: 1_000_000
19-
]
2010

2111
def sandbox(code, opts \\ []) when is_binary(code), do: Sandbox.eval(code, opts)
2212

@@ -138,7 +128,7 @@ defmodule Pi.Eval do
138128

139129
defp eval_with_captured_io(code, mode) do
140130
{{success?, result}, io} =
141-
capture_io(fn ->
131+
EvalOutput.capture_io(fn ->
142132
try do
143133
{result, _bindings} = Code.eval_string(code, [arguments: []], env())
144134
{true, result}
@@ -159,39 +149,50 @@ defmodule Pi.Eval do
159149
end
160150
end
161151

162-
defp error_text(%{text: text}) when is_binary(text), do: text
163-
defp error_text(text) when is_binary(text), do: text
164-
165-
defp error_exception(%{exception: exception}) when is_map(exception), do: exception
166-
defp error_exception(_), do: nil
167-
168152
defp format_eval_result(result, success?, io) do
169153
case {result, success?, io} do
170-
{:"do not show this result in output", true, io} -> {:ok, io}
171-
{result, false, ""} -> {:error, error_text(result)}
172-
{result, false, io} -> {:error, "IO:\n\n#{io}\n\nError:\n\n#{error_text(result)}"}
173-
{result, true, ""} -> {:ok, inspect(result, @inspect_opts)}
174-
{result, true, io} -> {:ok, "IO:\n\n#{io}\n\nResult:\n\n#{inspect(result, @inspect_opts)}"}
154+
{:"do not show this result in output", true, io} ->
155+
{:ok, io}
156+
157+
{result, false, ""} ->
158+
{:error, EvalOutput.error_text(result)}
159+
160+
{result, false, io} ->
161+
{:error, "IO:\n\n#{io}\n\nError:\n\n#{EvalOutput.error_text(result)}"}
162+
163+
{result, true, ""} ->
164+
{:ok, EvalOutput.inspect_value(result)}
165+
166+
{result, true, io} ->
167+
{:ok, "IO:\n\n#{io}\n\nResult:\n\n#{EvalOutput.inspect_value(result)}"}
175168
end
176169
end
177170

178171
defp structured_eval_result(:"do not show this result in output", true, io, {:ok, text}) do
179172
parts = if io == "", do: [], else: [OutputPart.text(io)]
180-
{:ok, %EvalPayload{io: io, result: nil, text: text, parts: parts, display: display(parts)}}
173+
174+
{:ok,
175+
%EvalPayload{
176+
io: io,
177+
result: nil,
178+
text: text,
179+
parts: parts,
180+
display: EvalOutput.display(parts)
181+
}}
181182
end
182183

183184
defp structured_eval_result(result, true, io, {:ok, text}) do
184185
explicit_text = Output.text_for(result)
185-
inspected = explicit_text || inspect(result, @inspect_opts)
186-
preview = inspect(result, @preview_inspect_opts)
186+
inspected = explicit_text || EvalOutput.inspect_value(result)
187+
preview = EvalOutput.preview(result)
187188

188189
value_parts =
189190
Output.parts_for(result) ||
190191
[OutputPart.inspect(inspected, language: :elixir, title: preview)]
191192

192193
parts =
193194
[]
194-
|> maybe_io_part(io)
195+
|> EvalOutput.maybe_io_part(io)
195196
|> Kernel.++(value_parts)
196197

197198
{:ok,
@@ -200,41 +201,27 @@ defmodule Pi.Eval do
200201
result: inspected,
201202
text: explicit_text || text,
202203
parts: parts,
203-
display: display(parts)
204+
display: EvalOutput.display(parts)
204205
}}
205206
end
206207

207208
defp structured_eval_result(result, false, io, {:error, text}) do
208209
parts =
209210
[]
210-
|> maybe_io_part(io)
211+
|> EvalOutput.maybe_io_part(io)
211212
|> Kernel.++([OutputPart.error(text)])
212213

213214
{:error,
214215
%EvalPayload{
215216
io: io,
216217
error: text,
217-
exception: error_exception(result),
218+
exception: EvalOutput.error_exception(result),
218219
text: text,
219220
parts: parts,
220-
display: display(parts)
221+
display: EvalOutput.display(parts)
221222
}}
222223
end
223224

224-
defp maybe_io_part(parts, ""), do: parts
225-
defp maybe_io_part(parts, io), do: parts ++ [OutputPart.text(io)]
226-
227-
defp display(parts) do
228-
%Display{blocks: Enum.map(parts, &part_block/1)}
229-
end
230-
231-
defp part_block(%OutputPart{kind: kind, body: body, language: language}) do
232-
%Block{type: block_type(kind), text: body, language: language}
233-
end
234-
235-
defp block_type(:code), do: :source
236-
defp block_type(kind), do: kind
237-
238225
defp normalize_names!(name) when is_atom(name), do: [name]
239226

240227
defp normalize_names!(name) when is_binary(name), do: [String.to_existing_atom(name)]
@@ -251,24 +238,6 @@ defmodule Pi.Eval do
251238
__ENV__
252239
end
253240

254-
defp capture_io(fun) do
255-
{:ok, pid} = StringIO.open("")
256-
original = Application.get_env(:elixir, :ansi_enabled)
257-
Application.put_env(:elixir, :ansi_enabled, false)
258-
original_gl = Process.group_leader()
259-
Process.group_leader(self(), pid)
260-
261-
try do
262-
result = fun.()
263-
{_, content} = StringIO.contents(pid)
264-
{result, content}
265-
after
266-
Process.group_leader(self(), original_gl)
267-
StringIO.close(pid)
268-
Application.put_env(:elixir, :ansi_enabled, original)
269-
end
270-
end
271-
272241
defp endpoints do
273242
for {app, _, _} <- Application.started_applications(),
274243
mod <- (Application.get_env(app, :phoenix_endpoint) || []) |> List.wrap() do

packages/bridge/lib/pi/eval/evaluator.ex

Lines changed: 19 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,11 @@ defmodule Pi.Eval.Evaluator do
55

66
alias Pi.Bridge.Info
77
alias Pi.Eval.{ExceptionInfo, Snapshot}
8+
alias Pi.Eval.Output, as: EvalOutput
89
alias Pi.Output
910
alias Pi.Protocol.Tool.Eval, as: EvalPayload
1011
alias Pi.Protocol.Tool.OutputPart
11-
alias Pi.Protocol.UI.Block
12-
alias Pi.Protocol.UI.Display
13-
14-
@inspect_opts [charlists: :as_lists, limit: 50, pretty: true]
15-
@preview_inspect_opts [
16-
charlists: :as_lists,
17-
limit: 20,
18-
pretty: false,
19-
printable_limit: 200,
20-
width: 1_000_000
21-
]
12+
2213
@control_key {Pi.Eval, :control}
2314
@binding_info_key {Pi.Eval, :binding_info}
2415
@session_id_key {Pi.Eval, :session_id}
@@ -111,7 +102,7 @@ defmodule Pi.Eval.Evaluator do
111102
end
112103

113104
defp eval_with_captured_io(code, state) do
114-
{{success?, result, state}, io} = capture_io(fn -> eval_code(code, state) end)
105+
{{success?, result, state}, io} = EvalOutput.capture_io(fn -> eval_code(code, state) end)
115106

116107
cond do
117108
success? ->
@@ -120,11 +111,17 @@ defmodule Pi.Eval.Evaluator do
120111
{{:ok, structured_result(result, io, state, persist_meta)}, state}
121112

122113
io != "" ->
123-
text = "IO:\n\n#{io}\n\nError:\n\n#{error_text(result)}"
124-
{{:error, error_result(text, io, state, error_exception(result))}, state}
114+
text = "IO:\n\n#{io}\n\nError:\n\n#{EvalOutput.error_text(result)}"
115+
{{:error, error_result(text, io, state, EvalOutput.error_exception(result))}, state}
125116

126117
true ->
127-
{{:error, error_result(error_text(result), io, state, error_exception(result))}, state}
118+
{{:error,
119+
error_result(
120+
EvalOutput.error_text(result),
121+
io,
122+
state,
123+
EvalOutput.error_exception(result)
124+
)}, state}
128125
end
129126
end
130127

@@ -167,24 +164,24 @@ defmodule Pi.Eval.Evaluator do
167164
result: nil,
168165
text: io,
169166
parts: parts,
170-
display: display(parts),
167+
display: EvalOutput.display(parts),
171168
bindings: Snapshot.binding_info(state.binding),
172169
state: eval_state_meta(state, persist_meta)
173170
}
174171
end
175172

176173
defp structured_result(result, io, state, persist_meta) do
177174
explicit_text = Output.text_for(result)
178-
inspected = explicit_text || inspect(result, @inspect_opts)
179-
preview = inspect(result, @preview_inspect_opts)
175+
inspected = explicit_text || EvalOutput.inspect_value(result)
176+
preview = EvalOutput.preview(result)
180177

181178
value_parts =
182179
Output.parts_for(result) ||
183180
[OutputPart.inspect(inspected, language: :elixir, title: preview)]
184181

185182
parts =
186183
[]
187-
|> maybe_io_part(io)
184+
|> EvalOutput.maybe_io_part(io)
188185
|> Kernel.++(value_parts)
189186

190187
text =
@@ -196,44 +193,27 @@ defmodule Pi.Eval.Evaluator do
196193
result: inspected,
197194
text: text,
198195
parts: parts,
199-
display: display(parts),
196+
display: EvalOutput.display(parts),
200197
bindings: Snapshot.binding_info(state.binding),
201198
state: eval_state_meta(state, persist_meta)
202199
}
203200
end
204201

205-
defp error_text(%{text: text}) when is_binary(text), do: text
206-
defp error_text(text) when is_binary(text), do: text
207-
208-
defp error_exception(%{exception: exception}) when is_map(exception), do: exception
209-
defp error_exception(_), do: nil
210-
211202
defp error_result(text, io, state, exception) do
212-
parts = [] |> maybe_io_part(io) |> Kernel.++([OutputPart.error(text)])
203+
parts = [] |> EvalOutput.maybe_io_part(io) |> Kernel.++([OutputPart.error(text)])
213204

214205
%EvalPayload{
215206
io: io,
216207
error: text,
217208
exception: exception,
218209
text: text,
219210
parts: parts,
220-
display: display(parts),
211+
display: EvalOutput.display(parts),
221212
bindings: Snapshot.binding_info(state.binding),
222213
state: eval_state_meta(state, %{persisted?: false})
223214
}
224215
end
225216

226-
defp maybe_io_part(parts, ""), do: parts
227-
defp maybe_io_part(parts, io), do: parts ++ [OutputPart.text(io)]
228-
defp display(parts), do: %Display{blocks: Enum.map(parts, &part_block/1)}
229-
230-
defp part_block(%OutputPart{} = part) do
231-
struct(Block, type: block_type(part.kind), text: part.body, language: part.language)
232-
end
233-
234-
defp block_type(:code), do: :source
235-
defp block_type(kind), do: kind
236-
237217
defp eval_state_meta(state, persist_meta) do
238218
%{
239219
sessionId: state.session_id,
@@ -312,24 +292,6 @@ defmodule Pi.Eval.Evaluator do
312292
end)
313293
end
314294

315-
defp capture_io(fun) do
316-
{:ok, pid} = StringIO.open("")
317-
original = Application.get_env(:elixir, :ansi_enabled)
318-
original_gl = Process.group_leader()
319-
Application.put_env(:elixir, :ansi_enabled, false)
320-
Process.group_leader(self(), pid)
321-
322-
try do
323-
result = fun.()
324-
{_, content} = StringIO.contents(pid)
325-
{result, content}
326-
after
327-
Process.group_leader(self(), original_gl)
328-
StringIO.close(pid)
329-
Application.put_env(:elixir, :ansi_enabled, original)
330-
end
331-
end
332-
333295
defp eval_file(session_id), do: "pi://eval/" <> session_id
334296
defp via(session_id), do: {:via, Registry, {Pi.Eval.Registry, session_id}}
335297

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
defmodule Pi.Eval.Output do
2+
@moduledoc false
3+
4+
alias Pi.Protocol.Tool.OutputPart
5+
alias Pi.Protocol.UI.Block
6+
alias Pi.Protocol.UI.Display
7+
8+
@inspect_opts [charlists: :as_lists, limit: 50, pretty: true]
9+
@preview_inspect_opts [
10+
charlists: :as_lists,
11+
limit: 20,
12+
pretty: false,
13+
printable_limit: 200,
14+
width: 1_000_000
15+
]
16+
17+
def inspect_value(value), do: inspect(value, @inspect_opts)
18+
def preview(value), do: inspect(value, @preview_inspect_opts)
19+
20+
def error_text(%{text: text}) when is_binary(text), do: text
21+
def error_text(text) when is_binary(text), do: text
22+
23+
def error_exception(%{exception: exception}) when is_map(exception), do: exception
24+
def error_exception(_), do: nil
25+
26+
def maybe_io_part(parts, ""), do: parts
27+
def maybe_io_part(parts, io), do: parts ++ [OutputPart.text(io)]
28+
29+
def display(parts), do: %Display{blocks: Enum.map(parts, &part_block/1)}
30+
31+
def capture_io(fun) do
32+
{:ok, pid} = StringIO.open("")
33+
original = Application.get_env(:elixir, :ansi_enabled)
34+
original_gl = Process.group_leader()
35+
Application.put_env(:elixir, :ansi_enabled, false)
36+
Process.group_leader(self(), pid)
37+
38+
try do
39+
result = fun.()
40+
{_, content} = StringIO.contents(pid)
41+
{result, content}
42+
after
43+
Process.group_leader(self(), original_gl)
44+
StringIO.close(pid)
45+
Application.put_env(:elixir, :ansi_enabled, original)
46+
end
47+
end
48+
49+
defp part_block(%OutputPart{} = part) do
50+
struct(Block, type: block_type(part.kind), text: part.body, language: part.language)
51+
end
52+
53+
defp block_type(:code), do: :source
54+
defp block_type(kind), do: kind
55+
end

0 commit comments

Comments
 (0)