Skip to content

Commit f7156a7

Browse files
committed
Add docs
1 parent cb956ab commit f7156a7

File tree

5 files changed

+71
-19
lines changed

5 files changed

+71
-19
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ req-*.tar
2424

2525
# Temporary files, for example, from tests.
2626
/tmp/
27+
/push.sh

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Req
22

3+
<!-- MDOC !-->
4+
35
A work-in-progress HTTP client.
46

57
# Features
@@ -129,6 +131,8 @@ def circuit_breaker(request) do
129131
end
130132
```
131133

134+
<!-- MDOC !-->
135+
132136
## License
133137

134138
Copyright (c) 2021 Wojtek Mach

lib/req.ex

+42-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
defmodule Req do
2+
@external_resource "README.md"
3+
4+
@moduledoc "README.md"
5+
|> File.read!()
6+
|> String.split("<!-- MDOC !-->")
7+
|> Enum.fetch!(1)
8+
29
@doc """
310
Makes a GET request.
411
"""
12+
@doc api: :high_level
513
def get!(url, opts \\ []) do
614
case request(:get, url, opts) do
715
{:ok, response} -> response
@@ -12,6 +20,7 @@ defmodule Req do
1220
@doc """
1321
Makes an HTTP request.
1422
"""
23+
@doc api: :high_level
1524
def request(method, url, opts \\ []) do
1625
method
1726
|> build(url, opts)
@@ -24,6 +33,7 @@ defmodule Req do
2433
@doc """
2534
Builds a request pipeline.
2635
"""
36+
@doc api: :low_level
2737
def build(method, url, opts \\ []) do
2838
body = Keyword.get(opts, :body, "")
2939
headers = Keyword.get(opts, :headers, [])
@@ -37,20 +47,19 @@ defmodule Req do
3747
end
3848

3949
@doc """
40-
Adds default steps.
41-
42-
This function adds the following steps:
50+
Adds steps that should be reasonable defaults for most users.
4351
44-
* request:
52+
* request:
4553
46-
* `default_headers/1`
54+
* `default_headers/1`
4755
48-
* response:
56+
* response:
4957
50-
* `decompress/2`
51-
* `decode/2`
58+
* `decompress/2`
59+
* `decode/2`
5260
5361
"""
62+
@doc api: :low_level
5463
def add_default_steps(request) do
5564
request
5665
|> add_request_steps([
@@ -63,22 +72,25 @@ defmodule Req do
6372
end
6473

6574
@doc """
66-
Adds a request step.
75+
Adds request steps.
6776
"""
77+
@doc api: :low_level
6878
def add_request_steps(request, steps) do
6979
update_in(request.request_steps, &(&1 ++ steps))
7080
end
7181

7282
@doc """
73-
Adds a response step.
83+
Adds response steps.
7484
"""
85+
@doc api: :low_level
7586
def add_response_steps(request, steps) do
7687
update_in(request.response_steps, &(&1 ++ steps))
7788
end
7889

7990
@doc """
80-
Adds an error step.
91+
Adds error steps.
8192
"""
93+
@doc api: :low_level
8294
def add_error_steps(request, steps) do
8395
update_in(request.error_steps, &(&1 ++ steps))
8496
end
@@ -88,6 +100,7 @@ defmodule Req do
88100
89101
Returns `{:ok, response}` or `{:error, exception}`.
90102
"""
103+
@doc api: :low_level
91104
def run(request) do
92105
result =
93106
Enum.reduce_while(request.request_steps, request, fn step, acc ->
@@ -130,10 +143,11 @@ defmodule Req do
130143
end
131144

132145
@doc """
133-
Runs a request pipeline.
146+
Runs a request pipeline and returns a response or raises an error.
134147
135-
Similar to `run/1` but returns a response or raises an exception.
148+
See `run/1`.
136149
"""
150+
@doc api: :low_level
137151
def run!(request) do
138152
case run(request) do
139153
{:ok, response} -> response
@@ -189,15 +203,27 @@ defmodule Req do
189203

190204
## Request steps
191205

206+
@user_agent "req/#{Mix.Project.config()[:version]}"
207+
208+
@doc """
209+
Adds common request headers.
210+
211+
Currently the following headers are added:
212+
213+
* `"user-agent"` - `#{inspect(@user_agent)}`
214+
215+
"""
216+
@doc api: :request
192217
def default_headers(request) do
193-
put_new_header(request, "user-agent", "req/0.1.0-dev")
218+
put_new_header(request, "user-agent", @user_agent)
194219
end
195220

196221
## Response steps
197222

198223
@doc """
199224
Decompresses the response body based on the `content-encoding` header.
200225
"""
226+
@doc api: :response
201227
def decompress(request, response) do
202228
compression_algorithms = get_content_encoding_header(response.headers)
203229
{request, update_in(response.body, &decompress_body(&1, compression_algorithms))}
@@ -226,6 +252,7 @@ defmodule Req do
226252
@doc """
227253
Decodes the response body based on the `content-type` header.
228254
"""
255+
@doc api: :response
229256
def decode(request, response) do
230257
case List.keyfind(response.headers, "content-type", 0) do
231258
{_, "application/json" <> _} ->
@@ -255,6 +282,7 @@ defmodule Req do
255282
* an exception
256283
257284
"""
285+
@doc api: :error
258286
def retry(request, %{status: status} = response) when status < 500 do
259287
{request, response}
260288
end

