rpdoc 0.1.16 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3332b67613587936b3b88b4f35fb1e78621faf65623f35e46b45e73c5b8bb221
4
- data.tar.gz: 7d1b22cf5313d4ad91f2e470e67c157b61f4e1f00f1bfb9b912c1f357fcf6023
3
+ metadata.gz: 963515874d698d5e0dc7a13f81ac47cfb669022c84e91561cab91c0a23963774
4
+ data.tar.gz: ac8543e04985d09166790d1f4604478995788cd10a5f38d95ba8b9e1637e6599
5
5
  SHA512:
6
- metadata.gz: 3067394739da8951ec0bbab2028c5b765dce497dd34feeca00ea3325d01e6717e3f418a4957936ac81843ffb6212172d2e6a4a85e1a351f62384cba0723251b6
7
- data.tar.gz: 9b21d3ba8cb79e13f1f5dfef58a155cde0edb1e8f861402f516f68b16dfe7def15e8f59b4b4c89e85e733150b378547b8479cee73ce5ea3795c3231d7c51055c
6
+ metadata.gz: 1ca60eac1301f3aa5d320effbbb1065ed0a78374fc897793841ade037abce37a5d45ae6ae74bdbf4e94b222a2fb8d70cedfaa9fc4078a5cda646ee285d7ef8d9
7
+ data.tar.gz: be9d0823c2ff93d0709b523534e9705fcd0ad5048cc4af92fc05f9f096d5cec36300bce1b3c8087fe06845e166efef6c2a996c5936dc591ba13e5e63e9b7f204
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,9 @@
1
+ ## [0.2.0] - 2024-04-02
2
+ - Add `rspec_root`, `rspec_response_allow_headers`, and `rspec_response_identifier` options to configuration.
3
+ - Add public method `merge!` for PostmanCollection.
4
+ - Fix rake usage.
5
+ - Refactor.
6
+
1
7
  ## [0.1.16] - 2023-06-01
2
8
  - Fix default rpdoc_example_folders bug.
3
9
 
data/Gemfile.lock CHANGED
@@ -1,116 +1,145 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rpdoc (0.1.14)
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.1.10)
34
+ concurrent-ruby (1.2.2)
33
35
  crass (1.0.6)
34
36
  diff-lcs (1.5.0)
35
- erubi (1.11.0)
36
- faraday (2.5.2)
37
- faraday-net_http (>= 2.0, < 3.1)
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-net_http (3.0.0)
40
- i18n (1.12.0)
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.2)
43
- json_requester (1.0.8)
44
- faraday (>= 1.0.0)
45
- loofah (2.19.0)
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.5.9)
69
+ nokogiri (>= 1.12.0)
48
70
  method_source (1.0.0)
49
- minitest (5.16.3)
50
- nokogiri (1.13.8-arm64-darwin)
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.13.8-x86_64-darwin)
75
+ nokogiri (1.15.4-x86_64-darwin)
53
76
  racc (~> 1.4)
54
- parallel (1.22.1)
55
- parser (3.1.2.1)
77
+ parallel (1.23.0)
78
+ parser (3.2.2.3)
56
79
  ast (~> 2.4.1)
57
- pry (0.14.1)
80
+ racc
81
+ pry (0.14.2)
58
82
  coderay (~> 1.1)
59
83
  method_source (~> 1.0)
60
- racc (1.6.0)
61
- rack (2.2.4)
62
- rack-test (2.0.2)
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.3)
65
- activesupport (>= 4.2.0)
88
+ rails-dom-testing (2.2.0)
89
+ activesupport (>= 5.0.0)
90
+ minitest
66
91
  nokogiri (>= 1.6)
