babl-json 0.2.4 → 0.2.5
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/lib/babl/nodes/create_pin.rb +1 -1
- data/lib/babl/nodes/dep.rb +2 -2
- data/lib/babl/nodes/fixed_array.rb +2 -2
- data/lib/babl/nodes/goto_pin.rb +1 -1
- data/lib/babl/nodes/internal_value.rb +3 -2
- data/lib/babl/nodes/merge.rb +37 -25
- data/lib/babl/nodes/object.rb +3 -2
- data/lib/babl/nodes/parent.rb +2 -2
- data/lib/babl/nodes/static.rb +2 -2
- data/lib/babl/nodes/switch.rb +2 -2
- data/lib/babl/nodes/terminal_value.rb +3 -2
- data/lib/babl/nodes/typed.rb +8 -23
- data/lib/babl/nodes/with.rb +3 -2
- data/lib/babl/operators/merge.rb +3 -2
- data/lib/babl/operators/switch.rb +2 -1
- data/lib/babl/operators/typed.rb +4 -4
- data/lib/babl/rendering/context.rb +3 -2
- data/lib/babl/schema/anything.rb +2 -1
- data/lib/babl/utils/hash.rb +2 -0
- data/lib/babl/utils/value.rb +3 -1
- data/lib/babl/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b3d925354aed5c77de3cf7003b305b6de01b71f
|
4
|
+
data.tar.gz: 24ffd681b9f421b971ac5340b1896608cb803313
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a935bea9bf8a01a924719526f7d26d1c5bdb016c6e64b3be08ae1040f6126b4aac8cc7dc032c38b7f2f2d1fbfc8ed9a53a091c6f7634b4c4c7b1cd894d7a7f6e
|
7
|
+
data.tar.gz: 1fc88f586cd05f30dbcf2a766611b6bb2208006722b14ab53beceeffcacce5b1cb00397cfb3dab048497cd7f41a944810ab1e229f24c0b254bb2ab124355fabe
|
@@ -12,7 +12,7 @@ module Babl
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def dependencies
|
15
|
-
Babl::Utils::Hash.deep_merge(node.dependencies, node.pinned_dependencies[ref] ||
|
15
|
+
Babl::Utils::Hash.deep_merge(node.dependencies, node.pinned_dependencies[ref] || Utils::Hash::EMPTY)
|
16
16
|
end
|
17
17
|
|
18
18
|
def pinned_dependencies
|
data/lib/babl/nodes/dep.rb
CHANGED
@@ -27,9 +27,9 @@ module Babl
|
|
27
27
|
|
28
28
|
def canonicalize(path)
|
29
29
|
case path
|
30
|
-
when ::Array then path.reduce(
|
30
|
+
when ::Array then path.reduce(Utils::Hash::EMPTY) { |a, p| a.merge(canonicalize(p)) }
|
31
31
|
when ::Hash then path.map { |k, v| [k.to_sym, canonicalize(v)] }.to_h
|
32
|
-
else { path.to_sym =>
|
32
|
+
else { path.to_sym => Utils::Hash::EMPTY }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -9,11 +9,11 @@ module Babl
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def dependencies
|
12
|
-
nodes.map(&:dependencies).reduce(
|
12
|
+
nodes.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
13
13
|
end
|
14
14
|
|
15
15
|
def pinned_dependencies
|
16
|
-
nodes.map(&:pinned_dependencies).reduce(
|
16
|
+
nodes.map(&:pinned_dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
17
17
|
end
|
18
18
|
|
19
19
|
def render(ctx)
|
data/lib/babl/nodes/goto_pin.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'babl/errors'
|
2
|
+
require 'babl/utils'
|
2
3
|
require 'singleton'
|
3
4
|
|
4
5
|
module Babl
|
@@ -16,11 +17,11 @@ module Babl
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def dependencies
|
19
|
-
|
20
|
+
Utils::Hash::EMPTY
|
20
21
|
end
|
21
22
|
|
22
23
|
def pinned_dependencies
|
23
|
-
|
24
|
+
Utils::Hash::EMPTY
|
24
25
|
end
|
25
26
|
|
26
27
|
def render(ctx)
|
data/lib/babl/nodes/merge.rb
CHANGED
@@ -6,11 +6,11 @@ module Babl
|
|
6
6
|
module Nodes
|
7
7
|
class Merge < Utils::Value.new(:nodes)
|
8
8
|
def dependencies
|
9
|
-
nodes.map(&:dependencies).reduce(
|
9
|
+
nodes.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
10
10
|
end
|
11
11
|
|
12
12
|
def pinned_dependencies
|
13
|
-
nodes.map(&:pinned_dependencies).reduce(
|
13
|
+
nodes.map(&:pinned_dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
14
14
|
end
|
15
15
|
|
16
16
|
def schema
|
@@ -24,31 +24,47 @@ module Babl
|
|
24
24
|
}
|
25
25
|
end
|
26
26
|
|
27
|
+
def self.build(nodes)
|
28
|
+
return new(nodes) if nodes.empty?
|
29
|
+
return nodes.first if nodes.size == 1 && Object === nodes.first
|
30
|
+
|
31
|
+
expanded = nodes.flat_map { |node| Merge === node ? node.nodes : [node] }
|
32
|
+
out = []
|
33
|
+
op1 = nil
|
34
|
+
op2 = expanded[0]
|
35
|
+
expanded.drop(1).each do |elm|
|
36
|
+
op1 = op2
|
37
|
+
op2 = elm
|
38
|
+
if Object === op1 && Object === op2
|
39
|
+
op2 = Object.new(op1.nodes.merge(op2.nodes))
|
40
|
+
op1 = nil
|
41
|
+
end
|
42
|
+
out << op1 if op1
|
43
|
+
end
|
44
|
+
out << op2 if op2
|
45
|
+
new(out)
|
46
|
+
end
|
47
|
+
|
27
48
|
private
|
28
49
|
|
50
|
+
AS_OBJECT_MAPPING = {
|
51
|
+
Schema::Anything.instance => Schema::Object::EMPTY_WITH_ADDITIONAL,
|
52
|
+
Schema::Static::NULL => Schema::Object::EMPTY
|
53
|
+
}
|
54
|
+
|
29
55
|
# Merge two documentations together
|
30
56
|
def merge_doc(doc1, doc2)
|
57
|
+
doc1 = AS_OBJECT_MAPPING[doc1] || doc1
|
58
|
+
doc2 = AS_OBJECT_MAPPING[doc2] || doc2
|
59
|
+
|
31
60
|
case
|
32
|
-
when Schema::Static::NULL == doc1
|
33
|
-
merge_doc(Schema::Object::EMPTY, doc2)
|
34
|
-
when Schema::Static::NULL == doc2
|
35
|
-
merge_doc(doc1, Schema::Object::EMPTY)
|
36
61
|
when Schema::AnyOf === doc1
|
37
|
-
Schema::AnyOf.canonicalized(doc1.choices.map { |c|
|
38
|
-
merge_doc(c, doc2)
|
39
|
-
})
|
62
|
+
Schema::AnyOf.canonicalized(doc1.choices.map { |c| merge_doc(c, doc2) })
|
40
63
|
when Schema::AnyOf === doc2
|
41
|
-
Schema::AnyOf.canonicalized(doc2.choices.map { |c|
|
42
|
-
merge_doc(doc1, c)
|
43
|
-
})
|
64
|
+
Schema::AnyOf.canonicalized(doc2.choices.map { |c| merge_doc(doc1, c) })
|
44
65
|
when Schema::Object === doc1 && Schema::Object === doc2
|
45
66
|
merge_object(doc1, doc2)
|
46
|
-
|
47
|
-
merge_object(doc1, Schema::Object::EMPTY_WITH_ADDITIONAL)
|
48
|
-
when Schema::Anything === doc1 && Schema::Object === doc2
|
49
|
-
merge_object(Schema::Object::EMPTY_WITH_ADDITIONAL, doc2)
|
50
|
-
else
|
51
|
-
raise Errors::InvalidTemplate, 'Only objects can be merged'
|
67
|
+
else raise Errors::InvalidTemplate, 'Only objects can be merged'
|
52
68
|
end
|
53
69
|
end
|
54
70
|
|
@@ -57,7 +73,7 @@ module Babl
|
|
57
73
|
additional = doc1.additional || doc2.additional
|
58
74
|
|
59
75
|
properties = (
|
60
|
-
doc1.properties.map { |property| doc2.additional ?
|
76
|
+
doc1.properties.map { |property| doc2.additional ? anything_property(property) : property } +
|
61
77
|
doc2.properties
|
62
78
|
).each_with_object({}) { |property, acc| acc[property.name] = property }.values
|
63
79
|
|
@@ -65,12 +81,8 @@ module Babl
|
|
65
81
|
end
|
66
82
|
|
67
83
|
# Rewrite a property to allow Schema::Anything as value
|
68
|
-
def
|
69
|
-
Schema::Object::Property.new(
|
70
|
-
property.name,
|
71
|
-
Schema::AnyOf.canonicalized([property.value, Schema::Anything.instance]),
|
72
|
-
property.required
|
73
|
-
)
|
84
|
+
def anything_property(property)
|
85
|
+
Schema::Object::Property.new(property.name, Schema::Anything.instance, property.required)
|
74
86
|
end
|
75
87
|
end
|
76
88
|
end
|
data/lib/babl/nodes/object.rb
CHANGED
@@ -5,11 +5,12 @@ module Babl
|
|
5
5
|
module Nodes
|
6
6
|
class Object < Utils::Value.new(:nodes)
|
7
7
|
def dependencies
|
8
|
-
nodes.values.map(&:dependencies).reduce(
|
8
|
+
nodes.values.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
9
9
|
end
|
10
10
|
|
11
11
|
def pinned_dependencies
|
12
|
-
nodes.values.map(&:pinned_dependencies)
|
12
|
+
nodes.values.map(&:pinned_dependencies)
|
13
|
+
.reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
13
14
|
end
|
14
15
|
|
15
16
|
def schema
|
data/lib/babl/nodes/parent.rb
CHANGED
@@ -32,12 +32,12 @@ module Babl
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def backpropagate_dependencies_one_level(deps)
|
35
|
-
deps.reduce(
|
35
|
+
deps.reduce(Utils::Hash::EMPTY) do |out, (k, v)|
|
36
36
|
next out if k == PARENT_MARKER
|
37
37
|
|
38
38
|
Babl::Utils::Hash.deep_merge(
|
39
39
|
Babl::Utils::Hash.deep_merge(out, k => backpropagate_dependencies_one_level(v)),
|
40
|
-
v[PARENT_MARKER] ||
|
40
|
+
v[PARENT_MARKER] || Utils::Hash::EMPTY
|
41
41
|
)
|
42
42
|
end
|
43
43
|
end
|
data/lib/babl/nodes/static.rb
CHANGED
data/lib/babl/nodes/switch.rb
CHANGED
@@ -7,12 +7,12 @@ module Babl
|
|
7
7
|
class Switch < Utils::Value.new(:nodes)
|
8
8
|
def dependencies
|
9
9
|
(nodes.values + nodes.keys).map(&:dependencies)
|
10
|
-
.reduce(
|
10
|
+
.reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
11
11
|
end
|
12
12
|
|
13
13
|
def pinned_dependencies
|
14
14
|
(nodes.values + nodes.keys).map(&:pinned_dependencies)
|
15
|
-
.reduce(
|
15
|
+
.reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
16
16
|
end
|
17
17
|
|
18
18
|
def schema
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'babl/schema'
|
2
2
|
require 'babl/errors'
|
3
|
+
require 'babl/utils'
|
3
4
|
require 'singleton'
|
4
5
|
|
5
6
|
module Babl
|
@@ -15,11 +16,11 @@ module Babl
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def dependencies
|
18
|
-
|
19
|
+
Utils::Hash::EMPTY
|
19
20
|
end
|
20
21
|
|
21
22
|
def pinned_dependencies
|
22
|
-
|
23
|
+
Utils::Hash::EMPTY
|
23
24
|
end
|
24
25
|
|
25
26
|
def render(ctx)
|
data/lib/babl/nodes/typed.rb
CHANGED
@@ -3,40 +3,25 @@ require 'babl/schema'
|
|
3
3
|
|
4
4
|
module Babl
|
5
5
|
module Nodes
|
6
|
-
class Typed < Utils::Value.new(:schema
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
NUMBER = CURRIED.call(Schema::Typed::NUMBER)
|
12
|
-
STRING = CURRIED.call(Schema::Typed::STRING)
|
6
|
+
class Typed < Utils::Value.new(:schema)
|
7
|
+
BOOLEAN = new(Schema::Typed::BOOLEAN)
|
8
|
+
INTEGER = new(Schema::Typed::INTEGER)
|
9
|
+
NUMBER = new(Schema::Typed::NUMBER)
|
10
|
+
STRING = new(Schema::Typed::STRING)
|
13
11
|
|
14
12
|
def dependencies
|
15
|
-
|
13
|
+
Utils::Hash::EMPTY
|
16
14
|
end
|
17
15
|
|
18
16
|
def pinned_dependencies
|
19
|
-
|
17
|
+
Utils::Hash::EMPTY
|
20
18
|
end
|
21
19
|
|
22
20
|
def render(ctx)
|
23
|
-
value =
|
21
|
+
value = ctx.object
|
24
22
|
return value if schema.classes.any? { |clazz| clazz === value }
|
25
23
|
raise Errors::RenderingError, "Expected type '#{schema.type}': #{value}\n#{ctx.formatted_stack}"
|
26
24
|
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def initialize(*)
|
31
|
-
super
|
32
|
-
check_type_compatibility
|
33
|
-
end
|
34
|
-
|
35
|
-
def check_type_compatibility
|
36
|
-
return if schema == node.schema
|
37
|
-
return if node.schema == Schema::Anything.instance
|
38
|
-
raise Errors::InvalidTemplate, "Type cannot be '#{schema.type}' in this context"
|
39
|
-
end
|
40
25
|
end
|
41
26
|
end
|
42
27
|
end
|
data/lib/babl/nodes/with.rb
CHANGED
@@ -9,11 +9,12 @@ module Babl
|
|
9
9
|
|
10
10
|
def dependencies
|
11
11
|
# Dependencies of 'node' are explicitely ignored
|
12
|
-
nodes.map(&:dependencies).reduce(
|
12
|
+
nodes.map(&:dependencies).reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
13
13
|
end
|
14
14
|
|
15
15
|
def pinned_dependencies
|
16
|
-
(nodes + [node]).map(&:pinned_dependencies)
|
16
|
+
(nodes + [node]).map(&:pinned_dependencies)
|
17
|
+
.reduce(Utils::Hash::EMPTY) { |a, b| Babl::Utils::Hash.deep_merge(a, b) }
|
17
18
|
end
|
18
19
|
|
19
20
|
def render(ctx)
|
data/lib/babl/operators/merge.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'babl/nodes'
|
2
|
+
require 'babl/utils'
|
2
3
|
|
3
4
|
module Babl
|
4
5
|
module Operators
|
@@ -6,10 +7,10 @@ module Babl
|
|
6
7
|
module DSL
|
7
8
|
# Merge multiple JSON objects (non-deep)
|
8
9
|
def merge(*templates)
|
9
|
-
return call(
|
10
|
+
return call(Utils::Hash::EMPTY) if templates.empty?
|
10
11
|
|
11
12
|
construct_terminal { |context|
|
12
|
-
Nodes::Merge.
|
13
|
+
Nodes::Merge.build(
|
13
14
|
templates.map { |t|
|
14
15
|
unscoped.call(t).builder.precompile(
|
15
16
|
Nodes::TerminalValue.instance,
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'babl/nodes'
|
2
|
+
require 'babl/utils'
|
2
3
|
|
3
4
|
module Babl
|
4
5
|
module Operators
|
5
6
|
module Switch
|
6
7
|
module DSL
|
7
8
|
# Conditional switching between different templates
|
8
|
-
def switch(conds =
|
9
|
+
def switch(conds = Utils::Hash::EMPTY)
|
9
10
|
construct_node(continue: nil) { |node, context|
|
10
11
|
nodes = conds.map { |cond, value|
|
11
12
|
cond_node = unscoped.call(cond).builder
|
data/lib/babl/operators/typed.rb
CHANGED
@@ -5,19 +5,19 @@ module Babl
|
|
5
5
|
module Typed
|
6
6
|
module DSL
|
7
7
|
def integer
|
8
|
-
|
8
|
+
construct_terminal { Nodes::Typed::INTEGER }
|
9
9
|
end
|
10
10
|
|
11
11
|
def number
|
12
|
-
|
12
|
+
construct_terminal { Nodes::Typed::NUMBER }
|
13
13
|
end
|
14
14
|
|
15
15
|
def string
|
16
|
-
|
16
|
+
construct_terminal { Nodes::Typed::STRING }
|
17
17
|
end
|
18
18
|
|
19
19
|
def boolean
|
20
|
-
|
20
|
+
construct_terminal { Nodes::Typed::BOOLEAN }
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'babl/errors'
|
2
|
+
require 'babl/utils'
|
2
3
|
|
3
4
|
module Babl
|
4
5
|
module Rendering
|
@@ -34,12 +35,12 @@ module Babl
|
|
34
35
|
def goto_pin(ref)
|
35
36
|
pin = pins&.[](ref)
|
36
37
|
raise Errors::RenderingError, 'Pin reference cannot be used here' unless pin
|
37
|
-
Context.new(pin.object, pin.key, pin.parent, (pin.pins ||
|
38
|
+
Context.new(pin.object, pin.key, pin.parent, (pin.pins || Utils::Hash::EMPTY).merge(pins))
|
38
39
|
end
|
39
40
|
|
40
41
|
# Associate a pin to current context
|
41
42
|
def create_pin(ref)
|
42
|
-
Context.new(object, key, parent, (pins ||
|
43
|
+
Context.new(object, key, parent, (pins || Utils::Hash::EMPTY).merge(ref => self))
|
43
44
|
end
|
44
45
|
|
45
46
|
# Wrapper around #move_forward navigating into the return value of
|
data/lib/babl/schema/anything.rb
CHANGED
data/lib/babl/utils/hash.rb
CHANGED
data/lib/babl/utils/value.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'babl/utils'
|
2
|
+
|
1
3
|
module Babl
|
2
4
|
module Utils
|
3
5
|
# Construct deeply immutable value objects
|
@@ -25,7 +27,7 @@ module Babl
|
|
25
27
|
eql?(other)
|
26
28
|
end
|
27
29
|
|
28
|
-
def self.with(hash =
|
30
|
+
def self.with(hash = Utils::Hash::EMPTY)
|
29
31
|
raise ::ArgumentError unless ::Hash === hash && (hash.keys - FIELDS).empty?
|
30
32
|
new(*FIELDS.map { |f| hash.fetch(f) })
|
31
33
|
end
|
data/lib/babl/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: babl-json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frederic Terrazzoni
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|