grape-swagger-entity 0.4.0 → 0.5.0

This diff has not been reviewed by any users.
Log in in order to be able to vote.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9cbc9a4f5350f907024319ec60d6bebcf58c1d9a9fbe0a87157eb521f5d90c27
4
- data.tar.gz: d70650e560a98a5c8e6299136146796d87bb8e124944c2b09603ddcab415085a
3
+ metadata.gz: 4c6aad956f868bcf6563b52eaaf6347b821fe06a63153324e299562857418dc3
4
+ data.tar.gz: 04ffc54b6c66cb328e7687aac44f9140f0891ab74c3fab05463bda4a43f02f41
5
5
  SHA512:
6
- metadata.gz: 4fffce9cc2ae49583807c9e02a5ed6d0c6fdbd1e3acc2f4816868b292fb8ae0e77161bd4736dcb2d91e30633a814cd8fd31c2f21af9fec12cc4cec8243bb5ce1
7
- data.tar.gz: 2c5cdf2184fefbd92fda6b7f65d95d31f0c331e225be2439b5fa2f6d711a7754890271b7a41b06cdd36c44d3bcace9b836cd727c93b21892e6ae9651badb712a
6
+ metadata.gz: e4e6cd881f3c194a10beb6489b295ecc0d3168479935c4402922d4e4f9358686c3aa2d3df1023e99114710c14efa9685d8f5b1792558538f680721d77d7b8177
7
+ data.tar.gz: 5090a6ae14257708c383c10b858b6c89ba21e54fd5a873dfe10dcd1873b1aac125b3d4be4ad0c055778461859b91c18c2505607ecbd4552384c1a0f01ce46033
@@ -4,10 +4,16 @@
4
4
 
5
5
  * Your contribution here.
6
6
 
7
- #### Features
7
+ #### Fixes
8
8
 
9
9
  * Your contribution here.
10
10
 
