rspec_generate_doc 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/rspec_generate_doc/configuration.rb +22 -7
- data/lib/rspec_generate_doc/decorators/action.rb +69 -0
- data/lib/rspec_generate_doc/decorators/parameter.rb +18 -0
- data/lib/rspec_generate_doc/generate_file.rb +52 -0
- data/lib/rspec_generate_doc/library_hooks/doc.rb +15 -7
- data/lib/rspec_generate_doc/templates/slate.md.erb +24 -0
- data/lib/rspec_generate_doc/version.rb +1 -1
- data/lib/rspec_generate_doc.rb +0 -2
- metadata +7 -4
- data/lib/rspec_generate_doc/generate.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f1b535b856bbb662c5c00d849b5eea93f7e5b24
|
4
|
+
data.tar.gz: b0f41dc6755e8ac3383d01174428de31f48517b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00523f36f4afa791dcfd10cee715694453d7e13691be071d88e6c921b3eff5c1e8e98c34b93de709873b644be635c408095c0bf8118bcd40cd39f19034d7af8d
|
7
|
+
data.tar.gz: caa362b4ea165600531ebfaf3e97dbdcab6ca4a523c2c640a2914207642784a7b9a195523bb8d67c47ae2417108f814dfd11c4b84e62d5ceffb9526f6fb2e176
|
data/README.md
CHANGED
@@ -28,6 +28,11 @@ require 'rspec_generate_doc'
|
|
28
28
|
RspecGenerateDoc.configure do |config|
|
29
29
|
config.docs_dir = 'path/to/docs/dir' # default: "#{Rails.root}/docs"
|
30
30
|
config.locale = :ru # default: I18n.default_locale
|
31
|
+
config.action_decorator = My::Cool::ActionDecorator # default: RspecGenerateDoc::Decorators::Action
|
32
|
+
config.parameter_decorator = My::Cool::ParameterDecorator # default: RspecGenerateDoc::Decorators::Parameter
|
33
|
+
config.template_file = '/path/to/my/template.api.erb' # default: "#{File.dirname(__FILE__)}/templates/slate.md.erb"
|
34
|
+
config.file_prefix = 'prefix_to_file_name_' # default: '_'
|
35
|
+
config.file_suffix = '_suffix_to_file_name' # default: ''
|
31
36
|
end
|
32
37
|
```
|
33
38
|
|
@@ -36,7 +41,7 @@ Example use
|
|
36
41
|
``` ruby
|
37
42
|
# spec/controllers/user_controller_spec.rb
|
38
43
|
...
|
39
|
-
let(:
|
44
|
+
let(:api_params) do
|
40
45
|
{
|
41
46
|
id: { description: 'user id', required: true },
|
42
47
|
email: { description: 'user email', required: false }
|
@@ -1,21 +1,36 @@
|
|
1
|
-
require '
|
1
|
+
require 'rspec_generate_doc/decorators/action'
|
2
|
+
require 'rspec_generate_doc/decorators/parameter'
|
2
3
|
|
3
4
|
module RspecGenerateDoc
|
4
5
|
class Configuration
|
6
|
+
attr_writer :docs_dir, :locale, :action_decorator, :parameter_decorator, :template_file, :file_prefix, :file_suffix
|
7
|
+
|
5
8
|
def docs_dir
|
6
9
|
@docs_dir || "#{Rails.root}/docs"
|
7
10
|
end
|
8
11
|
|
9
|
-
def docs_dir=(dir)
|
10
|
-
@docs_dir = dir
|
11
|
-
end
|
12
|
-
|
13
12
|
def locale
|
14
13
|
@locale || I18n.default_locale
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
18
|
-
@
|
16
|
+
def action_decorator
|
17
|
+
@action_decorator || RspecGenerateDoc::Decorators::Action
|
18
|
+
end
|
19
|
+
|
20
|
+
def parameter_decorator
|
21
|
+
@parameter_decorator || RspecGenerateDoc::Decorators::Parameter
|
22
|
+
end
|
23
|
+
|
24
|
+
def template_file
|
25
|
+
@template_file || "#{File.dirname(__FILE__)}/templates/slate.md.erb"
|
26
|
+
end
|
27
|
+
|
28
|
+
def file_prefix
|
29
|
+
@file_prefix || '_'
|
30
|
+
end
|
31
|
+
|
32
|
+
def file_suffix
|
33
|
+
@file_suffix || ''
|
19
34
|
end
|
20
35
|
end
|
21
36
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module RspecGenerateDoc
|
4
|
+
module Decorators
|
5
|
+
class Action
|
6
|
+
attr_reader :name, :response, :params, :options
|
7
|
+
def initialize(data = {})
|
8
|
+
@name = (data[:name] || '').split('#').join(' ')
|
9
|
+
@response = data[:response]
|
10
|
+
@params = to_params(data[:api_params])
|
11
|
+
@options = OpenStruct.new(data[:opntions] || {})
|
12
|
+
end
|
13
|
+
|
14
|
+
def request_method
|
15
|
+
@request_method ||= request.request_method
|
16
|
+
end
|
17
|
+
|
18
|
+
def request_fullpath
|
19
|
+
@request_fullpath ||= request.original_fullpath.split('?').first
|
20
|
+
end
|
21
|
+
|
22
|
+
def host
|
23
|
+
@host ||= request.host
|
24
|
+
end
|
25
|
+
|
26
|
+
def status
|
27
|
+
@status ||= response.status
|
28
|
+
end
|
29
|
+
|
30
|
+
def status_message
|
31
|
+
@status_message ||= response.status_message
|
32
|
+
end
|
33
|
+
|
34
|
+
def status_with_message
|
35
|
+
@status_with_message ||= "#{status} #{status_message}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def content_type
|
39
|
+
@content_type ||= response.content_type
|
40
|
+
end
|
41
|
+
|
42
|
+
def content_type?
|
43
|
+
content_type.present?
|
44
|
+
end
|
45
|
+
|
46
|
+
def body
|
47
|
+
@body ||= json_object.nil? ? response.body.to_s : JSON.pretty_generate(json_object)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def to_params(api_params)
|
53
|
+
api_params.map do |name, value|
|
54
|
+
hash = value.is_a?(Hash) ? value : {}
|
55
|
+
hash[:name] = name unless hash[:name] || hash['name']
|
56
|
+
RspecGenerateDoc.configuration.parameter_decorator.new(hash)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def json_object
|
61
|
+
@json_object ||= JSON.parse(response.body) rescue nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def request
|
65
|
+
@request ||= response.request
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RspecGenerateDoc
|
2
|
+
module Decorators
|
3
|
+
class Parameter
|
4
|
+
attr_reader :name, :required, :description, :options
|
5
|
+
|
6
|
+
def initialize(data = {})
|
7
|
+
@name = data[:name] || data['name']
|
8
|
+
@required = data[:required] || data['required'] || false
|
9
|
+
@description = data[:description] || data['description'] || name || ''
|
10
|
+
@options = OpenStruct.new(data[:options] || data['options'] || {})
|
11
|
+
end
|
12
|
+
|
13
|
+
def required_human
|
14
|
+
description ? I18n.t(:required_yes, scope: :rspec_api_docs) : I18n.t(:required_no, scope: :rspec_api_docs)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module RspecGenerateDoc
|
5
|
+
class GenarateFIle
|
6
|
+
TEMPLATE_EXTNAME = 'erb'.freeze
|
7
|
+
|
8
|
+
attr_reader :actions, :parent
|
9
|
+
|
10
|
+
def initialize(data = {})
|
11
|
+
@actions = data[:actions]
|
12
|
+
@parent = data[:parent]
|
13
|
+
I18n.locale = configuration.locale
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.source_root
|
17
|
+
configuration.docs_dir
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_file_by_template
|
21
|
+
file = File.open(file_path, 'w+')
|
22
|
+
file.write ERB.new(File.binread(configuration.template_file), nil, '-').result(binding)
|
23
|
+
file.close
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def file_path
|
29
|
+
"#{dir}/#{configuration.file_prefix}#{parent_name}#{configuration.file_suffix}.#{file_extension}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def parent_name
|
33
|
+
@parent_name ||= parent.downcase.split('::').join('_')
|
34
|
+
end
|
35
|
+
|
36
|
+
def template_name
|
37
|
+
@template_name ||= configuration.template_file.split('/').last
|
38
|
+
end
|
39
|
+
|
40
|
+
def file_extension
|
41
|
+
@file_extension ||= template_name.sub(/#{TEMPLATE_EXTNAME}$/, "").split('.').last
|
42
|
+
end
|
43
|
+
|
44
|
+
def dir
|
45
|
+
@dir ||= FileUtils.mkdir_p(configuration.docs_dir).join('')
|
46
|
+
end
|
47
|
+
|
48
|
+
def configuration
|
49
|
+
@configuration ||= RspecGenerateDoc.configuration
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,29 +1,37 @@
|
|
1
1
|
require 'rspec/rails'
|
2
|
-
require 'rspec_generate_doc/
|
2
|
+
require 'rspec_generate_doc/generate_file'
|
3
|
+
require 'rspec_generate_doc/decorators/action'
|
3
4
|
|
4
5
|
module RspecGenerateDoc
|
5
6
|
module LibraryHooks
|
6
7
|
module Doc
|
7
8
|
::RSpec.configure do |config|
|
8
9
|
config.before(:context) do
|
9
|
-
@
|
10
|
+
@actions = []
|
11
|
+
@is_correct_type = self.class.metadata[:type] == :controller
|
10
12
|
end
|
11
13
|
|
12
14
|
config.after(:each) do
|
13
|
-
|
15
|
+
next unless @is_correct_type
|
16
|
+
name = self.class.description
|
14
17
|
parent = self.class.parent
|
15
18
|
loop do
|
16
19
|
break if parent.nil? || parent.description == self.class.top_level_description
|
17
|
-
|
20
|
+
name = "#{parent.description} #{name}"
|
18
21
|
parent = parent.parent
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
24
|
+
next if try(:skip_this) || @skip_this
|
25
|
+
api_params = try(:api_params) || @api_params || {}
|
26
|
+
opntions = try(:api_opntions) || @api_opntions || {}
|
27
|
+
@actions << RspecGenerateDoc.configuration.action_decorator
|
28
|
+
.new(name: name, response: response, api_params: api_params, options: opntions)
|
23
29
|
end
|
24
30
|
|
25
31
|
config.after(:context) do
|
26
|
-
|
32
|
+
next unless @is_correct_type
|
33
|
+
parent = self.class.top_level_description
|
34
|
+
RspecGenerateDoc::GenarateFIle.new(parent: parent, actions: @actions).create_file_by_template
|
27
35
|
end
|
28
36
|
end
|
29
37
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# <%= parent %>
|
2
|
+
|
3
|
+
<% actions.each do |action| -%>
|
4
|
+
#<%= action.name %>
|
5
|
+
|
6
|
+
```http
|
7
|
+
<%= action.request_method %> <%= action.request_fullpath %> HTTP/1.1
|
8
|
+
Host: <%= action.host %>
|
9
|
+
User-Agent: ExampleClient/1.0.0
|
10
|
+
``
|
11
|
+
```http
|
12
|
+
HTTP/1.1 <%= action.status %> <%= action.status_message %>
|
13
|
+
<% if action.content_type? -%>
|
14
|
+
Content-Type: <%= action.content_type %>
|
15
|
+
<% end -%>
|
16
|
+
<%= action.body %>
|
17
|
+
```
|
18
|
+
<%= I18n.t(:parameter, scope: :rspec_api_docs) %> | <%= I18n.t(:required, scope: :rspec_api_docs) %> | <%= I18n.t(:description, scope: :rspec_api_docs) %>
|
19
|
+
-------- | ------- | -------
|
20
|
+
<% action.params.each do |parametr| -%>
|
21
|
+
<%= parametr.name %> | <%= parametr.required_human %> | <%= parametr.description %>
|
22
|
+
<% end -%>
|
23
|
+
|
24
|
+
<% end -%>
|
data/lib/rspec_generate_doc.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec_generate_doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Kutyavin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,8 +71,11 @@ files:
|
|
71
71
|
- config/locales/ru.yml
|
72
72
|
- lib/rspec_generate_doc.rb
|
73
73
|
- lib/rspec_generate_doc/configuration.rb
|
74
|
-
- lib/rspec_generate_doc/
|
74
|
+
- lib/rspec_generate_doc/decorators/action.rb
|
75
|
+
- lib/rspec_generate_doc/decorators/parameter.rb
|
76
|
+
- lib/rspec_generate_doc/generate_file.rb
|
75
77
|
- lib/rspec_generate_doc/library_hooks/doc.rb
|
78
|
+
- lib/rspec_generate_doc/templates/slate.md.erb
|
76
79
|
- lib/rspec_generate_doc/version.rb
|
77
80
|
- rspec_generate_doc.gemspec
|
78
81
|
homepage: https://github.com/jokius/rspec_generate_doc
|
@@ -95,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
98
|
version: '0'
|
96
99
|
requirements: []
|
97
100
|
rubyforge_project:
|
98
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.6.11
|
99
102
|
signing_key:
|
100
103
|
specification_version: 4
|
101
104
|
summary: Generate documentation api of rspec tests
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
|
-
module RspecGenerateDoc
|
4
|
-
class Genarate
|
5
|
-
attr_reader :parent, :methods_hash
|
6
|
-
|
7
|
-
def initialize(parent, methods_hash)
|
8
|
-
@parent = parent
|
9
|
-
@methods_hash = methods_hash
|
10
|
-
I18n.locale = RspecGenerateDoc.configuration.locale
|
11
|
-
create_file
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def dir
|
17
|
-
@dir ||= FileUtils.mkdir_p(RspecGenerateDoc.configuration.docs_dir).join('')
|
18
|
-
end
|
19
|
-
|
20
|
-
def create_file
|
21
|
-
file = File.open("#{dir}/_#{parent_name}.md", 'w+')
|
22
|
-
file.write file_text
|
23
|
-
file.close
|
24
|
-
end
|
25
|
-
|
26
|
-
def parent_name
|
27
|
-
@parent_name ||= parent.downcase.split('::').join('_')
|
28
|
-
end
|
29
|
-
|
30
|
-
def file_text
|
31
|
-
file_text = "# #{parent}\r\n\r\n"
|
32
|
-
methods_hash.each do |key, method|
|
33
|
-
response = method[:response]
|
34
|
-
request = response.request
|
35
|
-
file_text += "##{key.split('#').join(' ')}\r\n\r\n"\
|
36
|
-
"```http\r\n"\
|
37
|
-
"#{request.request_method} #{request.original_fullpath.split('?').first} HTTP/1.1\r\n"\
|
38
|
-
"Host: #{response.request.host}\r\n"\
|
39
|
-
"User-Agent: ExampleClient/1.0.0\r\n"\
|
40
|
-
"```\r\n\r\n"\
|
41
|
-
"```http\r\n"\
|
42
|
-
"HTTP/1.1 #{response.status} #{response.status_message}\r\n"
|
43
|
-
file_text += "Content-Type: #{response.content_type}\r\n\r\n" if response.content_type.present?
|
44
|
-
if response.body.present?
|
45
|
-
object = begin
|
46
|
-
JSON.parse(response.body)
|
47
|
-
rescue
|
48
|
-
nil
|
49
|
-
end
|
50
|
-
body = object.nil? ? response.body : JSON.pretty_generate(object)
|
51
|
-
file_text += "#{body}\r\n" if response.body.present?
|
52
|
-
end
|
53
|
-
|
54
|
-
file_text += "```\r\n\r\n"\
|
55
|
-
"#{I18n.t(:parameter, scope: :rspec_api_docs)} | #{I18n.t(:required, scope: :rspec_api_docs)} | #{I18n.t(:description, scope: :rspec_api_docs)}\r\n"\
|
56
|
-
"-------- | ------- | -------\r\n"
|
57
|
-
file_text += params_to_text(request, method[:params])
|
58
|
-
file_text += "\r\n\r\n"
|
59
|
-
end
|
60
|
-
|
61
|
-
file_text
|
62
|
-
end
|
63
|
-
|
64
|
-
def params_to_text(request, params)
|
65
|
-
file_text = ''
|
66
|
-
request.params.except(*%i(controller action format)).each do |name, _|
|
67
|
-
hash = params[name.to_sym] || {}
|
68
|
-
hash = {} unless hash.is_a? Hash
|
69
|
-
required = hash[:required] ? I18n.t(:required_yes, scope: :rspec_api_docs) : I18n.t(:required_no, scope: :rspec_api_docs)
|
70
|
-
description = hash[:description] || name
|
71
|
-
file_text += "#{name} | #{required} | #{description}\r\n"
|
72
|
-
end
|
73
|
-
|
74
|
-
file_text
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|