this repo has no description

Initial Phoenix scaffold

hauleth.dev 9a6efa6d

verified
+5
.formatter.exs
···
+
[
+
line_length: 80,
+
import_deps: [:phoenix],
+
inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}"]
+
]
+27
.gitignore
···
+
# The directory Mix will write compiled artifacts to.
+
/_build/
+
+
# If you run "mix test --cover", coverage assets end up here.
+
/cover/
+
+
# The directory Mix downloads your dependencies sources to.
+
/deps/
+
+
# Where 3rd-party dependencies like ExDoc output generated docs.
+
/doc/
+
+
# Ignore .fetch files in case you like to edit your project deps locally.
+
/.fetch
+
+
# If the VM crashes, it generates a dump, let's ignore it too.
+
erl_crash.dump
+
+
# Also ignore archive artifacts (built via "mix archive.build").
+
*.ez
+
+
# Temporary files, for example, from tests.
+
/tmp/
+
+
# Ignore package tarball (built via "mix hex.build").
+
esl_hn-*.tar
+
+18
README.md
···
+
# EslHn
+
+
To start your Phoenix server:
+
+
* Run `mix setup` to install and setup dependencies
+
* Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server`
+
+
Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.
+
+
Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html).
+
+
## Learn more
+
+
* Official website: https://www.phoenixframework.org/
+
* Guides: https://hexdocs.pm/phoenix/overview.html
+
* Docs: https://hexdocs.pm/phoenix
+
* Forum: https://elixirforum.com/c/phoenix-forum
+
* Source: https://github.com/phoenixframework/phoenix
+34
config/config.exs
···
+
# This file is responsible for configuring your application
+
# and its dependencies with the aid of the Config module.
+
#
+
# This configuration file is loaded before any dependency and
+
# is restricted to this project.
+
+
# General application configuration
+
import Config
+
+
config :esl_hn,
+
generators: [timestamp_type: :utc_datetime]
+
+
# Configures the endpoint
+
config :esl_hn, EslHnWeb.Endpoint,
+
url: [host: "localhost"],
+
adapter: Bandit.PhoenixAdapter,
+
render_errors: [
+
formats: [json: EslHnWeb.ErrorJSON],
+
layout: false
+
],
+
pubsub_server: EslHn.PubSub,
+
live_view: [signing_salt: "xzNLXpSZ"]
+
+
# Configures Elixir's Logger
+
config :logger, :console,
+
format: "$time $metadata[$level] $message\n",
+
metadata: [:request_id]
+
+
# Use Jason for JSON parsing in Phoenix
+
config :phoenix, :json_library, Jason
+
+
# Import environment specific config. This must remain at the bottom
+
# of this file so it overrides the configuration defined above.
+
import_config "#{config_env()}.exs"
+54
config/dev.exs
···
+
import Config
+
+
# For development, we disable any cache and enable
+
# debugging and code reloading.
+
#
+
# The watchers configuration can be used to run external
+
# watchers to your application. For example, we can use it
+
# to bundle .js and .css sources.
+
config :esl_hn, EslHnWeb.Endpoint,
+
# Binding to loopback ipv4 address prevents access from other machines.
+
# Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
+
http: [ip: {127, 0, 0, 1}, port: 4000],
+
check_origin: false,
+
code_reloader: true,
+
debug_errors: true,
+
secret_key_base:
+
"TQ20YLfpm8CWUZ0wvMVvXwKLjOdxb6//anr3iafpvW15LKlsoMez2OFUTifz0gxs",
+
watchers: []
+
+
# ## SSL Support
+
#
+
# In order to use HTTPS in development, a self-signed
+
# certificate can be generated by running the following
+
# Mix task:
+
#
+
# mix phx.gen.cert
+
#
+
# Run `mix help phx.gen.cert` for more information.
+
#
+
# The `http:` config above can be replaced with:
+
#
+
# https: [
+
# port: 4001,
+
# cipher_suite: :strong,
+
# keyfile: "priv/cert/selfsigned_key.pem",
+
# certfile: "priv/cert/selfsigned.pem"
+
# ],
+
#
+
# If desired, both `http:` and `https:` keys can be
+
# configured to run both http and https servers on
+
# different ports.
+
+
# Enable dev routes for dashboard and mailbox
+
config :esl_hn, dev_routes: true
+
+
# Do not include metadata nor timestamps in development logs
+
config :logger, :console, format: "[$level] $message\n"
+
+
# Set a higher stacktrace during development. Avoid configuring such
+
# in production as building large stacktraces may be expensive.
+
config :phoenix, :stacktrace_depth, 20
+
+
# Initialize plugs at runtime for faster development compilation
+
config :phoenix, :plug_init_mode, :runtime
+7
config/prod.exs
···
+
import Config
+
+
# Do not print debug messages in production
+
config :logger, level: :info
+
+
# Runtime production configuration, including reading
+
# of environment variables, is done on config/runtime.exs.
+84
config/runtime.exs
···
+
import Config
+
+
# config/runtime.exs is executed for all environments, including
+
# during releases. It is executed after compilation and before the
+
# system starts, so it is typically used to load production configuration
+
# and secrets from environment variables or elsewhere. Do not define
+
# any compile-time configuration in here, as it won't be applied.
+
# The block below contains prod specific runtime configuration.
+
+
# ## Using releases
+
#
+
# If you use `mix release`, you need to explicitly enable the server
+
# by passing the PHX_SERVER=true when you start it:
+
#
+
# PHX_SERVER=true bin/esl_hn start
+
#
+
# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
+
# script that automatically sets the env var above.
+
if System.get_env("PHX_SERVER") do
+
config :esl_hn, EslHnWeb.Endpoint, server: true
+
end
+
+
if config_env() == :prod do
+
# The secret key base is used to sign/encrypt cookies and other secrets.
+
# A default value is used in config/dev.exs and config/test.exs but you
+
# want to use a different value for prod and you most likely don't want
+
# to check this value into version control, so we use an environment
+
# variable instead.
+
secret_key_base =
+
System.get_env("SECRET_KEY_BASE") ||
+
raise """
+
environment variable SECRET_KEY_BASE is missing.
+
You can generate one by calling: mix phx.gen.secret
+
"""
+
+
host = System.get_env("PHX_HOST") || "example.com"
+
port = String.to_integer(System.get_env("PORT") || "4000")
+
+
config :esl_hn, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
+
+
config :esl_hn, EslHnWeb.Endpoint,
+
url: [host: host, port: 443, scheme: "https"],
+
http: [
+
# Enable IPv6 and bind on all interfaces.
+
# Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
+
# See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0
+
# for details about using IPv6 vs IPv4 and loopback vs public addresses.
+
ip: {0, 0, 0, 0, 0, 0, 0, 0},
+
port: port
+
],
+
secret_key_base: secret_key_base
+
+
# ## SSL Support
+
#
+
# To get SSL working, you will need to add the `https` key
+
# to your endpoint configuration:
+
#
+
# config :esl_hn, EslHnWeb.Endpoint,
+
# https: [
+
# ...,
+
# port: 443,
+
# cipher_suite: :strong,
+
# keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
+
# certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
+
# ]
+
#
+
# The `cipher_suite` is set to `:strong` to support only the
+
# latest and more secure SSL ciphers. This means old browsers
+
# and clients may not be supported. You can set it to
+
# `:compatible` for wider support.
+
#
+
# `:keyfile` and `:certfile` expect an absolute path to the key
+
# and cert in disk or a relative path inside priv, for example
+
# "priv/ssl/server.key". For all supported SSL configuration
+
# options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1
+
#
+
# We also recommend setting `force_ssl` in your config/prod.exs,
+
# ensuring no data is ever sent via http, always redirecting to https:
+
#
+
# config :esl_hn, EslHnWeb.Endpoint,
+
# force_ssl: [hsts: true]
+
#
+
# Check `Plug.SSL` for all available options in `force_ssl`.
+
end
+15
config/test.exs
···
+
import Config
+
+
# We don't run a server during test. If one is required,
+
# you can enable the server option below.
+
config :esl_hn, EslHnWeb.Endpoint,
+
http: [ip: {127, 0, 0, 1}, port: 4002],
+
secret_key_base:
+
"6iR9shI35kN7Xr5bOLgBVMHXTZQS49Gwu82WW4rsr0uhaia7D+NjfNrhhvcOp4rr",
+
server: false
+
+
# Print only warnings and errors during test
+
config :logger, level: :warning
+
+
# Initialize plugs at runtime for faster test compilation
+
config :phoenix, :plug_init_mode, :runtime
+9
lib/esl_hn.ex
···
+
defmodule EslHn do
+
@moduledoc """
+
EslHn keeps the contexts that define your domain
+
and business logic.
+
+
Contexts are also responsible for managing your data, regardless
+
if it comes from the database, an external API or others.
+
"""
+
end
+34
lib/esl_hn/application.ex
···
+
defmodule EslHn.Application do
+
# See https://hexdocs.pm/elixir/Application.html
+
# for more information on OTP Applications
+
@moduledoc false
+
+
use Application
+
+
@impl true
+
def start(_type, _args) do
+
children = [
+
EslHnWeb.Telemetry,
+
{DNSCluster,
+
query: Application.get_env(:esl_hn, :dns_cluster_query) || :ignore},
+
{Phoenix.PubSub, name: EslHn.PubSub},
+
# Start a worker by calling: EslHn.Worker.start_link(arg)
+
# {EslHn.Worker, arg},
+
# Start to serve requests, typically the last entry
+
EslHnWeb.Endpoint
+
]
+
+
# See https://hexdocs.pm/elixir/Supervisor.html
+
# for other strategies and supported options
+
opts = [strategy: :one_for_one, name: EslHn.Supervisor]
+
Supervisor.start_link(children, opts)
+
end
+
+
# Tell Phoenix to update the endpoint configuration
+
# whenever the application is updated.
+
@impl true
+
def config_change(changed, _new, removed) do
+
EslHnWeb.Endpoint.config_change(changed, removed)
+
:ok
+
end
+
end
+65
lib/esl_hn_web.ex
···
+
defmodule EslHnWeb do
+
@moduledoc """
+
The entrypoint for defining your web interface, such
+
as controllers, components, channels, and so on.
+
+
This can be used in your application as:
+
+
use EslHnWeb, :controller
+
use EslHnWeb, :html
+
+
The definitions below will be executed for every controller,
+
component, etc, so keep them short and clean, focused
+
on imports, uses and aliases.
+
+
Do NOT define functions inside the quoted expressions
+
below. Instead, define additional modules and import
+
those modules here.
+
"""
+
+
def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)
+
+
def router do
+
quote do
+
use Phoenix.Router, helpers: false
+
+
# Import common connection and controller functions to use in pipelines
+
import Plug.Conn
+
import Phoenix.Controller
+
end
+
end
+
+
def channel do
+
quote do
+
use Phoenix.Channel
+
end
+
end
+
+
def controller do
+
quote do
+
use Phoenix.Controller,
+
formats: [:html, :json],
+
layouts: [html: EslHnWeb.Layouts]
+
+
import Plug.Conn
+
+
unquote(verified_routes())
+
end
+
end
+
+
def verified_routes do
+
quote do
+
use Phoenix.VerifiedRoutes,
+
endpoint: EslHnWeb.Endpoint,
+
router: EslHnWeb.Router,
+
statics: EslHnWeb.static_paths()
+
end
+
end
+
+
@doc """
+
When used, dispatch to the appropriate controller/live_view/etc.
+
"""
+
defmacro __using__(which) when is_atom(which) do
+
apply(__MODULE__, which, [])
+
end
+
end
+25
lib/esl_hn_web/controllers/error_json.ex
···
+
defmodule EslHnWeb.ErrorJSON do
+
@moduledoc """
+
This module is invoked by your endpoint in case of errors on JSON requests.
+
+
See config/config.exs.
+
"""
+
+
# If you want to customize a particular status code,
+
# you may add your own clauses, such as:
+
#
+
# def render("500.json", _assigns) do
+
# %{errors: %{detail: "Internal Server Error"}}
+
# end
+
+
# By default, Phoenix returns the status message from
+
# the template name. For example, "404.json" becomes
+
# "Not Found".
+
def render(template, _assigns) do
+
%{
+
errors: %{
+
detail: Phoenix.Controller.status_message_from_template(template)
+
}
+
}
+
end
+
end
+50
lib/esl_hn_web/endpoint.ex
···
+
defmodule EslHnWeb.Endpoint do
+
use Phoenix.Endpoint, otp_app: :esl_hn
+
+
# The session will be stored in the cookie and signed,
+
# this means its contents can be read but not tampered with.
+
# Set :encryption_salt if you would also like to encrypt it.
+
@session_options [
+
store: :cookie,
+
key: "_esl_hn_key",
+
signing_salt: "NLq1Vxn8",
+
same_site: "Lax"
+
]
+
+
socket "/live", Phoenix.LiveView.Socket,
+
websocket: [connect_info: [session: @session_options]],
+
longpoll: [connect_info: [session: @session_options]]
+
+
# Serve at "/" the static files from "priv/static" directory.
+
#
+
# You should set gzip to true if you are running phx.digest
+
# when deploying your static files in production.
+
plug Plug.Static,
+
at: "/",
+
from: :esl_hn,
+
gzip: false,
+
only: EslHnWeb.static_paths()
+
+
# Code reloading can be explicitly enabled under the
+
# :code_reloader configuration of your endpoint.
+
if code_reloading? do
+
plug Phoenix.CodeReloader
+
end
+
+
plug Phoenix.LiveDashboard.RequestLogger,
+
param_key: "request_logger",
+
cookie_key: "request_logger"
+
+
plug Plug.RequestId
+
plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
+
+
plug Plug.Parsers,
+
parsers: [:urlencoded, :multipart, :json],
+
pass: ["*/*"],
+
json_decoder: Phoenix.json_library()
+
+
plug Plug.MethodOverride
+
plug Plug.Head
+
plug Plug.Session, @session_options
+
plug EslHnWeb.Router
+
end
+27
lib/esl_hn_web/router.ex
···
+
defmodule EslHnWeb.Router do
+
use EslHnWeb, :router
+
+
pipeline :api do
+
plug :accepts, ["json"]
+
end
+
+
scope "/api", EslHnWeb do
+
pipe_through :api
+
end
+
+
# Enable LiveDashboard in development
+
if Application.compile_env(:esl_hn, :dev_routes) do
+
# If you want to use the LiveDashboard in production, you should put
+
# it behind authentication and allow only admins to access it.
+
# If your application does not have an admins-only section yet,
+
# you can use Plug.BasicAuth to set up some basic authentication
+
# as long as you are also using SSL (which you should anyway).
+
import Phoenix.LiveDashboard.Router
+
+
scope "/dev" do
+
pipe_through [:fetch_session, :protect_from_forgery]
+
+
live_dashboard "/dashboard", metrics: EslHnWeb.Telemetry
+
end
+
end
+
end
+70
lib/esl_hn_web/telemetry.ex
···
+
defmodule EslHnWeb.Telemetry do
+
use Supervisor
+
import Telemetry.Metrics
+
+
def start_link(arg) do
+
Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
+
end
+
+
@impl true
+
def init(_arg) do
+
children = [
+
# Telemetry poller will execute the given period measurements
+
# every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics
+
{:telemetry_poller, measurements: periodic_measurements(), period: 10_000}
+
# Add reporters as children of your supervision tree.
+
# {Telemetry.Metrics.ConsoleReporter, metrics: metrics()}
+
]
+
+
Supervisor.init(children, strategy: :one_for_one)
+
end
+
+
def metrics do
+
[
+
# Phoenix Metrics
+
summary("phoenix.endpoint.start.system_time",
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.endpoint.stop.duration",
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.router_dispatch.start.system_time",
+
tags: [:route],
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.router_dispatch.exception.duration",
+
tags: [:route],
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.router_dispatch.stop.duration",
+
tags: [:route],
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.socket_connected.duration",
+
unit: {:native, :millisecond}
+
),
+
sum("phoenix.socket_drain.count"),
+
summary("phoenix.channel_joined.duration",
+
unit: {:native, :millisecond}
+
),
+
summary("phoenix.channel_handled_in.duration",
+
tags: [:event],
+
unit: {:native, :millisecond}
+
),
+
+
# VM Metrics
+
summary("vm.memory.total", unit: {:byte, :kilobyte}),
+
summary("vm.total_run_queue_lengths.total"),
+
summary("vm.total_run_queue_lengths.cpu"),
+
summary("vm.total_run_queue_lengths.io")
+
]
+
end
+
+
defp periodic_measurements do
+
[
+
# A module, function and arguments to be invoked periodically.
+
# This function must call :telemetry.execute/3 and a metric must be added above.
+
# {EslHnWeb, :count_users, []}
+
]
+
end
+
end
+56
mix.exs
···
+
defmodule EslHn.MixProject do
+
use Mix.Project
+
+
def project do
+
[
+
app: :esl_hn,
+
version: "0.1.0",
+
elixir: "~> 1.14",
+
elixirc_paths: elixirc_paths(Mix.env()),
+
start_permanent: Mix.env() == :prod,
+
aliases: aliases(),
+
deps: deps()
+
]
+
end
+
+
# Configuration for the OTP application.
+
#
+
# Type `mix help compile.app` for more information.
+
def application do
+
[
+
mod: {EslHn.Application, []},
+
extra_applications: [:logger, :runtime_tools]
+
]
+
end
+
+
# Specifies which paths to compile per environment.
+
defp elixirc_paths(:test), do: ["lib", "test/support"]
+
defp elixirc_paths(_), do: ["lib"]
+
+
# Specifies your project dependencies.
+
#
+
# Type `mix help deps` for examples and options.
+
defp deps do
+
[
+
{:phoenix, "~> 1.7.21"},
+
{:phoenix_live_dashboard, "~> 0.8.3"},
+
{:telemetry_metrics, "~> 1.0"},
+
{:telemetry_poller, "~> 1.0"},
+
{:jason, "~> 1.2"},
+
{:dns_cluster, "~> 0.1.1"},
+
{:bandit, "~> 1.5"}
+
]
+
end
+
+
# Aliases are shortcuts or tasks specific to the current project.
+
# For example, to install project dependencies and perform other setup tasks, run:
+
#
+
# $ mix setup
+
#
+
# See the documentation for `Mix` for more info on aliases.
+
defp aliases do
+
[
+
setup: ["deps.get"]
+
]
+
end
+
end
+22
mix.lock
···
+
%{
+
"bandit": {:hex, :bandit, "1.7.0", "d1564f30553c97d3e25f9623144bb8df11f3787a26733f00b21699a128105c0c", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "3e2f7a98c7a11f48d9d8c037f7177cd39778e74d55c7af06fe6227c742a8168a"},
+
"castore": {:hex, :castore, "1.0.14", "4582dd7d630b48cf5e1ca8d3d42494db51e406b7ba704e81fbd401866366896a", [:mix], [], "hexpm", "7bc1b65249d31701393edaaac18ec8398d8974d52c647b7904d01b964137b9f4"},
+
"dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"},
+
"hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"},
+
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
+
"mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"},
+
"phoenix": {:hex, :phoenix, "1.7.21", "14ca4f1071a5f65121217d6b57ac5712d1857e40a0833aff7a691b7870fc9a3b", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "336dce4f86cba56fed312a7d280bf2282c720abb6074bdb1b61ec8095bdd0bc9"},
+
"phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"},
+
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"},
+
"phoenix_live_view": {:hex, :phoenix_live_view, "1.0.17", "beeb16d83a7d3760f7ad463df94e83b087577665d2acc0bf2987cd7d9778068f", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a4ca05c1eb6922c4d07a508a75bfa12c45e5f4d8f77ae83283465f02c53741e1"},
+
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
+
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
+
"plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"},
+
"plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"},
+
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
+
"telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"},
+
"telemetry_poller": {:hex, :telemetry_poller, "1.3.0", "d5c46420126b5ac2d72bc6580fb4f537d35e851cc0f8dbd571acf6d6e10f5ec7", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "51f18bed7128544a50f75897db9974436ea9bfba560420b646af27a9a9b35211"},
+
"thousand_island": {:hex, :thousand_island, "1.3.14", "ad45ebed2577b5437582bcc79c5eccd1e2a8c326abf6a3464ab6c06e2055a34a", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d0d24a929d31cdd1d7903a4fe7f2409afeedff092d277be604966cd6aa4307ef"},
+
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
+
"websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"},
+
}
priv/static/favicon.ico

This is a binary file and will not be displayed.

+5
priv/static/robots.txt
···
+
# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+
#
+
# To ban all spiders from the entire site uncomment the next two lines:
+
# User-agent: *
+
# Disallow: /
+14
test/esl_hn_web/controllers/error_json_test.exs
···
+
defmodule EslHnWeb.ErrorJSONTest do
+
use EslHnWeb.ConnCase, async: true
+
+
test "renders 404" do
+
assert EslHnWeb.ErrorJSON.render("404.json", %{}) == %{
+
errors: %{detail: "Not Found"}
+
}
+
end
+
+
test "renders 500" do
+
assert EslHnWeb.ErrorJSON.render("500.json", %{}) ==
+
%{errors: %{detail: "Internal Server Error"}}
+
end
+
end
+37
test/support/conn_case.ex
···
+
defmodule EslHnWeb.ConnCase do
+
@moduledoc """
+
This module defines the test case to be used by
+
tests that require setting up a connection.
+
+
Such tests rely on `Phoenix.ConnTest` and also
+
import other functionality to make it easier
+
to build common data structures and query the data layer.
+
+
Finally, if the test case interacts with the database,
+
we enable the SQL sandbox, so changes done to the database
+
are reverted at the end of every test. If you are using
+
PostgreSQL, you can even run database tests asynchronously
+
by setting `use EslHnWeb.ConnCase, async: true`, although
+
this option is not recommended for other databases.
+
"""
+
+
use ExUnit.CaseTemplate
+
+
using do
+
quote do
+
# The default endpoint for testing
+
@endpoint EslHnWeb.Endpoint
+
+
use EslHnWeb, :verified_routes
+
+
# Import conveniences for testing with connections
+
import Plug.Conn
+
import Phoenix.ConnTest
+
import EslHnWeb.ConnCase
+
end
+
end
+
+
setup _tags do
+
{:ok, conn: Phoenix.ConnTest.build_conn()}
+
end
+
end
+1
test/test_helper.exs
···
+
ExUnit.start()