mix.exs

+18-5
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,41 @@ defmodule Req.MixProject do
44
def project do
55
[
66
app: :req,
7-
version: "0.1.0",
7+
version: "0.1.0-dev",
88
elixir: "~> 1.11",
99
start_permanent: Mix.env() == :prod,
10-
deps: deps()
10+
deps: deps(),
11+
docs: docs()
1112
]
1213
end
1314

14-
# Run "mix help compile.app" to learn about applications.
1515
def application do
1616
[
1717
mod: {Req.Application, []},
1818
extra_applications: [:logger]
1919
]
2020
end
2121

22-
# Run "mix help deps" to learn about dependencies.
2322
defp deps do
2423
[
2524
{:finch, "~> 0.6.0"},
2625
{:mint, github: "elixir-mint/mint", override: true},
2726
{:jason, "~> 1.0"},
28-
{:bypass, "~> 2.1", only: :test}
27+
{:bypass, "~> 2.1", only: :test},
28+
{:ex_doc, ">= 0.0.0", only: :docs}
29+
]
30+
end
31+
32+
defp docs do
33+
[
34+
main: "Req",
35+
groups_for_functions: [
36+
"High-level API": &(&1[:api] == :high_level),
37+
"Low-level API": &(&1[:api] == :low_level),
38+
"Request steps": &(&1[:api] == :request),
39+
"Response steps": &(&1[:api] == :response),
40+
"Error steps": &(&1[:api] == :error)
41+
]
2942
]
3043
end
3144
end

mix.lock

+6
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
"cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"},
55
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"},
66
"cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"},
7+
"earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"},
8+
"ex_doc": {:hex, :ex_doc, "0.24.1", "15673de99154f93ca7f05900e4e4155ced1ee0cd34e0caeee567900a616871a4", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "07972f17bdf7dc7b5bd76ec97b556b26178ed3f056e7ec9288eb7cea7f91cce2"},
79
"finch": {:hex, :finch, "0.6.3", "18b993653f5d7d5550b0a3c3f9777269b2b99db02726ac6fe776d58c2dd1a0a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.2", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.3.5", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "015f48d3a43f9d2afd06ef714636545bdb017297a63bf582cac8fdcf8ae6f031"},
810
"jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"},
11+
"makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"},
12+
"makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"},
13+
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
914
"mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"},
1015
"mint": {:git, "https://github.com/elixir-mint/mint.git", "796b8db097d69ede7163acba223ab2045c2773a4", []},
1116
"nimble_options": {:hex, :nimble_options, "0.3.5", "a4f6820cdcb4ee444afd78635f323e58e8a5ddf2fbbe9b9d283a99f972034bae", [:mix], [], "hexpm", "f5507cc90033a8d12769522009c80aa9164af6bab245dbd4ad421d008455f1e1"},
17+
"nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"},
1218
"nimble_pool": {:hex, :nimble_pool, "0.2.4", "1db8e9f8a53d967d595e0b32a17030cdb6c0dc4a451b8ac787bf601d3f7704c3", [:mix], [], "hexpm", "367e8071e137b787764e6a9992ccb57b276dc2282535f767a07d881951ebeac6"},
1319
"plug": {:hex, :plug, "1.11.1", "f2992bac66fdae679453c9e86134a4201f6f43a687d8ff1cd1b2862d53c80259", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "23524e4fefbb587c11f0833b3910bfb414bf2e2534d61928e920f54e3a1b881f"},
1420
"plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"},

0 commit comments

Comments
 (0)