reynard 0.0.5 → 0.0.9
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 +4 -4
- data/README.md +14 -0
- data/lib/reynard/context.rb +20 -3
- data/lib/reynard/http/request.rb +22 -0
- data/lib/reynard/specification.rb +7 -4
- data/lib/reynard/version.rb +1 -1
- data/lib/reynard.rb +8 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec98b52096f95c7c03aaa61a7f27555f5d595ab83ac15510e49fbdc600cbb3a0
|
4
|
+
data.tar.gz: e3fc7d6e0aa537ea08c727e89aec68b2e66986f5e4e1e53ebd6f74733bde6b8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b18bf2403a99460ded8be2c85efc08b28ffa8616d35628dbdb0806f58613e426acf48eff05d6f0c74bc0e602ed9a0bb6bc69e3604818b6b7a1ba9f1c4f38848
|
7
|
+
data.tar.gz: c566c502480ff527e5e8a6451bebd5b8629c714fb41a27faa486a311fb8a20ee85aea14d1c89c211fe20e6dd63e768027d678593341178d89177cda3f24512df
|
data/README.md
CHANGED
@@ -66,6 +66,20 @@ employee = reynard.
|
|
66
66
|
execute
|
67
67
|
```
|
68
68
|
|
69
|
+
## Mocking
|
70
|
+
|
71
|
+
You can mock Reynard requests by changing the HTTP implementation. The class **must** implement a single `request` method that accepts an URI and net/http request object. It **must** return a net/http response object or an object with the exact same interface.
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
Reynard.http = MyMock.new
|
75
|
+
|
76
|
+
class MyMock
|
77
|
+
def request(uri, net_http_request)
|
78
|
+
Net::HTTPResponse::CODE_TO_OBJ['404'].new('HTTP/1.1', '200', 'OK')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
```
|
82
|
+
|
69
83
|
## Copyright and other legal
|
70
84
|
|
71
85
|
See LICENCE.
|
data/lib/reynard/context.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'ostruct'
|
4
|
+
|
3
5
|
class Reynard
|
4
6
|
# Exposes a public interface to build a request context.
|
5
7
|
class Context
|
@@ -24,10 +26,10 @@ class Reynard
|
|
24
26
|
copy(params: @specification.build_grouped_params(@request_context.operation.node, params))
|
25
27
|
end
|
26
28
|
|
27
|
-
def body(
|
29
|
+
def body(data)
|
28
30
|
return unless @request_context.operation
|
29
31
|
|
30
|
-
serialized_body = @specification.build_body(@request_context.operation.node,
|
32
|
+
serialized_body = @specification.build_body(@request_context.operation.node, data)
|
31
33
|
return unless serialized_body
|
32
34
|
|
33
35
|
copy(
|
@@ -37,7 +39,7 @@ class Reynard
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def headers(headers)
|
40
|
-
copy(headers: @request_context.merge(headers))
|
42
|
+
copy(headers: @request_context.headers.merge(headers))
|
41
43
|
end
|
42
44
|
|
43
45
|
def execute
|
@@ -67,11 +69,26 @@ class Reynard
|
|
67
69
|
http_response.code,
|
68
70
|
http_response.content_type
|
69
71
|
)
|
72
|
+
if media_type
|
73
|
+
build_object_with_media_type(http_response, media_type)
|
74
|
+
else
|
75
|
+
build_object_without_media_type(http_response)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def build_object_with_media_type(http_response, media_type)
|
70
80
|
ObjectBuilder.new(
|
71
81
|
media_type: media_type,
|
72
82
|
schema: @specification.schema(media_type.node),
|
73
83
|
http_response: http_response
|
74
84
|
).call
|
75
85
|
end
|
86
|
+
|
87
|
+
def build_object_without_media_type(http_response)
|
88
|
+
# Try to parse the response as JSON and give up otherwise.
|
89
|
+
OpenStruct.new(MultiJson.load(http_response.body))
|
90
|
+
rescue StandardError
|
91
|
+
http_response.body
|
92
|
+
end
|
76
93
|
end
|
77
94
|
end
|
data/lib/reynard/http/request.rb
CHANGED
@@ -26,6 +26,12 @@ class Reynard
|
|
26
26
|
build_http_get
|
27
27
|
when 'post'
|
28
28
|
build_http_post
|
29
|
+
when 'put'
|
30
|
+
build_http_put
|
31
|
+
when 'patch'
|
32
|
+
build_http_patch
|
33
|
+
when 'delete'
|
34
|
+
build_http_delete
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
@@ -38,6 +44,22 @@ class Reynard
|
|
38
44
|
post.body = @request_context.body
|
39
45
|
post
|
40
46
|
end
|
47
|
+
|
48
|
+
def build_http_put
|
49
|
+
put = Net::HTTP::Put.new(uri, @request_context.headers)
|
50
|
+
put.body = @request_context.body
|
51
|
+
put
|
52
|
+
end
|
53
|
+
|
54
|
+
def build_http_patch
|
55
|
+
patch = Net::HTTP::Patch.new(uri, @request_context.headers)
|
56
|
+
patch.body = @request_context.body
|
57
|
+
patch
|
58
|
+
end
|
59
|
+
|
60
|
+
def build_http_delete
|
61
|
+
Net::HTTP::Delete.new(uri, @request_context.headers)
|
62
|
+
end
|
41
63
|
end
|
42
64
|
end
|
43
65
|
end
|
@@ -35,8 +35,8 @@ class Reynard
|
|
35
35
|
|
36
36
|
# Returns a serialized body instance to serialize a request body and figure out the request
|
37
37
|
# headers.
|
38
|
-
def build_body(operation_node,
|
39
|
-
SerializedBody.new(dig(*operation_node, 'requestBody', 'content'),
|
38
|
+
def build_body(operation_node, data)
|
39
|
+
SerializedBody.new(dig(*operation_node, 'requestBody', 'content'), data)
|
40
40
|
end
|
41
41
|
|
42
42
|
def operation(operation_name)
|
@@ -61,7 +61,10 @@ class Reynard
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def media_type_response(responses, response_code, media_type)
|
64
|
-
responses.dig(response_code, 'content')
|
64
|
+
defined_responses = responses.dig(response_code, 'content')
|
65
|
+
return unless defined_responses&.any?
|
66
|
+
|
67
|
+
defined_responses.each do |expression, response|
|
65
68
|
return response, expression if self.class.media_type_matches?(media_type, expression)
|
66
69
|
end
|
67
70
|
nil
|
@@ -89,7 +92,7 @@ class Reynard
|
|
89
92
|
|
90
93
|
def read
|
91
94
|
File.open(@filename, encoding: 'UTF-8') do |file|
|
92
|
-
YAML.safe_load(file)
|
95
|
+
YAML.safe_load(file, aliases: true)
|
93
96
|
end
|
94
97
|
end
|
95
98
|
|
data/lib/reynard/version.rb
CHANGED
data/lib/reynard.rb
CHANGED
@@ -34,6 +34,14 @@ class Reynard
|
|
34
34
|
@specification = Specification.new(filename: filename)
|
35
35
|
end
|
36
36
|
|
37
|
+
# Assign an object that follows Reynard's internal request interface to mock requests or use a
|
38
|
+
# different HTTP client.
|
39
|
+
class << self
|
40
|
+
attr_writer :http
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns Reynard's global request interface. This is a global object to allow persistent
|
44
|
+
# connections, caching, and other features that need a persistent object in the process.
|
37
45
|
def self.http
|
38
46
|
@http ||= begin
|
39
47
|
http = Net::HTTP::Persistent.new(name: 'Reynard')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reynard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manfred Stienstra
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -140,7 +140,7 @@ homepage: https://github.com/Manfred/reynard
|
|
140
140
|
licenses:
|
141
141
|
- MIT
|
142
142
|
metadata: {}
|
143
|
-
post_install_message:
|
143
|
+
post_install_message:
|
144
144
|
rdoc_options: []
|
145
145
|
require_paths:
|
146
146
|
- lib
|
@@ -155,8 +155,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
version: '0'
|
157
157
|
requirements: []
|
158
|
-
rubygems_version: 3.
|
159
|
-
signing_key:
|
158
|
+
rubygems_version: 3.1.6
|
159
|
+
signing_key:
|
160
160
|
specification_version: 4
|
161
161
|
summary: Minimal OpenAPI client.
|
162
162
|
test_files: []
|