67
- rails-html-sanitizer (1.4.3)
68
- loofah (~> 2.3)
69
- railties (6.1.7)
70
- actionpack (= 6.1.7)
71
- activesupport (= 6.1.7)
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.6.0)
78
- rexml (3.2.5)
79
- rspec (3.11.0)
80
- rspec-core (~> 3.11.0)
81
- rspec-expectations (~> 3.11.0)
82
- rspec-mocks (~> 3.11.0)
83
- rspec-core (3.11.0)
84
- rspec-support (~> 3.11.0)
85
- rspec-expectations (3.11.1)
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.11.0)
88
- rspec-mocks (3.11.1)
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.11.0)
91
- rspec-support (3.11.1)
92
- rubocop (1.36.0)
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.1.2.1)
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.20.1, < 2.0)
127
+ rubocop-ast (>= 1.28.1, < 2.0)
100
128
  ruby-progressbar (~> 1.7)
101
- unicode-display_width (>= 1.4.0, < 3.0)
102
- rubocop-ast (1.21.0)
103
- parser (>= 3.1.1.0)
104
- ruby-progressbar (1.11.0)
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.1)
107
- tzinfo (2.0.5)
134
+ thor (1.2.2)
135
+ tzinfo (2.0.6)
108
136
  concurrent-ruby (~> 1.0)
109
- unicode-display_width (2.3.0)
110
- zeitwerk (2.6.1)
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) Folder that Rpdoc use for json data generation and save.
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://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec) type.
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://relishapp.com/rspec/rspec-core/docs/example-groups/shared-context) in your spec to make `Rpdoc` identify which examples to transform.
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. Customiz your example [metdata](https://relishapp.com/rspec/rspec-core/docs/metadata/user-defined-metadata) to generate collection data in your preferenced format.
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` use the `File.open` method.
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/gem_tasks"
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.16
1
+ 0.2.0
@@ -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) Folder that Rpdoc use for json data generation and save.
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
 
@@ -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 # or :push_and_update
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
- if Rpdoc.configuration.rpdoc_enable && example.exception.nil? && example.metadata[:type] == :request && example.metadata[:rpdoc_skip] == false
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
- @data = generated_collection_data
13
- clean_empty_folders_from(@data[:collection][:item])
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
- merged_by(remote_collection_data)
33
- clean_empty_folders_from(remote_collection_data[:collection][:item])
34
- @requester.http_send(:put, path, remote_collection_data, headers)
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
- File.open("#{@configuration.rpdoc_root}/#{@configuration.rpdoc_collection_filename}", 'w+') do |f|
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
- collection_items = from_collection_items.deep_dup
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,7 +142,7 @@ 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
147
  item_hash[from_item_name][:request][:description] = from_item[:request][:description]
125
148
  item_hash[from_item_name][:response] += from_item[:response].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.reject! do |item|
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
- headers = @rspec_response.header.map { |key, value| {key: key, value: value} }
42
- headers << rspec_location_header
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 rspec_location_header
62
+ def rspec_response_identifier_header
61
63
  {
62
64
  key: 'RSpec-Location',
63
65
  value: @rspec_example.metadata[:location]
@@ -0,0 +1,14 @@
1
+ # lib/railtie.rb
2
+ require 'rpdoc'
3
+ require 'rails'
4
+
5
+ module Rpdoc
6
+ class Railtie < Rails::Railtie
7
+ railtie_name :rpdoc
8
+
9
+ rake_tasks do
10
+ path = File.expand_path(__dir__)
11
+ load "#{path}/rpdoc.rake"
12
+ end
13
+ end
14
+ end
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 => :environment do
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rpdoc
4
- VERSION = "0.1.16"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/rpdoc.rb CHANGED
@@ -5,6 +5,8 @@ require 'rpdoc/configuration'
5
5
  require 'rpdoc/postman_response'
6
6
  require 'rpdoc/postman_collection'
7
7
  require 'rpdoc/helper' if defined?(RSpec)
8
+ require 'rpdoc/railtie' if defined?(Rails)
9
+
8
10
 
9
11
  module Rpdoc
10
12
 
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.16
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yuntai
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-01 00:00:00.000000000 Z
11
+ date: 2024-04-02 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