grape-swagger-entity 0.2.1 → 0.2.2
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 +4 -4
- data/.rubocop_todo.yml +1 -0
- data/CHANGELOG.md +6 -0
- data/grape-swagger-entity.gemspec +1 -3
- data/lib/grape-swagger/entity/attribute_parser.rb +103 -0
- data/lib/grape-swagger/entity/parser.rb +7 -85
- data/lib/grape-swagger/entity/version.rb +1 -1
- data/lib/grape-swagger/entity.rb +1 -0
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4765712e8fa51a31cb4cde4e6cb6c67e2863f3cb
|
4
|
+
data.tar.gz: 2012ba6b40ad94a02afc087e8ddcfe9a2fb341f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc1f438ae665e682e20603cd9c1693dce8fc41c243b49706aa4939d0c75034f251e6516329a66ac2dbdb09962ab214dc4411ede6e3d72b05b9cc7aec58c92328
|
7
|
+
data.tar.gz: 467778758de82752d19f383bd9be651d06cd6116850ec8d71a21f79e337b822531b49bafbc8d4718940ed3d3b900eaa411cb3c7bb65058c993b65be4c404b3ac
|
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,12 @@
|
|
8
8
|
|
9
9
|
* Your contribution here.
|
10
10
|
|
11
|
+
### 0.2.2 (November 3, 2017)
|
12
|
+
|
13
|
+
#### Features
|
14
|
+
|
15
|
+
* [#27](https://github.com/ruby-grape/grape-swagger-entity/pull/27): Add support for attribute examples - [@Kukunin](https://github.com/Kukunin).
|
16
|
+
|
11
17
|
### 0.2.1 (Jule 5, 2017)
|
12
18
|
|
13
19
|
#### Features
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
1
|
lib = File.expand_path('../lib', __FILE__)
|
4
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
3
|
require 'grape-swagger/entity/version'
|
@@ -20,6 +18,6 @@ Gem::Specification.new do |s|
|
|
20
18
|
s.require_paths = ['lib']
|
21
19
|
|
22
20
|
s.required_ruby_version = '>= 2.2.6'
|
23
|
-
s.add_runtime_dependency 'grape-swagger', '>= 0.20.4'
|
24
21
|
s.add_runtime_dependency 'grape-entity', '>= 0.5.0'
|
22
|
+
s.add_runtime_dependency 'grape-swagger', '>= 0.20.4'
|
25
23
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module GrapeSwagger
|
2
|
+
module Entity
|
3
|
+
class AttributeParser
|
4
|
+
attr_reader :endpoint
|
5
|
+
|
6
|
+
def initialize(endpoint)
|
7
|
+
@endpoint = endpoint
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(entity_options)
|
11
|
+
documentation = entity_options[:documentation]
|
12
|
+
entity_model = model_from(entity_options)
|
13
|
+
|
14
|
+
if entity_model
|
15
|
+
name = endpoint.nil? ? entity_model.to_s.demodulize : endpoint.send(:expose_params_from_model, entity_model)
|
16
|
+
return entity_model_type(name, entity_options)
|
17
|
+
else
|
18
|
+
param = data_type_from(entity_options)
|
19
|
+
return param unless documentation
|
20
|
+
|
21
|
+
param[:default] = documentation[:default] if documentation[:default]
|
22
|
+
add_attribute_example(param, documentation[:example])
|
23
|
+
|
24
|
+
if (values = documentation[:values])
|
25
|
+
param[:enum] = values if values.is_a?(Array)
|
26
|
+
end
|
27
|
+
|
28
|
+
param = { type: :array, items: param } if documentation[:is_array]
|
29
|
+
param
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def model_from(entity_options)
|
36
|
+
model = entity_options[:using] if entity_options[:using].present?
|
37
|
+
|
38
|
+
if could_it_be_a_model?(entity_options[:documentation])
|
39
|
+
model ||= entity_options[:documentation][:type]
|
40
|
+
end
|
41
|
+
|
42
|
+
model
|
43
|
+
end
|
44
|
+
|
45
|
+
def could_it_be_a_model?(value)
|
46
|
+
return false if value.nil?
|
47
|
+
direct_model_type?(value[:type]) || ambiguous_model_type?(value[:type])
|
48
|
+
end
|
49
|
+
|
50
|
+
def direct_model_type?(type)
|
51
|
+
type.to_s.include?('Entity') || type.to_s.include?('Entities')
|
52
|
+
end
|
53
|
+
|
54
|
+
def ambiguous_model_type?(type)
|
55
|
+
type &&
|
56
|
+
type.is_a?(Class) &&
|
57
|
+
!GrapeSwagger::DocMethods::DataType.primitive?(type.name.downcase) &&
|
58
|
+
!type == Array
|
59
|
+
end
|
60
|
+
|
61
|
+
def data_type_from(documentation)
|
62
|
+
documented_type = documentation[:type]
|
63
|
+
documented_type ||= (documentation[:documentation] && documentation[:documentation][:type])
|
64
|
+
|
65
|
+
data_type = GrapeSwagger::DocMethods::DataType.call(documented_type)
|
66
|
+
|
67
|
+
document_data_type(documentation[:documentation], data_type)
|
68
|
+
end
|
69
|
+
|
70
|
+
def document_data_type(documentation, data_type)
|
71
|
+
type = if GrapeSwagger::DocMethods::DataType.primitive?(data_type)
|
72
|
+
data = GrapeSwagger::DocMethods::DataType.mapping(data_type)
|
73
|
+
{ type: data.first, format: data.last }
|
74
|
+
else
|
75
|
+
{ type: data_type }
|
76
|
+
end
|
77
|
+
type[:format] = documentation[:format] if documentation && documentation.key?(:format)
|
78
|
+
|
79
|
+
type
|
80
|
+
end
|
81
|
+
|
82
|
+
def entity_model_type(name, entity_options)
|
83
|
+
if entity_options[:documentation] && entity_options[:documentation][:is_array]
|
84
|
+
{
|
85
|
+
'type' => 'array',
|
86
|
+
'items' => {
|
87
|
+
'$ref' => "#/definitions/#{name}"
|
88
|
+
}
|
89
|
+
}
|
90
|
+
else
|
91
|
+
{
|
92
|
+
'$ref' => "#/definitions/#{name}"
|
93
|
+
}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_attribute_example(attribute, example)
|
98
|
+
return unless example
|
99
|
+
attribute[:example] = example.is_a?(Proc) ? example.call : example
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -3,10 +3,12 @@ module GrapeSwagger
|
|
3
3
|
class Parser
|
4
4
|
attr_reader :model
|
5
5
|
attr_reader :endpoint
|
6
|
+
attr_reader :attribute_parser
|
6
7
|
|
7
8
|
def initialize(model, endpoint)
|
8
9
|
@model = model
|
9
10
|
@endpoint = endpoint
|
11
|
+
@attribute_parser = AttributeParser.new(endpoint)
|
10
12
|
end
|
11
13
|
|
12
14
|
def call
|
@@ -27,30 +29,12 @@ module GrapeSwagger
|
|
27
29
|
|
28
30
|
entity_name = entity_options[:as] if entity_options[:as]
|
29
31
|
documentation = entity_options[:documentation]
|
30
|
-
entity_model = model_from(entity_options)
|
31
32
|
|
32
|
-
if
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
else
|
38
|
-
memo[entity_name] = data_type_from(entity_options)
|
39
|
-
next unless documentation
|
40
|
-
|
41
|
-
memo[entity_name][:default] = documentation[:default] if documentation[:default]
|
42
|
-
|
43
|
-
if (values = documentation[:values])
|
44
|
-
memo[entity_name][:enum] = values if values.is_a?(Array)
|
45
|
-
end
|
46
|
-
|
47
|
-
if documentation[:is_array]
|
48
|
-
memo[entity_name] = {
|
49
|
-
type: :array,
|
50
|
-
items: memo.delete(entity_name)
|
51
|
-
}
|
52
|
-
end
|
53
|
-
end
|
33
|
+
memo[entity_name] = if entity_options[:nesting]
|
34
|
+
parse_nested(entity_name, entity_options, parent_model)
|
35
|
+
else
|
36
|
+
attribute_parser.call(entity_options)
|
37
|
+
end
|
54
38
|
|
55
39
|
if documentation
|
56
40
|
memo[entity_name][:read_only] = documentation[:read_only].to_s == 'true' if documentation[:read_only]
|
@@ -59,16 +43,6 @@ module GrapeSwagger
|
|
59
43
|
end
|
60
44
|
end
|
61
45
|
|
62
|
-
def model_from(entity_options)
|
63
|
-
model = entity_options[:using] if entity_options[:using].present?
|
64
|
-
|
65
|
-
if could_it_be_a_model?(entity_options[:documentation])
|
66
|
-
model ||= entity_options[:documentation][:type]
|
67
|
-
end
|
68
|
-
|
69
|
-
model
|
70
|
-
end
|
71
|
-
|
72
46
|
def parse_nested(entity_name, entity_options, parent_model = nil)
|
73
47
|
nested_entity = if parent_model.nil?
|
74
48
|
model.root_exposures.find_by(entity_name)
|
@@ -101,58 +75,6 @@ module GrapeSwagger
|
|
101
75
|
}
|
102
76
|
end
|
103
77
|
end
|
104
|
-
|
105
|
-
def could_it_be_a_model?(value)
|
106
|
-
return false if value.nil?
|
107
|
-
direct_model_type?(value[:type]) || ambiguous_model_type?(value[:type])
|
108
|
-
end
|
109
|
-
|
110
|
-
def direct_model_type?(type)
|
111
|
-
type.to_s.include?('Entity') || type.to_s.include?('Entities')
|
112
|
-
end
|
113
|
-
|
114
|
-
def ambiguous_model_type?(type)
|
115
|
-
type &&
|
116
|
-
type.is_a?(Class) &&
|
117
|
-
!GrapeSwagger::DocMethods::DataType.primitive?(type.name.downcase) &&
|
118
|
-
!type == Array
|
119
|
-
end
|
120
|
-
|
121
|
-
def data_type_from(documentation)
|
122
|
-
documented_type = documentation[:type]
|
123
|
-
documented_type ||= (documentation[:documentation] && documentation[:documentation][:type])
|
124
|
-
|
125
|
-
data_type = GrapeSwagger::DocMethods::DataType.call(documented_type)
|
126
|
-
|
127
|
-
document_data_type(documentation[:documentation], data_type)
|
128
|
-
end
|
129
|
-
|
130
|
-
def document_data_type(documentation, data_type)
|
131
|
-
type = if GrapeSwagger::DocMethods::DataType.primitive?(data_type)
|
132
|
-
data = GrapeSwagger::DocMethods::DataType.mapping(data_type)
|
133
|
-
{ type: data.first, format: data.last }
|
134
|
-
else
|
135
|
-
{ type: data_type }
|
136
|
-
end
|
137
|
-
type[:format] = documentation[:format] if documentation && documentation.key?(:format)
|
138
|
-
|
139
|
-
type
|
140
|
-
end
|
141
|
-
|
142
|
-
def entity_model_type(name, entity_options)
|
143
|
-
if entity_options[:documentation] && entity_options[:documentation][:is_array]
|
144
|
-
{
|
145
|
-
'type' => 'array',
|
146
|
-
'items' => {
|
147
|
-
'$ref' => "#/definitions/#{name}"
|
148
|
-
}
|
149
|
-
}
|
150
|
-
else
|
151
|
-
{
|
152
|
-
'$ref' => "#/definitions/#{name}"
|
153
|
-
}
|
154
|
-
end
|
155
|
-
end
|
156
78
|
end
|
157
79
|
end
|
158
80
|
end
|
data/lib/grape-swagger/entity.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-swagger-entity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Zaitsev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: grape-
|
14
|
+
name: grape-entity
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.5.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.5.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: grape-
|
28
|
+
name: grape-swagger
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.20.4
|
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: 0.
|
40
|
+
version: 0.20.4
|
41
41
|
description:
|
42
42
|
email:
|
43
43
|
- kirik910@gmail.com
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- grape-swagger-entity.gemspec
|
62
62
|
- lib/grape-swagger-entity.rb
|
63
63
|
- lib/grape-swagger/entity.rb
|
64
|
+
- lib/grape-swagger/entity/attribute_parser.rb
|
64
65
|
- lib/grape-swagger/entity/parser.rb
|
65
66
|
- lib/grape-swagger/entity/version.rb
|
66
67
|
homepage: https://github.com/ruby-grape/grape-swagger-entity
|