Packages
phoenix
0.16.1
1.8.9
1.8.8
1.8.7
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.8.0-rc.4
1.8.0-rc.3
1.8.0-rc.2
1.8.0-rc.1
1.8.0-rc.0
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.7.0-rc.3
1.7.0-rc.2
1.7.0-rc.1
1.7.0-rc.0
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.15
1.5.14
1.5.13
1.5.12
1.5.11
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.0
1.4.18
1.4.17
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-rc.3
1.3.0-rc.2
1.3.0-rc.1
1.3.0-rc.0
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.1
1.2.0-rc.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.17.1
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Productive. Reliable. Fast. A productive web framework that does not compromise speed or maintainability.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/phoenix/code_reloader.ex
defmodule Phoenix.CodeReloader do
@moduledoc """
A plug and module to handle automatic code reloading.
For each request, Phoenix checks if any of the modules previously
compiled requires recompilation via `__phoenix_recompile__?/0` and then
calls `mix compile` for sources exclusive to the `web` directory.
To avoid race conditions, all code reloads are funneled through a
sequential call operation.
"""
## Server delegation
@doc """
Reloads code within the paths specified in the `:reloadable_paths`
config for the endpoint.
This is configured in your application environment like:
config :your_app, YourApp.Endpoint,
reloadable_paths: ["web"]
Keep in mind that the paths passed to :reloadable_paths must be
a subset of the paths specified in the :elixirc_paths option of
`project/0` in mix.exs.
"""
@spec reload!(module) :: :ok | :noop | {:error, binary()}
defdelegate reload!(endpoint), to: Phoenix.CodeReloader.Server
## Plug
@behaviour Plug
import Plug.Conn
@doc """
API used by Plug to start the code reloader.
"""
def init(opts), do: Keyword.put_new(opts, :reloader, &Phoenix.CodeReloader.reload!/1)
@doc """
API used by Plug to invoke the code reloader on every request.
"""
def call(conn, opts) do
case opts[:reloader].(conn.private.phoenix_endpoint) do
{:error, output} ->
conn
|> put_resp_content_type("text/html")
|> send_resp(500, template(conn, output))
|> halt()
_ ->
conn
end
end
defp template(conn, output) do
"""
<!DOCTYPE html>
<html>
<head>
<title>CompilationError at #{method(conn)} #{conn.request_path}</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
font-size: 10pt;
font-family: helvetica neue, lucida grande, sans-serif;
line-height: 1.5;
color: #333;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
}
html {
background: #f0f0f5;
}
header.exception {
padding: 18px 20px;
height: 59px;
min-height: 59px;
overflow: hidden;
background-color: #20202a;
color: #aaa;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3);
font-weight: 200;
box-shadow: inset 0 -5px 3px -3px rgba(0, 0, 0, 0.05), inset 0 -1px 0 rgba(0, 0, 0, 0.05);
-webkit-text-smoothing: antialiased;
}
header.exception h2 {
font-weight: 200;
font-size: 11pt;
padding-bottom: 2pt;
}
header.exception h2,
header.exception p {
line-height: 1.4em;
height: 1.4em;
overflow: hidden;
white-space: pre;
text-overflow: ellipsis;
}
header.exception h2 strong {
font-weight: 700;
color: #7E5ABE;
}
header.exception p {
font-weight: 200;
font-size: 18pt;
color: white;
}
pre, code {
font-family: menlo, lucida console, monospace;
font-size: 9pt;
}
.trace_info {
margin: 10px;
background: #fff;
padding: 6px;
border-radius: 3px;
margin-bottom: 2px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.03), 1px 1px 0 rgba(0, 0, 0, 0.05), -1px 1px 0 rgba(0, 0, 0, 0.05), 0 0 0 4px rgba(0, 0, 0, 0.04);
}
.code {
background: #fff;
box-shadow: inset 3px 3px 3px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);
margin-bottom: -1px;
padding: 10px;
overflow: auto;
}
.code::-webkit-scrollbar {
width: 10px;
height: 10px;
}
.code::-webkit-scrollbar-thumb {
background: #ccc;
border-radius: 5px;
}
.code:hover::-webkit-scrollbar-thumb {
background: #888;
}
</style>
</head>
<body>
<div class="top">
<header class="exception">
<h2><strong>CompilationError</strong> <span>at #{method(conn)} #{conn.request_path}</span></h2>
<p>Showing console output</p>
</header>
</div>
<header class="trace_info">
<div class="code">
<pre>#{String.strip(output)}</pre>
</div>
</header>
</body>
</html>
"""
end
defp method(%Plug.Conn{method: method}), do: method
end