sober_swag 0.17.0 → 0.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/benchmark.yml +39 -0
- data/.github/workflows/lint.yml +2 -4
- data/.github/workflows/ruby.yml +1 -1
- data/.gitignore +3 -0
- data/.rubocop.yml +5 -1
- data/.yardopts +7 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +12 -0
- data/README.md +1 -1
- data/bench/benchmark.rb +34 -0
- data/bench/benchmarks/basic_field_serializer.rb +21 -0
- data/bench/benchmarks/view_selection.rb +47 -0
- data/docs/serializers.md +4 -1
- data/example/Gemfile +2 -2
- data/example/Gemfile.lock +46 -44
- data/example/config/environments/production.rb +1 -1
- data/lib/sober_swag/compiler/path.rb +42 -3
- data/lib/sober_swag/compiler/paths.rb +20 -0
- data/lib/sober_swag/compiler/primitive.rb +20 -1
- data/lib/sober_swag/compiler/type.rb +105 -22
- data/lib/sober_swag/compiler.rb +29 -3
- data/lib/sober_swag/controller/route.rb +103 -20
- data/lib/sober_swag/controller.rb +39 -12
- data/lib/sober_swag/input_object.rb +124 -7
- data/lib/sober_swag/nodes/array.rb +19 -0
- data/lib/sober_swag/nodes/attribute.rb +45 -4
- data/lib/sober_swag/nodes/base.rb +27 -7
- data/lib/sober_swag/nodes/binary.rb +30 -13
- data/lib/sober_swag/nodes/enum.rb +16 -1
- data/lib/sober_swag/nodes/list.rb +20 -0
- data/lib/sober_swag/nodes/nullable_primitive.rb +3 -0
- data/lib/sober_swag/nodes/object.rb +4 -1
- data/lib/sober_swag/nodes/one_of.rb +11 -3
- data/lib/sober_swag/nodes/primitive.rb +34 -2
- data/lib/sober_swag/nodes/sum.rb +8 -0
- data/lib/sober_swag/output_object/definition.rb +57 -1
- data/lib/sober_swag/output_object/field.rb +31 -11
- data/lib/sober_swag/output_object/field_syntax.rb +19 -3
- data/lib/sober_swag/output_object/view.rb +46 -1
- data/lib/sober_swag/output_object.rb +40 -19
- data/lib/sober_swag/parser.rb +7 -1
- data/lib/sober_swag/serializer/array.rb +27 -3
- data/lib/sober_swag/serializer/base.rb +75 -25
- data/lib/sober_swag/serializer/conditional.rb +33 -1
- data/lib/sober_swag/serializer/field_list.rb +23 -5
- data/lib/sober_swag/serializer/hash.rb +53 -0
- data/lib/sober_swag/serializer/mapped.rb +10 -1
- data/lib/sober_swag/serializer/optional.rb +18 -1
- data/lib/sober_swag/serializer/primitive.rb +3 -0
- data/lib/sober_swag/serializer.rb +1 -0
- data/lib/sober_swag/server.rb +27 -11
- data/lib/sober_swag/type/named.rb +14 -0
- data/lib/sober_swag/types/comma_array.rb +4 -0
- data/lib/sober_swag/version.rb +1 -1
- data/lib/sober_swag.rb +6 -1
- metadata +9 -2
@@ -4,6 +4,9 @@ module SoberSwag
|
|
4
4
|
# A class that does *no* serialization: you give it a type,
|
5
5
|
# and it will pass any serialized input on verbatim.
|
6
6
|
class Primitive < Base
|
7
|
+
##
|
8
|
+
# Construct a primitive serializer with a description of the type it serializes to.
|
9
|
+
# @param type [Class] a swagger-able type
|
7
10
|
def initialize(type)
|
8
11
|
@type = type
|
9
12
|
end
|
@@ -10,6 +10,7 @@ module SoberSwag
|
|
10
10
|
autoload(:Mapped, 'sober_swag/serializer/mapped')
|
11
11
|
autoload(:Optional, 'sober_swag/serializer/optional')
|
12
12
|
autoload(:FieldList, 'sober_swag/serializer/field_list')
|
13
|
+
autoload(:Hash, 'sober_swag/serializer/hash')
|
13
14
|
autoload(:Meta, 'sober_swag/serializer/meta')
|
14
15
|
|
15
16
|
class << self
|
data/lib/sober_swag/server.rb
CHANGED
@@ -21,42 +21,58 @@ module SoberSwag
|
|
21
21
|
# Start up.
|
22
22
|
#
|
23
23
|
# @param controller_proc [Proc] a proc that, when called, gives a list of {SoberSwag::Controller}s to document
|
24
|
-
# @param cache [Bool | Proc] if we should cache our
|
24
|
+
# @param cache [Bool | Proc] if we should cache our definitions (default false)
|
25
|
+
# @param redoc_version [String] what version of the redoc library to use to display UI (default 'next', the latest version).
|
25
26
|
def initialize(
|
26
27
|
controller_proc: RAILS_CONTROLLER_PROC,
|
27
|
-
cache: false
|
28
|
+
cache: false,
|
29
|
+
redoc_version: 'next'
|
28
30
|
)
|
29
31
|
@controller_proc = controller_proc
|
30
32
|
@cache = cache
|
33
|
+
@html = EFFECT_HTML.gsub(/REDOC_VERSION/, redoc_version)
|
31
34
|
end
|
32
35
|
|
33
36
|
EFFECT_HTML = <<~HTML.freeze
|
34
37
|
<!DOCTYPE html>
|
35
38
|
<html>
|
36
39
|
<head>
|
37
|
-
<title>
|
38
|
-
|
39
|
-
<
|
40
|
+
<title>ReDoc</title>
|
41
|
+
<!-- needed for adaptive design -->
|
42
|
+
<meta charset="utf-8"/>
|
43
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
44
|
+
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
|
45
|
+
|
46
|
+
<!--
|
47
|
+
ReDoc doesn't change outer page styles
|
48
|
+
-->
|
49
|
+
<style>
|
50
|
+
body {
|
51
|
+
margin: 0;
|
52
|
+
padding: 0;
|
53
|
+
}
|
54
|
+
</style>
|
40
55
|
</head>
|
41
56
|
<body>
|
42
|
-
<
|
43
|
-
</
|
44
|
-
<script>
|
45
|
-
SwaggerUIBundle({url: 'SCRIPT_NAME', dom_id: '#swagger'})
|
46
|
-
</script>
|
57
|
+
<redoc spec-url='SCRIPT_NAME'></redoc>
|
58
|
+
<script src="https://cdn.jsdelivr.net/npm/redoc@REDOC_VERSION/bundles/redoc.standalone.js"> </script>
|
47
59
|
</body>
|
48
60
|
</html>
|
49
61
|
HTML
|
50
62
|
|
63
|
+
##
|
64
|
+
# Standard Rack call method.
|
51
65
|
def call(env)
|
52
66
|
req = Rack::Request.new(env)
|
53
67
|
if req.path_info&.match?(/json/si) || req.get_header('Accept')&.match?(/json/si)
|
54
68
|
[200, { 'Content-Type' => 'application/json' }, [generate_json_string]]
|
55
69
|
else
|
56
|
-
[200, { 'Content-Type' => 'text/html' }, [
|
70
|
+
[200, { 'Content-Type' => 'text/html' }, [@html.gsub(/SCRIPT_NAME/, "#{env['SCRIPT_NAME']}.json")]]
|
57
71
|
end
|
58
72
|
end
|
59
73
|
|
74
|
+
private
|
75
|
+
|
60
76
|
def generate_json_string
|
61
77
|
if cache?
|
62
78
|
@json_string ||= JSON.dump(generate_swagger)
|
@@ -9,24 +9,38 @@ module SoberSwag
|
|
9
9
|
# Modules that include {SoberSwag::Type::Named}
|
10
10
|
# will automatically extend this module.
|
11
11
|
module ClassMethods
|
12
|
+
##
|
13
|
+
# Is this type a "wrapper" for another type?
|
12
14
|
def alias?
|
13
15
|
false
|
14
16
|
end
|
15
17
|
|
18
|
+
##
|
19
|
+
# The type this type is a wrapper for
|
16
20
|
def alias_of
|
17
21
|
nil
|
18
22
|
end
|
19
23
|
|
24
|
+
##
|
25
|
+
# The "root" type along the alias chain
|
20
26
|
def root_alias
|
21
27
|
alias_of || self
|
22
28
|
end
|
23
29
|
|
30
|
+
##
|
31
|
+
# @overload description()
|
32
|
+
# @return [String] a human-readable description of this type
|
33
|
+
# @overload description(arg)
|
34
|
+
# @param arg [String] a human-readable description of this type
|
35
|
+
# @return [String] `arg`
|
24
36
|
def description(arg = nil)
|
25
37
|
@description = arg if arg
|
26
38
|
@description
|
27
39
|
end
|
28
40
|
end
|
29
41
|
|
42
|
+
##
|
43
|
+
# When included, extends {SoberSwag::Type::Named::ClassMethods}
|
30
44
|
def self.included(mod)
|
31
45
|
mod.extend(ClassMethods)
|
32
46
|
end
|
@@ -3,6 +3,10 @@ module SoberSwag
|
|
3
3
|
##
|
4
4
|
# An array that will be parsed from comma-separated values in a string, if given a string.
|
5
5
|
module CommaArray
|
6
|
+
##
|
7
|
+
# Get a parser that will parse comma-separated values of another type.
|
8
|
+
# @param other [Class] a swagger-able type to parse into
|
9
|
+
# @return [SoberSwag::Types::CommaArray]
|
6
10
|
def self.of(other)
|
7
11
|
SoberSwag::Types::Array.of(other).constructor { |val|
|
8
12
|
if val.is_a?(::String)
|
data/lib/sober_swag/version.rb
CHANGED
data/lib/sober_swag.rb
CHANGED
@@ -9,8 +9,10 @@ require 'sober_swag/version'
|
|
9
9
|
require 'active_support/inflector'
|
10
10
|
|
11
11
|
##
|
12
|
-
# Root namespace
|
12
|
+
# Root namespace for the SoberSwag Module.
|
13
13
|
module SoberSwag
|
14
|
+
##
|
15
|
+
# Root Error Class for SoberSwag errors.
|
14
16
|
class Error < StandardError; end
|
15
17
|
|
16
18
|
autoload :Parser, 'sober_swag/parser'
|
@@ -26,7 +28,10 @@ module SoberSwag
|
|
26
28
|
##
|
27
29
|
# Define a struct of something.
|
28
30
|
# Useful to prevent weirdness from autoloading.
|
31
|
+
#
|
29
32
|
# @param parent [Class] the base class for the struct (default of {SoberSwag::Struct})
|
33
|
+
# @yieldself [SoberSwag::InputObject]
|
34
|
+
# @return [Class] the input object class generated
|
30
35
|
def self.input_object(parent = nil, &block)
|
31
36
|
Class.new(parent || SoberSwag::InputObject, &block)
|
32
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sober_swag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Super
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -172,6 +172,8 @@ extensions: []
|
|
172
172
|
extra_rdoc_files: []
|
173
173
|
files:
|
174
174
|
- ".github/config/rubocop_linter_action.yml"
|
175
|
+
- ".github/dependabot.yml"
|
176
|
+
- ".github/workflows/benchmark.yml"
|
175
177
|
- ".github/workflows/lint.yml"
|
176
178
|
- ".github/workflows/ruby.yml"
|
177
179
|
- ".gitignore"
|
@@ -179,11 +181,15 @@ files:
|
|
179
181
|
- ".rubocop.yml"
|
180
182
|
- ".ruby-version"
|
181
183
|
- ".travis.yml"
|
184
|
+
- ".yardopts"
|
182
185
|
- CHANGELOG.md
|
183
186
|
- Gemfile
|
184
187
|
- LICENSE.txt
|
185
188
|
- README.md
|
186
189
|
- Rakefile
|
190
|
+
- bench/benchmark.rb
|
191
|
+
- bench/benchmarks/basic_field_serializer.rb
|
192
|
+
- bench/benchmarks/view_selection.rb
|
187
193
|
- bin/console
|
188
194
|
- bin/rspec
|
189
195
|
- bin/setup
|
@@ -282,6 +288,7 @@ files:
|
|
282
288
|
- lib/sober_swag/serializer/base.rb
|
283
289
|
- lib/sober_swag/serializer/conditional.rb
|
284
290
|
- lib/sober_swag/serializer/field_list.rb
|
291
|
+
- lib/sober_swag/serializer/hash.rb
|
285
292
|
- lib/sober_swag/serializer/mapped.rb
|
286
293
|
- lib/sober_swag/serializer/meta.rb
|
287
294
|
- lib/sober_swag/serializer/optional.rb
|