sober_swag 0.3.0 → 0.4.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: c404cf1bad19f06280ce4c8a2002899ed37e9e68e0fc910d270b4e14dc38dab6
4
- data.tar.gz: 29333042d89f5f3de762143ef60566bbbb45640a948c8b5720c4563b236a1d64
3
+ metadata.gz: 58d8be36679e1f9e29622e05aded075a325ab9fef563b4853c4715a1b4250a86
4
+ data.tar.gz: 7e33fec98c8bf330e7e49af5326a234447154c35f5813d17e3c134e7f41dfa71
5
5
  SHA512:
6
- metadata.gz: 1b84c508452f4dfd1250e0b6255d11173e2eb8382669adb75d3356f842a9ce7e6155410f5c233c6a8eae00697db0a561b3e466cfa9704996fb8de76c164f9c6b
7
- data.tar.gz: 45f28285e80a666f45f6b8ef3b598fb68c321da83022ee3d13b8532bf97cc9b2fe3eaed36ca3d670fe75b44a37263d349ce76dde44f4ed80bdb5583bb4e7f342
6
+ metadata.gz: 8e9cc9c095545c83b9411bc69cc3c459e017b72b220c8b79dbbfc4a1a303d3bf864d2c984a1290e13b42a999d8d19d03e6a78a66c4992102c31451ea538305de
7
+ data.tar.gz: 52ecf6c37d3dad5893c9626fd833ba2ae4ff52ddf03895719bb40784aacc63bac0db6c282cd521786902ffad76425c0f5f89d9093412ba166374bbaee796762b
@@ -17,6 +17,9 @@ jobs:
17
17
  test:
18
18
 
19
19
  runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby: [ '2.5', '2.6', '2.7' ]
20
23
 
21
24
  steps:
22
25
  - uses: actions/checkout@v2
@@ -30,9 +33,9 @@ jobs:
30
33
  - uses: actions/cache@v2
31
34
  with:
32
35
  path: vendor/bundle
33
- key: ${{ runner.os }}-gem-deps-${{ hashFiles('**/Gemfile.lock') }}
36
+ key: ${{ runner.os }}-${{ matrix.ruby }}-gem-deps-${{ hashFiles('**/Gemfile.lock') }}
34
37
  restore-keys: |
35
- ${{ runner.os }}-gem-deps-
38
+ ${{ runner.os }}-${{ matrix.ruby }}-gem-deps-
36
39
  - name: Install dependencies
37
40
  run: |
38
41
  bundle config path vendor/bundle
@@ -48,9 +51,9 @@ jobs:
48
51
  - uses: actions/cache@v2
49
52
  with:
50
53
  path: example/vendor/bundle
51
- key: ${{ runner.os }}-example-deps-${{ hashFiles('example/**/Gemfile.lock') }}
54
+ key: ${{ runner.os }}-${{ matrix.ruby }}-example-deps-${{ hashFiles('example/**/Gemfile.lock') }}
52
55
  restore-keys: |
53
- ${{ runner.os }}-example-deps-
56
+ ${{ runner.os }}-${{ matrix.ruby }}-example-deps-
54
57
  - name: Install example dependencies for example
55
58
  working-directory: example
56
59
  run: |
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sober_swag (0.2.0)
4
+ sober_swag (0.3.0)
5
5
  activesupport
6
6
  dry-struct (~> 1.0)
7
7
  dry-types (~> 1.2)
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- sober_swag (0.2.0)
4
+ sober_swag (0.3.0)
5
5
  activesupport
6
6
  dry-struct (~> 1.0)
7
7
  dry-types (~> 1.2)
@@ -150,14 +150,17 @@ module SoberSwag
150
150
 
151
151
  def rewrite_sums(object) # rubocop:disable Metrics/MethodLength
152
152
  case object
153
- in Nodes::Sum[Nodes::OneOf[*lhs], Nodes::OneOf[*rhs]]
154
- Nodes::OneOf.new(lhs + rhs)
155
- in Nodes::Sum[Nodes::OneOf[*args], rhs]
156
- Nodes::OneOf.new(args + [rhs])
157
- in Nodes::Sum[lhs, Nodes::OneOf[*args]]
158
- Nodes::OneOf.new([lhs] + args)
159
- in Nodes::Sum[lhs, rhs]
160
- Nodes::OneOf.new([lhs, rhs])
153
+ when Nodes::Sum
154
+ lhs, rhs = object.deconstruct
155
+ if lhs.is_a?(Nodes::OneOf) && rhs.is_a?(Nodes::OneOf)
156
+ Nodes::OneOf.new(lhs.deconstruct + rhs.deconstruct)
157
+ elsif lhs.is_a?(Nodes::OneOf)
158
+ Nodes::OneOf.new([*lhs.deconstruct, rhs])
159
+ elsif rhs.is_a?(Nodes::OneOf)
160
+ Nodes::OneOf.new([lhs, *rhs.deconstruct])
161
+ else
162
+ Nodes::OneOf.new([lhs, rhs])
163
+ end
161
164
  else
162
165
  object
163
166
  end
