Skip to content

Commit

Permalink
Minimalistic HTML interface
Browse files Browse the repository at this point in the history
  • Loading branch information
yrashk committed Sep 29, 2012
1 parent 574118b commit 2afeb57
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 3 deletions.
2 changes: 1 addition & 1 deletion lib/repositories/http.ex
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ defimpl Expm.Repository, for: Expm.Repository.HTTP do

def list(repo, filter) do
{:ok, 200, _headers, client} =
H.request("PUT", "#{repo.url}/__list__",
H.request("PUT", "#{repo.url}",
[
{"content-type","application/elixir"},
],
Expand Down
56 changes: 54 additions & 2 deletions lib/server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ defmodule Expm.Server do
env = Application.environment(:expm)
repository = Expm.Repository.DETS.new filename: env[:datafile]
dispatch = [
{:_, [{["__list__"], Expm.Server.Http, [repository: repository, endpoint: :list]},
{:_, [{[], Expm.Server.Http, [repository: repository, endpoint: :list]},
{[:package], Expm.Server.Http, [repository: repository, endpoint: :package]},
{[:package, :version], Expm.Server.Http, [repository: repository, endpoint: :package_version]},
]},
Expand Down Expand Up @@ -67,7 +67,10 @@ defmodule Expm.Server.Http do
end

def content_types_provided(req, State[] = state) do
{[{{<<"application">>, <<"elixir">>, []}, :to_elixir}], req, state}
{[
{{<<"application">>, <<"elixir">>, []}, :to_elixir},
{{<<"text">>, <<"html">>, []}, :to_html},
], req, state}
end

def content_types_accepted(req, state) do
Expand All @@ -91,6 +94,31 @@ defmodule Expm.Server.Http do
{true, req, state}
end

def to_html(req, State[endpoint: :list, repository: repository] = state) do
pkgs = Expm.Repository.list repository, Expm.Package[_: :_]
out = html_header(req, state) <>
"<ul>" <>
iolist_to_binary(lc pkg inlist pkgs, do: %b{<li><a href="/#{pkg.name}">#{pkg.name}</a> #{pkg.description}</li>}) <>
"</ul>" <> html_footer(req, state)
{out, req, state}
end

def to_html(req, State[endpoint: :package, repository: repository] = state) do
{package, req} = Req.binding(:package, req)
version = hd(Enum.reverse(List.sort(Expm.Repository.versions repository, package)))
pkg = Expm.Repository.get repository, package, version
out = html_header(req, state) <> %b{#{inspect pkg}} <> html_footer(req, state)
{out, req, state}
end

def to_html(req, State[endpoint: :package_version, repository: repository] = state) do
{package, req} = Req.binding(:package, req)
{version, req} = Req.binding(:version, req)
pkg = Expm.Repository.get repository, package, version
out = html_header(req, state) <> %b{#{inspect pkg}} <> html_footer(req, state)
{out, req, state}
end

def to_elixir(req, State[endpoint: :package_version, repository: repository] = state) do
{package, req} = Req.binding(:package, req)
{version, req} = Req.binding(:version, req)
Expand All @@ -104,5 +132,29 @@ defmodule Expm.Server.Http do
{inspect(versions), req, state}
end

defp html_header(_req, _state) do
"""
<h1>EXPM Repository</h1>
<small>(<a href="http://elixir-lang.org">Elixir</a> and <a href="http://erlang.org">Erlang</a> packages)</small>
<hr />
"""
end
defp html_footer(req, _state) do
{host, req} = Req.host(req)
{port, req} = Req.port(req)
if port == 80 do
port = ""
else
port = ":#{port}"
end
"""
<p />
<hr />
<p>This repository is available over HTTP:</p>
<code>Expm.Repository.HTTP.new url: "http://#{host}#{port}"[, username: "...", password: "..."]</code>
"""
end

def terminate(_req, _state), do: :ok
end

0 comments on commit 2afeb57

Please sign in to comment.