scorpio 0.6.0 → 0.6.2

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: b089f79e383e48c4d73793ceb0b1f3a3a254aca6abc34176252d24828ca0a9d8
4
- data.tar.gz: aa9f34563eacae7e07c68f757a66bc53504dbdde741c285f40b34f15a64a08a4
3
+ metadata.gz: c63ccc2d793787385be12175b68b1aca1b68372ee72bae4cb78e434d931aa941
4
+ data.tar.gz: 3e9bec23f6ca7ad6905ca1fcd33ce185f1dd5741ad3a1097d0cbc82fea09fef1
5
5
  SHA512:
6
- metadata.gz: 3d87134df5c11b0157c861fddd25947d3f45cbd2b17c29d9de23d22e8dd70e4edc2b6b1378ef3f5cfee0e0bff7872e9179e76b5f97e824d14a231ef19fd068cd
7
- data.tar.gz: f82dd97cdb8a8b2f0912d1d5e9a8198f5f7734dcb46c914b0c9cb25a3763d0c0a9d4c0c690a3598d53a8c62f065fde18dec0c42586f2257da289b776d091a3c2
6
+ metadata.gz: c7f265f3e6f68c340a2720a1f09238cd0f95d4a1dcfa8fb225ad4afa6e211fbe715c337d37faf7d8037ab0267b142af523182cf1d7eecca4e4cd80af16956a54
7
+ data.tar.gz: 0a3601a2380269a73fde895e1a2d9c80617a2643ead58420866baa04f5d4a2bad5ce06c54b43f155283f53286b2c1bca09b527b2f7d494d9b766e9a188ae31b6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # v0.6.2
2
+ - replace deprecated calls to JSI
3
+
4
+ # v0.6.1
5
+ - compatibility
6
+ - JSI 0.7
7
+ - Faraday 2
8
+ - Ruby 3
9
+ - JRuby
10
+
1
11
  # v0.6.0
2
12
  - ResourceBase resources in responses may be contained anywhere in the response object contained in ResourceBase::Container
3
13
  - ResourceBase defines class methods for operations whose request or response schemas are represented by the resource
data/README.md CHANGED
@@ -269,7 +269,7 @@ The detailed, machine-interpretable description of an API provided by a properly
269
269
 
270
270
  ## License
271
271
 
272
- [<img align="right" src="https://github.com/notEthan/scorpio/raw/master/resources/icons/AGPL-3.0.png">](https://www.gnu.org/licenses/agpl-3.0.html)
272
+ [<img align="right" src="https://www.gnu.org/graphics/agplv3-155x51.png">](https://www.gnu.org/licenses/agpl-3.0.html)
273
273
 
274
274
  Scorpio is licensed under the terms of the [GNU Affero General Public License version 3](https://www.gnu.org/licenses/agpl-3.0.html).
275
275
 
@@ -7,7 +7,7 @@ module Scorpio
7
7
  discovery_rest_description_doc,
8
8
  metaschema_root_ptr: JSI::Ptr['schemas']['JsonSchema'],
9
9
  root_schema_ptr: JSI::Ptr['schemas']['RestDescription'],
10
- metaschema_instance_modules: [JSI::Schema::Draft04],
10
+ schema_implementation_modules: [JSI::Schema::Draft04],
11
11
  )
12
12
 
13
13
  # naming these is not strictly necessary, but is nice to have.
@@ -29,7 +29,7 @@ module Scorpio
29
29
  # google does a weird thing where it defines a schema with a $ref property where a json-schema is to be used in the document (method request and response fields), instead of just setting the schema to be the json-schema schema. we'll share a module across those schema classes that really represent schemas. is this confusingly meta enough?
30
30
  module SchemaLike
31
31
  def to_openapi
32
- dup_doc = JSI::Typelike.as_json(self)
32
+ dup_doc = JSI::Util.as_json(self)
33
33
  # openapi does not want an id field on schemas
34
34
  dup_doc.delete('id')
35
35
  if dup_doc['properties'].is_a?(Hash)
@@ -56,7 +56,7 @@ module Scorpio
56
56
 
57
57
  def to_openapi_hash(options = {})
58
58
  # we will be modifying the api document (RestDescription). clone self and modify that one.
59
- ad = self.class.new(JSI::Typelike.as_json(self))
59
+ ad = self.class.new(JSI::Util.as_json(self))
60
60
  ad_methods = []
61
61
  if ad['methods']
62
62
  ad_methods += ad['methods'].map do |mn, m|
@@ -212,7 +212,7 @@ module Scorpio
212
212
  end.call(openapi)
213
213
  end
214
214
  end
215
- JSI::Typelike.as_json(openapi)
215
+ JSI::Util.as_json(openapi)
216
216
  end
217
217
  end
218
218
  end
@@ -224,11 +224,12 @@ module Scorpio
224
224
  # @return [JSI::Schema]
225
225
  def request_schema(media_type: self.request_media_type)
226
226
  # TODO typechecking on requestBody & children
227
- schema_object = requestBody &&
228
- requestBody['content'] &&
229
- requestBody['content'][media_type] &&
230
- requestBody['content'][media_type]['schema']
231
- schema_object ? JSI::Schema.ensure_schema(schema_object) : nil
227
+ request_content = requestBody && requestBody['content']
228
+ return nil unless request_content
229
+ raise(ArgumentError, "please specify media_type for request_schema") unless media_type
230
+ schema = request_content[media_type] && request_content[media_type]['schema']
231
+ return nil unless schema
232
+ JSI::Schema.ensure_schema(schema)
232
233
  end
233
234
 
234
235
  # @return [JSI::SchemaSet]
@@ -25,8 +25,8 @@ module Scorpio
25
25
  'documents/github.com/OAI/OpenAPI-Specification/blob/oas3-schema/schemas/v3.0/schema.yaml'
26
26
  )))