11
+ ### 0.5.0 (June 29, 2020)
12
+
13
+ #### Features
14
+
15
+ * [#50](https://github.com/ruby-grape/grape-swagger-entity/pull/50): Features/inheritance and discriminator - [@MaximeRDY](https://github.com/MaximeRDY).
16
+
11
17
  ### 0.4.0 (May 30, 2020)
12
18
 
13
19
  #### Features
data/Gemfile CHANGED
@@ -16,7 +16,7 @@ group :development, :test do
16
16
  gem 'rubocop', '~> 0.68.1'
17
17
  end
18
18
 
19
- gem 'grape-swagger', git: 'https://github.com/ruby-grape/grape-swagger.git'
19
+ gem 'grape-swagger', path: '../grape-swagger'
20
20
 
21
21
  group :test do
22
22
  gem 'grape-entity', ENV.fetch('GRAPE_ENTITY', '0.6.1')
@@ -19,5 +19,5 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.required_ruby_version = '>= 2.2.6'
21
21
  s.add_runtime_dependency 'grape-entity', '>= 0.5.0'
22
- s.add_runtime_dependency 'grape-swagger', '>= 1.0.0'
22
+ s.add_runtime_dependency 'grape-swagger', '>= 1.4.0'
23
23
  end
@@ -2,6 +2,7 @@ require 'grape-swagger'
2
2
  require 'grape-entity'
3
3
 
4
4
  require 'grape-swagger/entity/version'
5
+ require 'grape-swagger/entity/helper'
5
6
  require 'grape-swagger/entity/attribute_parser'
6
7
  require 'grape-swagger/entity/parser'
7
8
 
@@ -12,7 +12,7 @@ module GrapeSwagger
12
12
  entity_model = model_from(entity_options)
13
13
 
14
14
  if entity_model
15
- name = endpoint.nil? ? entity_model.to_s.demodulize : endpoint.send(:expose_params_from_model, entity_model)
15
+ name = GrapeSwagger::Entity::Helper.model_name(entity_model, endpoint)
16
16
 
17
17
  entity_model_type = entity_model_type(name, entity_options)
18
18
  return entity_model_type unless documentation
@@ -39,7 +39,7 @@ module GrapeSwagger
39
39
  add_attribute_documentation(param, documentation)
40
40
 
41
41
  add_extension_documentation(param, documentation)
42
-
42
+ add_discriminator_extension(param, documentation)
43
43
  param
44
44
  end
45
45
  end
@@ -128,6 +128,10 @@ module GrapeSwagger
128
128
  def add_extension_documentation(param, documentation)
129
129
  GrapeSwagger::DocMethods::Extensions.add_extensions_to_root(documentation, param)
130
130
  end
131
+
132
+ def add_discriminator_extension(param, documentation)
133
+ param[:documentation] = { is_discriminator: true } if documentation.key?(:is_discriminator)
134
+ end
131
135
  end
132
136
  end
133
137
  end
@@ -0,0 +1,36 @@
1
+ module GrapeSwagger
2
+ module Entity
3
+ # Helper methods for DRY
4
+ class Helper
5
+ class << self
6
+ def model_name(entity_model, endpoint)
7
+ if endpoint.nil?
8
+ entity_model.to_s.demodulize
9
+ else
10
+ endpoint.send(:expose_params_from_model, entity_model)
11
+ end
12
+ end
13
+
14
+ def discriminator(entity_model)
15
+ entity_model.superclass.root_exposures.detect do |value|
16
+ value.documentation.dig(:is_discriminator)
17
+ end
18
+ end
19
+
20
+ def root_exposures_without_parent(entity_model)
21
+ entity_model.root_exposures.select do |value|
22
+ entity_model.superclass.root_exposures.find_by(value.attribute).nil?
23
+ end
24
+ end
25
+
26
+ def root_exposure_with_discriminator(entity_model)
27
+ if discriminator(entity_model)
28
+ root_exposures_without_parent(entity_model)
29
+ else
30
+ entity_model.root_exposures
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -26,7 +26,7 @@ module GrapeSwagger
26
26
  end
27
27
 
28
28
  def extract_params(exposure)
29
- exposure.root_exposures.each_with_object({}) do |value, memo|
29
+ GrapeSwagger::Entity::Helper.root_exposure_with_discriminator(exposure).each_with_object({}) do |value, memo|
30
30
  if value.for_merge && (value.respond_to?(:entity_class) || value.respond_to?(:using_class_name))
31
31
  entity_class = value.respond_to?(:entity_class) ? value.entity_class : value.using_class_name
32
32
 
@@ -64,7 +64,39 @@ module GrapeSwagger
64
64
  memo[final_entity_name][:description] = documentation[:desc] if documentation[:desc]
65
65
  end
66
66
 
67
- [parsed, required_params(params)]
67
+ discriminator = GrapeSwagger::Entity::Helper.discriminator(model)
68
+ if discriminator
69
+ respond_with_all_of(parsed, params, discriminator)
70
+ else
71
+ [parsed, required_params(params)]
72
+ end
73
+ end
74
+
75
+ def respond_with_all_of(parsed, params, discriminator)
76
+ parent_name = GrapeSwagger::Entity::Helper.model_name(model.superclass, endpoint)
77
+
78
+ {
79
+ allOf: [
80
+ {
81
+ '$ref' => "#/definitions/#{parent_name}"
82
+ },
83
+ [
84
+ add_discriminator(parsed, discriminator),
85
+ required_params(params).push(discriminator.attribute)
86
+ ]
87
+ ]
88
+ }
89
+ end
90
+
91
+ def add_discriminator(parsed, discriminator)
92
+ model_name = GrapeSwagger::Entity::Helper.model_name(model, endpoint)
93
+
94
+ parsed.merge(
95
+ discriminator.attribute => {
96
+ type: 'string',
97
+ enum: [model_name]
98
+ }
99
+ )
68
100
  end
69
101
 
70
102
  def parse_nested(entity_name, entity_options, parent_model = nil)
@@ -1,5 +1,5 @@
1
1
  module GrapeSwagger
2
2
  module Entity
3
- VERSION = '0.4.0'.freeze
3
+ VERSION = '0.5.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-swagger-entity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kirill Zaitsev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-30 00:00:00.000000000 Z
11
+ date: 2020-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape-entity
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: 1.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.0.0
40
+ version: 1.4.0
41
41
  description:
42
42
  email:
43
43
  - kirik910@gmail.com
@@ -62,6 +62,7 @@ files:
62
62
  - lib/grape-swagger-entity.rb
63
63
  - lib/grape-swagger/entity.rb
64
64
  - lib/grape-swagger/entity/attribute_parser.rb
65
+ - lib/grape-swagger/entity/helper.rb
65
66
  - lib/grape-swagger/entity/parser.rb
66
67
  - lib/grape-swagger/entity/version.rb
67
68
  homepage: https://github.com/ruby-grape/grape-swagger-entity