Skip to content

Commit 57ff66f

Browse files
committed
Merge pull request #56 from JamesS237/more_api_organisation
Further API movement/organisation
2 parents def093c + c075365 commit 57ff66f

File tree

6 files changed

+85
-79
lines changed

6 files changed

+85
-79
lines changed

lib/hex/api.ex

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
defmodule Hex.API do
2+
alias Hex.API.Util
3+
24
def request(method, url, headers, body \\ nil) when body == nil or is_map(body) do
35
default_headers = %{
46
'accept' => 'application/vnd.hex.beta+elixir',
@@ -62,7 +64,7 @@ defmodule Hex.API do
6264
headers = Enum.into(headers, %{})
6365
content_encoding = :binary.list_to_bin(headers['content-encoding'] || '')
6466
content_type = :binary.list_to_bin(headers['content-type'] || '')
65-
handle_hex_message(headers['x-hex-message'])
67+
Util.handle_hex_message(headers['x-hex-message'])
6668

6769
if String.contains?(content_encoding, "gzip") do
6870
body = :zlib.gunzip(body)
@@ -75,18 +77,6 @@ defmodule Hex.API do
7577
{code, body}
7678
end
7779

78-
@doc false
79-
def handle_hex_message(nil), do: :ok
80-
81-
def handle_hex_message(header) do
82-
{message, level} = :binary.list_to_bin(header) |> parse_hex_message
83-
case level do
84-
"warn" -> Mix.shell.info("API warning: " <> message)
85-
"fatal" -> Mix.shell.error("API error: " <> message)
86-
_ -> :ok
87-
end
88-
end
89-
9080
def user_agent do
9181
'Hex/#{Hex.version} (Elixir/#{System.version})'
9282
end
@@ -111,45 +101,4 @@ defmodule Hex.API do
111101
base64 = :base64.encode_to_string(info[:user] <> ":" <> info[:pass])
112102
%{'authorization' => 'Basic ' ++ base64}
113103
end
114-
115-
@space [?\s, ?\t]
116-
117-
defp parse_hex_message(message) do
118-
{message, rest} = skip_ws(message) |> quoted
119-
level = skip_ws(rest) |> opt_level
120-
{message, level}
121-
end
122-
123-
defp skip_ws(<< char, rest :: binary >>) when char in @space,
124-
do: skip_ws(rest)
125-
defp skip_ws(rest),
126-
do: rest
127-
128-
defp skip_trail_ws(input, str \\ "", ws \\ "")
129-
130-
defp skip_trail_ws(<< char, rest :: binary >>, str, ws) when char in @space,
131-
do: skip_trail_ws(rest, str, << ws :: binary, char >>)
132-
defp skip_trail_ws(<< char, rest :: binary >>, str, ws),
133-
do: skip_trail_ws(rest, << str :: binary, ws :: binary, char >>, "")
134-
defp skip_trail_ws("", str, _ws),
135-
do: str
136-
137-
defp quoted("\"" <> rest),
138-
do: do_quoted(rest, "")
139-
140-
defp do_quoted("\"" <> rest, acc),
141-
do: {acc, rest}
142-
defp do_quoted(<< char, rest :: binary >>, acc),
143-
do: do_quoted(rest, << acc :: binary, char >>)
144-
145-
defp opt_level(";" <> rest),
146-
do: do_level(rest)
147-
defp opt_level(_),
148-
do: nil
149-
150-
defp do_level(rest) do
151-
"level" <> rest = skip_ws(rest)
152-
"=" <> rest = skip_ws(rest)
153-
skip_ws(rest) |> skip_trail_ws
154-
end
155104
end

lib/hex/api/package.ex

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,4 @@ defmodule Hex.API.Package do
88
def new(name, meta, auth) do
99
API.request(:put, API.api_url("packages/#{name}"), API.auth(auth), %{meta: meta})
1010
end
11-
12-
def add_owner(package, owner, auth) do
13-
owner = URI.encode_www_form(owner)
14-
API.request(:put, API.api_url("packages/#{package}/owners/#{owner}"), API.auth(auth))
15-
end
16-
17-
def delete_owner(package, owner, auth) do
18-
owner = URI.encode_www_form(owner)
19-
API.request(:delete, API.api_url("packages/#{package}/owners/#{owner}"), API.auth(auth))
20-
end
21-
22-
def get_owners(package, auth) do
23-
API.request(:get, API.api_url("packages/#{package}/owners"), API.auth(auth))
24-
end
2511
end

lib/hex/api/package_owner.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
defmodule Hex.API.Package.Owner do
2+
alias Hex.API
3+
4+
def add(package, owner, auth) do
5+
owner = URI.encode_www_form(owner)
6+
API.request(:put, API.api_url("packages/#{package}/owners/#{owner}"), API.auth(auth))
7+
end
8+
9+
def delete(package, owner, auth) do
10+
owner = URI.encode_www_form(owner)
11+
API.request(:delete, API.api_url("packages/#{package}/owners/#{owner}"), API.auth(auth))
12+
end
13+
14+
def get(package, auth) do
15+
API.request(:get, API.api_url("packages/#{package}/owners"), API.auth(auth))
16+
end
17+
end

lib/hex/api/util.ex

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
defmodule Hex.API.Util do
2+
@doc false
3+
def handle_hex_message(nil), do: :ok
4+
5+
def handle_hex_message(header) do
6+
{message, level} = :binary.list_to_bin(header) |> parse_hex_message
7+
case level do
8+
"warn" -> Mix.shell.info("API warning: " <> message)
9+
"fatal" -> Mix.shell.error("API error: " <> message)
10+
_ -> :ok
11+
end
12+
end
13+
14+
@space [?\s, ?\t]
15+
16+
def parse_hex_message(message) do
17+
{message, rest} = skip_ws(message) |> quoted
18+
level = skip_ws(rest) |> opt_level
19+
{message, level}
20+
end
21+
22+
def skip_ws(<< char, rest :: binary >>) when char in @space,
23+
do: skip_ws(rest)
24+
def skip_ws(rest),
25+
do: rest
26+
27+
def skip_trail_ws(input, str \\ "", ws \\ "")
28+
29+
def skip_trail_ws(<< char, rest :: binary >>, str, ws) when char in @space,
30+
do: skip_trail_ws(rest, str, << ws :: binary, char >>)
31+
def skip_trail_ws(<< char, rest :: binary >>, str, ws),
32+
do: skip_trail_ws(rest, << str :: binary, ws :: binary, char >>, "")
33+
def skip_trail_ws("", str, _ws),
34+
do: str
35+
36+
def quoted("\"" <> rest),
37+
do: do_quoted(rest, "")
38+
39+
def do_quoted("\"" <> rest, acc),
40+
do: {acc, rest}
41+
def do_quoted(<< char, rest :: binary >>, acc),
42+
do: do_quoted(rest, << acc :: binary, char >>)
43+
44+
def opt_level(";" <> rest),
45+
do: do_level(rest)
46+
def opt_level(_),
47+
do: nil
48+
49+
def do_level(rest) do
50+
"level" <> rest = skip_ws(rest)
51+
"=" <> rest = skip_ws(rest)
52+
skip_ws(rest) |> skip_trail_ws
53+
end
54+
end

lib/mix/tasks/hex/owner.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ defmodule Mix.Tasks.Hex.Owner do
5252

5353
defp add_owner(package, owner, opts) do
5454
Mix.shell.info("Adding owner #{owner} to #{package}")
55-
case Hex.API.Package.add_owner(package, owner, opts) do
55+
case Hex.API.Package.Owner.add(package, owner, opts) do
5656
{204, _body} ->
5757
:ok
5858
{code, body} ->
@@ -63,7 +63,7 @@ defmodule Mix.Tasks.Hex.Owner do
6363

6464
defp remove_owner(package, owner, opts) do
6565
Mix.shell.info("Removing owner #{owner} from #{package}")
66-
case Hex.API.Package.delete_owner(package, owner, opts) do
66+
case Hex.API.Package.Owner.delete(package, owner, opts) do
6767
{204, _body} ->
6868
:ok
6969
{code, body} ->
@@ -73,7 +73,7 @@ defmodule Mix.Tasks.Hex.Owner do
7373
end
7474

7575
defp list_owners(package, opts) do
76-
case Hex.API.Package.get_owners(package, opts) do
76+
case Hex.API.Package.Owner.get(package, opts) do
7777
{200, body} ->
7878
Enum.each(body, &Mix.shell.info(&1["email"]))
7979
{code, body} ->

test/hex/api_test.exs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,26 +70,26 @@ defmodule Hex.APITest do
7070
Hex.API.Package.new("orange", %{}, auth)
7171
Hex.API.User.new("orange_user", "[email protected]", "hunter42")
7272

73-
assert {200, [%{"username" => "user"}]} = Hex.API.Package.get_owners("orange", auth)
73+
assert {200, [%{"username" => "user"}]} = Hex.API.Package.Owner.get("orange", auth)
7474

75-
assert {204, _} = Hex.API.Package.add_owner("orange", "[email protected]", auth)
75+
assert {204, _} = Hex.API.Package.Owner.add("orange", "[email protected]", auth)
7676

7777
assert {200, [%{"username" => "user"}, %{"username" => "orange_user"}]} =
78-
Hex.API.Package.get_owners("orange", auth)
78+
Hex.API.Package.Owner.get("orange", auth)
7979

80-
assert {204, _} = Hex.API.Package.delete_owner("orange", "[email protected]", auth)
80+
assert {204, _} = Hex.API.Package.Owner.delete("orange", "[email protected]", auth)
8181

82-
assert {200, [%{"username" => "user"}]} = Hex.API.Package.get_owners("orange", auth)
82+
assert {200, [%{"username" => "user"}]} = Hex.API.Package.Owner.get("orange", auth)
8383
end
8484

8585
test "x-hex-message" do
86-
Hex.API.handle_hex_message('"oops, you done goofed"')
86+
Hex.API.Util.handle_hex_message('"oops, you done goofed"')
8787
refute_received {:mix_shell, _, _}
8888

89-
Hex.API.handle_hex_message(' "oops, you done goofed" ; level = warn')
89+
Hex.API.Util.handle_hex_message(' "oops, you done goofed" ; level = warn')
9090
assert_received {:mix_shell, :info, ["API warning: oops, you done goofed"]}
9191

92-
Hex.API.handle_hex_message('"oops, you done goofed";level=fatal ')
92+
Hex.API.Util.handle_hex_message('"oops, you done goofed";level=fatal ')
9393
assert_received {:mix_shell, :error, ["API error: oops, you done goofed"]}
9494
end
9595
end

0 commit comments

Comments
 (0)