paradocs 1.1.0 → 1.1.1
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/docs/changelog.md +14 -0
- data/docs/documentation_generation.md +38 -25
- data/docs/payload_builder.md +9 -8
- data/lib/paradocs/extensions/payload_builder.rb +3 -2
- data/lib/paradocs/extensions/structure.rb +6 -3
- data/lib/paradocs/version.rb +1 -1
- data/mkdocs.yml +1 -0
- data/spec/extensions/structures_spec.rb +25 -18
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2b76b24aa936e4626071a9563bb2d96626e584d
|
4
|
+
data.tar.gz: a562933c44070c959dd170dd704621014f4b6cd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 550d27c26a72f9f5ee9037a8072bcf40687f2554dd2822bd5c920218aa92a4c06fcd2c72b819ac479b99977028e395b4fdd32cfca4091874d1ac184e62968e2a
|
7
|
+
data.tar.gz: b28aa591c5c8cce7b7d19d638f9ba5ab530972ee6e83603f83eb35ab5a98f756d1b6e800a0000ebdbe87296c7f964ee261e9d2bbc430720d962433e1d3cd3160
|
data/docs/changelog.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 1.1.1
|
4
|
+
- Fixed bug with missing `errors` meta key in `Structure#all_nested` and `Structure#all_flatten` methods.
|
5
|
+
- Fixed bug with absent `nested_name` meta key in `#Structure#all_nested` method.
|
6
|
+
- Added opportunity to sort generated by `PayloadBuilder` payload in the way it is described in schema.
|
7
|
+
|
8
|
+
## 1.1.0
|
9
|
+
> `Schema#structure` is not comptatible with previous versions
|
10
|
+
|
11
|
+
- Added `Paradocs::Extensions::StructureBuilder`. See [more](payload_builder)
|
12
|
+
- `Parardocs::Extensions::Structure` has replaced `Paradocs::Extensions::Insides` and changed `Schema#structure` behavior
|
13
|
+
- `Paradocs::Extensions::Structure` got more structure generation methods. See [Documentation Generation](documentation_generation)
|
14
|
+
|
@@ -188,12 +188,16 @@ all_nested[:subschema] # =>
|
|
188
188
|
required: true,
|
189
189
|
present: true,
|
190
190
|
json_path: "$.data",
|
191
|
+
nested_name: "data",
|
191
192
|
structure: {
|
192
|
-
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
193
|
-
"
|
194
|
-
"
|
195
|
-
"
|
196
|
-
"
|
193
|
+
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true, nested_name: "data.role"},
|
194
|
+
"test_field" => {required: true, present: true, json_path: "$.data.test_field", nested_name: "data.test_field"},
|
195
|
+
"id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
196
|
+
"name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
197
|
+
"extra" => {
|
198
|
+
type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra",
|
199
|
+
structure: {"extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"}}
|
200
|
+
}
|
197
201
|
}
|
198
202
|
}
|
199
203
|
}
|
@@ -205,12 +209,16 @@ all_nested[:test_subschema] # =>
|
|
205
209
|
required: true,
|
206
210
|
present: true,
|
207
211
|
json_path: "$.data",
|
212
|
+
nested_name: "data",
|
208
213
|
structure: {
|
209
|
-
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
210
|
-
"
|
211
|
-
"
|
212
|
-
"
|
213
|
-
"
|
214
|
+
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true, nested_name: "data.role"},
|
215
|
+
"test1" => {required: true, present: true, json_path: "$.data.test1", nested_name: "data.test1"},
|
216
|
+
"id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
217
|
+
"name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
218
|
+
"extra" => {
|
219
|
+
type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra",
|
220
|
+
structure: {"extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"}}
|
221
|
+
}
|
214
222
|
}
|
215
223
|
}
|
216
224
|
}
|
@@ -219,33 +227,38 @@ all_nested[:test_subschema] # =>
|
|
219
227
|
## Structure#all_flatten
|
220
228
|
> This method returns all available combinations of schema (built on subschema) without nesting (the same way as Structure#flatten method does)
|
221
229
|
|
222
|
-
Schema is the same as described in Structure#all_nested
|
230
|
+
Schema is the same as described in `Structure#all_nested`
|
223
231
|
```rb
|
224
232
|
schema.structure.all_flatten # =>
|
225
233
|
{
|
226
234
|
subschema: {
|
227
235
|
_errors: [],
|
228
|
-
"data" => {type: :object, required: true, present: true, json_path: "$.data"},
|
229
|
-
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id"},
|
230
|
-
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true},
|
231
|
-
"data.role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
232
|
-
"data.extra" => {type: :array, required: true, json_path: "$.data.extra[]"},
|
233
|
-
"data.extra.extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra"},
|
234
|
-
"data.test_field" => {required: true, present: true, json_path: "$.data.test_field"}
|
236
|
+
"data" => {type: :object, required: true, present: true, json_path: "$.data", nested_name: "data"},
|
237
|
+
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
238
|
+
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
239
|
+
"data.role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true, nested_name: "data.role"},
|
240
|
+
"data.extra" => {type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra"},
|
241
|
+
"data.extra.extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"},
|
242
|
+
"data.test_field" => {required: true, present: true, json_path: "$.data.test_field", nested_name: "data.test_field"}
|
235
243
|
},
|
236
244
|
test_subschema: {
|
237
245
|
_errors: [],
|
238
|
-
"data" => {type: :object, required: true, present: true, json_path: "$.data"},
|
239
|
-
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id"},
|
240
|
-
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true},
|
241
|
-
"data.role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
242
|
-
"data.extra" => {type: :array, required: true, json_path: "$.data.extra[]"},
|
243
|
-
"data.extra.extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra"},
|
244
|
-
"data.test1" => {required: true, present: true, json_path: "$.data.test1"}
|
246
|
+
"data" => {type: :object, required: true, present: true, json_path: "$.data", nested_name: "data"},
|
247
|
+
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
248
|
+
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
249
|
+
"data.role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true, nested_name: "data.role"},
|
250
|
+
"data.extra" => {type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra"},
|
251
|
+
"data.extra.extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"},
|
252
|
+
"data.test1" => {required: true, present: true, json_path: "$.data.test1", nested_name: "data.test1"}
|
245
253
|
}
|
246
254
|
}
|
247
255
|
```
|
248
256
|
|
257
|
+
## Passing a block
|
258
|
+
Given block to the methods above (`#flatten`, `#nested`, `#all_flatten`, `#all_nested`) will be executed for
|
259
|
+
each field, passing you as arguments `field.key` and `field.meta`. Mutating the second argument `field.meta`
|
260
|
+
will reflect onto returned `meta`.
|
261
|
+
|
249
262
|
## Schema#walk
|
250
263
|
|
251
264
|
The `#walk` method can recursively walk a schema definition and extract meta data or field attributes.
|
data/docs/payload_builder.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
# Generate examples from the Schema
|
2
2
|
|
3
|
-
> Schema instance provides
|
3
|
+
> `Schema` instance provides `#example_payloads` method that returns example of all possible structures.
|
4
4
|
|
5
|
-
NOTE: PayloadBuilder sets nil values by default. If options are given - builder will take on of them, if default is set - builder will use it.
|
6
|
-
> PayloadBuilder#build! method takes a block as argument that may help you adding your custom rules.
|
5
|
+
NOTE: `PayloadBuilder` sets nil values by default. If options are given - builder will take on of them, if default is set - builder will use it.
|
7
6
|
|
8
7
|
#### Example schema
|
9
8
|
```ruby
|
@@ -59,12 +58,14 @@ schema.example_payloads.to_json # =>
|
|
59
58
|
```
|
60
59
|
|
61
60
|
## Customize payload generation logic
|
62
|
-
PayloadBuilder#build
|
61
|
+
`PayloadBuilder#build!` arguments:
|
63
62
|
|
64
|
-
|
65
|
-
|
66
|
-
-
|
67
|
-
-
|
63
|
+
1. `sort_by_schema: true` will try to return payload in the same way as declared in the schema.
|
64
|
+
2. `&block` will be executed for each key receiving the following arguments:
|
65
|
+
- `key`: Field name
|
66
|
+
- `meta`: Field meta data (that includes (if provided) field types, presence data, policies and other meta data
|
67
|
+
- `example_value`: Provided by generator example value.
|
68
|
+
- `skip_word`: Return this argument back if you want this item to be ommitted.
|
68
69
|
|
69
70
|
```rb
|
70
71
|
block = Proc.new do |key, meta, example, skip_word|
|
@@ -8,8 +8,9 @@ module Paradocs
|
|
8
8
|
@skip_word = skip_word
|
9
9
|
end
|
10
10
|
|
11
|
-
def build!(&block)
|
12
|
-
structure.all_nested.map { |name, struct| [name, build_simple_structure(struct, &block)] }.to_h
|
11
|
+
def build!(sort_by_schema: false, &block)
|
12
|
+
result = structure.all_nested.map { |name, struct| [name, build_simple_structure(struct, &block)] }.to_h
|
13
|
+
sort_by_schema ? schema.resolve(result).output : result
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
@@ -45,6 +45,7 @@ module Paradocs
|
|
45
45
|
struct.sort_by { |k, v| k.to_s.count(".") }.each do |key, value|
|
46
46
|
target = obj[name]
|
47
47
|
key, value = key.to_s, value.clone # clone the values, because we do mutation below
|
48
|
+
value.merge!(nested_name: key) if value.respond_to?(:merge) # it can be array (_errors)
|
48
49
|
next target[key.to_sym] = value if key.start_with?(Paradocs.config.meta_prefix) # copy meta fields
|
49
50
|
|
50
51
|
parts = key.split(".")
|
@@ -68,9 +69,11 @@ module Paradocs
|
|
68
69
|
end
|
69
70
|
@all_flatten = schema_structure[subschemes].each_with_object({}) do |(name, subschema), result|
|
70
71
|
if subschema[subschemes].empty?
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
result[name] = schema_structure.merge(subschema)
|
73
|
+
result[name][errors] += schema_structure[errors]
|
74
|
+
result[name][errors].uniq!
|
75
|
+
result[name].delete(subschemes)
|
76
|
+
next result[name]
|
74
77
|
end
|
75
78
|
|
76
79
|
all_flatten(subschema).each do |sub_name, schema|
|
data/lib/paradocs/version.rb
CHANGED
data/mkdocs.yml
CHANGED
@@ -174,7 +174,7 @@ describe Paradocs::Extensions::Structure do
|
|
174
174
|
it "generates N structures, where N = number of unique combinations of applied subschemas" do
|
175
175
|
expect(schema.structure.all_flatten).to eq({
|
176
176
|
subschema: {
|
177
|
-
_errors: [],
|
177
|
+
_errors: [ArgumentError],
|
178
178
|
"data" => {type: :object, required: true, present: true, json_path: "$.data"},
|
179
179
|
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id"},
|
180
180
|
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true},
|
@@ -184,7 +184,7 @@ describe Paradocs::Extensions::Structure do
|
|
184
184
|
"data.test_field" => {required: true, present: true, json_path: "$.data.test_field"}
|
185
185
|
},
|
186
186
|
test_subschema: {
|
187
|
-
_errors: [],
|
187
|
+
_errors: [ArgumentError],
|
188
188
|
"data" => {type: :object, required: true, present: true, json_path: "$.data"},
|
189
189
|
"data.id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id"},
|
190
190
|
"data.name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true},
|
@@ -201,34 +201,41 @@ describe Paradocs::Extensions::Structure do
|
|
201
201
|
it "generates N structures, where N = number of unique combinations of applied subschemas" do
|
202
202
|
result = schema.structure.all_nested
|
203
203
|
expect(result[:subschema]).to eq({
|
204
|
-
_errors: [],
|
204
|
+
_errors: [ArgumentError],
|
205
205
|
"data" => {
|
206
|
-
type:
|
207
|
-
required:
|
208
|
-
present:
|
209
|
-
json_path:
|
206
|
+
type: :object,
|
207
|
+
required: true,
|
208
|
+
present: true,
|
209
|
+
json_path: "$.data",
|
210
|
+
nested_name: "data",
|
210
211
|
structure: {
|
211
|
-
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
212
|
-
"
|
213
|
-
"
|
214
|
-
"
|
215
|
-
"
|
212
|
+
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", nested_name: "data.role", mutates_schema: true},
|
213
|
+
"test_field" => {required: true, present: true, json_path: "$.data.test_field", nested_name: "data.test_field"},
|
214
|
+
"id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
215
|
+
"name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
216
|
+
"extra" => {
|
217
|
+
type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra",
|
218
|
+
structure: {"extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"}}
|
219
|
+
}
|
216
220
|
}
|
217
221
|
}
|
218
222
|
})
|
219
223
|
expect(result[:test_subschema]).to eq({
|
220
|
-
_errors: [],
|
224
|
+
_errors: [ArgumentError],
|
221
225
|
"data" => {
|
222
226
|
type: :object,
|
223
227
|
required: true,
|
224
228
|
present: true,
|
225
229
|
json_path: "$.data",
|
230
|
+
nested_name: "data",
|
226
231
|
structure: {
|
227
|
-
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", mutates_schema: true},
|
228
|
-
"
|
229
|
-
"
|
230
|
-
"
|
231
|
-
"
|
232
|
+
"role" => {type: :string, options: ["admin", "user"], default: "user", json_path: "$.data.role", nested_name: "data.role", mutates_schema: true},
|
233
|
+
"test1" => {required: true, present: true, json_path: "$.data.test1", nested_name: "data.test1"},
|
234
|
+
"id" => {type: :integer, required: true, present: true, policy_with_error: {errors: [ArgumentError]}, json_path: "$.data.id", nested_name: "data.id"},
|
235
|
+
"name" => {type: :string, label: "very important staff", json_path: "$.data.name", mutates_schema: true, nested_name: "data.name"},
|
236
|
+
"extra" => {
|
237
|
+
type: :array, required: true, json_path: "$.data.extra[]", nested_name: "data.extra",
|
238
|
+
structure: {"extra" => {default: false, policy_with_silent_error: {errors: []}, json_path: "$.data.extra[].extra", nested_name: "data.extra.extra"}}}
|
232
239
|
}
|
233
240
|
}
|
234
241
|
})
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paradocs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxim Tkachenko
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- README.md
|
89
89
|
- Rakefile
|
90
90
|
- bin/console
|
91
|
+
- docs/changelog.md
|
91
92
|
- docs/custom_configuration.md
|
92
93
|
- docs/documentation_generation.md
|
93
94
|
- docs/faq.md
|