@@ -165,59 +168,69 @@ module SoberSwag
165
168
 
166
169
  def flatten_one_ofs(object)
167
170
  case object
168
- in Nodes::OneOf[*args]
169
- Nodes::OneOf.new(args.uniq)
170
- else
171
+ when Nodes::OneOf
172
+ Nodes::OneOf.new(object.deconstruct.uniq)
173
+ else
171
174
  object
172
175
  end
173
176
  end
174
177
 
175
- def to_object_schema(object) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
178
+ def to_object_schema(object) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
176
179
  case object
177
- in Nodes::List[element]
180
+ when Nodes::List
178
181
  {
179
182
  type: :array,
180
- items: element
183
+ items: object.deconstruct.first
181
184
  }
182
- in Nodes::Enum[values]
185
+ when Nodes::Enum
183
186
  {
184
187
  type: :string,
185
- enum: values
188
+ enum: object.deconstruct.first
186
189
  }
187
- in Nodes::OneOf[{ type: 'null' }, b]
188
- b.merge(nullable: true)
189
- in Nodes::OneOf[a, { type: 'null' }]
190
- a.merge(nullable: true)
191
- in Nodes::OneOf[*attrs] if attrs.include?(type: 'null')
192
- { oneOf: attrs.reject { |e| e[:type] == 'null' }, nullable: true }
193
- in Nodes::OneOf[*cases]
194
- { oneOf: cases }
195
- in Nodes::Object[*attrs]
196
- # openAPI requires that you give a list of required attributes
197
- # (which IMO is the *totally* wrong thing to do but whatever)
198
- # so we must do this garbage
199
- required = attrs.filter { |(_, b)| b[:required] }.map(&:first)
200
- {
201
- type: :object,
202
- properties: attrs.map { |(a, b)|
203
- [a, b.reject { |k, _| k == :required }]
204
- }.to_h,
205
- required: required
206
- }
207
- in Nodes::Attribute[name, true, value]
208
- [name, value.merge(required: true)]
209
- in Nodes::Attribute[name, false, value]
210
- [name, value]
190
+ when Nodes::OneOf
191
+ if object.deconstruct.include?({ type: 'null' })
192
+ rejected = object.deconstruct.reject { |e| e[:type] == 'null' }
193
+ if rejected.length == 1
194
+ rejected.first.merge(nullable: true)
195
+ else
196
+ { oneOf: rejected, nullable: true }
197
+ end
198
+ else
199
+ { oneOf: object.deconstruct }
200
+ end
201
+ when Nodes::Object
202
+ # openAPI requires that you give a list of required attributes
203
+ # (which IMO is the *totally* wrong thing to do but whatever)
204
+ # so we must do this garbage
205
+ required = object.deconstruct.filter { |(_, b)| b[:required] }.map(&:first)
206
+ {
207
+ type: :object,
208
+ properties: object.deconstruct.map { |(a, b)|
209
+ [a, b.reject { |k, _| k == :required }]
210
+ }.to_h,
211
+ required: required
212
+ }
213
+ when Nodes::Attribute
214
+ name, req, value = object.deconstruct
215
+ if req
216
+ [name, value.merge(required: true)]
217
+ else
218
+ [name, value]
219
+ end
211
220
  # can't match on value directly as ruby uses `===` to match,
212
221
  # and classes use `===` to mean `is an instance of`, as
213
222
  # opposed to direct equality lmao
214
- in Nodes::Primitive[value:, metadata:] if self.class.primitive?(value)
215
- md = self.class.primitive_def(value)
216
- METADATA_KEYS.select(&metadata.method(:key?)).reduce(md) do |definition, key|
217
- definition.merge(key => metadata[key])
218
- end
219
- in Nodes::Primitive[value:]
220
- { '$ref': self.class.get_ref(value) }
223
+ when Nodes::Primitive
224
+ value = object.value
225
+ metadata = object.metadata
226
+ if self.class.primitive?(value)
227
+ md = self.class.primitive_def(value)
228
+ METADATA_KEYS.select(&metadata.method(:key?)).reduce(md) do |definition, key|
229
+ definition.merge(key => metadata[key])
230
+ end
231
+ else
232
+ { '$ref': self.class.get_ref(value) }
233
+ end
221
234
  else
222
235
  raise ArgumentError, "Got confusing node #{object} (#{object.class})"
223
236
  end
@@ -44,6 +44,10 @@ module SoberSwag
44
44
  def map
45
45
  raise ArgumentError, 'Base is abstract'
46
46
  end
47
+
48
+ def flatten_one_ofs
49
+ raise ArgumentError, 'Base is abstract'
50
+ end
47
51
  end
48
52
  end
49
53
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SoberSwag
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.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.3.0
4
+ version: 0.4.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: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2020-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -295,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
295
  - !ruby/object:Gem::Version
296
296
  version: '0'
297
297
  requirements: []
298
- rubygems_version: 3.1.2
298
+ rubygems_version: 3.0.3
299
299
  signing_key:
300
300
  specification_version: 4
301
301
  summary: Generate swagger types from dry-types