27
27
 
28
- # the schema represented by Scorpio::OpenAPI::V3::Schema will describe schemas itself, so we set it
29
- # include on its schema module the jsi_schema_instance_modules that implement schema functionality.
28
+ # the schema represented by Scorpio::OpenAPI::V3::Schema will describe schemas itself.
29
+ # JSI::Schema#describes_schema! enables this to implement the functionality of schemas.
30
30
  describe_schema = [
31
31
  openapi_document_schema.definitions['Schema'],
32
32
  openapi_document_schema.definitions['SchemaReference'],
@@ -40,12 +40,12 @@ module Scorpio
40
40
  # a problem, and this way also applies when none of the anyOf match due to schema errors.)
41
41
  openapi_document_schema.definitions['Schema'].properties['additionalProperties'],
42
42
  ]
43
- describe_schema.each { |s| s.jsi_schema_instance_modules = [JSI::Schema::Draft04] }
43
+ describe_schema.each { |s| s.describes_schema!([JSI::Schema::Draft04]) }
44
44
 
45
45
  Document = openapi_document_schema.jsi_schema_module
46
46
 
47
47
  # naming these is not strictly necessary, but is nice to have.
48
- # generated: `puts Scorpio::OpenAPI::V3::Document.schema.definitions.select { |k,v| ['object', nil].include?(v['type']) }.keys.map { |k| "#{k[0].upcase}#{k[1..-1]} = Document.definitions['#{k}']" }`
48
+ # generated: `puts Scorpio::OpenAPI::V3::Document.schema.definitions.keys.map { |k| "#{k[0].upcase}#{k[1..-1]} = Document.definitions['#{k}']" }`
49
49
 
50
50
 
51
51
  Reference = Document.definitions['Reference']
@@ -118,19 +118,19 @@ module Scorpio
118
118
  'documents/swagger.io/v2/schema.json'
119
119
  ).read))
120
120
 
121
- # the schema represented by Scorpio::OpenAPI::V2::Schema will describe schemas itself, so we set it to
122
- # include on its schema module the jsi_schema_instance_modules that implement schema functionality.
121
+ # the schema represented by Scorpio::OpenAPI::V2::Schema will describe schemas itself.
122
+ # JSI::Schema#describes_schema! enables this to implement the functionality of schemas.
123
123
  describe_schema = [
124
124
  openapi_document_schema.definitions['schema'],
125
125
  # comments above on v3's definitions['Schema'].properties['additionalProperties'] apply here too
126
126
  openapi_document_schema.definitions['schema'].properties['additionalProperties'],
127
127
  ]
128
- describe_schema.each { |s| s.jsi_schema_instance_modules = [JSI::Schema::Draft04] }
128
+ describe_schema.each { |s| s.describes_schema!([JSI::Schema::Draft04]) }
129
129
 
130
130
  Document = openapi_document_schema.jsi_schema_module
131
131
 
