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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/lib/postman_doc_generator.rb +133 -0
  4. 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: []