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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9afdbd5bcb80896ee130f477fd40e21b475826cbe9ffcdac89b927e44ce77d5d
4
- data.tar.gz: 194b68623da1d25a723af09a565948fdc6c567e340ebe7ac1efea5f8f925a6a1
3
+ metadata.gz: 43171296e53409193af9a65974a2e30adb2f425c8dd952eb5a08be556411cb6b
4
+ data.tar.gz: 8146fffb1c51f8fcd7d5061192596a8e73749c443a573f6a6e48c00c5885997c
5
5
  SHA512:
6
- metadata.gz: 7f992466d0f04295e0808c199d37b31bc5ca16f8acc6e0a21ce519d932766437d7e87e604a7d5ea28b19ab89fe8ed3fa4f1b557882de7b36d41ec649be8f5a37
7
- data.tar.gz: 57999ac9cba35e2ca2b515e40de8e99acf6d2ec00e4dc529c78a0344546f1e0c87ad66d42d116d55f53ccc38b137758a7c51c3a8a6500fa75431c3b579e06070
6
+ metadata.gz: e50bf16b938b8708125c81d828c2350224dc7ed7ef9526e6fd7a066f44041b7e990003bfd6f3315aee69cdc68628399691dab28aacc7c4c2a233074d43887f0d
7
+ data.tar.gz: ba5efefb14c289839ca8fcc03d9102847cc495797816ddf51ce5dd1177d9ba100324e415ff329bb2b74b88e8db32532baa08e040e94f4e8ffff2ae2c9f23f3d5
@@ -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.to_s
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 |val|
214
- compiled_klass.define_singleton_method(val) do
215
- new(value: val.to_s)
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
- return options unless card
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.name.to_s
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Lml
5
- VERSION = "0.1.6"
5
+ VERSION = "0.1.7"
6
6
  end
7
7
  end
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.6
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-01 00:00:00.000000000 Z
11
+ date: 2026-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model