sober_swag 0.22.0 → 0.23.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/lib/sober_swag/reporting/input/in_range.rb +61 -0
- data/lib/sober_swag/reporting/input/interface.rb +26 -0
- data/lib/sober_swag/reporting/input/multiple_of.rb +36 -0
- data/lib/sober_swag/reporting/input/object.rb +1 -1
- data/lib/sober_swag/reporting/input.rb +2 -0
- data/lib/sober_swag/reporting/output/enum.rb +47 -0
- data/lib/sober_swag/reporting/output/interface.rb +6 -0
- data/lib/sober_swag/reporting/output.rb +1 -0
- data/lib/sober_swag/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13d3f48bc3d3d8fb42984b13e7b260f0c5e52331cbc6b641b600511b67aed323
|
4
|
+
data.tar.gz: 32437d0fc96f42c5c05120946154108d0ffa2a6d9ad3fce648c8c49884addbce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e643f5d730c20eac9671c6e306f63c8c0b679dd26eab69a5eea91aa456c094f240399c7058d59300e7c333c3747980a814a7db43f979f2e800cdc9ef940f577
|
7
|
+
data.tar.gz: 4454eee231879d67313f1d9c1d1b094faf1131d3487f68d96fa1e529055ce48954ad8fa74eeef78b675baf7a4404afb778d607ce701b27a3e40bbeb513aaab15
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module SoberSwag
|
2
|
+
module Reporting
|
3
|
+
module Input
|
4
|
+
##
|
5
|
+
# Specify that an item must be within a given range in ruby.
|
6
|
+
# This gets translated to `minimum` and `maximum` keys in swagger.
|
7
|
+
#
|
8
|
+
# This works with endless ranges (Ruby 2.6+) and beginless ranges (Ruby 2.7+)
|
9
|
+
class InRange < Base
|
10
|
+
def initialize(input, range)
|
11
|
+
@input = input
|
12
|
+
@range = range
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# @return [Interface]
|
17
|
+
attr_reader :input
|
18
|
+
|
19
|
+
##
|
20
|
+
# @return [Range]
|
21
|
+
attr_reader :range
|
22
|
+
|
23
|
+
##
|
24
|
+
# @return [Range]
|
25
|
+
def call(value)
|
26
|
+
res = input.call(value)
|
27
|
+
|
28
|
+
return res if res.is_a?(Report::Base)
|
29
|
+
return Report::Value.new(['was not in minimum/maximum range']) unless range.member?(res)
|
30
|
+
|
31
|
+
res
|
32
|
+
end
|
33
|
+
|
34
|
+
def swagger_schema
|
35
|
+
schema, found = input.swagger_schema
|
36
|
+
|
37
|
+
merged =
|
38
|
+
if schema.key?(:$ref)
|
39
|
+
{ allOf: [schema] }
|
40
|
+
else
|
41
|
+
schema
|
42
|
+
end.merge(maximum_portion).merge(minimum_portion)
|
43
|
+
|
44
|
+
[merged, found]
|
45
|
+
end
|
46
|
+
|
47
|
+
def maximum_portion
|
48
|
+
return {} unless range.end
|
49
|
+
|
50
|
+
{ maximum: range.end, exclusiveMaximum: range.exclude_end? }
|
51
|
+
end
|
52
|
+
|
53
|
+
def minimum_portion
|
54
|
+
return {} unless range.begin
|
55
|
+
|
56
|
+
{ minimum: range.begin, exclusiveMinimum: false }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -35,6 +35,21 @@ module SoberSwag
|
|
35
35
|
List.new(self)
|
36
36
|
end
|
37
37
|
|
38
|
+
##
|
39
|
+
# Constrained values: must be in range.
|
40
|
+
# @return [InRange]
|
41
|
+
def in_range(range)
|
42
|
+
raise ArgumentError, "need a range, not a #{range.class}" unless range.is_a?(Range)
|
43
|
+
|
44
|
+
InRange.new(self, range)
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Constrained values: must be a multiple of the given number
|
49
|
+
def multiple_of(number)
|
50
|
+
MultipleOf.new(self, number)
|
51
|
+
end
|
52
|
+
|
38
53
|
def referenced(name)
|
39
54
|
Referenced.new(self, name)
|
40
55
|
end
|
@@ -74,6 +89,17 @@ module SoberSwag
|
|
74
89
|
raise InvalidSchemaError::InvalidForQueryError.new(self) # rubocop:disable Style/RaiseArgs
|
75
90
|
end
|
76
91
|
|
92
|
+
def modify_schema(base, addition)
|
93
|
+
schema, found = base.swagger_schema
|
94
|
+
merged =
|
95
|
+
if schema.key?(:$ref)
|
96
|
+
{ allOf: [schema] }
|
97
|
+
else
|
98
|
+
schema
|
99
|
+
end.merge(addition)
|
100
|
+
[merged, found]
|
101
|
+
end
|
102
|
+
|
77
103
|
def add_schema_key(base, addition)
|
78
104
|
if base.key?(:$ref)
|
79
105
|
{ allOf: [base] }.merge(addition)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SoberSwag
|
2
|
+
module Reporting
|
3
|
+
module Input
|
4
|
+
##
|
5
|
+
# Adds the multipleOf constraint to input types.
|
6
|
+
# Will use the '%' operator to calculate this, which may behave oddly for floats.
|
7
|
+
class MultipleOf < Base
|
8
|
+
def initialize(input, mult)
|
9
|
+
@input = input
|
10
|
+
@mult = mult
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# @return [Interface]
|
15
|
+
attr_reader :input
|
16
|
+
|
17
|
+
##
|
18
|
+
# @return [Numeric]
|
19
|
+
attr_reader :mult
|
20
|
+
|
21
|
+
def call(value)
|
22
|
+
parsed = input.call(value)
|
23
|
+
|
24
|
+
return parsed if parsed.is_a?(Report::Base)
|
25
|
+
return Report::Value.new(["was not a multiple of #{mult}"]) unless (parsed % mult).zero?
|
26
|
+
|
27
|
+
parsed
|
28
|
+
end
|
29
|
+
|
30
|
+
def swagger_schema
|
31
|
+
modify_schema(input, { multipleOf: mult })
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -65,7 +65,7 @@ module SoberSwag
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def field_schemas
|
68
|
-
fields.reduce([{},
|
68
|
+
fields.reduce([{}, {}]) do |(field_schemas, found), (k, v)|
|
69
69
|
key_schema, key_found = v.property_schema
|
70
70
|
[
|
71
71
|
field_schemas.merge(k => key_schema),
|
@@ -14,7 +14,9 @@ module SoberSwag
|
|
14
14
|
autoload :Format, 'sober_swag/reporting/input/format'
|
15
15
|
autoload :Number, 'sober_swag/reporting/input/number'
|
16
16
|
autoload :Interface, 'sober_swag/reporting/input/interface'
|
17
|
+
autoload :InRange, 'sober_swag/reporting/input/in_range'
|
17
18
|
autoload :List, 'sober_swag/reporting/input/list'
|
19
|
+
autoload :MultipleOf, 'sober_swag/reporting/input/multiple_of'
|
18
20
|
autoload :Mapped, 'sober_swag/reporting/input/mapped'
|
19
21
|
autoload :MergeObjects, 'sober_swag/reporting/input/merge_objects'
|
20
22
|
autoload :Null, 'sober_swag/reporting/input/null'
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module SoberSwag
|
2
|
+
module Reporting
|
3
|
+
module Output
|
4
|
+
##
|
5
|
+
# Models outputting an enum.
|
6
|
+
class Enum < Base
|
7
|
+
def initialize(output, values)
|
8
|
+
@output = output
|
9
|
+
@values = values
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# @return [Interface]
|
14
|
+
attr_reader :output
|
15
|
+
|
16
|
+
##
|
17
|
+
# @return [Array]
|
18
|
+
attr_reader :values
|
19
|
+
|
20
|
+
def call(value)
|
21
|
+
output.call(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize_report(value)
|
25
|
+
rep = output.serialize_report(value)
|
26
|
+
|
27
|
+
return rep if rep.is_a?(Report::Base)
|
28
|
+
|
29
|
+
return Report::Value.new(['was not an acceptable enum member']) unless values.include?(rep)
|
30
|
+
|
31
|
+
rep
|
32
|
+
end
|
33
|
+
|
34
|
+
def swagger_schema
|
35
|
+
schema, found = output.swagger_schema
|
36
|
+
merged =
|
37
|
+
if schema.key?(:$ref)
|
38
|
+
{ allOf: [schema] }
|
39
|
+
else
|
40
|
+
schema
|
41
|
+
end.merge(enum: values)
|
42
|
+
[merged, found]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -15,6 +15,7 @@ module SoberSwag
|
|
15
15
|
autoload(:MergeObjects, 'sober_swag/reporting/output/merge_objects')
|
16
16
|
autoload(:Null, 'sober_swag/reporting/output/null')
|
17
17
|
autoload(:Number, 'sober_swag/reporting/output/number')
|
18
|
+
autoload(:Enum, 'sober_swag/reporting/output/enum')
|
18
19
|
autoload(:Object, 'sober_swag/reporting/output/object')
|
19
20
|
autoload(:Partitioned, 'sober_swag/reporting/output/partitioned')
|
20
21
|
autoload(:Pattern, 'sober_swag/reporting/output/pattern')
|
data/lib/sober_swag/version.rb
CHANGED
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.23.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: 2022-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -304,10 +304,12 @@ files:
|
|
304
304
|
- lib/sober_swag/reporting/input/either.rb
|
305
305
|
- lib/sober_swag/reporting/input/enum.rb
|
306
306
|
- lib/sober_swag/reporting/input/format.rb
|
307
|
+
- lib/sober_swag/reporting/input/in_range.rb
|
307
308
|
- lib/sober_swag/reporting/input/interface.rb
|
308
309
|
- lib/sober_swag/reporting/input/list.rb
|
309
310
|
- lib/sober_swag/reporting/input/mapped.rb
|
310
311
|
- lib/sober_swag/reporting/input/merge_objects.rb
|
312
|
+
- lib/sober_swag/reporting/input/multiple_of.rb
|
311
313
|
- lib/sober_swag/reporting/input/null.rb
|
312
314
|
- lib/sober_swag/reporting/input/number.rb
|
313
315
|
- lib/sober_swag/reporting/input/object.rb
|
@@ -323,6 +325,7 @@ files:
|
|
323
325
|
- lib/sober_swag/reporting/output/defer.rb
|
324
326
|
- lib/sober_swag/reporting/output/described.rb
|
325
327
|
- lib/sober_swag/reporting/output/dictionary.rb
|
328
|
+
- lib/sober_swag/reporting/output/enum.rb
|
326
329
|
- lib/sober_swag/reporting/output/interface.rb
|
327
330
|
- lib/sober_swag/reporting/output/list.rb
|
328
331
|
- lib/sober_swag/reporting/output/merge_objects.rb
|