grape-swagger-entity 0.4.0 → 0.5.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.

Potentially problematic release.


This version of grape-swagger-entity might be problematic. Click here for more details.

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