lazy_api_doc 0.1.0 → 0.1.1

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: b6a2460462b4e6747f547a54ff2a54883eaa06332c6cff5a282596b1fa4cad3e
4
- data.tar.gz: a8684334ee355acbf77cf7267de1af061560019fc6b9f26894eea739da21136c
3
+ metadata.gz: e13f1dbef507e8cd73dba019cf5b46049a06f257225aaba546a1e426465cfb0a
4
+ data.tar.gz: f7d05704e71695f96752ae86678df55d5ffbaed7fbcd8af66cb4800fae40622d
5
5
  SHA512:
6
- metadata.gz: 8dd797d746ede57afd720a224dd1aca0fc381b6287a7743808279f0e3d9915591edd09323d6793218405d4f6eb4ed67ee155b7b98a67862afca7aa6ec8a5be0e
7
- data.tar.gz: d2fad45f01e0ea6ce438c891e528cb9a7b11d1b347d528138bec2eb23d0edb3136a7d4abc390ea687c6f3bd23fbccc13d3be8c12983f887452b38a3432fb0396
6
+ metadata.gz: 412a28cb29f54a64e3290ad235b645932a86d253f3bbd5cadd9225638bec0c966a9085b56252ed27d28880c31d672fc8712c05723c0cec92f8d7d173cac3c73a
7
+ data.tar.gz: 5676bfcf8a8e909d9838239051c693512938ab8d0e8150e7e4b1474adf94423f365e5a3ac142e8f0df1e31f1fbf9f9de0c9e7bdbe1ada138bf7e7b74d69514ed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lazy_api_doc (0.1.0)
4
+ lazy_api_doc (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -10,7 +10,7 @@ attributes, endpoint description and then generates OpenAPI documentation.
10
10
  Add this line to your application's Gemfile:
11
11
 
12
12
  ```ruby
13
- gem 'lazy_api_doc', group: :test
13
+ gem 'lazy_api_doc', require: false, group: :test
14
14
  ```
15
15
 
16
16
  And then execute:
@@ -23,6 +23,7 @@ module LazyApiDoc
23
23
  insert_into_file 'spec/rails_helper.rb', after: "RSpec.configure do |config|\n" do
24
24
  <<~RUBY
25
25
  if ENV['DOC']
26
+ require 'lazy_api_doc'
26
27
  require 'support/lazy_api_doc_interceptor'
27
28
 
28
29
  config.include LazyApiDocInterceptor, type: :request
@@ -41,7 +42,9 @@ module LazyApiDoc
41
42
 
42
43
  append_to_file 'test/test_helper.rb' do
43
44
  <<~RUBY
45
+
44
46
  if ENV['DOC']
47
+ require 'lazy_api_doc'
45
48
  require 'support/lazy_api_doc_interceptor'
46
49
 
47
50
  class ActionDispatch::IntegrationTest
@@ -6,13 +6,9 @@ info:
6
6
  name: User Name
7
7
  email: user@example.com
8
8
  url: https://app.example.com
9
- tags:
10
9
 
11
10
  servers:
12
11
  - url: https://app.example.com
13
12
  description: description
14
13
 
15
14
  paths:
16
-
17
- components:
18
- schemas:
data/lib/lazy_api_doc.rb CHANGED
@@ -15,14 +15,19 @@ module LazyApiDoc
15
15
  generator.add(example)
16
16
  end
17
17
 
18
- def self.add_spec(example)
18
+ def self.add_spec(example) # rubocop:disable Metrics/AbcSize
19
19
  add(
20
20
  controller: example.request.params[:controller],
21
21
  action: example.request.params[:action],
22
22
  description: example.class.description,
23
+ source_location: [example.class.metadata[:file_path], example.class.metadata[:line_number]],
23
24
  verb: example.request.method,
24
25
  params: example.request.params,
25
26
  content_type: example.request.content_type.to_s,
27
+ request: {
28
+ query_params: example.request.query_parameters,
29
+ full_path: example.request.fullpath
30
+ },
26
31
  response: {
27
32
  code: example.response.status,
28
33
  content_type: example.response.content_type.to_s,
@@ -31,14 +36,19 @@ module LazyApiDoc
31
36
  )
32
37
  end
33
38
 
34
- def self.add_test(example)
39
+ def self.add_test(example) # rubocop:disable Metrics/AbcSize
35
40
  add(
36
41
  controller: example.request.params[:controller],
37
42
  action: example.request.params[:action],
38
43
  description: example.name.gsub(/\Atest_/, '').humanize,
44
+ source_location: example.method(example.name).source_location,
39
45
  verb: example.request.method,
40
46
  params: example.request.params,
41
47
  content_type: example.request.content_type.to_s,
48
+ request: {
49
+ query_params: example.request.query_parameters,
50
+ full_path: example.request.fullpath
51
+ },
42
52
  response: {
43
53
  code: example.response.status,
44
54
  content_type: example.response.content_type.to_s,
@@ -1,3 +1,5 @@
1
+ require 'cgi'
2
+
1
3
  module LazyApiDoc
2
4
  class Generator
3
5
  attr_reader :examples
@@ -14,7 +16,7 @@ module LazyApiDoc
14
16
 
15
17
  def result
16
18
  result = {}
17
- @examples.group_by { |example| [example.controller, example.action] }.map do |_, examples|
19
+ @examples.sort_by(&:source_location).group_by { |ex| [ex.controller, ex.action] }.map do |_, examples|
18
20
  first = examples.first
19
21
  route = ::LazyApiDoc::RouteParser.new(first.controller, first.action, first.verb).route
20
22
  doc_path = route[:doc_path]
@@ -24,18 +26,19 @@ module LazyApiDoc
24
26
  result
25
27
  end
26
28
 
27
- def example_group(example, examples, route)
29
+ def example_group(example, examples, route) # rubocop:disable Metrics/AbcSize
28
30
  {
29
31
  route[:verb].downcase => {
30
32
  "tags" => [example.controller],
31
33
  "description" => example["description"].capitalize,
32
34
  "summary" => example.action,
33
- "parameters" => path_params(route, examples),
35
+ "parameters" => path_params(route, examples) + query_params(examples),
34
36
  "requestBody" => body_params(route, examples),
35
37
  "responses" => examples.group_by { |ex| ex.response[:code] }.map do |code, variants|
36
38
  [
37
39
  code,
38
40
  {
41
+ "description" => variants.first["description"].capitalize,
39
42
  "content" => {
40
43
  example.response[:content_type] => {
41
44
  "schema" => ::LazyApiDoc::VariantsParser.new(variants.map { |v| parse_body(v.response) }).result
@@ -43,8 +46,8 @@ module LazyApiDoc
43
46
  }
44
47
  }
45
48
  ]
46
- end.to_h
47
- }
49
+ end.to_h # rubocop:disable Style/MultilineBlockChain
50
+ }.reject { |_, v| v.nil? }
48
51
  }
49
52
  end
50
53
 
@@ -59,10 +62,32 @@ module LazyApiDoc
59
62
  end
60
63
 
61
64
  def path_params(route, examples)
62
- variants = examples.map { |example| example.params.slice(*route[:path_params]) }
63
- ::LazyApiDoc::VariantsParser.new(variants).result["properties"].map do |param_name, schema|
65
+ path_variants = examples.map { |example| example.params.slice(*route[:path_params]) }
66
+ ::LazyApiDoc::VariantsParser.new(path_variants).result["properties"].map do |param_name, schema|
64
67
  {
65
68
  'in' => "path",
69
+ 'required' => true,
70
+ 'name' => param_name,
71
+ 'schema' => schema
72
+ }
73
+ end
74
+ end
75
+
76
+ def query_params(examples)
77
+ query_variants = examples.map do |example|
78
+ full_path = example.request[:full_path].split('?')
79
+ next {} if full_path.size == 1
80
+
81
+ # TODO: simplify it
82
+ full_path.last.split('&').map { |part| part.split('=').map { |each| CGI.unescape(each) } }.group_by(&:first)
83
+ .transform_values { |v| v.map(&:last) }.map { |k, v| [k, k.match?(/\[\]\z/) ? v : v.first] }.to_h
84
+ end
85
+
86
+ parsed = ::LazyApiDoc::VariantsParser.new(query_variants).result
87
+ parsed["properties"].map do |param_name, schema|
88
+ {
89
+ 'in' => "query",
90
+ 'required' => parsed['required'].include?(param_name),
66
91
  'name' => param_name,
67
92
  'schema' => schema
68
93
  }
@@ -9,7 +9,7 @@ module LazyApiDoc
9
9
  end
10
10
 
11
11
  def route
12
- self.class.routes.find { |r| r[:action] == action && r[:controller] == controller && r[:verb] == verb }
12
+ self.class.routes.find { |r| r[:action] == action && r[:controller] == controller && r[:verb].include?(verb) }
13
13
  end
14
14
 
15
15
  def self.routes
@@ -17,7 +17,7 @@ module LazyApiDoc
17
17
  when Array
18
18
  parse_array(variant, variants)
19
19
  when Hash
20
- parse_hash(variant, variants)
20
+ parse_hash(variants)
21
21
  else
22
22
  types_template(variants).merge("example" => variant)
23
23
  end
@@ -50,6 +50,8 @@ module LazyApiDoc
50
50
  "boolean"
51
51
  when String
52
52
  type_of_string(variant)
53
+ when Float
54
+ 'number'
53
55
  else
54
56
  variant.class.name.downcase
55
57
  end
@@ -64,8 +66,10 @@ module LazyApiDoc
64
66
  end
65
67
  end
66
68
 
67
- def parse_hash(variant, variants)
68
- result = types_template(variants)
69
+ def parse_hash(variants)
70
+ result = types_template(variants)
71
+ variant = variants.select { |v| v.instance_of?(Hash) }.reverse_each
72
+ .each_with_object({}) { |v, res| res.merge!(v) }
69
73
  result["properties"] = variant.map do |key, val|
70
74
  [
71
75
  key.to_s,
@@ -1,3 +1,3 @@
1
1
  module LazyApiDoc
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lazy_api_doc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Guban
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-08 00:00:00.000000000 Z
11
+ date: 2020-04-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The gem collects all requests and responses from your request specs and
14
14
  generates documentationbased on it