request_handler 1.3.0 → 2.0.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 +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile +2 -0
- data/README.md +167 -29
- data/lib/request_handler/base.rb +27 -33
- data/lib/request_handler/base_parser.rb +9 -0
- data/lib/request_handler/builder/base.rb +23 -0
- data/lib/request_handler/builder/body_builder.rb +27 -0
- data/lib/request_handler/builder/fieldsets_builder.rb +28 -0
- data/lib/request_handler/builder/fieldsets_resource_builder.rb +17 -0
- data/lib/request_handler/builder/filter_builder.rb +31 -0
- data/lib/request_handler/builder/include_options_builder.rb +23 -0
- data/lib/request_handler/builder/multipart_builder.rb +22 -0
- data/lib/request_handler/builder/multipart_resource_builder.rb +35 -0
- data/lib/request_handler/builder/options_builder.rb +88 -0
- data/lib/request_handler/builder/page_builder.rb +30 -0
- data/lib/request_handler/builder/page_resource_builder.rb +23 -0
- data/lib/request_handler/builder/query_builder.rb +23 -0
- data/lib/request_handler/builder/sort_options_builder.rb +23 -0
- data/lib/request_handler/concerns/config_helper.rb +25 -0
- data/lib/request_handler/config.rb +33 -0
- data/lib/request_handler/fieldsets_parser.rb +5 -4
- data/lib/request_handler/include_option_parser.rb +2 -2
- data/lib/request_handler/multipart_parser.rb +8 -11
- data/lib/request_handler/option_parser.rb +1 -1
- data/lib/request_handler/page_parser.rb +19 -10
- data/lib/request_handler/schema_parser.rb +8 -4
- data/lib/request_handler/sort_option_parser.rb +2 -2
- data/lib/request_handler/validation/definition_engine.rb +2 -1
- data/lib/request_handler/validation/dry_engine.rb +24 -16
- data/lib/request_handler/version.rb +1 -1
- data/lib/request_handler.rb +7 -22
- data/request_handler.gemspec +2 -4
- metadata +33 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6f03be51da1bccf44ba08a55724d6cd68c8dd43817e5b1e74f427b9ae1164f7
|
4
|
+
data.tar.gz: 942131e22d64ee316f7e7c690c9c1a6af0d5c589459d2bc77786e86a940fe342
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f50ec83b0dc218d07d9f9703f929696f761dfd812e2a1dd5230d2e901f20ac1c4141d8674a332d08ecf3297dd7e3a3af4514e7330e37d341db92efc1dc660714
|
7
|
+
data.tar.gz: 7e0b0d58b1f0fd697432c9e3f0fb4447b983510bc643acde7713db1c3bc8de23a4209bd45e80ce9f255458ba0c83c5dbd9f22eca672280c98363e85a6cd3c429
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [2.0.0] - 2019-11-19
|
8
|
+
### Changed
|
9
|
+
- BREAKING: Required configuration of validation engine
|
10
|
+
- BREAKING: Dynamic resource keys in config DSL are not supported anymore and
|
11
|
+
have to be defined via the `resource` key
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- Support for dry-* 1.x
|
15
|
+
|
16
|
+
### Removed
|
17
|
+
- BREAKING: Dry dependencies were removed and should manually be added
|
18
|
+
- BREAKING: Support for config inheritance
|
19
|
+
- BREAKING: Support for dry-* 0.x
|
20
|
+
|
7
21
|
## [1.3.0] - 2019-05-21
|
8
22
|
### Added
|
9
23
|
- Serializable JSONAPI error objects out of validation failures
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -26,34 +26,51 @@ Or install it yourself as:
|
|
26
26
|
|
27
27
|
## Configuration
|
28
28
|
|
29
|
+
You have to chose a validation engine and configure it globally:
|
30
|
+
```ruby
|
31
|
+
RequestHandler.configure do |config|
|
32
|
+
config.validation_engine = RequestHandler::Validation::DryEngine
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
If you want to use the included dry engine you also have to add the dry gems to
|
37
|
+
your Gemfile:
|
38
|
+
```ruby
|
39
|
+
gem 'dry-validation', '~> 1.0'
|
40
|
+
gem 'dry-types', '~> 1.0'
|
41
|
+
```
|
42
|
+
Note that only dry >= 1.0 is supported.
|
43
|
+
|
29
44
|
The default logger and separator can be changed globally:
|
30
45
|
|
31
46
|
```ruby
|
32
|
-
RequestHandler.configure do
|
33
|
-
logger Logger.new(STDERR)
|
34
|
-
separator '____'
|
35
|
-
validation_engine RequestHandler::Validation::DryEngine
|
47
|
+
RequestHandler.configure do |config|
|
48
|
+
config.logger = Logger.new(STDERR)
|
49
|
+
config.separator = '____'
|
36
50
|
end
|
37
51
|
```
|
38
52
|
|
39
53
|
JSON:API-style error data can be included in validation errors raised by `RequestHandler`.
|
40
54
|
|
41
55
|
```ruby
|
42
|
-
RequestHandler.configure do
|
43
|
-
raise_jsonapi_errors = true # default: false
|
56
|
+
RequestHandler.configure do |config|
|
57
|
+
config.raise_jsonapi_errors = true # default: false
|
44
58
|
end
|
45
59
|
```
|
46
60
|
|
47
61
|
|
48
62
|
### Validation Engine
|
49
|
-
|
50
|
-
|
51
|
-
|
63
|
+
You have to chose a validation engine and configure it globally (see
|
64
|
+
configuration section above).
|
65
|
+
All examples in this Readme assume you are using the `DryEngine` which relies on
|
66
|
+
dry-validation. However you can also use the builtin `DefinitionEngine`, which
|
67
|
+
uses [Definition](https://github.com/Goltergaul/definition) as validation
|
68
|
+
library:
|
52
69
|
|
53
70
|
```ruby
|
54
|
-
RequestHandler.configure do
|
71
|
+
RequestHandler.configure do |config|
|
55
72
|
require 'request_handler/validation/definition_engine'
|
56
|
-
validation_engine RequestHandler::Validation::DefinitionEngine
|
73
|
+
config.validation_engine = RequestHandler::Validation::DefinitionEngine
|
57
74
|
end
|
58
75
|
```
|
59
76
|
|
@@ -85,14 +102,13 @@ defines if the JsonApiDocumentParser or JsonParser is used.
|
|
85
102
|
If nothing is defined, JsonApiDocumentParser will be used by default.
|
86
103
|
|
87
104
|
```ruby
|
88
|
-
require "dry-validation"
|
89
105
|
require "request_handler"
|
90
106
|
class DemoHandler < RequestHandler::Base
|
91
107
|
options do
|
92
108
|
page do
|
93
109
|
default_size 10
|
94
110
|
max_size 20
|
95
|
-
comments do
|
111
|
+
resource :comments do
|
96
112
|
default_size 20
|
97
113
|
max_size 100
|
98
114
|
end
|
@@ -108,11 +124,11 @@ class DemoHandler < RequestHandler::Base
|
|
108
124
|
|
109
125
|
filter do
|
110
126
|
schema(
|
111
|
-
Dry::Validation
|
112
|
-
|
113
|
-
|
127
|
+
Class.new(Dry::Validation::Contract) do
|
128
|
+
option :foo
|
129
|
+
params do
|
130
|
+
required(:name).filled(:string)
|
114
131
|
end
|
115
|
-
required(:name).filled(:str?)
|
116
132
|
end
|
117
133
|
)
|
118
134
|
additional_url_filter %i(user_id id)
|
@@ -122,8 +138,8 @@ class DemoHandler < RequestHandler::Base
|
|
122
138
|
|
123
139
|
query do
|
124
140
|
schema(
|
125
|
-
Dry::
|
126
|
-
optional(:name).filled(:
|
141
|
+
Dry::Schema.Params do
|
142
|
+
optional(:name).filled(:string)
|
127
143
|
end
|
128
144
|
)
|
129
145
|
end
|
@@ -131,11 +147,11 @@ class DemoHandler < RequestHandler::Base
|
|
131
147
|
body do
|
132
148
|
type :jsonapi
|
133
149
|
schema(
|
134
|
-
Dry::Validation
|
135
|
-
|
136
|
-
|
150
|
+
Class.new(Dry::Validation::Contract) do
|
151
|
+
option :foo
|
152
|
+
json do
|
153
|
+
required(:id).filled(:string)
|
137
154
|
end
|
138
|
-
required(:id).filled(:str?)
|
139
155
|
end
|
140
156
|
)
|
141
157
|
options(->(_handler, _request) { { foo: "bar" } })
|
@@ -208,19 +224,19 @@ file related to the question
|
|
208
224
|
class CreateQuestionHandler < RequestHandler::Base
|
209
225
|
options do
|
210
226
|
multipart do
|
211
|
-
question do
|
227
|
+
resource :question do
|
212
228
|
required true
|
213
229
|
type "json"
|
214
230
|
schema(
|
215
|
-
Dry::
|
216
|
-
required(:id).filled(:
|
217
|
-
required(:type).filled(:
|
218
|
-
required(:content).filled(:
|
231
|
+
Dry::Schema.JSON do
|
232
|
+
required(:id).filled(:string)
|
233
|
+
required(:type).filled(:string)
|
234
|
+
required(:content).filled(:string)
|
219
235
|
end
|
220
236
|
)
|
221
237
|
end
|
222
238
|
|
223
|
-
file do
|
239
|
+
resource :file do
|
224
240
|
# no validation necessary
|
225
241
|
end
|
226
242
|
end
|
@@ -317,6 +333,128 @@ get "/users/:user_id/posts" do
|
|
317
333
|
end
|
318
334
|
```
|
319
335
|
|
336
|
+
## v1 to v2 migration guide
|
337
|
+
Multiple breaking changes were introduced with request_handler 2.0. This section
|
338
|
+
describes which steps have to be taken in order to migrate from 1.x to 2.0.
|
339
|
+
|
340
|
+
### Configure validation engine
|
341
|
+
By default the DryEngine was used in 1.0. You now have to explicitly configure
|
342
|
+
a validation engine:
|
343
|
+
|
344
|
+
```ruby
|
345
|
+
RequestHandler.configure do |config|
|
346
|
+
config.validation_engine = RequestHandler::Validation::DryEngine
|
347
|
+
end
|
348
|
+
```
|
349
|
+
|
350
|
+
### Add dry dependency if you use the DryEngine
|
351
|
+
Since the DryEngine is not configured by default anymore, the dependency to the
|
352
|
+
dry gems could be removed from request_handler. If you use the DryEngine
|
353
|
+
simply add the dry-gems to your Gemfile:
|
354
|
+
|
355
|
+
```ruby
|
356
|
+
gem 'dry-validation', '~> 1.0'
|
357
|
+
gem 'dry-types', '~> 1.0'
|
358
|
+
```
|
359
|
+
Note that only dry >= 1.0 is supported.
|
360
|
+
|
361
|
+
### Define custom resources via the `resource` key
|
362
|
+
In request_handler 1.x it was possible to define custom resource names like this:
|
363
|
+
|
364
|
+
```ruby
|
365
|
+
options do
|
366
|
+
fieldsets do
|
367
|
+
allowed do
|
368
|
+
posts schema
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
```
|
373
|
+
|
374
|
+
This was possible in multiple places (`page`, `multipart`, `fieldsets.allowed`).
|
375
|
+
Starting with version 2.0 you will have to define those custom resources via the
|
376
|
+
`resource` key:
|
377
|
+
|
378
|
+
```ruby
|
379
|
+
options do
|
380
|
+
fieldsets do
|
381
|
+
allowed do
|
382
|
+
resource :posts, schema
|
383
|
+
end
|
384
|
+
end
|
385
|
+
end
|
386
|
+
```
|
387
|
+
|
388
|
+
### Use dry-* 1.x instead of dry-* 0.x if you use the DryEngine
|
389
|
+
Some of the most common required changes are listed here:
|
390
|
+
|
391
|
+
* Use `Dry::Schema.Params` instead of `Dry::Validation.Schema`
|
392
|
+
* Use `Dry::Schema.JSON` instead of `Dry::Validation.JSON`
|
393
|
+
* If you use some more complex validation rules with options like this:
|
394
|
+
|
395
|
+
```
|
396
|
+
Dry::Validation.Params do
|
397
|
+
configure do
|
398
|
+
option :query_id
|
399
|
+
end
|
400
|
+
required(:id).value(eql?: query_id)
|
401
|
+
end
|
402
|
+
|
403
|
+
options(->(_parser, request) { { query_id: request.params['id'] } })
|
404
|
+
```
|
405
|
+
|
406
|
+
please rewrite it using `Dry::Validation::Contract` like this:
|
407
|
+
|
408
|
+
```
|
409
|
+
Class.new(Dry::Validation::Contract) do
|
410
|
+
option :query_id
|
411
|
+
params do
|
412
|
+
required(:id).value(:string)
|
413
|
+
end
|
414
|
+
rule(:id) do
|
415
|
+
key.failure('invalid id') unless values[:id] == query_id
|
416
|
+
end
|
417
|
+
end)
|
418
|
+
options(->(_parser, request) { { query_id: request.params['id'] } })
|
419
|
+
```
|
420
|
+
|
421
|
+
A useful guide for upgrading to dry 1 types, validations and schemas can be
|
422
|
+
found [here](https://www.morozov.is/2019/05/31/upgrading-dry-gems.html).
|
423
|
+
|
424
|
+
Also please refer to the official docs of
|
425
|
+
[dry-schema](https://dry-rb.org/gems/dry-schema) and
|
426
|
+
[dry-validation](https://dry-rb.org/gems/dry-validation).
|
427
|
+
|
428
|
+
### Remove config inheritance
|
429
|
+
It was possible to (partially) overwrite configs defined in a request-handler
|
430
|
+
super-class:
|
431
|
+
```
|
432
|
+
class Parent < RequestHandler::Base
|
433
|
+
options do
|
434
|
+
page do
|
435
|
+
comments do
|
436
|
+
default_size 20
|
437
|
+
end
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
```
|
442
|
+
|
443
|
+
```ruby
|
444
|
+
class Child < Parent
|
445
|
+
options do
|
446
|
+
page do
|
447
|
+
comments do
|
448
|
+
default_size 10
|
449
|
+
end
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
```
|
454
|
+
|
455
|
+
Support for this has been fully removed. If you overwrite configs in subclasses
|
456
|
+
please remove the inheritance and define the two request-handlers separately.
|
457
|
+
|
320
458
|
## Development
|
321
459
|
|
322
460
|
After checking out the repo, run `bin/setup` to install dependencies. You can
|
data/lib/request_handler/base.rb
CHANGED
@@ -10,22 +10,22 @@ require 'request_handler/multipart_parser'
|
|
10
10
|
require 'request_handler/fieldsets_parser'
|
11
11
|
require 'request_handler/query_parser'
|
12
12
|
require 'request_handler/helper'
|
13
|
-
require '
|
13
|
+
require 'request_handler/builder/options_builder'
|
14
|
+
require 'request_handler/concerns/config_helper'
|
15
|
+
require 'request_handler/config'
|
16
|
+
|
14
17
|
module RequestHandler
|
15
18
|
class Base
|
19
|
+
include RequestHandler::Concerns::ConfigHelper
|
20
|
+
|
16
21
|
class << self
|
17
22
|
def options(&block)
|
18
|
-
@config
|
19
|
-
@config.configure(&block)
|
20
|
-
end
|
21
|
-
|
22
|
-
def inherited(subclass)
|
23
|
-
return if @config.nil?
|
24
|
-
subclass.config = @config.deep_copy
|
23
|
+
@config = Config.new(&block)
|
25
24
|
end
|
26
25
|
|
27
26
|
attr_accessor :config
|
28
27
|
end
|
28
|
+
|
29
29
|
def initialize(request:)
|
30
30
|
raise MissingArgumentError, request: 'is missing' if request.nil?
|
31
31
|
@request = request
|
@@ -38,7 +38,7 @@ module RequestHandler
|
|
38
38
|
def page_params
|
39
39
|
@page_params ||= PageParser.new(
|
40
40
|
params: params,
|
41
|
-
page_config: lookup!('page')
|
41
|
+
page_config: config.lookup!('page')
|
42
42
|
).run
|
43
43
|
end
|
44
44
|
|
@@ -82,9 +82,9 @@ module RequestHandler
|
|
82
82
|
defaults = fetch_defaults('filter.defaults', {})
|
83
83
|
defaults.merge(FilterParser.new(
|
84
84
|
params: params,
|
85
|
-
schema: lookup!('filter.schema'),
|
86
|
-
additional_url_filter: lookup('filter.additional_url_filter'),
|
87
|
-
schema_options: execute_options(lookup('filter.options'))
|
85
|
+
schema: config.lookup!('filter.schema'),
|
86
|
+
additional_url_filter: config.lookup('filter.additional_url_filter'),
|
87
|
+
schema_options: execute_options(config.lookup('filter.options'))
|
88
88
|
).run)
|
89
89
|
end
|
90
90
|
|
@@ -100,7 +100,7 @@ module RequestHandler
|
|
100
100
|
defaults = fetch_defaults("#{type}.defaults", [])
|
101
101
|
result = parser.new(
|
102
102
|
params: params,
|
103
|
-
allowed_options_type: lookup!("#{type}.allowed")
|
103
|
+
allowed_options_type: config.lookup!("#{type}.allowed")
|
104
104
|
).run
|
105
105
|
result.empty? ? defaults : result
|
106
106
|
end
|
@@ -108,35 +108,35 @@ module RequestHandler
|
|
108
108
|
def parse_body_params
|
109
109
|
BodyParser.new(
|
110
110
|
request: request,
|
111
|
-
schema: lookup!('body.schema'),
|
112
|
-
schema_options: execute_options(lookup('body.options')),
|
113
|
-
type: lookup('body.type')
|
111
|
+
schema: config.lookup!('body.schema'),
|
112
|
+
schema_options: execute_options(config.lookup('body.options')),
|
113
|
+
type: config.lookup('body.type')
|
114
114
|
).run
|
115
115
|
end
|
116
116
|
|
117
117
|
def parse_multipart_params
|
118
118
|
MultipartsParser.new(
|
119
119
|
request: request,
|
120
|
-
multipart_config: lookup!('multipart')
|
120
|
+
multipart_config: config.lookup!('multipart').to_h
|
121
121
|
).run
|
122
122
|
end
|
123
123
|
|
124
124
|
def parse_fieldsets_params
|
125
125
|
FieldsetsParser.new(params: params,
|
126
|
-
allowed: lookup!('fieldsets.allowed'),
|
127
|
-
required: lookup('fieldsets.required') || []).run
|
126
|
+
allowed: config.lookup!('fieldsets.allowed'),
|
127
|
+
required: config.lookup('fieldsets.required') || []).run
|
128
128
|
end
|
129
129
|
|
130
130
|
def parse_query_params
|
131
131
|
QueryParser.new(
|
132
132
|
params: params,
|
133
|
-
schema: lookup!('query.schema'),
|
134
|
-
schema_options: execute_options(lookup('query.options'))
|
133
|
+
schema: config.lookup!('query.schema'),
|
134
|
+
schema_options: execute_options(config.lookup('query.options'))
|
135
135
|
).run
|
136
136
|
end
|
137
137
|
|
138
138
|
def fetch_defaults(key, default)
|
139
|
-
value = lookup(key)
|
139
|
+
value = config.lookup(key)
|
140
140
|
return default if value.nil?
|
141
141
|
return value unless value.respond_to?(:call)
|
142
142
|
value.call(request)
|
@@ -148,26 +148,20 @@ module RequestHandler
|
|
148
148
|
options.call(self, request)
|
149
149
|
end
|
150
150
|
|
151
|
-
def lookup!(key)
|
152
|
-
config.lookup!(key).tap do |data|
|
153
|
-
raise NoConfigAvailableError, key.to_sym => 'is not configured' if data.nil?
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
def lookup(key)
|
158
|
-
config.lookup!(key)
|
159
|
-
end
|
160
|
-
|
161
151
|
def params
|
162
152
|
raise MissingArgumentError, params: 'is missing' if request.params.nil?
|
163
153
|
raise ExternalArgumentError, [] unless request.params.is_a?(Hash)
|
164
154
|
@params ||= Helper.deep_transform_keys_in_object(request.params) do |k|
|
165
|
-
k.to_s.gsub('.',
|
155
|
+
k.to_s.gsub('.', separator)
|
166
156
|
end
|
167
157
|
end
|
168
158
|
|
169
159
|
def config
|
170
160
|
self.class.instance_variable_get('@config')
|
171
161
|
end
|
162
|
+
|
163
|
+
def separator
|
164
|
+
::RequestHandler.configuration.separator
|
165
|
+
end
|
172
166
|
end
|
173
167
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class Base
|
8
|
+
attr_accessor :result
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
create_klass_struct
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_klass_struct
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
def build
|
19
|
+
result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class BodyBuilder < Base
|
8
|
+
Body = Struct.new(:type, :schema, :options)
|
9
|
+
|
10
|
+
def create_klass_struct
|
11
|
+
@result = Body.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def type(value)
|
15
|
+
@result.type = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def schema(value)
|
19
|
+
@result.schema = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def options(value)
|
23
|
+
@result.options = value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
require 'request_handler/builder/fieldsets_resource_builder'
|
5
|
+
|
6
|
+
module RequestHandler
|
7
|
+
module Builder
|
8
|
+
class FieldsetsBuilder < Base
|
9
|
+
Fieldsets = Struct.new(:allowed, :required)
|
10
|
+
|
11
|
+
def create_klass_struct
|
12
|
+
@result = Fieldsets.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def allowed(&block)
|
16
|
+
@result.allowed = build_fieldsets_resource(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def required(value)
|
20
|
+
@result.required = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_fieldsets_resource(&block)
|
24
|
+
Docile.dsl_eval(FieldsetsResourceBuilder.new, &block).build
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "request_handler/builder/base"
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class FieldsetsResourceBuilder < Base
|
8
|
+
def create_klass_struct
|
9
|
+
@result = OpenStruct.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def resource(name, value)
|
13
|
+
@result[name.to_sym] = value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class FilterBuilder < Base
|
8
|
+
Filter = Struct.new(:schema, :additional_url_filter, :options, :defaults)
|
9
|
+
|
10
|
+
def create_klass_struct
|
11
|
+
@result = Filter.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def schema(value)
|
15
|
+
@result.schema = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def additional_url_filter(value)
|
19
|
+
@result.additional_url_filter = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def options(value)
|
23
|
+
@result.options = value
|
24
|
+
end
|
25
|
+
|
26
|
+
def defaults(value)
|
27
|
+
@result.defaults = value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class IncludeOptionsBuilder < Base
|
8
|
+
IncludeOptions = Struct.new(:allowed, :defaults)
|
9
|
+
|
10
|
+
def create_klass_struct
|
11
|
+
@result = IncludeOptions.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def allowed(value)
|
15
|
+
@result.allowed = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def defaults(value)
|
19
|
+
@result.defaults = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
require 'request_handler/builder/multipart_resource_builder'
|
5
|
+
|
6
|
+
module RequestHandler
|
7
|
+
module Builder
|
8
|
+
class MultipartBuilder < Base
|
9
|
+
def create_klass_struct
|
10
|
+
@result = OpenStruct.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def resource(name, &block)
|
14
|
+
@result[name.to_sym] = build_multipart_resource(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_multipart_resource(&block)
|
18
|
+
Docile.dsl_eval(MultipartResourceBuilder.new, &block).build
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'request_handler/builder/base'
|
4
|
+
|
5
|
+
module RequestHandler
|
6
|
+
module Builder
|
7
|
+
class MultipartResourceBuilder < Base
|
8
|
+
MultipartResource = Struct.new(:required, :schema, :type, :options)
|
9
|
+
|
10
|
+
def create_klass_struct
|
11
|
+
@result = MultipartResource.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def type(value)
|
15
|
+
@result.type = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def required(value)
|
19
|
+
@result.required = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def resource(name, &block)
|
23
|
+
@result[name.to_sym] = build_multipart_resource(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def schema(value)
|
27
|
+
@result.schema = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def options(value)
|
31
|
+
@result.options = value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|