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 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