faraday_middleware-openapi 0.0.1 → 0.0.2

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: 5af0efe250b2afc8f1a0bdedfa76feed9dc6e8c6d75283eae30e9de8c97b1593
4
- data.tar.gz: 183c3a1e0202fc982310b4c57c2b992ce4ba7048706eeda01ca283953cbe9ebc
3
+ metadata.gz: dfb34ee30b7b4e177eaba4234981418f9c217f8e6a5d270f61f2d39ff18ac8af
4
+ data.tar.gz: fe0e7c176b712505d14a301966aa67a0118867473940c3450e727a4e5835d838
5
5
  SHA512:
6
- metadata.gz: 517ef8d5de5309d76ea613ec2518bf70774d65c8ee46bf3fed0019641d1d1efa827c04ae8e1d038b948e9312ee3e30c63d79ff2718e5d4e2d324d7a980802b26
7
- data.tar.gz: df07b15c091a34883b941f15ee17392b5fc57c825ffb032a00295f53c6effe08fcac2e3e7b4be3313e4934f959efb7d87d2d15ce8eb6865b0649fa8ed33b1358
6
+ metadata.gz: 9ef0e5294688a1cb5d1afdb90e3e18eb973e72ce1a5bb94e2d1d93c046ac26a0068bbe245de22d20998de0310bb16807351a3b49d036f15df8aae83e2105e472
7
+ data.tar.gz: 296e07aed246abe7728199c281c4685f7920e3c47107968dafb55a73c3b2cdf51c02a1009de9c7f25acaa8a51a0ec7fcee019896ed696c5ab1a603c0f1d9606e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.1.0] - 2021-02-20
3
+ ## [0.0.2] - 2021-02-20
4
+
5
+ - Support multipart/form-data in RequestValidator (#2)
6
+ ## [0.0.1] - 2021-02-20
4
7
 
5
8
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,19 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- faraday_middleware-openapi (0.0.1)
4
+ faraday_middleware-openapi (0.0.2)
5
+ activesupport
5
6
  faraday (>= 1.0)
6
7
  openapi_parser
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
12
+ activesupport (6.1.2.1)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (>= 1.6, < 2)
15
+ minitest (>= 5.1)
16
+ tzinfo (~> 2.0)
17
+ zeitwerk (~> 2.3)
18
+ concurrent-ruby (1.1.8)
11
19
  diff-lcs (1.4.4)
12
20
  faraday (1.3.0)
13
21
  faraday-net_http (~> 1.0)
14
22
  multipart-post (>= 1.2, < 3)
15
23
  ruby2_keywords
16
24
  faraday-net_http (1.0.1)
25
+ i18n (1.8.8)
26
+ concurrent-ruby (~> 1.0)
27
+ minitest (5.14.3)
17
28
  multipart-post (2.1.1)
18
29
  openapi_parser (0.12.1)
19
30
  rake (13.0.3)
@@ -31,6 +42,9 @@ GEM
31
42
  rspec-support (~> 3.10.0)
32
43
  rspec-support (3.10.2)
33
44
  ruby2_keywords (0.0.4)
45
+ tzinfo (2.0.4)
46
+ concurrent-ruby (~> 1.0)
47
+ zeitwerk (2.4.2)
34
48
 
35
49
  PLATFORMS
36
50
  ruby
data/README.md CHANGED
@@ -11,6 +11,9 @@ gem 'faraday_middleware-openapi'
11
11
  ```ruby
12
12
  Faraday.new(...) do |conn|
13
13
  conn.request :openapi, "/path/to/openapi_schema.yaml"
14
+
15
+ # if using :multipart, it must be defined after :openapi
16
+ conn.request(:multipart)
14
17
  end
15
18
  ```
16
19
 
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["meganemura"]
9
9
  spec.email = ["meganemura@users.noreply.github.com"]
10
10
 
11
- spec.summary = ""
12
- spec.description = ""
11
+ spec.summary = "Faraday middleware for validation by OpenAPI"
12
+ spec.description = spec.summary
13
13
  spec.homepage = "https://github.com/meganemura/faraday_middleware-openapi"
14
14
  spec.license = "MIT"
15
15
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_dependency "faraday", ">= 1.0"
31
31
  spec.add_dependency "openapi_parser"
32
+ spec.add_dependency "activesupport"
32
33
  end
@@ -3,6 +3,8 @@
3
3
  require "faraday"
4
4
  require "yaml"
5
5
  require "openapi_parser"
6
+ require "active_support/core_ext/hash/keys"
7
+ require "active_support/core_ext/hash/deep_transform_values"
6
8
  require_relative "openapi/request_validator"
7
9
  require_relative "openapi/version"
8
10
 
@@ -4,20 +4,7 @@ module FaradayMiddleware
4
4
  module OpenAPI
5
5
  class RequestValidator < Faraday::Middleware
6
6
  def on_request(env)
7
- content_type = env.request_headers['Content-Type']
8
- operation = request_operation(env.method, env.url.path)
9
- operation.validate_request_parameter(env.params || {}, {})
10
- request_body = case content_type
11
- when 'application/json' # Use regexp
12
- begin
13
- JSON.parse(env.request_body)
14
- rescue
15
- nil
16
- end
17
- end
18
- operation.validate_request_body(content_type, request_body)
19
- rescue OpenAPIParser::NotExistRequiredKey, OpenAPIParser::NotNullError => e
20
- raise ::FaradayMiddleware::OpenAPI::Error.new(e.message)
7
+ validate(env)
21
8
  end
22
9
 
23
10
  def initialize(app, options = {})
@@ -30,12 +17,75 @@ module FaradayMiddleware
30
17
 
31
18
  attr_reader :schema_path
32
19
 
33
- def openapi_parser
34
- @openapi_parser ||= OpenAPIParser.parse(YAML.load_file(schema_path), coerce_value: false)
20
+ def validate(env)
21
+ request_operation = RequestOperation.new(env: env, schema_path: schema_path)
22
+ request_operation.validate_request_parameter
23
+ request_operation.validate_request_body
35
24
  end
36
25
 
37
- def request_operation(method, path)
38
- openapi_parser.request_operation(method, path)
26
+ def request_operation(env:, schema_path:)
27
+ RequestOperation.new(env: env, schema_path: schema_path)
28
+ end
29
+
30
+ class RequestOperation
31
+ def initialize(env:, schema_path:)
32
+ @env = env
33
+ @schema_path = schema_path
34
+ end
35
+
36
+ def validate_request_parameter
37
+ request_operation.validate_request_parameter(env.params || {}, {})
38
+ rescue OpenAPIParser::OpenAPIError => e
39
+ raise ::FaradayMiddleware::OpenAPI::Error.new(e.message)
40
+ end
41
+
42
+ def validate_request_body
43
+ request_operation.validate_request_body(content_type, request_body)
44
+ rescue OpenAPIParser::OpenAPIError => e
45
+ raise ::FaradayMiddleware::OpenAPI::Error.new(e.message)
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :env
51
+ attr_reader :schema_path
52
+
53
+ def content_type
54
+ env.request_headers['Content-Type']
55
+ end
56
+
57
+ def request_body
58
+ case content_type
59
+ when 'application/json' # Use regexp
60
+ begin
61
+ JSON.parse(env.request_body)
62
+ rescue
63
+ nil
64
+ end
65
+ when "multipart/form-data"
66
+ validatablize_multipart_form_data(env.request_body)
67
+ end
68
+ end
69
+
70
+ def validatablize_multipart_form_data(request_body)
71
+ body = request_body.deep_stringify_keys
72
+ body.deep_transform_values do |value|
73
+ case value
74
+ when Faraday::FilePart
75
+ value.yield_self {|x| v = x.read; x.rewind; v }
76
+ else
77
+ value
78
+ end
79
+ end
80
+ end
81
+
82
+ def request_operation
83
+ openapi_parser.request_operation(env.method, env.url.path)
84
+ end
85
+
86
+ def openapi_parser
87
+ @openapi_parser ||= OpenAPIParser.parse(YAML.load_file(schema_path), coerce_value: false)
88
+ end
39
89
  end
40
90
  end
41
91
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module FaradayMiddleware
4
4
  module OpenAPI
5
- VERSION = "0.0.1"
5
+ VERSION = "0.0.2"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday_middleware-openapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - meganemura
@@ -38,7 +38,21 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: ''
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Faraday middleware for validation by OpenAPI
42
56
  email:
43
57
  - meganemura@users.noreply.github.com
44
58
  executables: []
@@ -86,5 +100,5 @@ requirements: []
86
100
  rubygems_version: 3.1.2
87
101
  signing_key:
88
102
  specification_version: 4
89
- summary: ''
103
+ summary: Faraday middleware for validation by OpenAPI
90
104
  test_files: []