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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da1c1c2df36ccecf700e4d3ecf104c1324f9fa35b4588b4a040238f2513bf4b8
4
- data.tar.gz: 3d22562035e1d8e93b11876fc82f6a23b1d26e95952d988423559d555adf680a
3
+ metadata.gz: 13d3f48bc3d3d8fb42984b13e7b260f0c5e52331cbc6b641b600511b67aed323
4
+ data.tar.gz: 32437d0fc96f42c5c05120946154108d0ffa2a6d9ad3fce648c8c49884addbce
5
5
  SHA512:
6
- metadata.gz: 3a486a7b09b631d567f509c94b3b161350de61971f148ba24f707e117fa6915e6d7be99c6782ff07662da44edc3edb56ebb1691ac0fe8e819fc138dca4513ac9
7
- data.tar.gz: e4447e3a951d0867c76a6bbd30a49da136d9406d00dfe0c5e0632574746a59fa72b936eb736c573de33bfe01e1d36d36771561fed7b9a6b00be43dcaa0c82653
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([{}, Set.new]) do |(field_schemas, found), (k, v)|
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
@@ -30,6 +30,12 @@ module SoberSwag
30
30
  ViaMap.new(self, block)
31
31
  end
32
32
 
33
+ ##
34
+ # @return [SoberSwag::Reporting::Output::Enum]
35
+ def enum(*cases)
36
+ Enum.new(self, cases)
37
+ end
38
+
33
39
  def referenced(name)
34
40
  Referenced.new(self, name)
35
41
  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')
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SoberSwag
4
- VERSION = '0.22.0'
4
+ VERSION = '0.23.0'
5
5
  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.22.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: 2021-12-21 00:00:00.000000000 Z
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