postman_doc_generator 0.1.0
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/README.md +1 -0
- data/lib/postman_doc_generator.rb +133 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f85ff61f6b39a16e78c7c2c4f28339ca31741633
|
4
|
+
data.tar.gz: d348ae263c06c598b32d45d1dfefb4c76bd01310
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '038d203ad6adb813d9860c189f18a42e82a358ac58cb7e0d6f619c38777c600dcb4c69561ec46ee6ba1e1f4c2863d24241bd38fba4e412524467efa821e24b45'
|
7
|
+
data.tar.gz: 355223d845164a9f55aa8dff21b0d6c228ebe0ca350ad778f0217ad83984ee8cdc24bf66da4fba8c46238a985e5e094f3030c04cab548934989af9a26f03932e
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Postman::DocMaker.call(request.method_symbol, path, controller, response)
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class PostmanDocGenerator
|
5
|
+
attr_accessor :result, :error
|
6
|
+
|
7
|
+
def start(http_method, path, controller, response)
|
8
|
+
generator = new(http_method, path, controller, response)
|
9
|
+
generator.call
|
10
|
+
rescue => e
|
11
|
+
generator.error = e
|
12
|
+
ensure
|
13
|
+
generator
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(http_method, path, controller, response)
|
17
|
+
@sample_dir = "#{File.expand_path("#{File.dirname(__FILE__)}/..")}/sample"
|
18
|
+
@http_method = http_method.upcase.to_s
|
19
|
+
@path = path
|
20
|
+
@controller = controller
|
21
|
+
@response = response
|
22
|
+
@file_path = file_path
|
23
|
+
end
|
24
|
+
|
25
|
+
def call
|
26
|
+
get_basic_setting
|
27
|
+
setup_basic_info
|
28
|
+
setup_postman_json
|
29
|
+
save_to_file
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def get_basic_setting
|
35
|
+
env = ENV['RAILS_ENV'] || 'development'
|
36
|
+
string = File.open('config/postman_doc_generator.yml', 'rb') { |f| f.read }
|
37
|
+
fail 'config/postman_doc_generator.yml not existed nor not readable' if string.nil?
|
38
|
+
@config = YAML.load(string)[env]
|
39
|
+
fail 'config/postman_doc_generator.yml incorrect or environment not exist' if @config.nil?
|
40
|
+
result_dir = @config['postman_dir'] || 'result'
|
41
|
+
FileUtils.mkdir_p(result_dir)
|
42
|
+
@file_path = "#{result_dir}/postman.json"
|
43
|
+
end
|
44
|
+
|
45
|
+
def setup_basic_info
|
46
|
+
@params = @controller.params.permit!.to_h.to_json(except: [:format, :controller, :action, :tag, :user_agent])
|
47
|
+
@res_status = @response.status
|
48
|
+
@res_body = @response.body.present? ? JSON.parse(@response.body) : {}
|
49
|
+
data = File.read(@file_path) if File.exist?(@file_path)
|
50
|
+
@postman_data = data.blank? ? JSON.parse(File.read("#{@sample_dir}/doc.json")) : JSON.parse(data)
|
51
|
+
end
|
52
|
+
|
53
|
+
def setup_postman_json
|
54
|
+
levels = @controller.class.name.split('::')
|
55
|
+
@postman_data['item'] = format_with_levels(levels, @postman_data['item'])
|
56
|
+
end
|
57
|
+
|
58
|
+
def save_to_file
|
59
|
+
File.open(@file_path, 'w+') do |f|
|
60
|
+
f.write(@postman_data.to_json)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def format_with_levels(levels, pm_items)
|
65
|
+
first_level = levels.first
|
66
|
+
return format_namespace_requests(pm_items || []) if first_level.nil?
|
67
|
+
pm_item = pm_items.find do |item|
|
68
|
+
item['name'] == first_level
|
69
|
+
end
|
70
|
+
if pm_item.nil?
|
71
|
+
pm_items << {name: first_level, item: format_with_levels(levels[1..-1], [])}
|
72
|
+
else
|
73
|
+
pm_item['item'] = format_with_levels(levels[1..-1], pm_item['item'])
|
74
|
+
end
|
75
|
+
pm_items
|
76
|
+
end
|
77
|
+
|
78
|
+
def format_namespace_requests(namespace_requests)
|
79
|
+
target_req = namespace_requests.find do |r|
|
80
|
+
req = r['request']
|
81
|
+
req['method'] == @http_method && req['url']['raw'] == "#{@config['project_host']}#{@path}"
|
82
|
+
end
|
83
|
+
request = setup_request(target_req)
|
84
|
+
target_req.present? ? (target_req = request) : namespace_requests << request
|
85
|
+
namespace_requests
|
86
|
+
end
|
87
|
+
|
88
|
+
def setup_request(target_req)
|
89
|
+
if @res_status == 200 || target_req.nil?
|
90
|
+
request = JSON.parse(File.read("#{@sample_dir}/request.json"))
|
91
|
+
request['name'] = "#{@http_method} #{@path}"
|
92
|
+
req = request['request']
|
93
|
+
req['method'] = @http_method
|
94
|
+
req['body']['raw'] = @params.to_json
|
95
|
+
req['url']['raw'] = "#{@config['project_host']}#{@path}"
|
96
|
+
req['url']['host'] = [@config['project_host']]
|
97
|
+
req['url']['path'] = @path.split('/').delete_if(&:blank?)
|
98
|
+
else
|
99
|
+
request = target_req
|
100
|
+
end
|
101
|
+
request['response'] = format_responses_of_request(request, target_req&.dig('response') || [])
|
102
|
+
request
|
103
|
+
end
|
104
|
+
|
105
|
+
def format_responses_of_request(request, responses)
|
106
|
+
target_res = responses.find do |res|
|
107
|
+
next false unless res['code'] == @res_status
|
108
|
+
break true if @res_status == 200
|
109
|
+
body = JSON.parse(res['body'])
|
110
|
+
body['error_code'] == @res_body['error_code']
|
111
|
+
end
|
112
|
+
response = setup_response(request['request'], target_res)
|
113
|
+
target_res.present? ? (target_res = response) : responses << response
|
114
|
+
responses
|
115
|
+
end
|
116
|
+
|
117
|
+
def setup_response(request, target_res)
|
118
|
+
response = JSON.parse(File.read("#{@sample_dir}/response.json"))
|
119
|
+
result = @res_status == 200 ? 'Success' : 'Failed'
|
120
|
+
status_text = Rack::Utils::HTTP_STATUS_CODES[@res_status]
|
121
|
+
error_code = " #{@res_body['error_code']}" unless @res_status == 200
|
122
|
+
response['name'] = "#{@http_method} #{@path} #{result} (#{status_text}#{error_code})"
|
123
|
+
response['originalRequest'] = request.except('description')
|
124
|
+
response['status'] = status_text
|
125
|
+
response['code'] = @res_status
|
126
|
+
response['header'] = @response.header.map do |key, value|
|
127
|
+
{key: key, value: value}
|
128
|
+
end
|
129
|
+
response['body'] = @res_body.to_json
|
130
|
+
response
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: postman_doc_generator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- JiaRou
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
description: A Json API Doc Generator of Postman
|
28
|
+
email: laura34963@kdanmobile.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.md
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- lib/postman_doc_generator.rb
|
36
|
+
homepage: https://github.com/laura34963/postman_doc_generator
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options:
|
42
|
+
- "--charset=UTF-8"
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 2.6.1
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.6.13
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: Generate Postman Doc Json After Run Rspec
|
61
|
+
test_files: []
|