Skip to content

Commit 716f453

Browse files
authored
Merge pull request #103 from open-api-spex/spec-behaviour
Add behaviour to OpenApi module documenting the `spec/0` callback.
2 parents 60eda20 + 7593733 commit 716f453

File tree

8 files changed

+45
-5
lines changed

8 files changed

+45
-5
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ Start by adding an `ApiSpec` module to your application to populate an `OpenApiS
3232
```elixir
3333
defmodule MyApp.ApiSpec do
3434
alias OpenApiSpex.{OpenApi, Server, Info, Paths}
35+
@behaviour OpenApi
3536

37+
@impl OpenApi
3638
def spec do
3739
%OpenApi{
3840
servers: [

examples/phoenix_app/lib/phoenix_app_web/api_spec.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule PhoenixAppWeb.ApiSpec do
22
alias OpenApiSpex.{Info, OpenApi, Paths}
3+
@behaviour OpenApi
34

5+
@impl OpenApi
46
def spec do
57
%OpenApi{
68
info: %Info{
@@ -11,4 +13,4 @@ defmodule PhoenixAppWeb.ApiSpec do
1113
}
1214
|> OpenApiSpex.resolve_schema_modules()
1315
end
14-
end
16+
end

examples/phoenix_app/lib/phoenix_app_web/controllers/user_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ defmodule PhoenixAppWeb.UserController do
4848
}
4949
end
5050

51-
def create(conn = %{body_params: %Schemas.UserRequest{user: user_params}}, %{group_id: group_id}) do
51+
def create(conn = %{body_params: %Schemas.UserRequest{user: user_params}}, %{group_id: _group_id}) do
5252
with {:ok, %User{} = user} <- Accounts.create_user(user_params) do
5353
conn
5454
|> put_status(:created)

examples/plug_app/lib/plug_app/api_spec.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule PlugApp.ApiSpec do
2-
alias OpenApiSpex.{Info, OpenApi, Paths}
2+
alias OpenApiSpex.{Info, OpenApi}
3+
@behaviour OpenApi
34

5+
@impl OpenApi
46
def spec do
57
%OpenApi{
68
info: %Info{

lib/open_api_spex/open_api.ex

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
defmodule OpenApiSpex.OpenApi do
1+
defmodule OpenApiSpex.OpenApi do
22
@moduledoc """
3-
Defines the `OpenApiSpex.OpenApi.t` type.
3+
Defines the `OpenApiSpex.OpenApi.t` type and the behaviour for application modules that
4+
construct an `OpenApiSpex.OpenApi.t` at runtime.
45
"""
56
alias OpenApiSpex.{
67
Info, Server, Paths, Components,
@@ -35,6 +36,30 @@ defmodule OpenApiSpex.OpenApi do
3536
externalDocs: ExternalDocumentation.t | nil
3637
}
3738

39+
@doc """
40+
A spec/0 callback function is required for use with the `OpenApiSpex.Plug.PutApiSpec` plug.
41+
42+
## Example
43+
44+
@impl OpenApiSpex.OpenApi
45+
def spec do
46+
%OpenApi{
47+
servers: [
48+
# Populate the Server info from a phoenix endpoint
49+
Server.from_endpoint(MyAppWeb.Endpoint, otp_app: :my_app)
50+
],
51+
info: %Info{
52+
title: "My App",
53+
version: "1.0"
54+
},
55+
# populate the paths from a phoenix router
56+
paths: Paths.from_router(MyAppWeb.Router)
57+
}
58+
|> OpenApiSpex.resolve_schema_modules() # discover request/response schemas from path specs
59+
end
60+
"""
61+
@callback spec() :: t
62+
3863
@json_encoder Enum.find([Jason, Poison], &Code.ensure_loaded?/1)
3964

4065
def json_encoder, do: @json_encoder

lib/open_api_spex/plug/put_api_spec.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ defmodule OpenApiSpex.Plug.PutApiSpec do
44
55
This allows downstream plugs to use the API spec for casting, validating and rendering.
66
7+
## Options
8+
9+
- module: A module implementing the `OpenApiSpex.OpenApi` behaviour
10+
711
## Example
812
913
plug OpenApiSpex.Plug.PutApiSpec, module: MyAppWeb.ApiSpec

test/operation2_test.exs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ defmodule OpenApiSpex.Operation2Test do
5858
end
5959

6060
defmodule SpecModule do
61+
@behaviour OpenApiSpex.OpenApi
62+
63+
@impl OpenApiSpex.OpenApi
6164
def spec do
6265
paths = %{
6366
"/users" => %{

test/support/api_spec.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
defmodule OpenApiSpexTest.ApiSpec do
22
alias OpenApiSpex.{OpenApi, Contact, License, Paths, Server, Info, Components}
33
alias OpenApiSpexTest.{Router, Schemas}
4+
@behaviour OpenApi
45

6+
@impl OpenApi
57
def spec() do
68
%OpenApi{
79
servers: [

0 commit comments

Comments
 (0)