132
132
  # naming these is not strictly necessary, but is nice to have.
133
- # generated: `puts Scorpio::OpenAPI::V2::Document.schema.definitions.select { |k,v| ['object', nil].include?(v['type']) }.keys.map { |k| "#{k[0].upcase}#{k[1..-1]} = Document.definitions['#{k}']" }`
133
+ # generated: `puts Scorpio::OpenAPI::V2::Document.schema.definitions.keys.map { |k| "#{k[0].upcase}#{k[1..-1]} = Document.definitions['#{k}']" }`
134
134
 
135
135
 
136
136
  Info = Document.definitions['info']
@@ -142,7 +142,8 @@ module Scorpio
142
142
  ResponseDefinitions = Document.definitions['responseDefinitions']
143
143
  ExternalDocs = Document.definitions['externalDocs']
144
144
  Examples = Document.definitions['examples']
145
- Operation = Document.definitions['operation']
145
+ MimeType = Document.definitions['mimeType']
146
+ Operation = Document.definitions['operation']
146
147
  PathItem = Document.definitions['pathItem']
147
148
  Responses = Document.definitions['responses']
148
149
  ResponseValue = Document.definitions['responseValue']
@@ -159,7 +160,8 @@ module Scorpio
159
160
  Parameter = Document.definitions['parameter']
160
161
  Schema = Document.definitions['schema']
161
162
  FileSchema = Document.definitions['fileSchema']
162
- PrimitivesItems = Document.definitions['primitivesItems']
163
+ PrimitivesItems = Document.definitions['primitivesItems']
164
+ Security = Document.definitions['security']
163
165
  SecurityRequirement = Document.definitions['securityRequirement']
164
166
  Xml = Document.definitions['xml']
165
167
  Tag = Document.definitions['tag']
@@ -171,19 +173,24 @@ module Scorpio
171
173
  Oauth2ApplicationSecurity = Document.definitions['oauth2ApplicationSecurity']
172
174
  Oauth2AccessCodeSecurity = Document.definitions['oauth2AccessCodeSecurity']
173
175
  Oauth2Scopes = Document.definitions['oauth2Scopes']
174
- Title = Document.definitions['title']
175
- Description = Document.definitions['description']
176
- Default = Document.definitions['default']
177
- MultipleOf = Document.definitions['multipleOf']
178
- Maximum = Document.definitions['maximum']
179
- ExclusiveMaximum = Document.definitions['exclusiveMaximum']
180
- Minimum = Document.definitions['minimum']
181
- ExclusiveMinimum = Document.definitions['exclusiveMinimum']
182
- MaxLength = Document.definitions['maxLength']
183
- MinLength = Document.definitions['minLength']
184
- Pattern = Document.definitions['pattern']
185
- MaxItems = Document.definitions['maxItems']
186
- MinItems = Document.definitions['minItems']
176
+ MediaTypeList = Document.definitions['mediaTypeList']
177
+ ParametersList = Document.definitions['parametersList']
178
+ SchemesList = Document.definitions['schemesList']
179
+ CollectionFormat = Document.definitions['collectionFormat']
180
+ CollectionFormatWithMulti = Document.definitions['collectionFormatWithMulti']
181
+ Title = Document.definitions['title']
182
+ Description = Document.definitions['description']
183
+ Default = Document.definitions['default']
184
+ MultipleOf = Document.definitions['multipleOf']
185
+ Maximum = Document.definitions['maximum']
186
+ ExclusiveMaximum = Document.definitions['exclusiveMaximum']
187
+ Minimum = Document.definitions['minimum']
188
+ ExclusiveMinimum = Document.definitions['exclusiveMinimum']
189
+ MaxLength = Document.definitions['maxLength']
190
+ MinLength = Document.definitions['minLength']
191
+ Pattern = Document.definitions['pattern']
192
+ MaxItems = Document.definitions['maxItems']
193
+ MinItems = Document.definitions['minItems']
187
194
  UniqueItems = Document.definitions['uniqueItems']
188
195
  Enum = Document.definitions['enum']
189
196
  JsonReference = Document.definitions['jsonReference']
@@ -2,9 +2,18 @@
2
2
 
3
3
  module Scorpio
4
4
  class Request
