json_schema-faker 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +37 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +15 -8
- data/Dangerfile +1 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/json_schema-faker.gemspec +5 -0
- data/lib/json_schema/faker/strategy/greedy.rb +14 -10
- data/lib/json_schema/faker/strategy/simple.rb +41 -96
- data/lib/json_schema/faker/util.rb +235 -0
- metadata +48 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a48c2a0057da8ee6de1652e93757976bda7579f
|
4
|
+
data.tar.gz: ce9fba20b0e52dfb882311a2c6959b10f6c7431d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2aa83f9038c66b9c569b35b1fafac65b08638c99b00635c3daf24119ec26c43094e7e8607c9678de66ead6eefde411eca0ed94dd77b0d7374be9b0f290df82b
|
7
|
+
data.tar.gz: '0558dcd25334eda4711868fd89e7d291195ccc32013bb37aabaebdf90cd05d430fd61e6b0f55558d2eab33f4f52f749c1604db8f42b3e54595d163f37bfef7ec'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Ruby CircleCI 2.0 configuration file
|
2
|
+
#
|
3
|
+
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
|
4
|
+
#
|
5
|
+
version: 2
|
6
|
+
jobs:
|
7
|
+
build:
|
8
|
+
docker:
|
9
|
+
- image: circleci/ruby:2.4.1
|
10
|
+
|
11
|
+
working_directory: ~/repo
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- checkout
|
15
|
+
|
16
|
+
# Download and cache dependencies
|
17
|
+
- restore_cache:
|
18
|
+
keys:
|
19
|
+
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
20
|
+
# fallback to using the latest cache if no exact match is found
|
21
|
+
- v1-dependencies-
|
22
|
+
|
23
|
+
- run:
|
24
|
+
name: install dependencies
|
25
|
+
command: |
|
26
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
27
|
+
|
28
|
+
- save_cache:
|
29
|
+
paths:
|
30
|
+
- ./venv
|
31
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
32
|
+
|
33
|
+
# run tests!
|
34
|
+
- run:
|
35
|
+
name: run tests
|
36
|
+
command: |
|
37
|
+
bundle exec danger
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,22 +1,29 @@
|
|
1
|
+
## 0.5.0
|
2
|
+
|
3
|
+
* Added
|
4
|
+
* ::JsonSchema::Faker::Util. utility for json_schema
|
5
|
+
* Removed
|
6
|
+
* ::JsonSchema::Faker::Strategy::Simple.merge_schema! is removed. use ::JsonSchema::Faker::Util.take_logical_and_of_schema instead.
|
7
|
+
|
1
8
|
## 0.4.0
|
2
9
|
|
3
|
-
*
|
4
|
-
|
10
|
+
* Added
|
11
|
+
* Greedy strategy to use properties as much as possible (suitable to response generation)
|
5
12
|
|
6
13
|
## 0.3.0
|
7
14
|
|
8
|
-
*
|
9
|
-
|
15
|
+
* Added
|
16
|
+
* can add faker to format
|
10
17
|
|
11
18
|
## 0.2.0
|
12
19
|
|
13
|
-
*
|
14
|
-
|
20
|
+
* Added
|
21
|
+
* support example as hint
|
15
22
|
|
16
23
|
## 0.1.1
|
17
24
|
|
18
|
-
*
|
19
|
-
|
25
|
+
* Added
|
26
|
+
* refactor and improve generation
|
20
27
|
|
21
28
|
## 0.1.0
|
22
29
|
|
data/Dangerfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rspec_no_filter.warn_for_rspec_filter
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/json_schema-faker.gemspec
CHANGED
@@ -24,6 +24,11 @@ Gem::Specification.new do |spec|
|
|
24
24
|
# test
|
25
25
|
spec.add_development_dependency "rspec"
|
26
26
|
spec.add_development_dependency "guard-rspec"
|
27
|
+
spec.add_development_dependency "activesupport"
|
28
|
+
|
29
|
+
# check pr
|
30
|
+
spec.add_development_dependency "danger"
|
31
|
+
spec.add_development_dependency "danger-rspec_no_filter"
|
27
32
|
|
28
33
|
# debug
|
29
34
|
spec.add_development_dependency "pry"
|
@@ -21,22 +21,27 @@ module JsonSchema::Faker::Strategy
|
|
21
21
|
{}
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
keys
|
24
|
+
if hint && hint[:not_have_keys]
|
25
|
+
candidates = schema.properties.keys - object.keys - hint[:not_have_keys]
|
26
|
+
required_length = schema.max_properties || [ (schema.properties.keys - hint[:not_have_keys]).size, (schema.min_properties || 0) ].max
|
27
|
+
else
|
28
|
+
candidates = schema.properties.keys - object.keys
|
29
|
+
required_length = schema.max_properties || [ schema.properties.keys.size, (schema.min_properties || 0) ].max
|
30
|
+
end
|
29
31
|
|
30
|
-
|
32
|
+
# http://json-schema.org/latest/json-schema-validation.html#anchor53
|
33
|
+
# TODO: candidates.shift(required_length)
|
34
|
+
candidates.first(required_length).each.with_object(object) do |key, hash|
|
31
35
|
hash[key] = generate(schema.properties[key], hint: hint, position: "#{position}/#{key}")
|
32
36
|
end
|
37
|
+
candidates = candidates - object.keys
|
33
38
|
|
34
39
|
# if length is not enough
|
35
40
|
if schema.additional_properties === false
|
36
41
|
(required_length - object.keys.length).times.each.with_object(object) do |i, hash|
|
37
42
|
if schema.pattern_properties.empty?
|
38
|
-
key =
|
39
|
-
hash[key] = generate(schema.properties[key], hint: hint, position: "#{position}/#{key}")
|
43
|
+
key = candidates.pop
|
44
|
+
hash[key] = generate(schema.properties[key], hint: hint, position: "#{position}/#{key}") if key
|
40
45
|
else
|
41
46
|
name = ::Pxeger.new(schema.pattern_properties.keys.first).generate
|
42
47
|
hash[name] = generate(schema.pattern_properties.values.first, hint: hint, position: "#{position}/#{name}")
|
@@ -51,7 +56,6 @@ module JsonSchema::Faker::Strategy
|
|
51
56
|
|
52
57
|
# consider dependency
|
53
58
|
depended_keys = object.keys & schema.dependencies.keys
|
54
|
-
|
55
59
|
# FIXME: circular dependency is not supported
|
56
60
|
depended_keys.each.with_object(object) do |key, hash|
|
57
61
|
dependency = schema.dependencies[key]
|
@@ -61,7 +65,7 @@ module JsonSchema::Faker::Strategy
|
|
61
65
|
hash.update(generate(schema.dependencies[key], hint: nil, position: "#{position}/dependencies/#{key}"))
|
62
66
|
else
|
63
67
|
dependency.each do |additional_key|
|
64
|
-
|
68
|
+
hash[additional_key] = generate(schema.properties[additional_key], hint: hint, position: "#{position}/dependencies/#{key}/#{additional_key}") unless object.has_key?(additional_key)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|
@@ -1,5 +1,9 @@
|
|
1
|
+
require "json_schema/faker/util"
|
2
|
+
|
1
3
|
module JsonSchema::Faker::Strategy
|
2
4
|
class Simple
|
5
|
+
include ::JsonSchema::Faker::Util
|
6
|
+
|
3
7
|
class << self
|
4
8
|
def formats
|
5
9
|
@formats ||= {}
|
@@ -171,7 +175,7 @@ module JsonSchema::Faker::Strategy
|
|
171
175
|
if schema.items.is_a?(Array)
|
172
176
|
items = schema.items.map.with_index {|e, i| generate(e, hint: hint, position: "#{position}/items[#{i}]") }
|
173
177
|
|
174
|
-
items + (length - items.size).map.with_index {|i| schema.additional_items === false ? i : generate(schema.additional_items, hint: hint, position: "#{position}/additional_items[#{i}]") }
|
178
|
+
items + (length - items.size).times.map.with_index {|i| schema.additional_items === false ? i : generate(schema.additional_items, hint: hint, position: "#{position}/additional_items[#{i}]") }
|
175
179
|
else
|
176
180
|
length.times.map.with_index {|i| generate(schema.items, hint: hint, position: "#{position}/items[#{i}]") }
|
177
181
|
end
|
@@ -218,15 +222,7 @@ module JsonSchema::Faker::Strategy
|
|
218
222
|
end
|
219
223
|
end
|
220
224
|
|
221
|
-
|
222
|
-
merge_schema!(
|
223
|
-
compact_schema(a, position: a_position),
|
224
|
-
compact_schema(b, position: b_position),
|
225
|
-
a_position: a_position,
|
226
|
-
b_position: b_position
|
227
|
-
)
|
228
|
-
end
|
229
|
-
|
225
|
+
# TODO: compacting all_of and one_of/any_of at once will not work
|
230
226
|
def compact_schema(schema, position:)
|
231
227
|
return schema if schema.one_of.empty? && schema.any_of.empty? && schema.all_of.empty?
|
232
228
|
|
@@ -241,108 +237,57 @@ module JsonSchema::Faker::Strategy
|
|
241
237
|
merged_schema.any_of = []
|
242
238
|
merged_schema.all_of = []
|
243
239
|
|
244
|
-
unless schema.one_of.empty?
|
245
|
-
::JsonSchema::Faker::Configuration.logger.info "compact one_of" if ::JsonSchema::Faker::Configuration.logger
|
246
|
-
compact_and_merge_schema(merged_schema, schema.one_of.first, a_position: position, b_position: "#{position}/one_of[0]")
|
247
|
-
end
|
248
|
-
|
249
|
-
unless schema.any_of.empty?
|
250
|
-
::JsonSchema::Faker::Configuration.logger.info "compact any_of" if ::JsonSchema::Faker::Configuration.logger
|
251
|
-
compact_and_merge_schema(merged_schema, schema.any_of.first, a_position: position, b_position: "#{position}/any_of[0]")
|
252
|
-
end
|
253
|
-
|
254
240
|
unless schema.all_of.empty?
|
255
241
|
::JsonSchema::Faker::Configuration.logger.info "compact all_of" if ::JsonSchema::Faker::Configuration.logger
|
256
|
-
all_of = ::JsonSchema::Schema.new
|
257
|
-
all_of.copy_from(schema.all_of.first)
|
258
242
|
|
259
|
-
all_of = schema.all_of
|
260
|
-
|
243
|
+
all_of = schema.all_of.each.with_index.inject(nil) do |(a, _), (b, i)|
|
244
|
+
if a
|
245
|
+
take_logical_and_of_schema(a, b, a_position: "#{position}/all_of", b_position: "#{position}/all_of[#{i+1}]")
|
246
|
+
else
|
247
|
+
b
|
248
|
+
end
|
261
249
|
end
|
262
250
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
def merge_schema!(a, b, a_position:, b_position:)
|
272
|
-
if ::JsonSchema::Faker::Configuration.logger
|
273
|
-
::JsonSchema::Faker::Configuration.logger.info "start to merge at #{a_position} with #{b_position}"
|
274
|
-
::JsonSchema::Faker::Configuration.logger.debug "a: #{a.inspect_schema}"
|
275
|
-
::JsonSchema::Faker::Configuration.logger.debug "b: #{b.inspect_schema}"
|
276
|
-
end
|
277
|
-
# attr not supported now
|
278
|
-
# not: too difficult (if `not` is not wrapped by all_of wrap it?)
|
279
|
-
# multiple_of TODO: least common multiple
|
280
|
-
# format TODO: just override
|
281
|
-
|
282
|
-
# array properties
|
283
|
-
a.any_of = (a.any_of.empty? ? b.any_of : a.any_of) # XXX: actually impossible
|
284
|
-
a.enum = (a.enum ? (a.enum & b.enum) : b.enum) if b.enum
|
285
|
-
|
286
|
-
%i[ type one_of all_of ].each do |attr|
|
287
|
-
a.__send__("#{attr}=", a.__send__(attr) + b.__send__(attr))
|
288
|
-
end
|
289
|
-
a.required = (a.required ? (a.required + b.required).uniq : b.required) if b.required
|
290
|
-
|
291
|
-
# object properties
|
292
|
-
# XXX: key conflict
|
293
|
-
%i[ properties pattern_properties dependencies ].each do |attr|
|
294
|
-
a.__send__("#{attr}=", a.__send__(attr).merge(b.__send__(attr)))
|
295
|
-
end
|
251
|
+
merged_schema = unless schema.one_of.empty? && schema.any_of.empty?
|
252
|
+
::JsonSchema::Faker::Configuration.logger.info "find from one_of and any_of which satiffy all_of" if ::JsonSchema::Faker::Configuration.logger
|
253
|
+
one_of_candidate = schema.one_of.find do |s|
|
254
|
+
s2 = take_logical_and_of_schema(s, all_of)
|
255
|
+
compare_schema(s, s2) # FIXME: check s2 > s
|
256
|
+
end
|
296
257
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
# TODO: zip and merge it
|
301
|
-
elsif a.items.is_a?(Array) && b.items.is_a?(::JsonSchema::Schema)
|
302
|
-
a.items = a.items.map.with_index do |e, i|
|
303
|
-
compact_and_merge_schema(e, b.items, a_position: "#{a_position}/items[#{i}]", b_position: "#{b_position}/items")
|
258
|
+
any_of_candidate = schema.any_of.find do |s|
|
259
|
+
s2 = take_logical_and_of_schema(s, all_of)
|
260
|
+
compare_schema(s, s2) # FIXME: check s2 > s
|
304
261
|
end
|
305
|
-
|
306
|
-
|
307
|
-
|
262
|
+
|
263
|
+
unless one_of_candidate || any_of_candidate
|
264
|
+
::JsonSchema::Faker::Configuration.logger.error "failed to find condition which satfisfy all_of in one_of and any_of" if ::JsonSchema::Faker::Configuration.logger
|
265
|
+
take_logical_and_of_schema(merged_schema, all_of, a_position: position, b_position: "#{position}/all_of")
|
266
|
+
else
|
267
|
+
take_logical_and_of_schema(merged_schema, one_of_candidate, a_position: position, b_position: "#{position}/one_of") if one_of_candidate
|
268
|
+
take_logical_and_of_schema(merged_schema, any_of_candidate, a_position: position, b_position: "#{position}/any_of") if any_of_candidate
|
308
269
|
end
|
309
270
|
else
|
310
|
-
|
271
|
+
take_logical_and_of_schema(merged_schema, all_of, a_position: position, b_position: "#{position}/all_of")
|
311
272
|
end
|
312
273
|
else
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
# override to stronger validation
|
317
|
-
%i[ additional_items additional_properties ].each do |attr|
|
318
|
-
a.__send__("#{attr}=", false) unless a.__send__(attr) && b.__send__(attr)
|
319
|
-
end
|
320
|
-
%i[ min_exclusive max_exclusive unique_items ].each do |attr|
|
321
|
-
a.__send__("#{attr}=", a.__send__(attr) & b.__send__(attr))
|
322
|
-
end
|
323
|
-
%i[ min min_length min_properties min_items ].each do |attr|
|
324
|
-
if b.__send__(attr)
|
325
|
-
if a.__send__(attr)
|
326
|
-
a.__send__("#{attr}=", b.__send__(attr)) if b.__send__(attr) < a.__send__(attr)
|
327
|
-
else
|
328
|
-
a.__send__("#{attr}=", b.__send__(attr))
|
329
|
-
end
|
274
|
+
unless schema.one_of.empty?
|
275
|
+
::JsonSchema::Faker::Configuration.logger.info "compact one_of" if ::JsonSchema::Faker::Configuration.logger
|
276
|
+
merged_schema = take_logical_and_of_schema(merged_schema, schema.one_of.first, a_position: position, b_position: "#{position}/one_of[0]")
|
330
277
|
end
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
a.__send__("#{attr}=", b.__send__(attr)) if b.__send__(attr) > a.__send__(attr)
|
336
|
-
else
|
337
|
-
a.__send__("#{attr}=", b.__send__(attr))
|
338
|
-
end
|
278
|
+
|
279
|
+
unless schema.any_of.empty?
|
280
|
+
::JsonSchema::Faker::Configuration.logger.info "compact any_of" if ::JsonSchema::Faker::Configuration.logger
|
281
|
+
merged_schema = take_logical_and_of_schema(merged_schema, schema.any_of.first, a_position: position, b_position: "#{position}/any_of[0]")
|
339
282
|
end
|
340
283
|
end
|
341
|
-
a.pattern = (a.pattern && b.pattern) ? "(?:#{a.pattern})(?=#{b.pattern})" : (a.pattern || b.pattern)
|
342
284
|
|
343
|
-
|
285
|
+
# compact recursively
|
286
|
+
merged_schema = compact_schema(merged_schema, position: position)
|
344
287
|
|
345
|
-
|
288
|
+
::JsonSchema::Faker::Configuration.logger.debug "compacted: #{merged_schema.inspect_schema}" if ::JsonSchema::Faker::Configuration.logger
|
289
|
+
|
290
|
+
merged_schema
|
346
291
|
end
|
347
292
|
end
|
348
293
|
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require "json_schema/faker"
|
2
|
+
|
3
|
+
class JsonSchema::Faker
|
4
|
+
module Util
|
5
|
+
# umhhh maybe we don't need this...
|
6
|
+
def compare_schema(a, b)
|
7
|
+
if a.is_a?(::JsonSchema::Schema) && b.is_a?(::JsonSchema::Schema)
|
8
|
+
%i[ multiple_of min max min_exclusive max_exclusive
|
9
|
+
max_length min_length pattern
|
10
|
+
additional_items items max_items min_items unique_items
|
11
|
+
max_properties min_properties required additional_properties properties pattern_properties
|
12
|
+
enum type all_of any_of one_of not
|
13
|
+
].all? {|k| compare_schema(a.__send__(k), b.__send__(k)) }
|
14
|
+
elsif a.is_a?(::Array) && b.is_a?(::Array)
|
15
|
+
return false unless a.size == b.size
|
16
|
+
a.zip(b).all? {|ai, bi| compare_schema(ai, bi) }
|
17
|
+
elsif a.is_a?(::Hash) && b.is_a?(::Hash)
|
18
|
+
return false unless a.keys.sort == b.keys.sort
|
19
|
+
a.keys.all? {|key| compare_schema(a[key], b[key]) }
|
20
|
+
else
|
21
|
+
a == b
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def take_unique_items(a, b)
|
26
|
+
a.select do |ae|
|
27
|
+
b.any? {|be| compare_schema(ae, be) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def take_logical_and_of_schema(a, b, a_position: nil, b_position: nil)
|
32
|
+
return a || b if a.nil? || b.nil?
|
33
|
+
|
34
|
+
# deep copy and modify it
|
35
|
+
a = ::JsonSchema::Schema.new.tap {|s| s.copy_from(a) }
|
36
|
+
|
37
|
+
# for numeric
|
38
|
+
if a.multiple_of && b.multiple_of
|
39
|
+
# TODO: multipleOf it seems easy
|
40
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging multipleOf" if ::JsonSchema::Faker::Configuration.logger
|
41
|
+
end
|
42
|
+
|
43
|
+
# maximum minimum exclusiveMinimum exclusiveMinimum
|
44
|
+
if b.max
|
45
|
+
if !a.max || a.max > b.max
|
46
|
+
a.max = b.max
|
47
|
+
end
|
48
|
+
a.max_exclusive = b.max_exclusive if b.max_exclusive
|
49
|
+
end
|
50
|
+
if b.min
|
51
|
+
if !a.min || a.min < b.min
|
52
|
+
a.min = b.min
|
53
|
+
end
|
54
|
+
a.min_exclusive = b.min_exclusive if b.min_exclusive
|
55
|
+
end
|
56
|
+
|
57
|
+
# for string
|
58
|
+
# maxLength minLength
|
59
|
+
if b.max_length
|
60
|
+
if !a.max_length || a.max_length > b.max_length
|
61
|
+
a.max_length = b.max_length
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if b.min_length
|
65
|
+
if !a.min_length || a.min_length < b.min_length
|
66
|
+
a.min_length = b.min_length
|
67
|
+
end
|
68
|
+
end
|
69
|
+
# pattern
|
70
|
+
if a.pattern && b.pattern
|
71
|
+
# TODO: pexeger does not support generated one
|
72
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging pattern" if ::JsonSchema::Faker::Configuration.logger
|
73
|
+
end
|
74
|
+
#if b.pattern
|
75
|
+
# a.pattern = (a.pattern ? "/^(?=.*#{a.pattern.inspect.gsub("/\\/", "").gsub("\\//", "")})(?=.*#{b.pattern.inspect.gsub("/\\/", "").gsub("\\//", "")})/" : b.pattern)
|
76
|
+
#end
|
77
|
+
|
78
|
+
# for array
|
79
|
+
# items and aditionalItems
|
80
|
+
if b.items
|
81
|
+
if a.items
|
82
|
+
if a.items.is_a?(Array) && b.items.is_a?(Array)
|
83
|
+
[ a.items.size, b.items.size ].max.times do |i|
|
84
|
+
ai, bi = a.items[i], b.items[i]
|
85
|
+
if ai && bi
|
86
|
+
a.items[i] = take_logical_and_of_schema(ai, bi)
|
87
|
+
else
|
88
|
+
# XXX: consider aditionalItems
|
89
|
+
a.items[i] = ai || bi
|
90
|
+
end
|
91
|
+
end
|
92
|
+
elsif a.items.is_a?(::JsonSchema::Schema) && b.items.is_a?(::JsonSchema::Schema)
|
93
|
+
a.items = take_logical_and_of_schema(a.items, b.items)
|
94
|
+
end
|
95
|
+
else
|
96
|
+
a.items = b.items
|
97
|
+
end
|
98
|
+
end
|
99
|
+
if a.additional_items === false || b.additional_items === false
|
100
|
+
a.additonal_items = false
|
101
|
+
else
|
102
|
+
if b.additional_items.is_a?(::JsonSchema::Schema)
|
103
|
+
if a.additional_items.is_a?(::JsonSchem::Schema)
|
104
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging additionalItems" if ::JsonSchema::Faker::Configuration.logger
|
105
|
+
else
|
106
|
+
a.additional_items = b.additional_items
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# maxItems, minItems
|
111
|
+
if b.max_items
|
112
|
+
if !a.max_items || a.max_items > b.max_items
|
113
|
+
a.max_items = b.max_items
|
114
|
+
end
|
115
|
+
end
|
116
|
+
if b.min_items
|
117
|
+
if !a.min_items || a.min_items < b.min_items
|
118
|
+
a.min_items = b.min_items
|
119
|
+
end
|
120
|
+
end
|
121
|
+
# uniqueItems
|
122
|
+
if a.unique_items || b.unique_items
|
123
|
+
a.unique_items = true
|
124
|
+
end
|
125
|
+
|
126
|
+
# for object
|
127
|
+
# maxProperties, minProperties
|
128
|
+
if b.max_properties
|
129
|
+
if !a.max_properties || a.max_properties > b.max_properties
|
130
|
+
a.max_properties = b.max_properties
|
131
|
+
end
|
132
|
+
end
|
133
|
+
if b.min_properties
|
134
|
+
if !a.min_properties || a.min_properties < b.min_properties
|
135
|
+
a.min_properties = b.min_properties
|
136
|
+
end
|
137
|
+
end
|
138
|
+
# required
|
139
|
+
if b.required
|
140
|
+
a.required = a.required ? (a.required + b.required).uniq : b.required
|
141
|
+
end
|
142
|
+
# properties
|
143
|
+
if !b.properties.empty?
|
144
|
+
( a.properties.keys + b.properties.keys ).uniq.each do |key|
|
145
|
+
a.properties[key] = take_logical_and_of_schema(a.properties[key], b.properties[key])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
# additionalProperties, patternProperties, dependencies
|
149
|
+
if a.additional_properties === false || b.additional_properties === false
|
150
|
+
a.additional_properties = false
|
151
|
+
else
|
152
|
+
if b.additional_properties.is_a?(::JsonSchema::Schema)
|
153
|
+
if a.additional_properties.is_a?(::JsonSchem::Schema)
|
154
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging additionalProperties" if ::JsonSchema::Faker::Configuration.logger
|
155
|
+
else
|
156
|
+
a.additional_properties = b.additional_properties
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
if !b.pattern_properties.empty?
|
161
|
+
if !a.pattern_properties.empty?
|
162
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging patternProperties" if ::JsonSchema::Faker::Configuration.logger
|
163
|
+
else
|
164
|
+
a.pattern_properties = b.pattern_properties
|
165
|
+
end
|
166
|
+
end
|
167
|
+
if !b.dependencies.empty?
|
168
|
+
if !a.dependencies.empty?
|
169
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging dependencies" if ::JsonSchema::Faker::Configuration.logger
|
170
|
+
else
|
171
|
+
a.dependencies = b.dependencies
|
172
|
+
end
|
173
|
+
end
|
174
|
+
# for any
|
175
|
+
# enum
|
176
|
+
if b.enum
|
177
|
+
if a.enum
|
178
|
+
a.enum = a.enum & b.enum
|
179
|
+
else
|
180
|
+
a.enum = b.enum
|
181
|
+
end
|
182
|
+
end
|
183
|
+
# type
|
184
|
+
if !b.type.empty?
|
185
|
+
if !a.type.empty?
|
186
|
+
a.type = a.type & b.type
|
187
|
+
else
|
188
|
+
a.type = b.type
|
189
|
+
end
|
190
|
+
end
|
191
|
+
# allOf
|
192
|
+
if !b.all_of.empty?
|
193
|
+
if !a.all_of.empty?
|
194
|
+
a.all_of = [
|
195
|
+
[ *a.all_of, *b.all_of ].inject(nil) {|res, c| res ? take_logical_and_of_schema(res, c) : c }
|
196
|
+
]
|
197
|
+
else
|
198
|
+
a.all_of = b.all_of
|
199
|
+
end
|
200
|
+
end
|
201
|
+
# anyOf
|
202
|
+
if !b.any_of.empty?
|
203
|
+
if !a.any_of.empty?
|
204
|
+
# XXX: it is difficult to find logically and of any_of
|
205
|
+
# like "anyOf": { "minimum": 5 }, { "multipleOf": 3 } and { "maximum": 6 }, { "multipleOf": 2 }
|
206
|
+
a.any_of = take_unique_items(a.any_of, b.any_of)
|
207
|
+
else
|
208
|
+
a.any_of = b.any_of
|
209
|
+
end
|
210
|
+
end
|
211
|
+
# oneOf
|
212
|
+
if !b.one_of.empty?
|
213
|
+
if !a.one_of.empty?
|
214
|
+
# XXX: it is difficult to find logically and of one_of
|
215
|
+
a.one_of = take_unique_items(a.one_of, b.one_of)
|
216
|
+
else
|
217
|
+
a.one_of = b.one_of
|
218
|
+
end
|
219
|
+
end
|
220
|
+
# not
|
221
|
+
if b.not
|
222
|
+
if a.not
|
223
|
+
::JsonSchema::Faker::Configuration.logger.warn "not support merging not" if ::JsonSchema::Faker::Configuration.logger
|
224
|
+
else
|
225
|
+
a.not = b.not
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
a
|
230
|
+
end
|
231
|
+
|
232
|
+
|
233
|
+
module_function *instance_methods
|
234
|
+
end
|
235
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_schema-faker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- okitan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json_schema
|
@@ -94,6 +94,48 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: activesupport
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: danger
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: danger-rspec_no_filter
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
140
|
name: pry
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,12 +157,14 @@ executables: []
|
|
115
157
|
extensions: []
|
116
158
|
extra_rdoc_files: []
|
117
159
|
files:
|
160
|
+
- ".circleci/config.yml"
|
118
161
|
- ".gitignore"
|
119
162
|
- ".gitmodules"
|
120
163
|
- ".rspec"
|
121
164
|
- ".travis.yml"
|
122
165
|
- CHANGELOG.md
|
123
166
|
- CODE_OF_CONDUCT.md
|
167
|
+
- Dangerfile
|
124
168
|
- Gemfile
|
125
169
|
- Guardfile
|
126
170
|
- LICENSE.txt
|
@@ -133,6 +177,7 @@ files:
|
|
133
177
|
- lib/json_schema/faker.rb
|
134
178
|
- lib/json_schema/faker/strategy/greedy.rb
|
135
179
|
- lib/json_schema/faker/strategy/simple.rb
|
180
|
+
- lib/json_schema/faker/util.rb
|
136
181
|
homepage: https://github.com/okitan/json_schema-faker
|
137
182
|
licenses:
|
138
183
|
- MIT
|
@@ -153,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
198
|
version: '0'
|
154
199
|
requirements: []
|
155
200
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
201
|
+
rubygems_version: 2.6.12
|
157
202
|
signing_key:
|
158
203
|
specification_version: 4
|
159
204
|
summary: generate fake data from json schema
|