rpdoc 0.1.16 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +4 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +87 -58
- data/README.md +20 -6
- data/Rakefile +4 -1
- data/VERSION.md +1 -1
- data/lib/generators/templates/initializer.rb +14 -2
- data/lib/rpdoc/configuration.rb +16 -1
- data/lib/rpdoc/helper.rb +7 -1
- data/lib/rpdoc/postman_collection.rb +57 -22
- data/lib/rpdoc/postman_response.rb +10 -6
- data/lib/rpdoc/railtie.rb +14 -0
- data/lib/rpdoc/rpdoc.rake +5 -1
- data/lib/rpdoc/version.rb +1 -1
- data/lib/rpdoc.rb +2 -0
- data/rpdoc.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 614c1855e12f3279570419fc23b7ce0af9849a4f2a8cf9a333b8f53013927cde
|
4
|
+
data.tar.gz: f0b61a84a3e26b447227368ccd2fae5e4723f4d15c2b75b42df569b005fd057b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dd60eaf51e2c3a466782a13c028a0a1f4ff99540b73c435ae7b9e4b4c22893bfdb7a405906639995d017d21a3906fae066d5e536ccc3cc91820921603806be6
|
7
|
+
data.tar.gz: c6e1c5cb2c221f484905182f112151621d73c2226b9383d26d60f63df8287a807e6ef49a50e53fa3897de79af3f1d9fc39bf47532481800e47b392435318f46d
|
data/.gitlab-ci.yml
CHANGED
@@ -5,6 +5,8 @@ stages:
|
|
5
5
|
rspec:
|
6
6
|
stage: rspec
|
7
7
|
image: ruby:3.2.1
|
8
|
+
tags:
|
9
|
+
- arm64
|
8
10
|
script:
|
9
11
|
- bundle install
|
10
12
|
- RPDOC_ENABLE=false rspec spec -fd
|
@@ -14,6 +16,8 @@ rspec:
|
|
14
16
|
to_gem:
|
15
17
|
stage: publish
|
16
18
|
image: ruby:3.2.1
|
19
|
+
tags:
|
20
|
+
- arm64
|
17
21
|
script:
|
18
22
|
- mkdir -p ~/.gem
|
19
23
|
- touch ~/.gem/credentials
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## [0.2.1] - 2024-04-11
|
2
|
+
- Fix `rspec_response_identifier` option bug.
|
3
|
+
- Fix path bug for redirected requests and `push_and_update` strategy.
|
4
|
+
|
5
|
+
## [0.2.0] - 2024-04-02
|
6
|
+
- Add `rspec_root`, `rspec_response_allow_headers`, and `rspec_response_identifier` options to configuration.
|
7
|
+
- Add public method `merge!` for PostmanCollection.
|
8
|
+
- Fix rake usage.
|
9
|
+
- Refactor.
|
10
|
+
|
1
11
|
## [0.1.16] - 2023-06-01
|
2
12
|
- Fix default rpdoc_example_folders bug.
|
3
13
|
|
data/Gemfile.lock
CHANGED
@@ -1,116 +1,145 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rpdoc (0.
|
4
|
+
rpdoc (0.2.0)
|
5
|
+
activesupport (~> 6.1)
|
5
6
|
json_requester (~> 1.0)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
9
10
|
specs:
|
10
|
-
actionpack (6.1.7)
|
11
|
-
actionview (= 6.1.7)
|
12
|
-
activesupport (= 6.1.7)
|
11
|
+
actionpack (6.1.7.6)
|
12
|
+
actionview (= 6.1.7.6)
|
13
|
+
activesupport (= 6.1.7.6)
|
13
14
|
rack (~> 2.0, >= 2.0.9)
|
14
15
|
rack-test (>= 0.6.3)
|
15
16
|
rails-dom-testing (~> 2.0)
|
16
17
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
17
|
-
actionview (6.1.7)
|
18
|
-
activesupport (= 6.1.7)
|
18
|
+
actionview (6.1.7.6)
|
19
|
+
activesupport (= 6.1.7.6)
|
19
20
|
builder (~> 3.1)
|
20
21
|
erubi (~> 1.4)
|
21
22
|
rails-dom-testing (~> 2.0)
|
22
23
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
23
|
-
activesupport (6.1.7)
|
24
|
+
activesupport (6.1.7.6)
|
24
25
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
25
26
|
i18n (>= 1.6, < 2)
|
26
27
|
minitest (>= 5.1)
|
27
28
|
tzinfo (~> 2.0)
|
28
29
|
zeitwerk (~> 2.3)
|
29
30
|
ast (2.4.2)
|
31
|
+
base64 (0.1.1)
|
30
32
|
builder (3.2.4)
|
31
33
|
coderay (1.1.3)
|
32
|
-
concurrent-ruby (1.
|
34
|
+
concurrent-ruby (1.2.2)
|
33
35
|
crass (1.0.6)
|
34
36
|
diff-lcs (1.5.0)
|
35
|
-
erubi (1.
|
36
|
-
faraday (
|
37
|
-
faraday-
|
37
|
+
erubi (1.12.0)
|
38
|
+
faraday (1.10.3)
|
39
|
+
faraday-em_http (~> 1.0)
|
40
|
+
faraday-em_synchrony (~> 1.0)
|
41
|
+
faraday-excon (~> 1.1)
|
42
|
+
faraday-httpclient (~> 1.0)
|
43
|
+
faraday-multipart (~> 1.0)
|
44
|
+
faraday-net_http (~> 1.0)
|
45
|
+
faraday-net_http_persistent (~> 1.0)
|
46
|
+
faraday-patron (~> 1.0)
|
47
|
+
faraday-rack (~> 1.0)
|
48
|
+
faraday-retry (~> 1.0)
|
38
49
|
ruby2_keywords (>= 0.0.4)
|
39
|
-
faraday-
|
40
|
-
|
50
|
+
faraday-em_http (1.0.0)
|
51
|
+
faraday-em_synchrony (1.0.0)
|
52
|
+
faraday-excon (1.1.0)
|
53
|
+
faraday-httpclient (1.0.1)
|
54
|
+
faraday-multipart (1.0.4)
|
55
|
+
multipart-post (~> 2)
|
56
|
+
faraday-net_http (1.0.1)
|
57
|
+
faraday-net_http_persistent (1.2.0)
|
58
|
+
faraday-patron (1.0.0)
|
59
|
+
faraday-rack (1.0.0)
|
60
|
+
faraday-retry (1.0.3)
|
61
|
+
i18n (1.14.1)
|
41
62
|
concurrent-ruby (~> 1.0)
|
42
|
-
json (2.6.
|
43
|
-
json_requester (1.0
|
44
|
-
faraday (>= 1.0.0)
|
45
|
-
|
63
|
+
json (2.6.3)
|
64
|
+
json_requester (1.1.0)
|
65
|
+
faraday (~> 1.0, >= 1.0.0)
|
66
|
+
language_server-protocol (3.17.0.3)
|
67
|
+
loofah (2.21.3)
|
46
68
|
crass (~> 1.0.2)
|
47
|
-
nokogiri (>= 1.
|
69
|
+
nokogiri (>= 1.12.0)
|
48
70
|
method_source (1.0.0)
|
49
|
-
minitest (5.
|
50
|
-
|
71
|
+
minitest (5.19.0)
|
72
|
+
multipart-post (2.4.0)
|
73
|
+
nokogiri (1.15.4-arm64-darwin)
|
51
74
|
racc (~> 1.4)
|
52
|
-
nokogiri (1.
|
75
|
+
nokogiri (1.15.4-x86_64-darwin)
|
53
76
|
racc (~> 1.4)
|
54
|
-
parallel (1.
|
55
|
-
parser (3.
|
77
|
+
parallel (1.23.0)
|
78
|
+
parser (3.2.2.3)
|
56
79
|
ast (~> 2.4.1)
|
57
|
-
|
80
|
+
racc
|
81
|
+
pry (0.14.2)
|
58
82
|
coderay (~> 1.1)
|
59
83
|
method_source (~> 1.0)
|
60
|
-
racc (1.
|
61
|
-
rack (2.2.
|
62
|
-
rack-test (2.0
|
84
|
+
racc (1.7.1)
|
85
|
+
rack (2.2.8)
|
86
|
+
rack-test (2.1.0)
|
63
87
|
rack (>= 1.3)
|
64
|
-
rails-dom-testing (2.0
|
65
|
-
activesupport (>=
|
88
|
+
rails-dom-testing (2.2.0)
|
89
|
+
activesupport (>= 5.0.0)
|
90
|
+
minitest
|
66
91
|
nokogiri (>= 1.6)
|
67
|
-
rails-html-sanitizer (1.
|
68
|
-
loofah (~> 2.
|
69
|
-
|
70
|
-
|
71
|
-
|
92
|
+
rails-html-sanitizer (1.6.0)
|
93
|
+
loofah (~> 2.21)
|
94
|
+
nokogiri (~> 1.14)
|
95
|
+
railties (6.1.7.6)
|
96
|
+
actionpack (= 6.1.7.6)
|
97
|
+
activesupport (= 6.1.7.6)
|
72
98
|
method_source
|
73
99
|
rake (>= 12.2)
|
74
100
|
thor (~> 1.0)
|
75
101
|
rainbow (3.1.1)
|
76
102
|
rake (13.0.6)
|
77
|
-
regexp_parser (2.
|
78
|
-
rexml (3.2.
|
79
|
-
rspec (3.
|
80
|
-
rspec-core (~> 3.
|
81
|
-
rspec-expectations (~> 3.
|
82
|
-
rspec-mocks (~> 3.
|
83
|
-
rspec-core (3.
|
84
|
-
rspec-support (~> 3.
|
85
|
-
rspec-expectations (3.
|
103
|
+
regexp_parser (2.8.1)
|
104
|
+
rexml (3.2.6)
|
105
|
+
rspec (3.12.0)
|
106
|
+
rspec-core (~> 3.12.0)
|
107
|
+
rspec-expectations (~> 3.12.0)
|
108
|
+
rspec-mocks (~> 3.12.0)
|
109
|
+
rspec-core (3.12.2)
|
110
|
+
rspec-support (~> 3.12.0)
|
111
|
+
rspec-expectations (3.12.3)
|
86
112
|
diff-lcs (>= 1.2.0, < 2.0)
|
87
|
-
rspec-support (~> 3.
|
88
|
-
rspec-mocks (3.
|
113
|
+
rspec-support (~> 3.12.0)
|
114
|
+
rspec-mocks (3.12.6)
|
89
115
|
diff-lcs (>= 1.2.0, < 2.0)
|
90
|
-
rspec-support (~> 3.
|
91
|
-
rspec-support (3.
|
92
|
-
rubocop (1.
|
116
|
+
rspec-support (~> 3.12.0)
|
117
|
+
rspec-support (3.12.1)
|
118
|
+
rubocop (1.56.2)
|
119
|
+
base64 (~> 0.1.1)
|
93
120
|
json (~> 2.3)
|
121
|
+
language_server-protocol (>= 3.17.0)
|
94
122
|
parallel (~> 1.10)
|
95
|
-
parser (>= 3.
|
123
|
+
parser (>= 3.2.2.3)
|
96
124
|
rainbow (>= 2.2.2, < 4.0)
|
97
125
|
regexp_parser (>= 1.8, < 3.0)
|
98
126
|
rexml (>= 3.2.5, < 4.0)
|
99
|
-
rubocop-ast (>= 1.
|
127
|
+
rubocop-ast (>= 1.28.1, < 2.0)
|
100
128
|
ruby-progressbar (~> 1.7)
|
101
|
-
unicode-display_width (>=
|
102
|
-
rubocop-ast (1.
|
103
|
-
parser (>= 3.
|
104
|
-
ruby-progressbar (1.
|
129
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
130
|
+
rubocop-ast (1.29.0)
|
131
|
+
parser (>= 3.2.1.0)
|
132
|
+
ruby-progressbar (1.13.0)
|
105
133
|
ruby2_keywords (0.0.5)
|
106
|
-
thor (1.2.
|
107
|
-
tzinfo (2.0.
|
134
|
+
thor (1.2.2)
|
135
|
+
tzinfo (2.0.6)
|
108
136
|
concurrent-ruby (~> 1.0)
|
109
|
-
unicode-display_width (2.
|
110
|
-
zeitwerk (2.6.
|
137
|
+
unicode-display_width (2.4.2)
|
138
|
+
zeitwerk (2.6.11)
|
111
139
|
|
112
140
|
PLATFORMS
|
113
141
|
arm64-darwin-20
|
142
|
+
arm64-darwin-22
|
114
143
|
x86_64-darwin-19
|
115
144
|
|
116
145
|
DEPENDENCIES
|
data/README.md
CHANGED
@@ -50,14 +50,23 @@ Rpdoc.configure do |config|
|
|
50
50
|
|
51
51
|
# (Optional) Collection name.
|
52
52
|
config.collection_name = 'Rpdoc'
|
53
|
+
|
54
|
+
# (Optional) Specs in folder are used for json data generation.
|
55
|
+
config.rspec_root = 'rspec'
|
53
56
|
|
54
57
|
# (Optional) Your Rails server API host.
|
55
58
|
config.rspec_server_host = '{{server_host}}'
|
56
59
|
|
57
|
-
# (Optional) Since Rspec generates many noisy headers, you can filter them.
|
60
|
+
# (Optional) Since Rspec generates many noisy request headers, you can filter them.
|
58
61
|
config.rspec_request_allow_headers = ['User-Agent', 'Content-Type', 'Authorization']
|
59
62
|
|
60
|
-
# (Optional)
|
63
|
+
# (Optional) Since Rspec generates many noisy response headers, you can filter them.
|
64
|
+
config.rspec_response_allow_headers = ['Content-Type', 'Content-Length', 'Location']
|
65
|
+
|
66
|
+
# (Optional) Rspec response identifier, including :rspec_location and nil.
|
67
|
+
config.rspec_response_identifier = :rspec_location
|
68
|
+
|
69
|
+
# (Optional) Root folder where Rpdoc saves generated json data.
|
61
70
|
config.rpdoc_root = 'rpdoc'
|
62
71
|
|
63
72
|
# (Optional) Filename to store RSpec request json data.
|
@@ -76,6 +85,9 @@ Rpdoc.configure do |config|
|
|
76
85
|
config.rpdoc_clean_empty_folders = true
|
77
86
|
config.rpdoc_clean_empty_folders_except = []
|
78
87
|
|
88
|
+
# (Optional) Folder ordering, including :asc, :desc, and custom array.
|
89
|
+
config.rpdoc_folder_ordering = :asc
|
90
|
+
|
79
91
|
# (Optional) Auto push strategy, including :push_and_create and :push_and_update
|
80
92
|
config.rpdoc_auto_push_strategy = :push_and_create
|
81
93
|
end
|
@@ -83,16 +95,16 @@ end
|
|
83
95
|
|
84
96
|
## Usage
|
85
97
|
|
86
|
-
`Rpdoc` only supports RSpec examples with [request](https://
|
98
|
+
`Rpdoc` only supports RSpec examples with [request](https://rspec.info/features/6-1/rspec-rails/request-specs/request-spec/) type.
|
87
99
|
|
88
|
-
1. Include [shared_context](https://
|
100
|
+
1. Include [shared_context](https://rspec.info/features/3-13/rspec-core/example-groups/shared-context/) in your spec to make `Rpdoc` identify which examples to transform.
|
89
101
|
```ruby
|
90
102
|
RSpec.describe 'POST /api/v1/books', type: :request do
|
91
103
|
include_context 'rpdoc'
|
92
104
|
...
|
93
105
|
end
|
94
106
|
```
|
95
|
-
2.
|
107
|
+
2. Customize your example [metdata](https://rspec.info/features/3-13/rspec-core/metadata/user-defined/) to generate collection data in your preferenced format.
|
96
108
|
```ruby
|
97
109
|
it 'should return 200' do |example|
|
98
110
|
# Request identifier.
|
@@ -132,9 +144,11 @@ end
|
|
132
144
|
|
133
145
|
4. You can write description for your Postman collection by creating markdown files (named `description.md`) and putting each of them in corresponding location under `rpdoc` folder.
|
134
146
|
|
147
|
+
5. You can manually push your collection to the Postman server through `rake rpdoc:push`.
|
148
|
+
|
135
149
|
## Notice
|
136
150
|
|
137
|
-
If you try to mock the `File.open` method, generating collection data will fail because creating `request.json`
|
151
|
+
If you try to mock the `File.open` method, generating collection data will fail because creating `request.json` uses the `File.open` method.
|
138
152
|
|
139
153
|
Solution:
|
140
154
|
|
data/Rakefile
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "bundler/
|
3
|
+
require "bundler/setup"
|
4
4
|
require "rubocop/rake_task"
|
5
5
|
|
6
6
|
RuboCop::RakeTask.new
|
7
7
|
|
8
8
|
task default: :rubocop
|
9
|
+
|
10
|
+
path = File.expand_path(__dir__)
|
11
|
+
Dir.glob("#{path}/lib/rpdoc/**/*.rake").each { |f| import f }
|
data/VERSION.md
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
@@ -16,14 +16,23 @@ Rpdoc.configure do |config|
|
|
16
16
|
|
17
17
|
# (Optional) Collection name.
|
18
18
|
# config.collection_name = 'Rpdoc'
|
19
|
+
|
20
|
+
# (Optional) Specs in folder are used for json data generation.
|
21
|
+
# config.rspec_root = 'spec'
|
19
22
|
|
20
23
|
# (Optional) Your Rails server API host.
|
21
24
|
# config.rspec_server_host = '{{server_host}}'
|
22
25
|
|
23
|
-
# (Optional) Since Rspec generates many noisy headers, you can filter them.
|
26
|
+
# (Optional) Since Rspec generates many noisy request headers, you can filter them.
|
24
27
|
# config.rspec_request_allow_headers = ['User-Agent', 'Content-Type', 'Authorization']
|
25
28
|
|
26
|
-
# (Optional)
|
29
|
+
# (Optional) Since Rspec generates many noisy response headers, you can filter them.
|
30
|
+
# config.rspec_response_allow_headers = ['Content-Type', 'Content-Length', 'Location']
|
31
|
+
|
32
|
+
# (Optional) Rspec response identifier, including :rspec_location and nil.
|
33
|
+
# config.rspec_response_identifier = :rspec_location
|
34
|
+
|
35
|
+
# (Optional) Root folder where Rpdoc saves generated json data.
|
27
36
|
# config.rpdoc_root = 'rpdoc'
|
28
37
|
|
29
38
|
# (Optional) Filename to store RSpec request json data.
|
@@ -39,6 +48,9 @@ Rpdoc.configure do |config|
|
|
39
48
|
# config.rpdoc_clean_empty_folders = true
|
40
49
|
# config.rpdoc_clean_empty_folders_except = []
|
41
50
|
|
51
|
+
# (Optional) Folder ordering, including :asc, :desc, and custom array.
|
52
|
+
# config.rpdoc_folder_ordering = :asc
|
53
|
+
|
42
54
|
# (Optional) Auto push collection to Postman server or not.
|
43
55
|
# config.rpdoc_auto_push = false
|
44
56
|
|
data/lib/rpdoc/configuration.rb
CHANGED
@@ -13,17 +13,25 @@ module Rpdoc
|
|
13
13
|
:collection_workspace,
|
14
14
|
:collection_uid,
|
15
15
|
:collection_name,
|
16
|
+
:rspec_root,
|
16
17
|
:rspec_server_host,
|
17
18
|
:rspec_request_allow_headers,
|
19
|
+
:rspec_response_allow_headers,
|
20
|
+
:rspec_response_identifier,
|
18
21
|
:rpdoc_root,
|
19
22
|
:rpdoc_request_filename,
|
20
23
|
:rpdoc_description_filename,
|
21
24
|
:rpdoc_collection_filename,
|
22
25
|
:rpdoc_clean_empty_folders,
|
23
26
|
:rpdoc_clean_empty_folders_except,
|
27
|
+
:rpdoc_folder_ordering,
|
24
28
|
:rpdoc_auto_push,
|
25
29
|
:rpdoc_auto_push_strategy
|
26
30
|
|
31
|
+
RSPEC_RESPONSE_IDENTIFIERS = [:rspec_location, nil].freeze
|
32
|
+
RPDOC_FOLDER_ORDERING = [:asc, :desc].freeze
|
33
|
+
RPDOC_AUTO_PUSH_STRATEGIES = [:push_and_create, :push_and_update].freeze
|
34
|
+
|
27
35
|
def initialize
|
28
36
|
@rpdoc_enable = ENV['RPDOC_ENABLE'] != 'false'
|
29
37
|
|
@@ -36,8 +44,11 @@ module Rpdoc
|
|
36
44
|
@collection_name = 'Rpdoc'
|
37
45
|
@collection_schema = 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json'
|
38
46
|
|
47
|
+
@rspec_root = 'spec'
|
39
48
|
@rspec_server_host = '{{server_host}}'
|
40
49
|
@rspec_request_allow_headers = ['User-Agent', 'Content-Type', 'Authorization']
|
50
|
+
@rspec_response_allow_headers = ['Content-Type', 'Content-Length', 'Location']
|
51
|
+
@rspec_response_identifier = :rspec_location
|
41
52
|
|
42
53
|
@rpdoc_root = 'rpdoc'
|
43
54
|
@rpdoc_request_filename = 'request.json'
|
@@ -46,15 +57,19 @@ module Rpdoc
|
|
46
57
|
|
47
58
|
@rpdoc_clean_empty_folders = true
|
48
59
|
@rpdoc_clean_empty_folders_except = []
|
60
|
+
@rpdoc_folder_ordering = []
|
49
61
|
|
50
62
|
@rpdoc_auto_push = false
|
51
|
-
@rpdoc_auto_push_strategy = :push_and_create
|
63
|
+
@rpdoc_auto_push_strategy = :push_and_create
|
52
64
|
end
|
53
65
|
|
54
66
|
def valid?
|
55
67
|
return true unless @rpdoc_enable && @rpdoc_auto_push
|
56
68
|
return false if @postman_apikey.nil?
|
69
|
+
return false unless RSPEC_RESPONSE_IDENTIFIERS.include?(@rspec_response_identifier&.to_sym)
|
70
|
+
return false unless RPDOC_AUTO_PUSH_STRATEGIES.include?(@rpdoc_auto_push_strategy.to_sym)
|
57
71
|
return false if @rpdoc_auto_push_strategy == :push_and_update && @collection_uid.nil?
|
72
|
+
return false if @rpdoc_folder_ordering.present? && (RPDOC_FOLDER_ORDERING.exclude?(@rpdoc_folder_ordering) || !@rpdoc_folder_ordering.is_a?(Array))
|
58
73
|
true
|
59
74
|
end
|
60
75
|
end
|
data/lib/rpdoc/helper.rb
CHANGED
@@ -25,7 +25,13 @@ end
|
|
25
25
|
RSpec.shared_context 'rpdoc' do
|
26
26
|
after(:each) do |example|
|
27
27
|
example.metadata[:rpdoc_skip] ||= false
|
28
|
-
|
28
|
+
|
29
|
+
example_usable = true
|
30
|
+
example_usable &&= example.metadata[:rpdoc_skip] == false
|
31
|
+
example_usable &&= File.expand_path(example.metadata[:file_path]).start_with?(File.expand_path(Rpdoc.configuration.rspec_root))
|
32
|
+
example_usable &&= example.exception.nil? && example.metadata[:type] == :request
|
33
|
+
|
34
|
+
if Rpdoc.configuration.rpdoc_enable && example_usable
|
29
35
|
example.metadata[:rpdoc_action_key] ||= controller.action_name
|
30
36
|
example.metadata[:rpdoc_action_name] ||= controller.action_name
|
31
37
|
example.metadata[:rpdoc_example_key] ||= example.metadata[:description].underscore
|
@@ -1,16 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'json_requester'
|
4
|
+
require 'active_support'
|
5
|
+
require 'active_support/core_ext'
|
4
6
|
|
5
7
|
module Rpdoc
|
6
8
|
class PostmanCollection
|
9
|
+
attr_reader :data
|
7
10
|
|
8
|
-
def initialize
|
9
|
-
@configuration = Rpdoc.configuration
|
11
|
+
def initialize(configuration: nil, data: nil)
|
12
|
+
@configuration = configuration || Rpdoc.configuration
|
10
13
|
@requester = JsonRequester.new(@configuration.postman_host)
|
14
|
+
@data = data&.deep_symbolize_keys || generated_collection_data
|
11
15
|
|
12
|
-
|
13
|
-
|
16
|
+
self.clean_empty_folders!
|
17
|
+
self.reordering!
|
18
|
+
end
|
19
|
+
|
20
|
+
def push
|
21
|
+
send(@configuration.rpdoc_auto_push_strategy)
|
14
22
|
end
|
15
23
|
|
16
24
|
def push_and_create
|
@@ -28,18 +36,38 @@ module Rpdoc
|
|
28
36
|
}
|
29
37
|
remote_collection_data = @requester.http_send(:get, path, {}, headers)
|
30
38
|
remote_collection_data = remote_collection_data['status'] == 200 ? remote_collection_data.deep_symbolize_keys.slice(:collection) : nil
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@requester.http_send(:put, path,
|
39
|
+
remote_collection = PostmanCollection.new(data: remote_collection_data)
|
40
|
+
remote_collection.clean_generated_responses!
|
41
|
+
remote_collection.merge!(self)
|
42
|
+
@requester.http_send(:put, path, remote_collection.data, headers)
|
35
43
|
end
|
36
44
|
|
37
|
-
def save
|
38
|
-
|
45
|
+
def save(path: nil)
|
46
|
+
path ||= "#{@configuration.rpdoc_root}/#{@configuration.rpdoc_collection_filename}"
|
47
|
+
File.open(path, 'w+') do |f|
|
39
48
|
f.write(JSON.pretty_generate(@data))
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
52
|
+
def merge!(other_collection)
|
53
|
+
@data[:collection][:info][:name] = other_collection.data[:collection][:info][:name]
|
54
|
+
@data[:collection][:info][:description] = other_collection.data[:collection][:info][:description]
|
55
|
+
insert_generated_responses_into(@data[:collection][:item], from_collection_items: other_collection.data[:collection][:item].to_a)
|
56
|
+
sort_folders_from(@data[:collection][:item])
|
57
|
+
end
|
58
|
+
|
59
|
+
def clean_empty_folders!
|
60
|
+
clean_empty_folders_from(@data[:collection][:item])
|
61
|
+
end
|
62
|
+
|
63
|
+
def clean_generated_responses!
|
64
|
+
clean_generated_responses_from(@data[:collection][:item])
|
65
|
+
end
|
66
|
+
|
67
|
+
def reordering!
|
68
|
+
sort_folders_from(@data[:collection][:item])
|
69
|
+
end
|
70
|
+
|
43
71
|
private
|
44
72
|
|
45
73
|
def generated_collection_data
|
@@ -84,20 +112,13 @@ module Rpdoc
|
|
84
112
|
data
|
85
113
|
end
|
86
114
|
|
87
|
-
def merged_by(other_collection_data)
|
88
|
-
clean_generated_responses_from(other_collection_data[:collection][:item])
|
89
|
-
|
90
|
-
other_collection_data[:collection][:info][:description] = @data[:collection][:info][:description]
|
91
|
-
insert_generated_responses_into(other_collection_data[:collection][:item], from_collection_items: @data[:collection][:item])
|
92
|
-
end
|
93
|
-
|
94
115
|
def clean_generated_responses_from(collection_items)
|
95
116
|
collection_items.each do |item|
|
96
117
|
if item.has_key?(:item)
|
97
118
|
clean_generated_responses_from(item[:item])
|
98
119
|
elsif item.has_key?(:response)
|
99
120
|
item[:response].reject! do |response|
|
100
|
-
response.dig(:header)&.pluck(:key)&.include?('RSpec-Location')
|
121
|
+
@configuration.rspec_response_identifier.present? ? response.dig(:header)&.pluck(:key)&.include?('RSpec-Location') : true
|
101
122
|
end
|
102
123
|
end
|
103
124
|
end
|
@@ -105,7 +126,9 @@ module Rpdoc
|
|
105
126
|
|
106
127
|
def insert_generated_responses_into(collection_items, from_collection_items: [])
|
107
128
|
if collection_items.empty?
|
108
|
-
|
129
|
+
from_collection_items.each do |item|
|
130
|
+
collection_items << item.deep_dup
|
131
|
+
end
|
109
132
|
else
|
110
133
|
# transform collection_items into hash, using item[:name] as key
|
111
134
|
item_hash = {}
|
@@ -119,9 +142,9 @@ module Rpdoc
|
|
119
142
|
if item_hash.has_key?(from_item_name)
|
120
143
|
if from_item.has_key?(:item) && item_hash[from_item_name].has_key?(:item)
|
121
144
|
item_hash[from_item_name][:description] = from_item[:description]
|
122
|
-
insert_generated_responses_into(item_hash[from_item_name][:item], from_collection_items: from_item[:item])
|
145
|
+
insert_generated_responses_into(item_hash[from_item_name][:item], from_collection_items: from_item[:item].to_a)
|
123
146
|
elsif from_item.has_key?(:response) && item_hash[from_item_name].has_key?(:response)
|
124
|
-
item_hash[from_item_name][:request]
|
147
|
+
item_hash[from_item_name][:request] = from_item[:request].deep_dup
|
125
148
|
item_hash[from_item_name][:response] += from_item[:response].deep_dup
|
126
149
|
else
|
127
150
|
collection_items << from_item.deep_dup
|
@@ -135,12 +158,24 @@ module Rpdoc
|
|
135
158
|
|
136
159
|
def clean_empty_folders_from(collection_items)
|
137
160
|
return unless @configuration.rpdoc_clean_empty_folders
|
138
|
-
collection_items
|
161
|
+
collection_items&.reject! do |item|
|
139
162
|
next false if item.has_key?(:request)
|
140
163
|
next false if @configuration.rpdoc_clean_empty_folders_except.include?(item[:name])
|
141
164
|
clean_empty_folders_from(item[:item]) if item[:item].present?
|
142
165
|
item[:item].nil? || item[:item].empty?
|
143
166
|
end
|
144
167
|
end
|
168
|
+
|
169
|
+
def sort_folders_from(collection_items)
|
170
|
+
return unless @configuration.rpdoc_folder_ordering.present?
|
171
|
+
if @configuration.rpdoc_folder_ordering == :asc
|
172
|
+
collection_items&.sort_by! { |item| item[:name] }
|
173
|
+
elsif @configuration.rpdoc_folder_ordering == :desc
|
174
|
+
collection_items&.sort_by! { |item| item[:name] }.reverse!
|
175
|
+
elsif @configuration.rpdoc_folder_ordering.is_a?(Array)
|
176
|
+
# sort by array and then sort by asc
|
177
|
+
collection_items&.sort_by! { |item| [@configuration.rpdoc_folder_ordering.index(item[:name]) || Float::INFINITY, item[:name]] }
|
178
|
+
end
|
179
|
+
end
|
145
180
|
end
|
146
181
|
end
|
@@ -38,26 +38,28 @@ module Rpdoc
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def response_data
|
41
|
-
|
42
|
-
headers
|
41
|
+
header = @rspec_response.header.slice(*@configuration.rspec_response_allow_headers) if @configuration.rspec_response_allow_headers.present?
|
42
|
+
headers = header.map { |key, value| { key: key, value: value } }
|
43
|
+
headers << rspec_response_identifier_header if @configuration.rspec_response_identifier.present?
|
43
44
|
data = {
|
44
45
|
name: @rspec_example.metadata[:rpdoc_example_name],
|
45
46
|
originalRequest: original_request_data,
|
46
47
|
status: @rspec_response.status.to_s,
|
47
48
|
code: @rspec_response.code.to_i,
|
48
|
-
_postman_previewlanguage: 'json',
|
49
49
|
header: headers,
|
50
50
|
}
|
51
51
|
if @rspec_response.headers['Content-Type'].include?('application/json')
|
52
|
+
data[:_postman_previewlanguage] = 'json'
|
52
53
|
data[:body] = JSON.pretty_generate(JSON.parse(@rspec_response.body)) rescue nil
|
53
54
|
else
|
54
55
|
body = @rspec_response.body
|
56
|
+
data[:_postman_previewlanguage] = 'text'
|
55
57
|
data[:body] = body.encoding == Encoding::BINARY ? (body.force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8) rescue body) : body
|
56
58
|
end
|
57
59
|
data
|
58
60
|
end
|
59
61
|
|
60
|
-
def
|
62
|
+
def rspec_response_identifier_header
|
61
63
|
{
|
62
64
|
key: 'RSpec-Location',
|
63
65
|
value: @rspec_example.metadata[:location]
|
@@ -82,13 +84,15 @@ module Rpdoc
|
|
82
84
|
text: 'text'
|
83
85
|
}
|
84
86
|
end.compact
|
87
|
+
|
88
|
+
original_path = @rspec_request.original_fullpath.split('?').first # use original_fullpath instead of path to avoid request being redirected
|
85
89
|
{
|
86
90
|
method: @rspec_request.method,
|
87
91
|
header: filter_headers,
|
88
92
|
url: {
|
89
|
-
raw: "#{@configuration.rspec_server_host}#{
|
93
|
+
raw: "#{@configuration.rspec_server_host}#{original_path}",
|
90
94
|
host: [@configuration.rspec_server_host],
|
91
|
-
path:
|
95
|
+
path: original_path.split('/'),
|
92
96
|
query: query_string
|
93
97
|
},
|
94
98
|
body: original_request_data_body
|
data/lib/rpdoc/rpdoc.rake
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rpdoc'
|
4
|
+
|
1
5
|
namespace :rpdoc do
|
2
6
|
desc 'push collection to the Postman server'
|
3
|
-
task :push
|
7
|
+
task :push do
|
4
8
|
postman_collection = Rpdoc::PostmanCollection.new
|
5
9
|
postman_collection.save
|
6
10
|
postman_collection.send(Rpdoc.configuration.rpdoc_auto_push_strategy) if Rpdoc.configuration.rpdoc_auto_push
|
data/lib/rpdoc/version.rb
CHANGED
data/lib/rpdoc.rb
CHANGED
data/rpdoc.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
|
30
30
|
spec.add_dependency 'json_requester', '~> 1.0'
|
31
|
+
spec.add_dependency 'activesupport', '~> 6.1'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'railties', '~> 6.1.4'
|
33
34
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpdoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yuntai
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json_requester
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '6.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '6.1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: railties
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,6 +126,7 @@ files:
|
|
112
126
|
- lib/rpdoc/helper.rb
|
113
127
|
- lib/rpdoc/postman_collection.rb
|
114
128
|
- lib/rpdoc/postman_response.rb
|
129
|
+
- lib/rpdoc/railtie.rb
|
115
130
|
- lib/rpdoc/rpdoc.rake
|
116
131
|
- lib/rpdoc/version.rb
|
117
132
|
- rpdoc.gemspec
|