5
- SUPPORTED_REQUEST_MEDIA_TYPES = ['application/json'.freeze, 'application/x-www-form-urlencoded'.freeze].freeze
5
+ # media types for which Scorpio has implemented generating / parsing between body
6
+ # and body_object (see {Request#body} and {Response#body_object})
7
+ SUPPORTED_REQUEST_MEDIA_TYPES = %w(
8
+ application/json
9
+ application/x-www-form-urlencoded
10
+ ).map(&:freeze).freeze
11
+
6
12
  FALLBACK_CONTENT_TYPE = 'application/x-www-form-urlencoded'.freeze
7
13
 
14
+ # see also Faraday::Env::MethodsWithBodies
15
+ METHODS_WITH_BODIES = %w(post put patch options).map(&:freeze).freeze
16
+
8
17
  def self.best_media_type(media_types)
9
18
  if media_types.size == 1
10
19
  media_types.first
@@ -13,6 +22,13 @@ module Scorpio
13
22
  end
14
23
  end
15
24
 
25
+ # @param http_method [String]
26
+ # @return [Boolean]
27
+ def self.method_with_body?(http_method)
28
+ raise(ArgumentError) unless http_method.is_a?(String)
29
+ METHODS_WITH_BODIES.include?(http_method.downcase)
30
+ end
31
+
16
32
  module Configurables
17
33
  attr_writer :path_params
18
34
  def path_params
@@ -55,7 +71,7 @@ module Scorpio
55
71
  return @body if instance_variable_defined?(:@body)
56
72
  if instance_variable_defined?(:@body_object)
57
73
  if content_type && content_type.json?
58
- JSON.pretty_generate(JSI::Typelike.as_json(body_object))
74
+ JSON.pretty_generate(JSI::Util.as_json(body_object))
59
75
  elsif content_type && content_type.form_urlencoded?
60
76
  URI.encode_www_form(body_object)
61
77
 
@@ -310,7 +326,7 @@ module Scorpio
310
326
  # the named value
311
327
  # @param name [String, Symbol] the parameter name
312
328
  # @return [Object]
313
- # @raise [ArgumentError] invalid `param_in` parameter
329
+ # @raise [OpenAPI::SemanticError] invalid `param_in` parameter
314
330
  # @raise [NotImplementedError] cookies aren't implemented
315
331
  def get_param_from(param_in, name)
316
332
  if param_in == 'path'
@@ -323,7 +339,7 @@ module Scorpio
323
339
  elsif param_in == 'cookie'
324
340
  raise(NotImplementedError, "cookies not implemented: #{name.inspect}")
325
341
  else
326
- raise(ArgumentError, "cannot get param from param_in = #{param_in.inspect} (name: #{name.pretty_inspect.chomp})")
342
+ raise(OpenAPI::SemanticError, "cannot get param from param_in = #{param_in.inspect} (name: #{name.pretty_inspect.chomp})")
327
343
  end
328
344
  end
329
345
 
@@ -341,14 +357,17 @@ module Scorpio
341
357
  else
342
358
  # I'd rather not have a default content-type, but if none is set then the HTTP adapter sets this to
343
359
  # application/x-www-form-urlencoded and issues a warning about it.
344
- headers['Content-Type'] = FALLBACK_CONTENT_TYPE
360
+ if METHODS_WITH_BODIES.include?(http_method.to_s)
361
+ headers['Content-Type'] = FALLBACK_CONTENT_TYPE
362
+ end
345
363
  end
346
364
  end
347
- if self.headers
348
- headers.update(self.headers)
349
- end
365
+ headers.update(self.headers)
366
+ body = self.body
367
+
350
368
  ur = nil
351
- faraday_connection(-> (yur) { ur = yur }).run_request(http_method.downcase.to_sym, url, body, headers)
369
+ conn = faraday_connection(-> (yur) { ur = yur })
370
+ conn.run_request(http_method.downcase.to_sym, url, body, headers)
352
371
  ur.scorpio_request = self
353
372
  ur
354
373
  end
@@ -375,6 +394,12 @@ module Scorpio
375
394
  return to_enum(__method__, next_page: next_page, raise_on_http_error: raise_on_http_error) unless block_given?
376
395
  page_ur = run_ur
377
396
  while page_ur
397
+ unless page_ur.is_a?(Scorpio::Ur)
398
+ raise(TypeError, [
399
+ "next_page must result in a #{Scorpio::Ur}",
400
+ "this should be the result of #run_ur from a #{OpenAPI::Operation} or #{Request}",
401
+ ].join("\n"))
402
+ end
378
403
  page_ur.raise_on_http_error if raise_on_http_error
