lutaml-lml 0.1.6 → 0.1.7
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/lutaml/lml/grammar.rb +6 -3
- data/lib/lutaml/lml/model_compiler.rb +35 -9
- data/lib/lutaml/lml/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 43171296e53409193af9a65974a2e30adb2f425c8dd952eb5a08be556411cb6b
|
|
4
|
+
data.tar.gz: 8146fffb1c51f8fcd7d5061192596a8e73749c443a573f6a6e48c00c5885997c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e50bf16b938b8708125c81d828c2350224dc7ed7ef9526e6fd7a066f44041b7e990003bfd6f3315aee69cdc68628399691dab28aacc7c4c2a233074d43887f0d
|
|
7
|
+
data.tar.gz: ba5efefb14c289839ca8fcc03d9102847cc495797816ddf51ce5dd1177d9ba100324e415ff329bb2b74b88e8db32532baa08e040e94f4e8ffff2ae2c9f23f3d5
|
data/lib/lutaml/lml/grammar.rb
CHANGED
|
@@ -24,17 +24,20 @@ module Lutaml
|
|
|
24
24
|
@artifact ||= load_artifact || compile_artifact
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
# The grammar text and artifact carry UTF-8 (em-dashes in
|
|
28
|
+
# comments); pin the encoding so non-UTF-8 locales (LANG=C CI
|
|
29
|
+
# images) cannot raise InvalidByteSequenceError on read.
|
|
27
30
|
def self.load_artifact
|
|
28
31
|
return unless File.exist?(ARTIFACT_PATH)
|
|
29
32
|
|
|
30
|
-
envelope = JSON.parse(File.read(ARTIFACT_PATH))
|
|
31
|
-
return unless envelope['source'] == File.read(GRAMMAR_PATH)
|
|
33
|
+
envelope = JSON.parse(File.read(ARTIFACT_PATH, encoding: 'UTF-8'))
|
|
34
|
+
return unless envelope['source'] == File.read(GRAMMAR_PATH, encoding: 'UTF-8')
|
|
32
35
|
|
|
33
36
|
Parsanol::PARG::Artifact.new(envelope, ARTIFACT_PATH, File.dirname(ARTIFACT_PATH))
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
def self.compile_artifact
|
|
37
|
-
document = Parsanol::PARG::Parser.new(File.read(GRAMMAR_PATH)).parse
|
|
40
|
+
document = Parsanol::PARG::Parser.new(File.read(GRAMMAR_PATH, encoding: 'UTF-8')).parse
|
|
38
41
|
Parsanol::PARG::Artifact.new(
|
|
39
42
|
Parsanol::PARG::Compiler.compile(document).envelope, nil, nil
|
|
40
43
|
)
|
|
@@ -26,6 +26,7 @@ module Lutaml
|
|
|
26
26
|
@compiled = {}
|
|
27
27
|
@forward_refs = {}
|
|
28
28
|
@enum_names = Set.new
|
|
29
|
+
@enum_classes = {}
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def compile(input)
|
|
@@ -78,7 +79,7 @@ module Lutaml
|
|
|
78
79
|
attrs = Array(instance.attributes)
|
|
79
80
|
type_attr = attrs.find { |a| a.name == "type" }
|
|
80
81
|
type_name = type_attr ? type_attr.value.to_s : instance.type
|
|
81
|
-
klass = @compiled[type_name]
|
|
82
|
+
klass = @compiled[demodulize(type_name)]
|
|
82
83
|
unless klass
|
|
83
84
|
errors << "#{path}: unknown type '#{type_name}'"
|
|
84
85
|
return
|
|
@@ -158,15 +159,20 @@ module Lutaml
|
|
|
158
159
|
key = name.to_sym
|
|
159
160
|
next unless schema_keys.include?(key)
|
|
160
161
|
|
|
161
|
-
hash[key] = resolve_instance_value(value, nested)
|
|
162
|
+
hash[key] = resolve_instance_value(value, nested, klass.attributes[key])
|
|
162
163
|
end
|
|
163
164
|
end
|
|
164
165
|
|
|
165
|
-
def resolve_instance_value(value, nested)
|
|
166
|
+
def resolve_instance_value(value, nested, attr_def = nil)
|
|
166
167
|
if nested.any?
|
|
167
168
|
nested.map { |i| hydrate_instance(i) }
|
|
168
169
|
elsif value.is_a?(Array)
|
|
169
170
|
value
|
|
171
|
+
elsif enum_class = attr_def && enum_class_for(attr_def.type)
|
|
172
|
+
value_name = enum_value_name(value.to_s)
|
|
173
|
+
description = enum_class.values
|
|
174
|
+
.find { |v| v.name == value_name }&.description
|
|
175
|
+
enum_class.new(value: value_name, description: description)
|
|
170
176
|
elsif !value.nil?
|
|
171
177
|
value
|
|
172
178
|
end
|
|
@@ -200,23 +206,28 @@ module Lutaml
|
|
|
200
206
|
|
|
201
207
|
alias_method :compile_data_type, :compile_class
|
|
202
208
|
|
|
209
|
+
EnumValue = Struct.new(:name, :description)
|
|
210
|
+
|
|
203
211
|
def compile_enum(enum_def)
|
|
204
212
|
name = enum_def.name.to_s
|
|
205
213
|
values = extract_enum_values(enum_def)
|
|
206
214
|
|
|
207
215
|
compiled_klass = Class.new(Lutaml::Model::Serializable) do
|
|
208
|
-
attribute :value, :string, default: values.first.
|
|
216
|
+
attribute :value, :string, default: values.first.name
|
|
217
|
+
attribute :description, :string
|
|
209
218
|
|
|
210
219
|
define_method(:to_s) { value }
|
|
211
220
|
end
|
|
212
221
|
|
|
213
|
-
values.each do |
|
|
214
|
-
compiled_klass.define_singleton_method(
|
|
215
|
-
new(value:
|
|
222
|
+
values.each do |value|
|
|
223
|
+
compiled_klass.define_singleton_method(value.name) do
|
|
224
|
+
new(value: value.name, description: value.description)
|
|
216
225
|
end
|
|
217
226
|
end
|
|
227
|
+
compiled_klass.define_singleton_method(:values) { values }
|
|
218
228
|
|
|
219
229
|
@enum_names << name
|
|
230
|
+
@enum_classes[name] = compiled_klass
|
|
220
231
|
register(name, compiled_klass)
|
|
221
232
|
end
|
|
222
233
|
|
|
@@ -288,7 +299,11 @@ module Lutaml
|
|
|
288
299
|
def build_options(attr)
|
|
289
300
|
options = {}
|
|
290
301
|
card = attr.cardinality
|
|
291
|
-
|
|
302
|
+
unless card
|
|
303
|
+
# LML attributes without an explicit cardinality are optional (0..1)
|
|
304
|
+
options[:default] = nil
|
|
305
|
+
return options
|
|
306
|
+
end
|
|
292
307
|
|
|
293
308
|
min = parse_cardinality_value(card.min)
|
|
294
309
|
max = parse_cardinality_value(card.max)
|
|
@@ -313,10 +328,21 @@ module Lutaml
|
|
|
313
328
|
|
|
314
329
|
def extract_enum_values(enum_def)
|
|
315
330
|
enum_def.attributes.map do |attr|
|
|
316
|
-
attr.
|
|
331
|
+
description = Array(attr.attributes).find do |nested|
|
|
332
|
+
nested.name == "description"
|
|
333
|
+
end
|
|
334
|
+
EnumValue.new(attr.name.to_s, description&.type)
|
|
317
335
|
end
|
|
318
336
|
end
|
|
319
337
|
|
|
338
|
+
def enum_class_for(type)
|
|
339
|
+
type.is_a?(Class) && @enum_classes.value?(type) and return type
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def enum_value_name(raw)
|
|
343
|
+
raw.split("::").last
|
|
344
|
+
end
|
|
345
|
+
|
|
320
346
|
def register(name, klass)
|
|
321
347
|
@compiled[name] = klass
|
|
322
348
|
return unless @namespace
|
data/lib/lutaml/lml/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lutaml-lml
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-10-
|
|
11
|
+
date: 2026-10-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: lutaml-model
|