babl-json 0.3.1 → 0.3.2
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/merge.rb +17 -8
- data/lib/babl/nodes/switch.rb +12 -0
- data/lib/babl/nodes/terminal_value.rb +3 -1
- data/lib/babl/operators/enter.rb +1 -1
- data/lib/babl/operators/object.rb +1 -1
- data/lib/babl/operators/partial.rb +1 -1
- data/lib/babl/railtie.rb +1 -1
- data/lib/babl/schema/any_of.rb +3 -10
- data/lib/babl/version.rb +1 -1
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1244f145154a35f410ff91f14de9dbacd4f679c9
|
4
|
+
data.tar.gz: fdc4821e46e72c54c248b33c406850421ec548e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f1256e9d5a21ba6da758a890eba6e8063b94e2a3d9e26d45c55f262ebc9db95eacbef29f7a920ec67d55626e0a23d3c0f76bcd312d41d3f4de729fc742bd9b7
|
7
|
+
data.tar.gz: 47b8265e9078140b733cd81bd77baa1dcf40936362998dd8a85b7ad7a3b891a8ae1849f82be60c638fc6ccc3eb5a03d09b4eed137242575a453240d21e77c93b
|
data/lib/babl/nodes/merge.rb
CHANGED
@@ -65,12 +65,11 @@ module Babl
|
|
65
65
|
obj1 = constant_to_object(obj1) if Constant === obj1
|
66
66
|
obj2 = constant_to_object(obj2) if Constant === obj2
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
68
|
+
next unless Object === obj1 && Object === obj2
|
69
|
+
new_nodes = nodes.dup
|
70
|
+
new_nodes[idx] = Object.new(obj1.nodes.merge(obj2.nodes))
|
71
|
+
new_nodes[idx + 1] = nil
|
72
|
+
return Merge.new(new_nodes.compact).optimize
|
74
73
|
end
|
75
74
|
nil
|
76
75
|
end
|
@@ -87,7 +86,7 @@ module Babl
|
|
87
86
|
AS_OBJECT_MAPPING = {
|
88
87
|
Schema::Anything.instance => Schema::Object::EMPTY_WITH_ADDITIONAL,
|
89
88
|
Schema::Primitive::NULL => Schema::Object::EMPTY
|
90
|
-
}
|
89
|
+
}.freeze
|
91
90
|
|
92
91
|
# Merge two documentations together
|
93
92
|
def merge_doc(doc1, doc2)
|
@@ -112,7 +111,17 @@ module Babl
|
|
112
111
|
properties = (
|
113
112
|
doc1.property_set.map { |property| doc2.additional ? anything_property(property) : property } +
|
114
113
|
doc2.property_set.to_a
|
115
|
-
).each_with_object({}) { |property, acc|
|
114
|
+
).each_with_object({}) { |property, acc|
|
115
|
+
if property.required
|
116
|
+
acc[property.name] = property
|
117
|
+
else
|
118
|
+
acc[property.name] = Schema::Object::Property.new(
|
119
|
+
property.name,
|
120
|
+
Schema::AnyOf.canonicalized([property.value, acc[property.name]&.value].compact),
|
121
|
+
acc[property.name]&.required || false
|
122
|
+
)
|
123
|
+
end
|
124
|
+
}.values
|
116
125
|
|
117
126
|
Schema::Object.new(properties, additional)
|
118
127
|
end
|
data/lib/babl/nodes/switch.rb
CHANGED
@@ -3,6 +3,7 @@ require 'babl/schema'
|
|
3
3
|
require 'babl/errors'
|
4
4
|
require 'babl/utils'
|
5
5
|
require 'babl/nodes/constant'
|
6
|
+
require 'set'
|
6
7
|
|
7
8
|
module Babl
|
8
9
|
module Nodes
|
@@ -36,11 +37,22 @@ module Babl
|
|
36
37
|
optimize_falsy_conditions ||
|
37
38
|
optimize_truthy_conditions ||
|
38
39
|
optimize_always_same_outputs ||
|
40
|
+
optimize_same_conditions ||
|
39
41
|
self
|
40
42
|
end
|
41
43
|
|
42
44
|
private
|
43
45
|
|
46
|
+
def optimize_same_conditions
|
47
|
+
conds = Set.new
|
48
|
+
new_nodes = nodes.map { |cond, val|
|
49
|
+
next if conds.include?(cond)
|
50
|
+
conds << cond
|
51
|
+
[cond, val]
|
52
|
+
}.compact
|
53
|
+
new_nodes.size == nodes.size ? nil : Switch.new(new_nodes).optimize
|
54
|
+
end
|
55
|
+
|
44
56
|
def optimize_always_same_outputs
|
45
57
|
return unless nodes.map(&:first).any? { |node| Constant === node && node.value }
|
46
58
|
return unless nodes.map(&:last).uniq.size == 1
|
@@ -6,7 +6,7 @@ require 'singleton'
|
|
6
6
|
|
7
7
|
module Babl
|
8
8
|
module Nodes
|
9
|
-
# A TerminalValue node is always
|
9
|
+
# A TerminalValue node is always implicitly added to the end of the
|
10
10
|
# chain during compilation. It basically ensures that the output contains only
|
11
11
|
# primitives, arrays and hashes.
|
12
12
|
class TerminalValue
|
@@ -71,8 +71,10 @@ module Babl
|
|
71
71
|
case key
|
72
72
|
when ::Symbol then key
|
73
73
|
when ::String then key.to_sym
|
74
|
+
# rubocop:disable Lint/BooleanSymbol
|
74
75
|
when ::TrueClass then :true
|
75
76
|
when ::FalseClass then :false
|
77
|
+
# rubocop:enable Lint/BooleanSymbol
|
76
78
|
when ::Numeric, ::NilClass then :"#{key}"
|
77
79
|
else raise TerminalValueError.new("Invalid key for JSON object: #{key}", stack)
|
78
80
|
end
|
data/lib/babl/operators/enter.rb
CHANGED
@@ -11,7 +11,7 @@ module Babl
|
|
11
11
|
def enter
|
12
12
|
construct_node(key: nil, continue: nil) { |node, context|
|
13
13
|
key = context[:key]
|
14
|
-
raise Errors::InvalidTemplate,
|
14
|
+
raise Errors::InvalidTemplate, 'No key to enter into' unless key
|
15
15
|
Nodes::Nav.new(key, node)
|
16
16
|
}
|
17
17
|
end
|
@@ -8,7 +8,7 @@ module Babl
|
|
8
8
|
module DSL
|
9
9
|
# Create a JSON object node with static structure
|
10
10
|
def object(*attrs, **nested)
|
11
|
-
(attrs.map(&:to_sym) + nested.keys).group_by(&:itself).
|
11
|
+
(attrs.map(&:to_sym) + nested.keys).group_by(&:itself).each_value do |keys|
|
12
12
|
raise Errors::InvalidTemplate, "Duplicate key in object(): #{keys.first}" if keys.size > 1
|
13
13
|
end
|
14
14
|
|
@@ -8,7 +8,7 @@ module Babl
|
|
8
8
|
# Load a partial template given its name
|
9
9
|
# A 'lookup_context' must be defined
|
10
10
|
def partial(partial_name)
|
11
|
-
raise Errors::InvalidTemplate,
|
11
|
+
raise Errors::InvalidTemplate, 'Cannot use partial without lookup context' unless lookup_context
|
12
12
|
|
13
13
|
path, source, partial_lookup_context = lookup_context.find(partial_name)
|
14
14
|
raise Errors::InvalidTemplate, "Cannot find partial '#{partial_name}'" unless path
|
data/lib/babl/railtie.rb
CHANGED
@@ -42,7 +42,7 @@ module Babl
|
|
42
42
|
end
|
43
43
|
|
44
44
|
class Railtie < Rails::Railtie
|
45
|
-
initializer
|
45
|
+
initializer 'babl.initialize' do
|
46
46
|
ActiveSupport.on_load(:action_view) do
|
47
47
|
::ActionView::Template.register_template_handler(:babl, Babl::ActionView::TemplateHandler)
|
48
48
|
end
|
data/lib/babl/schema/any_of.rb
CHANGED
@@ -110,25 +110,19 @@ module Babl
|
|
110
110
|
obj1props = obj1.property_set.map { |p| [p.name, p] }.to_h
|
111
111
|
obj2props = obj2.property_set.map { |p| [p.name, p] }.to_h
|
112
112
|
|
113
|
-
# Do not merge properties unless a keyset is almost a subset of the other
|
114
|
-
next unless (obj1props.keys.to_set - obj2props.keys).size <= 1 ||
|
115
|
-
(obj2props.keys.to_set - obj1props.keys).size <= 1
|
116
|
-
|
117
113
|
# Try to detect a discrimitive property (inspired from Typescript's discriminative union),
|
118
|
-
# We will abort the merging process
|
119
|
-
|
114
|
+
# We will abort the merging process if there is one
|
115
|
+
next if obj1props.any? { |name, p1|
|
120
116
|
p2 = obj2props[name]
|
121
117
|
next name if p2 && Primitive === p2.value &&
|
122
118
|
Primitive === p1.value &&
|
123
119
|
p1.value.value != p2.value.value
|
124
|
-
}
|
120
|
+
}
|
125
121
|
|
126
122
|
new_properties = (obj1props.keys + obj2props.keys).uniq.map { |name|
|
127
123
|
p1 = obj1props[name]
|
128
124
|
p2 = obj2props[name]
|
129
125
|
|
130
|
-
break if discriminator && discriminator != name && p1 != p2
|
131
|
-
|
132
126
|
Object::Property.new(
|
133
127
|
name,
|
134
128
|
AnyOf.canonicalized([p1&.value, p2&.value].compact),
|
@@ -136,7 +130,6 @@ module Babl
|
|
136
130
|
)
|
137
131
|
}
|
138
132
|
|
139
|
-
next unless new_properties
|
140
133
|
new_obj = Object.new(new_properties, obj1.additional || obj2.additional)
|
141
134
|
return AnyOf.canonicalized(choice_set - [obj1, obj2] + [new_obj])
|
142
135
|
}
|
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.3.
|
4
|
+
version: 0.3.2
|
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-09-
|
11
|
+
date: 2017-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.50'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.50'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: json-schema
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rabl
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.13'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.13'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: multi_json
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -199,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
213
|
version: '0'
|
200
214
|
requirements: []
|
201
215
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.6.
|
216
|
+
rubygems_version: 2.6.13
|
203
217
|
signing_key:
|
204
218
|
specification_version: 4
|
205
219
|
summary: JSON templating on steroids
|