apicraft-rails 0.5.1.beta1 → 0.5.2.beta1
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 +17 -5
- data/lib/apicraft/config.rb +11 -1
- data/lib/apicraft/errors.rb +1 -0
- data/lib/apicraft/middlewares/mocker.rb +32 -9
- data/lib/apicraft/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5411b6d7fec8f1e73a0827f8809c53212ff39f0c97d94bd5ed54825e84a81882
|
4
|
+
data.tar.gz: b4d2b5001f2aca8c32b5ac510e9b67a749e2eb5fc199ed89eaaaa42135b598df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46cf0e60bd1d0f7551c80f118af6d8c421c8d6485252dc92a2b58d75c02f052c6c3216ac976ecb46f636fee72946c8f9662ed3af7b243575a5d716bcf5c6d40a
|
7
|
+
data.tar.gz: 5e77011472cb349e45f84131e9ef15e17b22a13576b2cb3b5f40b2311d191bede0c36bcec654932527e4e7e1c7006b3a12cd7967b8a42c9cd47865efedbbfb18
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# APICraft Rails
|
1
|
+
# APICraft Rails
|
2
2
|
[](https://github.com/apicraft-dev/apicraft-rails/actions/workflows/build.yml)
|
3
|
-
[](https://badge.fury.io/rb/apicraft-rails)
|
3
|
+
[](https://badge.fury.io/rb/apicraft-rails)
|
4
4
|
|
5
5
|
🚀 Accelerates your development by 2-3x with an API Design First approach. Seamlessly integrates with your Rails application server — no fancy tooling or expenses required.
|
6
6
|
|
@@ -72,7 +72,7 @@ By adopting an API Design First approach with APICraft Rails, you can accelerate
|
|
72
72
|
Add this line to your application's Gemfile:
|
73
73
|
|
74
74
|
```ruby
|
75
|
-
gem 'apicraft-rails', '~> 0.5.
|
75
|
+
gem 'apicraft-rails', '~> 0.5.2.beta1'
|
76
76
|
```
|
77
77
|
|
78
78
|
And then execute:
|
@@ -143,12 +143,14 @@ headers: {
|
|
143
143
|
|
144
144
|
### 🎮 API Mocking (Behaviours)
|
145
145
|
The above is an example of a 200 response. If you have more responses documented you can force that behaviour using `Apicraft-Response-Code` header in the mock request.
|
146
|
+
You can find a list of all the supported headers in the [configuration section](#-configuration) that would allow you to manipulate the API Behaviour.
|
146
147
|
|
147
148
|
`https://yoursite.com/api/orders`
|
148
149
|
```
|
149
150
|
headers: {
|
150
151
|
Apicraft-Response-Code: 400
|
151
152
|
Apicraft-Mock: true
|
153
|
+
Apicraft-Delay: 5
|
152
154
|
}
|
153
155
|
```
|
154
156
|
```json
|
@@ -223,6 +225,9 @@ module App
|
|
223
225
|
end
|
224
226
|
end
|
225
227
|
```
|
228
|
+
RapiDoc | SwaggerDoc
|
229
|
+
:-------------------------:|:-------------------------:
|
230
|
+
 | 
|
226
231
|
|
227
232
|
## 🔧 Configuration
|
228
233
|
|
@@ -249,6 +254,10 @@ Apicraft.configure do |config|
|
|
249
254
|
# Defaults to true
|
250
255
|
config.strict_reference_validation = true
|
251
256
|
|
257
|
+
# When simulating delay using the mocks, the max
|
258
|
+
# delay in seconds that can be simulated
|
259
|
+
config.max_allowed_delay = 30
|
260
|
+
|
252
261
|
config.headers = {
|
253
262
|
# The name of the header used to control
|
254
263
|
# the response code of the mock
|
@@ -257,11 +266,14 @@ Apicraft.configure do |config|
|
|
257
266
|
|
258
267
|
# The name of the header to introspect the API.
|
259
268
|
# Defaults to Apicraft-Introspect
|
260
|
-
introspect: "Apicraft-Introspect"
|
269
|
+
introspect: "Apicraft-Introspect",
|
261
270
|
|
262
271
|
# The name of the header to mock the API.
|
263
272
|
# Defaults to Apicraft-Mock
|
264
|
-
mock: "Apicraft-Mock"
|
273
|
+
mock: "Apicraft-Mock",
|
274
|
+
|
275
|
+
# Delay simulation header name
|
276
|
+
delay: "Apicraft-Delay"
|
265
277
|
}
|
266
278
|
end
|
267
279
|
|
data/lib/apicraft/config.rb
CHANGED
@@ -13,12 +13,14 @@ module Apicraft
|
|
13
13
|
response_code: "Apicraft-Response-Code",
|
14
14
|
introspect: "Apicraft-Introspect",
|
15
15
|
mock: "Apicraft-Mock",
|
16
|
+
delay: "Apicraft-Delay",
|
16
17
|
content_type: "Content-Type"
|
17
18
|
},
|
18
19
|
mocks: true,
|
19
20
|
introspection: true,
|
20
21
|
strict_reference_validation: true,
|
21
|
-
request_validations: true
|
22
|
+
request_validations: true,
|
23
|
+
max_allowed_delay: 30
|
22
24
|
}.with_indifferent_access
|
23
25
|
|
24
26
|
def initialize(opts = {})
|
@@ -47,6 +49,10 @@ module Apicraft
|
|
47
49
|
@opts[:introspection]
|
48
50
|
end
|
49
51
|
|
52
|
+
def max_allowed_delay
|
53
|
+
@opts[:max_allowed_delay]
|
54
|
+
end
|
55
|
+
|
50
56
|
def contracts_path=(contracts_path)
|
51
57
|
@opts[:contracts_path] = contracts_path
|
52
58
|
end
|
@@ -67,6 +73,10 @@ module Apicraft
|
|
67
73
|
@opts[:request_validations] = enabled
|
68
74
|
end
|
69
75
|
|
76
|
+
def max_allowed_delay=(enabled)
|
77
|
+
@opts[:max_allowed_delay] = enabled
|
78
|
+
end
|
79
|
+
|
70
80
|
def headers=(headers)
|
71
81
|
@opts[:headers] = @opts[:headers].merge(
|
72
82
|
headers.with_indifferent_access
|
data/lib/apicraft/errors.rb
CHANGED
@@ -15,15 +15,9 @@ module Apicraft
|
|
15
15
|
request = ActionDispatch::Request.new(env)
|
16
16
|
return @app.call(env) unless mock?(request)
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
)
|
21
|
-
raise Errors::InvalidContract if contract.blank?
|
22
|
-
|
23
|
-
operation = contract.operation(
|
24
|
-
request.method, request.path_info
|
25
|
-
)
|
26
|
-
raise Errors::InvalidOperation if operation.blank?
|
18
|
+
use_delay!(request)
|
19
|
+
contract = find_contract!(request)
|
20
|
+
operation = find_operation!(contract, request)
|
27
21
|
|
28
22
|
code = request.headers[config.headers[:response_code]] || "200"
|
29
23
|
response = operation.response_for(code.to_s)
|
@@ -64,6 +58,35 @@ module Apicraft
|
|
64
58
|
def mock?(request)
|
65
59
|
request.headers[config.headers[:mock]].present?
|
66
60
|
end
|
61
|
+
|
62
|
+
def find_contract!(request)
|
63
|
+
contract = Apicraft::Openapi::Contract.find_by_operation(
|
64
|
+
request.method, request.path_info
|
65
|
+
)
|
66
|
+
raise Errors::InvalidContract if contract.blank?
|
67
|
+
|
68
|
+
contract
|
69
|
+
end
|
70
|
+
|
71
|
+
def find_operation!(contract, request)
|
72
|
+
operation = contract.operation(
|
73
|
+
request.method, request.path_info
|
74
|
+
)
|
75
|
+
raise Errors::InvalidOperation if operation.blank?
|
76
|
+
|
77
|
+
operation
|
78
|
+
end
|
79
|
+
|
80
|
+
def use_delay!(request)
|
81
|
+
request_delay = delay(request)
|
82
|
+
raise Errors::DelayTooHigh if request_delay > config.max_allowed_delay
|
83
|
+
|
84
|
+
sleep(request_delay)
|
85
|
+
end
|
86
|
+
|
87
|
+
def delay(request)
|
88
|
+
request.headers[config.headers[:delay]].to_i
|
89
|
+
end
|
67
90
|
end
|
68
91
|
end
|
69
92
|
end
|
data/lib/apicraft/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apicraft-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abhishek Sarkar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|