json_schema-faker 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ed035b4c6b13f8c95e652da5d0a3a8cd0b2f2ea1
4
- data.tar.gz: 56cfae8127b7a6dfaeb6f39ed178efbe8d95daf9
3
+ metadata.gz: 4fe0bd03f8a005b3e787b728ce7287db41612d36
4
+ data.tar.gz: ab3c402bb39c68ee5c3c9102b5dcbc5dccc370d4
5
5
  SHA512:
6
- metadata.gz: 3f1f10ce70b6607759b82c98429f8ca157d28d137530cebe7b324a0faffd4ba34f9252709db0674516c368bfe4a02b203e3d74f5bce4b426e029344313c16fcf
7
- data.tar.gz: fa9a0f383a929411577fba5e97fb7dbcb25a8872521d3f882de15224b599229761dfc1315569b8143a56c34bde93271c99dd41ab302a68ee56b245f7914667bf
6
+ metadata.gz: 8cfdfcb77c087e913d4d555a6793a948a847f7dae5b4fe9722cc3f844a10a1f5f1b6b14b54ef20db7909faef0e59263bc71e32f0aba1d95af0f5f23f1c8005c7
7
+ data.tar.gz: 25b74a451865ab813ed00c2575fe8b43eab4775a6503dbf984baefbb4a794236c828d5a2e0b620115cc8af055e5c2caa470b3e0f91643e48eadea7d6fe787bed
@@ -1,3 +1,8 @@
1
+ ## 0.4.0
2
+
3
+ * ADDED
4
+ * Greedy strategy to use properties as much as possible (suitable to response generation)
5
+
1
6
  ## 0.3.0
2
7
 
3
8
  * ENHANCEMENT
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -0,0 +1,70 @@
1
+ require "json_schema/faker/strategy/simple"
2
+
3
+ module JsonSchema::Faker::Strategy
4
+ class Greedy < Simple
5
+ def generate_for_object(schema, hint: nil, position:)
6
+ # complete hint
7
+ object = if hint && hint[:example] && hint[:example].is_a?(Hash)
8
+ hint[:example].each.with_object({}) do |(key, value), hash|
9
+ if value.is_a?(Hash)
10
+ if schema.properties.has_key?(key)
11
+ hash[key] = generate(schema.properties[key], hint: { example: hint[:example][key] }, position: "#{position}/#{key}")
12
+ else
13
+ # TODO: support pattern properties
14
+ hash[key] = value
15
+ end
16
+ else
17
+ hash[key] = value
18
+ end
19
+ end
20
+ else
21
+ {}
22
+ end
23
+
24
+ # http://json-schema.org/latest/json-schema-validation.html#anchor53
25
+ required_length = schema.max_properties || [ schema.properties.size, (schema.min_properties || 0) ].max
26
+
27
+ keys = ((schema.required || [])+ (schema.properties || {}).keys).uniq - object.keys
28
+ keys -= hint[:not_have_keys] if hint && hint[:not_have_keys]
29
+
30
+ keys.first(required_length).each.with_object(object) do |key, hash|
31
+ hash[key] = generate(schema.properties[key], hint: hint, position: "#{position}/#{key}")
32
+ end
33
+
34
+ # if length is not enough
35
+ if schema.additional_properties === false
36
+ (required_length - object.keys.length).times.each.with_object(object) do |i, hash|
37
+ if schema.pattern_properties.empty?
38
+ key = (schema.properties.keys - object.keys).first
39
+ hash[key] = generate(schema.properties[key], hint: hint, position: "#{position}/#{key}")
40
+ else
41
+ name = ::Pxeger.new(schema.pattern_properties.keys.first).generate
42
+ hash[name] = generate(schema.pattern_properties.values.first, hint: hint, position: "#{position}/#{name}")
43
+ end
44
+ end
45
+ else
46
+ # FIXME: key confilct with properties
47
+ (required_length - object.keys.length).times.each.with_object(object) do |i, hash|
48
+ hash[i.to_s] = i
49
+ end
50
+ end
51
+
52
+ # consider dependency
53
+ depended_keys = object.keys & schema.dependencies.keys
54
+
55
+ # FIXME: circular dependency is not supported
56
+ depended_keys.each.with_object(object) do |key, hash|
57
+ dependency = schema.dependencies[key]
58
+
59
+ if dependency.is_a?(::JsonSchema::Schema)
60
+ # too difficult we just merge
61
+ hash.update(generate(schema.dependencies[key], hint: nil, position: "#{position}/dependencies/#{key}"))
62
+ else
63
+ dependency.each do |additional_key|
64
+ object[additional_key] = generate(schema.properties[additional_key], hint: hint, position: "#{position}/dependencies/#{key}/#{additional_key}") unless object.has_key?(additional_key)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -144,14 +144,14 @@ module JsonSchema::Faker::Strategy
144
144
 
145
145
  true
146
146
  when "integer", "number"
147
- generate_for_number(schema, hint: hint)
147
+ generate_for_number(schema, hint: hint, position: position)
148
148
  when "null"
149
149
  nil
150
150
  when "object", nil
151
151
  # here comes object without properties
152
152
  generate_for_object(schema, hint: hint, position: position)
153
153
  when "string"
154
- generate_for_string(schema, hint: hint)
154
+ generate_for_string(schema, hint: hint, position: position)
155
155
  else
156
156
  raise "unknown type for #{schema.inspect_schema}"
157
157
  end
@@ -178,7 +178,7 @@ module JsonSchema::Faker::Strategy
178
178
  end
179
179
  end
180
180
 
181
- def generate_for_number(schema, hint: nil)
181
+ def generate_for_number(schema, hint: nil, position:)
182
182
  return hint[:example] if hint && hint[:example] && hint[:example].is_a?(Numeric)
183
183
 
184
184
  # http://json-schema.org/latest/json-schema-validation.html#anchor13
@@ -204,7 +204,7 @@ module JsonSchema::Faker::Strategy
204
204
  end
205
205
  end
206
206
 
207
- def generate_for_string(schema, hint: nil)
207
+ def generate_for_string(schema, hint: nil, position:)
208
208
  return hint[:example] if hint && hint[:example] && hint[:example].is_a?(String)
209
209
 
210
210
  # http://json-schema.org/latest/json-schema-validation.html#anchor25
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema-faker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - okitan
@@ -131,6 +131,7 @@ files:
131
131
  - bin/setup
132
132
  - json_schema-faker.gemspec
133
133
  - lib/json_schema/faker.rb
134
+ - lib/json_schema/faker/strategy/greedy.rb
134
135
  - lib/json_schema/faker/strategy/simple.rb
135
136
  homepage: https://github.com/okitan/json_schema-faker
136
137
  licenses: