sober_swag 0.22.0 → 0.24.1

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: 85928715576aecc38e7a63176e14595a22531501e36ef9a4ef6202e03e08d8ea
4
+ data.tar.gz: 12940b348760152cef2e20c96adb15fc9ebf59e9aaacfd13741da83841c45bdf
5
5
  SHA512:
6
- metadata.gz: 3a486a7b09b631d567f509c94b3b161350de61971f148ba24f707e117fa6915e6d7be99c6782ff07662da44edc3edb56ebb1691ac0fe8e819fc138dca4513ac9
7
- data.tar.gz: e4447e3a951d0867c76a6bbd30a49da136d9406d00dfe0c5e0632574746a59fa72b936eb736c573de33bfe01e1d36d36771561fed7b9a6b00be43dcaa0c82653
6
+ metadata.gz: 88722e20a08f2b80b64501756474bcbd06758c2b7bcb498b0f0d316f5d335f43e5d937579f1888b8a5332eb536c0172618c75485a52bf6096c6ebe823e8e3f3e
7
+ data.tar.gz: 3f98c37fb29945196ce348f48886d9f27b9c913c83aca5520d96318d9711b5d5fc97347566e73c93538e931ad7d70c2ad725a006197504d2197a9e55432158c4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.24.1] 2022-05-26
4
+
5
+ - Added a better `#message` to `SoberSwag::Reporting::Report::Error`
6
+
3
7
  ## [v0.22.0] 2021-12-21
4
8
 
5
9
  - Added `SoberSwag::Reporting`, which is basically a v2 of the gem!
data/example/Gemfile CHANGED
@@ -8,7 +8,7 @@ gem 'actionpack', '>= 6.0.3.2'
8
8
  # Use sqlite3 as the database for Active Record
9
9
  gem 'sqlite3', '~> 1.4'
10
10
  # Use Puma as the app server
11
- gem 'puma', '~> 5.4'
11
+ gem 'puma', '~> 5.6'
12
12
  # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
13
13
  # gem 'jbuilder', '~> 2.7'
14
14
  # Use Active Model has_secure_password
data/example/Gemfile.lock CHANGED
@@ -64,14 +64,14 @@ GEM
64
64
  minitest (~> 5.1)
65
65
  tzinfo (~> 1.1)
66
66
  zeitwerk (~> 2.2, >= 2.2.2)
67
- bootsnap (1.9.3)
68
- msgpack (~> 1.0)
67
+ bootsnap (1.11.1)
68
+ msgpack (~> 1.2)
69
69
  builder (3.2.4)
70
70
  byebug (11.1.3)
71
71
  coderay (1.1.3)
72
- concurrent-ruby (1.1.9)
72
+ concurrent-ruby (1.1.10)
73
73
  crass (1.0.6)
74
- diff-lcs (1.4.4)
74
+ diff-lcs (1.5.0)
75
75
  dry-configurable (0.13.0)
76
76
  concurrent-ruby (~> 1.0)
77
77
  dry-core (~> 0.6)
@@ -98,16 +98,16 @@ GEM
98
98
  dry-types (>= 0.8.1)
99
99
  rails (>= 3)
100
100
  erubi (1.10.0)
101
- ffi (1.15.4)
101
+ ffi (1.15.5)
102
102
  globalid (1.0.0)
103
103
  activesupport (>= 5.0)
104
- i18n (1.8.11)
104
+ i18n (1.10.0)
105
105
  concurrent-ruby (~> 1.0)
106
106
  ice_nine (0.11.2)
107
- listen (3.7.0)
107
+ listen (3.7.1)
108
108
  rb-fsevent (~> 0.10, >= 0.10.3)
109
109
  rb-inotify (~> 0.9, >= 0.9.10)
110
- loofah (2.12.0)
110
+ loofah (2.16.0)
111
111
  crass (~> 1.0.2)
112
112
  nokogiri (>= 1.5.9)
113
113
  mail (2.7.1)
@@ -115,17 +115,17 @@ GEM
115
115
  marcel (1.0.2)
116
116
  method_source (1.0.0)
117
117
  mini_mime (1.1.2)
118
- mini_portile2 (2.6.1)
119
- minitest (5.14.4)
120
- msgpack (1.4.2)
118
+ mini_portile2 (2.8.0)
119
+ minitest (5.15.0)
120
+ msgpack (1.5.1)
121
121
  nio4r (2.5.8)
122
- nokogiri (1.12.5)
123
- mini_portile2 (~> 2.6.1)
122
+ nokogiri (1.13.4)
123
+ mini_portile2 (~> 2.8.0)
124
124
  racc (~> 1.4)
125
125
  pry (0.14.1)
126
126
  coderay (~> 1.1)
127
127
  method_source (~> 1.0)
128
- puma (5.5.2)
128
+ puma (5.6.4)
129
129
  nio4r (~> 2.0)
130
130
  racc (1.6.0)
131
131
  rack (2.2.3)
@@ -158,18 +158,18 @@ GEM
158
158
  rake (>= 0.8.7)
159
159
  thor (>= 0.20.3, < 2.0)
160
160
  rake (13.0.6)
161
- rb-fsevent (0.11.0)
161
+ rb-fsevent (0.11.1)
162
162
  rb-inotify (0.10.1)
163
163
  ffi (~> 1.0)
164
- rspec-core (3.10.1)
165
- rspec-support (~> 3.10.0)
166
- rspec-expectations (3.10.1)
164
+ rspec-core (3.11.0)
165
+ rspec-support (~> 3.11.0)
166
+ rspec-expectations (3.11.0)
167
167
  diff-lcs (>= 1.2.0, < 2.0)
168
- rspec-support (~> 3.10.0)
169
- rspec-mocks (3.10.2)
168
+ rspec-support (~> 3.11.0)
169
+ rspec-mocks (3.11.1)
170
170
  diff-lcs (>= 1.2.0, < 2.0)
171
- rspec-support (~> 3.10.0)
172
- rspec-rails (5.0.2)
171
+ rspec-support (~> 3.11.0)
172
+ rspec-rails (5.1.2)
173
173
  actionpack (>= 5.2)
174
174
  activesupport (>= 5.2)
175
175
  railties (>= 5.2)
@@ -177,7 +177,7 @@ GEM
177
177
  rspec-expectations (~> 3.10)
178
178
  rspec-mocks (~> 3.10)
179
179
  rspec-support (~> 3.10)
180
- rspec-support (3.10.3)
180
+ rspec-support (3.11.0)
181
181
  spring (2.1.1)
182
182
  spring-watcher-listen (2.0.1)
183
183
  listen (>= 2.7, < 4.0)
@@ -190,14 +190,14 @@ GEM
190
190
  activesupport (>= 5.2)
191
191
  sprockets (>= 3.0.0)
192
192
  sqlite3 (1.4.2)
193
- thor (1.1.0)
193
+ thor (1.2.1)
194
194
  thread_safe (0.3.6)
195
195
  tzinfo (1.2.9)
196
196
  thread_safe (~> 0.1)
197
197
  websocket-driver (0.7.5)
198
198
  websocket-extensions (>= 0.1.0)
199
199
  websocket-extensions (0.1.5)
200
- zeitwerk (2.5.1)
200
+ zeitwerk (2.5.4)
201
201
 
202
202
  PLATFORMS
203
203
  ruby
@@ -209,7 +209,7 @@ DEPENDENCIES
209
209
  dry-types-rails
210
210
  listen (>= 3.0.5, < 3.8)
211
211
  pry
212
- puma (~> 5.4)
212
+ puma (~> 5.6)
213
213
  rails (~> 6.0.2, >= 6.0.2.2)
214
214
  rspec-rails
215
215
  sober_swag!
@@ -42,6 +42,7 @@ module SoberSwag
42
42
  # @param type the attribute type
43
43
  def attribute(key, parent = SoberSwag::InputObject, &block)
44
44
  raise ArgumentError, "parent class #{parent} is not an input object type!" unless valid_field_def?(parent, block)
45
+ raise ArgumentError, "cannot mix reporting and non-reporting types at attribute #{key}" if parent.is_a?(SoberSwag::Reporting::Input::Interface)
45
46
 
46
47
  super(key, parent, &block)
47
48
  end
@@ -11,6 +11,8 @@ module SoberSwag
11
11
  # @param from [Symbol] method name to extract this field from, for convenience.
12
12
  # @param block [Proc] optional way to extract this field.
13
13
  def field(name, serializer, from: nil, &block)
14
+ raise ArgumentError, "do not mix reporting and non-reporting outputs (at key #{name})" if serializer.is_a?(SoberSwag::Reporting::Output::Interface)
15
+
14
16
  add_field!(Field.new(name, serializer, from: from, &block))
15
17
  end
16
18
 
@@ -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),
@@ -76,6 +76,7 @@ module SoberSwag
76
76
  #
77
77
  def add_attribute!(name, input, required:, description: nil)
78
78
  raise ArgumentError, 'name must be a symbol' unless name.is_a?(Symbol)
79
+ raise ArgumentError, 'input type must be a SoberSwag::Reporting::Input::Interface' unless input.is_a?(Interface)
79
80
 
80
81
  define_attribute(name) # defines an instance method to access this attribute
81
82
 
@@ -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
@@ -0,0 +1,64 @@
1
+ module SoberSwag
2
+ module Reporting
3
+ module Output
4
+ ##
5
+ # Specify that an output will be within a certain range.
6
+ # This gets translated to `minimum` and `maximum` keys in swagger.
7
+ class InRange < Base
8
+ def initialize(output, range)
9
+ @output = output
10
+ @range = range
11
+ end
12
+
13
+ ##
14
+ # @return [Interface]
15
+ attr_reader :output
16
+
17
+ ##
18
+ # @return [Range]
19
+ attr_reader :range
20
+
21
+ def call(value)
22
+ output.call(value)
23
+ end
24
+
25
+ def serialize_report(value)
26
+ rep = output.serialize_report(value)
27
+
28
+ return rep if rep.is_a?(Report::Base)
29
+
30
+ return Report::Value.new(['was not in minimum/maximum range']) unless range.member?(rep)
31
+
32
+ rep
33
+ end
34
+
35
+ def swagger_schema
36
+ schema, found = output.swagger_schema
37
+
38
+ merged =
39
+ if schema.key?(:$ref)
40
+ { allOf: [schema] }
41
+ else
42
+ schema
43
+ end.merge(maximum_portion).merge(minimum_portion)
44
+
45
+ [merged, found]
46
+ end
47
+
48
+ def maximum_portion
49
+ return {} unless range.end
50
+
51
+ res = { maximum: range.end }
52
+ res[:exclusiveMaximum] = true if range.exclude_end?
53
+ res
54
+ end
55
+
56
+ def minimum_portion
57
+ return {} unless range.begin
58
+
59
+ { minimum: range.begin }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -30,10 +30,25 @@ 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
36
42
 
43
+ ##
44
+ # @return [SoberSwag::Reporting::Output::InRange]
45
+ # Constrained values: must be within the given range.
46
+ def in_range(range)
47
+ raise ArgumentError, 'need a range' unless range.is_a?(Range)
48
+
49
+ InRange.new(self, range)
50
+ end
51
+
37
52
  def list
38
53
  List.new(self)
39
54
  end
@@ -20,6 +20,8 @@ module SoberSwag
20
20
  #
21
21
  # You can access other methods from this method.
22
22
  def field(name, output, description: nil, &extract)
23
+ raise ArgumentError, "output of field #{name} is not a SoberSwag::Reporting::Output::Interface" unless output.is_a?(Interface)
24
+
23
25
  define_field(name, extract)
24
26
 
25
27
  object_fields[name] = Object::Property.new(
@@ -158,22 +160,20 @@ module SoberSwag
158
160
  # @param name [Symbol] name of this view.
159
161
  # @yieldself [self] a block in which you can add more fields to the view.
160
162
  # @return [Class]
161
- def define_view(name, &block) # rubocop:disable Metrics/MethodLength
162
- raise ArgumentError, "duplicate view #{name}" if name == :base || views.include?(name)
163
-
164
- classy_name = name.to_s.classify
163
+ def define_view(name, &block)
164
+ define_view_with_parent(name, self, block)
165
+ end
165
166
 
166
- Class.new(self).tap do |c|
167
- c.instance_eval(&block)
168
- c.define_singleton_method(:define_view) do |*|
169
- raise ArgumentError, 'no nesting views'
170
- end
171
- c.define_singleton_method(:identifier) do
172
- [parent_struct.identifier, classy_name.gsub('::', '.')].join('.')
173
- end
174
- const_set(classy_name, c)
175
- view_map[name] = c
176
- end
167
+ ##
168
+ # Defines a view for this object, which "inherits" another view.
169
+ # @see #define_view for how views behave.
170
+ #
171
+ # @param name [Symbol] name of this view
172
+ # @param inherits [Symbol] name of the view this view inherits
173
+ # @yieldself [self] a block in which you can add more fields to this view
174
+ # @return [Class]
175
+ def define_inherited_view(name, inherits:, &block)
176
+ define_view_with_parent(name, view_class(inherits), block)
177
177
  end
178
178
 
179
179
  ##
@@ -199,6 +199,16 @@ module SoberSwag
199
199
  view_map.fetch(name).view(:base)
200
200
  end
201
201
 
202
+ ##
203
+ # Equivalent to .view, but returns the raw view class.
204
+ #
205
+ # @return [Class]
206
+ def view_class(name)
207
+ return self if name == :base
208
+
209
+ view_map.fetch(name)
210
+ end
211
+
202
212
  attr_accessor :parent_struct
203
213
 
204
214
  ##
@@ -226,6 +236,21 @@ module SoberSwag
226
236
 
227
237
  private
228
238
 
239
+ def define_view_with_parent(name, parent, block)
240
+ raise ArgumentError, "duplicate view #{name}" if name == :base || views.include?(name)
241
+
242
+ classy_name = name.to_s.classify
243
+ us = self # grab this so its identifier doesn't get nested under whatever parent it inherits from, since its our view
244
+
245
+ Class.new(parent).tap do |c|
246
+ c.instance_eval(&block)
247
+ c.define_singleton_method(:define_view) { |*| raise ArgumentError, 'no nesting views' }
248
+ c.define_singleton_method(:identifier) { [us.identifier, classy_name.gsub('::', '.')].join('.') }
249
+ const_set(classy_name, c)
250
+ view_map[name] = c
251
+ end
252
+ end
253
+
229
254
  def identified_view_map
230
255
  view_map.transform_values(&:identified_without_base).merge(base: inherited_output)
231
256
  end
@@ -10,11 +10,13 @@ module SoberSwag
10
10
  autoload(:Defer, 'sober_swag/reporting/output/defer')
11
11
  autoload(:Described, 'sober_swag/reporting/output/described')
12
12
  autoload(:Dictionary, 'sober_swag/reporting/output/dictionary')
13
+ autoload(:InRange, 'sober_swag/reporting/output/in_range')
13
14
  autoload(:Interface, 'sober_swag/reporting/output/interface')
14
15
  autoload(:List, 'sober_swag/reporting/output/list')
15
16
  autoload(:MergeObjects, 'sober_swag/reporting/output/merge_objects')
16
17
  autoload(:Null, 'sober_swag/reporting/output/null')
17
18
  autoload(:Number, 'sober_swag/reporting/output/number')
19
+ autoload(:Enum, 'sober_swag/reporting/output/enum')
18
20
  autoload(:Object, 'sober_swag/reporting/output/object')
19
21
  autoload(:Partitioned, 'sober_swag/reporting/output/partitioned')
20
22
  autoload(:Pattern, 'sober_swag/reporting/output/pattern')
@@ -8,6 +8,10 @@ module SoberSwag
8
8
  @report = report
9
9
  end
10
10
 
11
+ def message
12
+ "Reported errors: #{report.full_errors.join(', ')}"
13
+ end
14
+
11
15
  attr_reader :report
12
16
  end
13
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SoberSwag
4
- VERSION = '0.22.0'
4
+ VERSION = '0.24.1'
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.24.1
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-05-26 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,8 @@ 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
329
+ - lib/sober_swag/reporting/output/in_range.rb
326
330
  - lib/sober_swag/reporting/output/interface.rb
327
331
  - lib/sober_swag/reporting/output/list.rb
328
332
  - lib/sober_swag/reporting/output/merge_objects.rb