Skip to content

Commit c62e3a3

Browse files
committed
Fixes parameters properties rendering inconsistently
* `parameter :id, required: true` renders `id: (required, ) - id` * `parameter :id, required: false` renders `id: () - id` Connects to #313
1 parent 2f5cceb commit c62e3a3

File tree

4 files changed

+59
-9
lines changed

4 files changed

+59
-9
lines changed

features/api_blueprint_documentation.feature

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ Feature: Generate API Blueprint documentation from test examples
110110
route '/orders/{id}', "Single Order" do
111111
parameter :id, 'Order id', required: true, type: 'string', :example => '1'
112112
113-
attribute :name, 'The order name', required: true, type: 'string', :example => '1'
113+
attribute :name, 'The order name', required: true, :example => 'a name'
114+
attribute :amount, required: false
115+
attribute :description, 'The order description', type: 'string', required: false, example: "a description"
114116
115117
get 'Returns a single order' do
116118
explanation "This is used to return orders."
@@ -354,10 +356,12 @@ Feature: Generate API Blueprint documentation from test examples
354356
## Single Order [/orders/{id}]
355357
356358
+ Parameters
357-
+ id: (required, string) - Order id
359+
+ id: 1 (required, string) - Order id
358360
359361
+ Attributes (object)
360-
+ name: (required, string) - The order name
362+
+ name: a name (required) - The order name
363+
+ amount
364+
+ description: a description (string) - The order description
361365
362366
### Deletes a specific order [DELETE]
363367

lib/rspec_api_documentation/views/api_blueprint_index.rb

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ def initialize(index, configuration)
99
def sections
1010
super.map do |section|
1111
routes = section[:examples].group_by(&:route_uri).map do |route_uri, examples|
12-
attrs = examples.map { |example| example.metadata[:attributes] }.flatten.compact.uniq { |attr| attr[:name] }
13-
params = examples.map { |example| example.metadata[:parameters] }.flatten.compact.uniq { |param| param[:name] }
12+
attrs = fields(:attributes, examples)
13+
params = fields(:parameters, examples)
1414

1515
methods = examples.group_by(&:http_method).map do |http_method, examples|
1616
{
@@ -42,6 +42,49 @@ def examples
4242
ApiBlueprintExample.new(example, @configuration)
4343
end
4444
end
45+
46+
private
47+
48+
# APIB has both `parameters` and `attributes`. This generates a hash
49+
# with all of its properties, like name, description, required.
50+
# {
51+
# required: true,
52+
# example: "1",
53+
# type: "string",
54+
# name: "id",
55+
# description: "The id",
56+
# properties_description: "required, string"
57+
# }
58+
def fields(property_name, examples)
59+
examples
60+
.map { |example| example.metadata[property_name] }
61+
.flatten
62+
.compact
63+
.uniq { |property| property[:name] }
64+
.map do |property|
65+
properties = []
66+
properties << "required" if property[:required]
67+
properties << property[:type] if property[:type]
68+
if properties.count > 0
69+
property[:properties_description] = properties.join(", ")
70+
else
71+
property[:properties_description] = nil
72+
end
73+
74+
property[:description] = nil if description_blank?(property)
75+
property
76+
end
77+
end
78+
79+
# When no `description` was specified for a parameter, the DSL class
80+
# is making `description = "#{scope} #{name}"`, which is bad because it
81+
# assumes that all formats want this behavior. To avoid changing there
82+
# and breaking everything, I do my own check here and if description
83+
# equals the name, I assume it is blank.
84+
def description_blank?(property)
85+
!property[:description] ||
86+
property[:description].to_s.strip == property[:name].to_s.strip
87+
end
4588
end
4689
end
4790
end

spec/views/api_blueprint_index_spec.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
let(:rspec_example_posts) do
3939
post_group.route "/posts", "Posts Collection" do
40-
attribute :description, "Order description", required: false
40+
attribute :description, required: false
4141

4242
get("/posts") do
4343
example_request 'Get all posts' do
@@ -105,12 +105,14 @@
105105
type: "string",
106106
name: "id",
107107
description: "The id",
108+
properties_description: "required, string"
108109
}]
109110
expect(post_route[:has_attributes?]).to eq true
110111
expect(post_route[:attributes]).to eq [{
111112
required: true,
112113
name: "name",
113114
description: "Order name 1",
115+
properties_description: "required"
114116
}]
115117

116118
posts_examples = posts_route[:http_methods].map { |http_method| http_method[:examples] }.flatten
@@ -123,7 +125,8 @@
123125
expect(posts_route[:attributes]).to eq [{
124126
required: false,
125127
name: "description",
126-
description: "Order description",
128+
description: nil,
129+
properties_description: nil
127130
}]
128131
end
129132
end

templates/rspec_api_documentation/api_blueprint_index.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ explanation: {{ explanation }}
2525

2626
+ Parameters
2727
{{# parameters }}
28-
+ {{ name }}: ({{# required }}required, {{/ required }}{{ type }}) - {{ description }}
28+
+ {{ name }}{{# example }}: {{ example }}{{/ example }}{{# properties_description }} ({{ properties_description }}){{/ properties_description }}{{# description }} - {{ description }}{{/ description }}
2929
{{/ parameters }}
3030
{{/ has_parameters? }}
3131
{{# has_attributes? }}
3232

3333
+ Attributes (object)
3434
{{# attributes }}
35-
+ {{ name }}: ({{# required }}required, {{/ required }}{{ type }}) - {{ description }}
35+
+ {{ name }}{{# example }}: {{ example }}{{/ example }}{{# properties_description }} ({{ properties_description }}){{/ properties_description }}{{# description }} - {{ description }}{{/ description }}
3636
{{/ attributes }}
3737
{{/ has_attributes? }}
3838
{{# http_methods }}

0 commit comments

Comments
 (0)