379
404
  yield page_ur
380
405
  page_ur = next_page.call(page_ur)
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scorpio
4
- # see also Faraday::Env::MethodsWithBodies
5
- METHODS_WITH_BODIES = %w(post put patch options).map(&:freeze).freeze
6
4
  class RequestSchemaFailure < Error
7
5
  end
8
6
 
@@ -265,7 +263,7 @@ module Scorpio
265
263
  call_params = JSI::Util.stringify_symbol_keys(call_params) if call_params.respond_to?(:to_hash)
266
264
  model_attributes = JSI::Util.stringify_symbol_keys(model_attributes || {})
267
265
 
268
- request = Scorpio::Request.new(operation)
266
+ request = operation.build_request
269
267
 
270
268
  accessor_overridden = -> (accessor) do
271
269
  # an accessor is overridden if the default accessor getter (UnboundMethod) is the same
@@ -326,7 +324,7 @@ module Scorpio
326
324
  else
327
325
  jsi = operation.request_schema.new_jsi(o)
328
326
  end
329
- jsi.jsi_select_children_leaf_first do |node|
327
+ jsi.jsi_select_descendents_leaf_first do |node|
330
328
  # we want to specifically reject only nodes described (only) by a false schema.
331
329
  # note that for OpenAPI schemas, false is only a valid schema as a value
332
330
  # of `additionalProperties`
@@ -344,7 +342,7 @@ module Scorpio
344
342
  end
345
343
  else
346
344
  if other_params
347
- if METHODS_WITH_BODIES.any? { |m| m.to_s == operation.http_method.downcase.to_s }
345
+ if Request.method_with_body?(request.http_method)
348
346
  request.body_object = other_params
349
347
  else
350
348
  if other_params.respond_to?(:to_hash)
@@ -394,7 +392,7 @@ module Scorpio
394
392
 
395
393
  class ResourceBase
396
394
  module Containment
397
- def [](key)
395
+ def [](key, _: nil) # unused keyword param lets an empty keyword hash be passed in older ruby versions
398
396
  sub = contained_object[key]
399
397
  if sub.is_a?(JSI::Base)
400
398
  # TODO avoid reinstantiating the container only to throw it away if it matches the memo
@@ -420,7 +418,7 @@ module Scorpio
420
418
  end
421
419
 
422
420
  def as_json(*opt)
423
- JSI::Typelike.as_json(contained_object, *opt)
421
+ JSI::Util.as_json(contained_object, *opt)
424
422
  end
425
423
 
426
424
  def inspect
@@ -513,12 +511,10 @@ module Scorpio
513
511
 
514
512
  # TODO this is JSI internals that scorpio shouldn't really be using
515
513
  if object.respond_to?(:to_hash)
516
- container_modules << Enumerable # TODO change next JSI when PathedHashNode includes Enumerable
517
- container_modules << JSI::PathedHashNode
514
+ container_modules << JSI::Base::HashNode
518
515
  end
519
516
  if object.respond_to?(:to_ary)
520
- container_modules << Enumerable # TODO change next JSI when PathedArrayNode includes Enumerable
521
- container_modules << JSI::PathedArrayNode
517
+ container_modules << JSI::Base::ArrayNode
522
518
  end
523
519
 
524
520
  container_modules += object.jsi_schemas.map do |schema|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scorpio
4
- VERSION = "0.6.0".freeze
4
+ VERSION = "0.6.2".freeze
5
5
  end
data/scorpio.gemspec CHANGED
@@ -26,8 +26,8 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- spec.add_dependency "jsi", "~> 0.6.0"
29
+ spec.add_dependency "jsi", "~> 0.7.0"
30
30
  spec.add_dependency "ur", "~> 0.2.1"
31
- spec.add_dependency "faraday", "< 2.0"
31
+ spec.add_dependency "faraday", "< 3.0"
32
32
  spec.add_dependency "addressable", '~> 2.3'
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scorpio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-28 00:00:00.000000000 Z
11
+ date: 2023-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsi
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.0
19
+ version: 0.7.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.0
26
+ version: 0.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ur
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "<"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: '3.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "<"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
54
+ version: '3.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: addressable
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  requirements: []
120
- rubygems_version: 3.1.2
120
+ rubygems_version: 3.1.6
121
121
  signing_key:
122
122
  specification_version: 4
123
123
  summary: Scorpio REST client