swagger_yard 0.4.4 → 1.0.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 +4 -4
- data/README.md +202 -103
- data/lib/swagger_yard.rb +8 -4
- data/lib/swagger_yard/api_group.rb +106 -0
- data/lib/swagger_yard/authorization.rb +21 -18
- data/lib/swagger_yard/configuration.rb +6 -11
- data/lib/swagger_yard/example.rb +11 -0
- data/lib/swagger_yard/model.rb +16 -34
- data/lib/swagger_yard/openapi.rb +120 -0
- data/lib/swagger_yard/operation.rb +67 -50
- data/lib/swagger_yard/operation.rb.~9b471577ebed4e4ba6ed266566355dbe5990787d~ +161 -0
- data/lib/swagger_yard/parameter.rb +1 -18
- data/lib/swagger_yard/path_item.rb +21 -0
- data/lib/swagger_yard/property.rb +3 -16
- data/lib/swagger_yard/{resource_listing.rb → specification.rb} +21 -34
- data/lib/swagger_yard/swagger.rb +172 -4
- data/lib/swagger_yard/type.rb +20 -12
- data/lib/swagger_yard/type.rb.~master~ +34 -0
- data/lib/swagger_yard/type_parser.rb +10 -4
- data/lib/swagger_yard/version.rb +1 -1
- metadata +9 -5
- data/lib/swagger_yard/api.rb +0 -39
- data/lib/swagger_yard/api_declaration.rb +0 -72
data/lib/swagger_yard/type.rb
CHANGED
@@ -4,31 +4,39 @@ module SwaggerYard
|
|
4
4
|
new(types.first)
|
5
5
|
end
|
6
6
|
|
7
|
-
|
7
|
+
# Default model location path
|
8
|
+
MODEL_PATH = '#/definitions/'.freeze
|
9
|
+
|
10
|
+
attr_reader :source
|
8
11
|
|
9
12
|
def initialize(string)
|
10
13
|
@source = string
|
11
|
-
@
|
12
|
-
@name = name_for(@schema)
|
13
|
-
@name = name_for(@schema['items']) if @name == 'array'
|
14
|
+
@name = nil
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
schema
|
17
|
+
def name
|
18
|
+
return @name if @name
|
19
|
+
@name = name_for(schema)
|
20
|
+
@name = name_for(schema['items']) if @name == 'array'
|
21
|
+
@name
|
19
22
|
end
|
20
23
|
|
21
|
-
def
|
22
|
-
|
24
|
+
def schema
|
25
|
+
@schema ||= TypeParser.new.json_schema(source)
|
23
26
|
end
|
24
27
|
|
25
|
-
def
|
26
|
-
|
28
|
+
def schema_with(options = {})
|
29
|
+
model_path = options && options[:model_path] || MODEL_PATH
|
30
|
+
if model_path != MODEL_PATH
|
31
|
+
TypeParser.new(model_path).json_schema(source)
|
32
|
+
else
|
33
|
+
schema
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
37
|
private
|
30
38
|
def name_for(schema)
|
31
|
-
schema["type"] || schema["$ref"][%r'
|
39
|
+
schema["type"] || schema["$ref"][%r'.*/([^/]*)$', 1]
|
32
40
|
end
|
33
41
|
end
|
34
42
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SwaggerYard
|
2
|
+
class Type
|
3
|
+
def self.from_type_list(types)
|
4
|
+
new(types.first)
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :name, :source, :schema
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
@source = string
|
11
|
+
@schema = TypeParser.new.json_schema(string)
|
12
|
+
@name = name_for(@schema)
|
13
|
+
@name = name_for(@schema['items']) if @name == 'array'
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO: have this look at resource listing?
|
17
|
+
def ref?
|
18
|
+
schema["$ref"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def model_name
|
22
|
+
ref? ? name : nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_h
|
26
|
+
schema
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def name_for(schema)
|
31
|
+
schema["type"] || schema["$ref"][%r'#/definitions/(.*)', 1]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -69,7 +69,7 @@ module SwaggerYard
|
|
69
69
|
else
|
70
70
|
name = Model.mangle(v)
|
71
71
|
if /[[:upper:]]/.match(name)
|
72
|
-
{ '$ref' => "
|
72
|
+
{ '$ref' => "#{model_path}#{name}" }
|
73
73
|
else
|
74
74
|
{ 'type' => name }
|
75
75
|
end
|
@@ -81,7 +81,12 @@ module SwaggerYard
|
|
81
81
|
unless url = SwaggerYard.config.external_schema[prefix]
|
82
82
|
raise UndefinedSchemaError, "unknown prefix #{prefix} for #{name}"
|
83
83
|
end
|
84
|
-
|
84
|
+
uri = URI(url)
|
85
|
+
fragment = uri.fragment ? "##{uri.fragment}" : model_path
|
86
|
+
uri.fragment = nil
|
87
|
+
fragment += '/' unless fragment.end_with?('/')
|
88
|
+
url = uri.to_s
|
89
|
+
{ '$ref' => "#{url}#{fragment}#{Model.mangle(name)}"}
|
85
90
|
end
|
86
91
|
|
87
92
|
rule(formatted: { name: simple(:name), format: simple(:format) }) do
|
@@ -122,9 +127,10 @@ module SwaggerYard
|
|
122
127
|
end
|
123
128
|
end
|
124
129
|
|
125
|
-
def initialize
|
130
|
+
def initialize(model_path = Type::MODEL_PATH)
|
126
131
|
@parser = Parser.new
|
127
132
|
@xform = Transform.new
|
133
|
+
@model_path = model_path
|
128
134
|
end
|
129
135
|
|
130
136
|
def parse(str)
|
@@ -132,7 +138,7 @@ module SwaggerYard
|
|
132
138
|
end
|
133
139
|
|
134
140
|
def json_schema(str)
|
135
|
-
@xform.apply(parse(str))
|
141
|
+
@xform.apply(parse(str), model_path: @model_path)
|
136
142
|
rescue Parslet::ParseFailed => e
|
137
143
|
raise InvalidTypeError, "'#{str}': #{e.message}"
|
138
144
|
end
|
data/lib/swagger_yard/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swagger_yard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chtrinh (Chris Trinh)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -190,17 +190,21 @@ files:
|
|
190
190
|
- README.md
|
191
191
|
- Rakefile
|
192
192
|
- lib/swagger_yard.rb
|
193
|
-
- lib/swagger_yard/
|
194
|
-
- lib/swagger_yard/api_declaration.rb
|
193
|
+
- lib/swagger_yard/api_group.rb
|
195
194
|
- lib/swagger_yard/authorization.rb
|
196
195
|
- lib/swagger_yard/configuration.rb
|
196
|
+
- lib/swagger_yard/example.rb
|
197
197
|
- lib/swagger_yard/model.rb
|
198
|
+
- lib/swagger_yard/openapi.rb
|
198
199
|
- lib/swagger_yard/operation.rb
|
200
|
+
- lib/swagger_yard/operation.rb.~9b471577ebed4e4ba6ed266566355dbe5990787d~
|
199
201
|
- lib/swagger_yard/parameter.rb
|
202
|
+
- lib/swagger_yard/path_item.rb
|
200
203
|
- lib/swagger_yard/property.rb
|
201
|
-
- lib/swagger_yard/
|
204
|
+
- lib/swagger_yard/specification.rb
|
202
205
|
- lib/swagger_yard/swagger.rb
|
203
206
|
- lib/swagger_yard/type.rb
|
207
|
+
- lib/swagger_yard/type.rb.~master~
|
204
208
|
- lib/swagger_yard/type_parser.rb
|
205
209
|
- lib/swagger_yard/version.rb
|
206
210
|
homepage: http://www.synctv.com
|
data/lib/swagger_yard/api.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module SwaggerYard
|
2
|
-
class Api
|
3
|
-
attr_accessor :path, :operations, :api_declaration
|
4
|
-
|
5
|
-
def self.path_from_yard_object(yard_object)
|
6
|
-
if tag = yard_object.tags.detect {|t| t.tag_name == "path"}
|
7
|
-
tag.text
|
8
|
-
elsif fn = SwaggerYard.config.path_discovery_function
|
9
|
-
begin
|
10
|
-
method, path = fn[yard_object]
|
11
|
-
yard_object.add_tag YARD::Tags::Tag.new("path", path, [method]) if path
|
12
|
-
path
|
13
|
-
rescue => e
|
14
|
-
SwaggerYard.log.warn e.message
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.from_yard_object(yard_object, api_declaration)
|
21
|
-
path = path_from_yard_object(yard_object)
|
22
|
-
new(path, api_declaration)
|
23
|
-
end
|
24
|
-
|
25
|
-
def initialize(path, api_declaration)
|
26
|
-
@api_declaration = api_declaration
|
27
|
-
@path = path
|
28
|
-
@operations = []
|
29
|
-
end
|
30
|
-
|
31
|
-
def add_operation(yard_object)
|
32
|
-
@operations << Operation.from_yard_object(yard_object, self)
|
33
|
-
end
|
34
|
-
|
35
|
-
def operations_hash
|
36
|
-
Hash[@operations.map {|op| [op.http_method.downcase, op.to_h]}]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module SwaggerYard
|
2
|
-
class ApiDeclaration
|
3
|
-
attr_accessor :description, :resource
|
4
|
-
attr_reader :apis, :authorizations, :class_name
|
5
|
-
|
6
|
-
def self.from_yard_object(yard_object)
|
7
|
-
new.add_yard_object(yard_object)
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@resource = nil
|
12
|
-
@apis = {}
|
13
|
-
@authorizations = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def valid?
|
17
|
-
!@resource.nil?
|
18
|
-
end
|
19
|
-
|
20
|
-
def add_yard_object(yard_object)
|
21
|
-
case yard_object.type
|
22
|
-
when :class # controller
|
23
|
-
add_info(yard_object)
|
24
|
-
if valid?
|
25
|
-
yard_object.children.each do |child_object|
|
26
|
-
add_yard_object(child_object)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
when :method # actions
|
30
|
-
add_api(yard_object)
|
31
|
-
end
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def add_info(yard_object)
|
36
|
-
@description = yard_object.docstring
|
37
|
-
@class_name = yard_object.path
|
38
|
-
|
39
|
-
if tag = yard_object.tags.detect {|t| t.tag_name == "resource"}
|
40
|
-
@resource = tag.text
|
41
|
-
end
|
42
|
-
|
43
|
-
if tag = yard_object.tags.detect {|t| t.tag_name == "resource_path"}
|
44
|
-
SwaggerYard.log.warn "DEPRECATED: @resource_path tag is obsolete."
|
45
|
-
end
|
46
|
-
|
47
|
-
# we only have api_key auth, the value for now is always empty array
|
48
|
-
@authorizations = Hash[yard_object.tags.
|
49
|
-
select {|t| t.tag_name == "authorize_with"}.
|
50
|
-
map(&:text).uniq.
|
51
|
-
map {|k| [k, []]}]
|
52
|
-
end
|
53
|
-
|
54
|
-
def add_api(yard_object)
|
55
|
-
path = Api.path_from_yard_object(yard_object)
|
56
|
-
|
57
|
-
return if path.nil?
|
58
|
-
|
59
|
-
api = (apis[path] ||= Api.from_yard_object(yard_object, self))
|
60
|
-
api.add_operation(yard_object)
|
61
|
-
end
|
62
|
-
|
63
|
-
def apis_hash
|
64
|
-
Hash[apis.map {|path, api| [path, api.operations_hash]}]
|
65
|
-
end
|
66
|
-
|
67
|
-
def to_tag
|
68
|
-
{ "name" => resource,
|
69
|
-
"description" => description }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|