sober_swag 0.22.0 → 0.23.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|