sober_swag 0.17.0 → 0.21.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/.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
|