rspec-api-blueprint-formatter 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/api_blueprint.rb +130 -0
- data/spec/rspec/api/blueprint/formatter_spec.rb +7 -0
- data/spec/spec_helper.rb +2 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b6dfeb563d5f0d7faae44cb720d625abfa25d91e
|
4
|
+
data.tar.gz: b9ffaabf36aeae46b20de087661323963c692ae0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f96c797447ae5f70ef8999a630c9e61f4dd0fb6f8911c85927340c3b7fe987a65709739e6ce696740d1e3ada62147fb7aa8a6da981b4d6b402a513db3d002b4
|
7
|
+
data.tar.gz: 26d68c0902c8a2c74cc78f88636d777ec76f68c3dfc3100b72f9954efc47dedba1f728d8b1ca05982eeeea2045a2a0086b521b25892e9759d9cf1dc0920bdd5d
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "api_blueprint_formatter"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'rspec/core/formatters/base_text_formatter'
|
3
|
+
|
4
|
+
class ApiBlueprint < RSpec::Core::Formatters::BaseTextFormatter
|
5
|
+
VERSION = "0.1.0"
|
6
|
+
RSpec::Core::Formatters.register self, :example_passed, :example_started, :stop
|
7
|
+
|
8
|
+
def initialize(output)
|
9
|
+
super
|
10
|
+
@passed_examples = {}
|
11
|
+
@group_level = 0
|
12
|
+
end
|
13
|
+
|
14
|
+
def example_started(notification)
|
15
|
+
@example_group_instance = notification.example.example_group_instance
|
16
|
+
end
|
17
|
+
|
18
|
+
def example_passed(passed)
|
19
|
+
metadata = passed.example.metadata
|
20
|
+
|
21
|
+
if metadata[:apidoc] &&
|
22
|
+
metadata[:resource_group] &&
|
23
|
+
metadata[:resource] &&
|
24
|
+
metadata[:action] &&
|
25
|
+
metadata[:action_description]
|
26
|
+
|
27
|
+
request = @example_group_instance.request
|
28
|
+
response = @example_group_instance.response
|
29
|
+
description = description_array_from(passed.example.metadata).reverse.join(' ').gsub(/[\(\)]/, '..')
|
30
|
+
|
31
|
+
@passed_examples.deep_merge!({
|
32
|
+
metadata[:resource_group] => {
|
33
|
+
metadata[:resource] => {
|
34
|
+
metadata[:action] => {
|
35
|
+
description: metadata[:action_description],
|
36
|
+
examples: {
|
37
|
+
description => {
|
38
|
+
request: {
|
39
|
+
parameters: request.parameters.except(*request.path_parameters.keys.map(&:to_s)).to_json,
|
40
|
+
format: request.format
|
41
|
+
},
|
42
|
+
source: passed.example.instance_variable_get(:@example_block).source,
|
43
|
+
location: metadata[:location],
|
44
|
+
response: {
|
45
|
+
status: response.status,
|
46
|
+
body: response.body
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
})
|
54
|
+
end
|
55
|
+
@example_group_instance = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def stop(notification)
|
59
|
+
@passed_examples.sort_by { |k,v| k }.each do |resource_group_name, resource_group_resources|
|
60
|
+
print_resource_group(resource_group_name, resource_group_resources)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def print_resource_group(resource_group_name, resource_group_resources)
|
67
|
+
output.puts "# Group #{resource_group_name}"
|
68
|
+
resource_group_resources.each &method(:print_resource)
|
69
|
+
end
|
70
|
+
|
71
|
+
def print_resource(resource_name, actions)
|
72
|
+
unless resource_name =~ /^[^\[\]]*\[\/[^\]]+\]/
|
73
|
+
raise "resoure: '#{resource_name}' is invalid. :resource needs to be specified according to https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md#resource-section"
|
74
|
+
end
|
75
|
+
output.puts "# #{resource_name}"
|
76
|
+
|
77
|
+
http_verbs = actions.keys.map {|action| action.scan(/\[([A-Z]+)\]/).flatten[0] }
|
78
|
+
|
79
|
+
unless http_verbs.length == http_verbs.uniq.length
|
80
|
+
raise "Action HTTP verbs are not unique #{actions.keys.inspect} for resource: '#{resource_name}'"
|
81
|
+
end
|
82
|
+
|
83
|
+
actions.each &method(:print_action)
|
84
|
+
end
|
85
|
+
|
86
|
+
def print_action(action_name, action_meta_data)
|
87
|
+
output.puts "## #{action_name}\n" \
|
88
|
+
"\n" \
|
89
|
+
"#{action_meta_data[:description]}\n" \
|
90
|
+
"\n" \
|
91
|
+
|
92
|
+
action_meta_data[:examples].each &method(:print_example)
|
93
|
+
end
|
94
|
+
|
95
|
+
def print_example(example_description, example_metadata)
|
96
|
+
output.puts "+ Request #{example_description}\n" \
|
97
|
+
"\n" \
|
98
|
+
" #{example_metadata[:request][:parameters]}\n" \
|
99
|
+
" \n" \
|
100
|
+
" Location: #{example_metadata[:location]}\n" \
|
101
|
+
" Source code:\n" \
|
102
|
+
" \n" \
|
103
|
+
"#{indent_lines(8, example_metadata[:source])}\n" \
|
104
|
+
"\n"
|
105
|
+
|
106
|
+
output.puts "+ Response #{example_metadata[:response][:status]} (#{example_metadata[:request][:format]})\n" \
|
107
|
+
"\n" \
|
108
|
+
" #{example_metadata[:response][:body]}\n" \
|
109
|
+
"\n"
|
110
|
+
end
|
111
|
+
|
112
|
+
# To include the descriptions of all the contexts that are below the action
|
113
|
+
# group, but not including resource/resource_group descriptions
|
114
|
+
def description_array_from(example_metadata)
|
115
|
+
parent = example_metadata[:parent_example_group] if example_metadata.key?(:parent_example_group)
|
116
|
+
parent ||= example_metadata[:example_group] if example_metadata.key?(:example_group)
|
117
|
+
if parent[:action].nil?
|
118
|
+
[]
|
119
|
+
else
|
120
|
+
[example_metadata[:description]] + description_array_from(parent)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def indent_lines(number_of_spaces, string)
|
125
|
+
string
|
126
|
+
.split("\n")
|
127
|
+
.map { |a| a.prepend(' ' * number_of_spaces) }
|
128
|
+
.join("\n")
|
129
|
+
end
|
130
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-api-blueprint-formatter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nam Chu Hoai
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.3'
|
55
|
+
description: Use your Rspec tests to build your API documentation
|
56
|
+
email:
|
57
|
+
- nambrot@googlemail.com
|
58
|
+
executables:
|
59
|
+
- console
|
60
|
+
- setup
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- bin/console
|
65
|
+
- bin/setup
|
66
|
+
- lib/api_blueprint.rb
|
67
|
+
- spec/rspec/api/blueprint/formatter_spec.rb
|
68
|
+
- spec/spec_helper.rb
|
69
|
+
homepage: https://github.com/nambrot/rspec-api-blueprint-formatter
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata:
|
73
|
+
allowed_push_host: https://rubygems.org
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 2.4.5.1
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Use your Rspec tests to build your API documentation
|
94
|
+
test_files:
|
95
|
+
- spec/rspec/api/blueprint/formatter_spec.rb
|
96
|
+
- spec/spec_helper.rb
|