lutaml-model 0.3.25 → 0.3.27

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 923c122ff4459f02c1949dc88ee8df94b93db6ce23c00c9da2159f6b376da3a0
4
- data.tar.gz: aa537363d67a5383cdbd280cfa9ddee0a3c5de0cb151b79b2e195a030bc0061d
3
+ metadata.gz: e00c3fab326d719d8341687a8411797d60ccaf54820380ba7a2dacead6a89792
4
+ data.tar.gz: e46c1dd3d50f6b2bea7da738d94ace488655205deb049170057490f6d1526bf8
5
5
  SHA512:
6
- metadata.gz: a0da4f4a87c8fe4a3951d302df5797594675f83616ea52b4582f417683d4f55076c57ad3d6f3018119c0a6021497bf6832b150ebf695d1fa8d4304da2040b641
7
- data.tar.gz: 0d4d6d783728b53d453c23e2cfcfcd08d9eac83d94b4652d3bdee95c19d9d9bf68e233dea6d29d9478d4214271dd800be93b8f8e11a59cf9f9cd46d744dd2002
6
+ metadata.gz: ab260d59203839c5fd9b1aa670501c1953c741fe75f0f7ab7261795c54cd19ed6de9807f9b8252c83ce9eee8cf2e6a9116087066e464ca1f35b8b46e29082351
7
+ data.tar.gz: c579a87612ce8e249edcca0c79f0ee2550d40af899e31ee2405ffdd48509e584df449c19bb3489a6871cdf4dfc08c4bc51f482422ea9a7d91f02d706d653cac6
data/.rubocop_todo.yml CHANGED
@@ -73,7 +73,7 @@ Metrics/MethodLength:
73
73
  # Offense count: 7
74
74
  # Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
75
75
  Metrics/ParameterLists:
76
- Max: 13
76
+ Max: 14
77
77
 
78
78
  # Offense count: 23
79
79
  # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
data/README.adoc CHANGED
@@ -543,8 +543,15 @@ end
543
543
  ====
544
544
 
545
545
 
546
+ === Attribute value validation
547
+
548
+ ==== General
549
+
550
+ There are several mechanisms to validate attribute values in Lutaml::Model.
551
+
552
+
546
553
  [[attribute-enumeration]]
547
- === Attribute as an enumeration
554
+ ==== Values of an enumeration
548
555
 
549
556
  An attribute can be defined as an enumeration by using the `values` directive.
550
557
 
@@ -641,6 +648,44 @@ acceptance of the newly updated component.
641
648
  ====
642
649
 
643
650
 
651
+ ==== String values restricted to patterns
652
+
653
+ An attribute that accepts a string value accepts value validation using regular
654
+ expressions.
655
+
656
+ Syntax:
657
+
658
+ [source,ruby]
659
+ ----
660
+ attribute :name_of_attribute, :string, pattern: /regex/
661
+ ----
662
+
663
+ .Using the `pattern` option to restrict the value of an attribute
664
+ [example]
665
+ ====
666
+ In this example, the `color` attribute takes hex color values such as `#ccddee`.
667
+
668
+ A regular expression can be used to validate values assigned to the attribute.
669
+ In this case, it is `/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/`.
670
+
671
+ [source,ruby]
672
+ ----
673
+ class Glaze < Lutaml::Model::Serializable
674
+ attribute :color, :string, pattern: /\A#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\z/
675
+ end
676
+ ----
677
+
678
+ [source,ruby]
679
+ ----
680
+ > Glaze.new(color: '#ff0000').color
681
+ > # "#ff0000"
682
+ > Glaze.new(color: '#ff000').color
683
+ > # Lutaml::Model::InvalidValueError: Invalid value for attribute 'color'
684
+ ----
685
+ ====
686
+
687
+
688
+
644
689
  === Attribute value default and rendering defaults
645
690
 
646
691
  Specify default values for attributes using the `default` option.
@@ -771,7 +816,8 @@ class Person < Lutaml::Model::Serializable
771
816
  end
772
817
  ----
773
818
 
774
- For the following xml
819
+ For the following XML snippet:
820
+
775
821
  [source,xml]
776
822
  ----
777
823
  <Person>
@@ -1144,6 +1190,80 @@ end
1144
1190
  ====
1145
1191
 
1146
1192
 
1193
+ ==== CDATA nodes
1194
+
1195
+ CDATA is an XML feature that allows the inclusion of text that may contain
1196
+ characters that are unescaped in XML.
1197
+
1198
+ While CDATA is not preferred in XML, it is sometimes necessary to handle CDATA
1199
+ nodes for both input and output.
1200
+
1201
+ NOTE: The W3C XML Recommendation explicitly encourages escaping characters over
1202
+ usage of CDATA.
1203
+
1204
+ Lutaml::Model supports the handling of CDATA nodes in XML in the following
1205
+ behavior:
1206
+
1207
+ . When an attribute contains a CDATA node with no text:
1208
+ ** On reading: The node (CDATA or text) is read as its value.
1209
+ ** On writing: The value is written as its native type.
1210
+
1211
+ . When an XML mapping sets `cdata: true` on `map_element` or `map_content`:
1212
+ ** On reading: The node (CDATA or text) is read as its value.
1213
+ ** On writing: The value is written as a CDATA node.
1214
+
1215
+ . When an XML mapping sets `cdata: false` on `map_element` or `map_content`:
1216
+ ** On reading: The node (CDATA or text) is read as its value.
1217
+ ** On writing: The value is written as a text node (string).
1218
+
1219
+
1220
+ Syntax:
1221
+
1222
+ [source,ruby]
1223
+ ----
1224
+ xml do
1225
+ map_content to: :name_of_attribute, cdata: (true | false)
1226
+ map_element :name, to: :name, cdata: (true | false)
1227
+ end
1228
+ ----
1229
+
1230
+ .Using `cdata` to map CDATA content
1231
+ [example]
1232
+ ====
1233
+ The following class will parse the XML snippet below:
1234
+
1235
+ [source,ruby]
1236
+ ----
1237
+ class Example < Lutaml::Model::Serializable
1238
+ attribute :name, :string
1239
+ attribute :description, :string
1240
+ attribute :title, :string
1241
+ attribute :note, :string
1242
+
1243
+ xml do
1244
+ root 'example'
1245
+ map_element :name, to: :name, cdata: true
1246
+ map_content to: :description, cdata: true
1247
+ map_element :title, to: :title, cdata: false
1248
+ map_element :note, to: :note, cdata: false
1249
+ end
1250
+ end
1251
+ ----
1252
+
1253
+ [source,xml]
1254
+ ----
1255
+ <example><name><![CDATA[John]]></name><![CDATA[here is the description]]><title><![CDATA[Lutaml]]></title><note>Careful</note></example>
1256
+ ----
1257
+
1258
+ [source,ruby]
1259
+ ----
1260
+ > Example.from_xml(xml)
1261
+ > #<Example:0x0000000104ac7240 @name="John" @description="here is the description" @title="Lutaml" @note="Careful">
1262
+ > Example.new(name: "John", description: "here is the description", title: "Lutaml", note: "Careful").to_xml
1263
+ > #<example><name><![CDATA[John]]></name><![CDATA[here is the description]]><title>Lutaml</title><note>Careful</note></example>
1264
+ ----
1265
+ ====
1266
+
1147
1267
 
1148
1268
  ==== Example for mapping
1149
1269
 
@@ -1182,6 +1302,69 @@ end
1182
1302
  ====
1183
1303
 
1184
1304
 
1305
+ ==== Encoding Options in XmlAdapter
1306
+
1307
+ XmlAdapter supports the encoding in the following ways:
1308
+
1309
+ . When encoding is not passed in to_xml:
1310
+ ** Default encoding is UTF-8.
1311
+
1312
+ . When encoding is explicitly passed nil:
1313
+ ** Encoding will be nil, show the HexCode(Nokogiri) or ASCII-8bit(Ox).
1314
+
1315
+ . When encoding is passed with some option:
1316
+ ** Encoding option will be selected as passed.
1317
+
1318
+
1319
+ Syntax:
1320
+
1321
+ [source,ruby]
1322
+ ----
1323
+ Example.new(description: " ∑ is my ∏ moniker µ.").to_xml
1324
+ Example.new(description: " ∑ is my ∏ moniker µ.").to_xml(encoding: nil)
1325
+ Example.new(description: " ∑ is my ∏ moniker µ.").to_xml(encoding: "ASCII")
1326
+ ----
1327
+
1328
+ [example]
1329
+ ====
1330
+ The following class will parse the XML snippet below:
1331
+
1332
+ [source,ruby]
1333
+ ----
1334
+ class Example < Lutaml::Model::Serializable
1335
+ attribute :name, :string
1336
+ attribute :description, :string
1337
+ attribute :value, :integer
1338
+
1339
+ xml do
1340
+ root 'example'
1341
+ map_element 'name', to: :name
1342
+ map_content to: :description
1343
+ end
1344
+ end
1345
+ ----
1346
+
1347
+ [source,xml]
1348
+ ----
1349
+ <example><name>John &#x0026; Doe</name> &#x2211; is my &#x220F; moniker &#xB5;.</example>
1350
+ ----
1351
+
1352
+ [source,ruby]
1353
+ ----
1354
+ > Example.from_xml(xml)
1355
+ > #<Example:0x0000000104ac7240 @name="John & Doe", @description=" ∑ is my ∏ moniker µ.">
1356
+ > Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml
1357
+ > #<example><name>John &amp; Doe</name> ∑ is my ∏ moniker µ.</example>
1358
+
1359
+ > Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml(encoding: nil)
1360
+ > #<example><name>John &amp; Doe</name> &#x2211; is my &#x220F; moniker &#xB5;.</example>
1361
+
1362
+ > Example.new(name: "John & Doe", description: " ∑ is my ∏ moniker µ.").to_xml(encoding: "ASCII")
1363
+ > #<example><name>John &amp; Doe</name> &#8721; is my &#8719; moniker &#181;.</example>
1364
+ ----
1365
+ ====
1366
+
1367
+
1185
1368
  ==== Namespaces
1186
1369
 
1187
1370
  [[root-namespace]]
@@ -9,6 +9,7 @@ module Lutaml
9
9
  delegate
10
10
  collection
11
11
  values
12
+ pattern
12
13
  ].freeze
13
14
 
14
15
  def initialize(name, type, options = {})
@@ -87,23 +88,12 @@ module Lutaml
87
88
  cast_value(value)
88
89
  end
89
90
 
90
- def enum_values
91
- @options.key?(:values) ? @options[:values] : []
91
+ def pattern
92
+ options[:pattern]
92
93
  end
93
94
 
94
- # Check if the value to be assigned is valid for the attribute
95
- #
96
- # Currently there are 2 validations
97
- # 1. Value should be from the values list if they are defined
98
- # e.g values: ["foo", "bar"] is set then any other value for this
99
- # attribute will raise `Lutaml::Model::InvalidValueError`
100
- #
101
- # 2. Value count should be between the collection range if defined
102
- # e.g if collection: 0..5 is set then the value greater then 5
103
- # will raise `Lutaml::Model::CollectionCountOutOfRangeError`
104
- def validate_value!(value)
105
- valid_value!(value)
106
- valid_collection!(value)
95
+ def enum_values
96
+ @options.key?(:values) ? @options[:values] : []
107
97
  end
108
98
 
109
99
  def valid_value!(value)
@@ -123,14 +113,32 @@ module Lutaml
123
113
  options[:values].include?(value)
124
114
  end
125
115
 
126
- def validate_value!(value)
127
- # return true if none of the validations are present
128
- return true if enum_values.empty? && singular?
116
+ def valid_pattern!(value)
117
+ return true unless type == Lutaml::Model::Type::String
118
+ return true unless pattern
119
+
120
+ unless pattern.match?(value)
121
+ raise Lutaml::Model::PatternNotMatchedError.new(name, pattern, value)
122
+ end
129
123
 
124
+ true
125
+ end
126
+
127
+ # Check if the value to be assigned is valid for the attribute
128
+ #
129
+ # Currently there are 2 validations
130
+ # 1. Value should be from the values list if they are defined
131
+ # e.g values: ["foo", "bar"] is set then any other value for this
132
+ # attribute will raise `Lutaml::Model::InvalidValueError`
133
+ #
134
+ # 2. Value count should be between the collection range if defined
135
+ # e.g if collection: 0..5 is set then the value greater then 5
136
+ # will raise `Lutaml::Model::CollectionCountOutOfRangeError`
137
+ def validate_value!(value)
130
138
  # Use the default value if the value is nil
131
139
  value = default if value.nil?
132
140
 
133
- valid_value!(value) && valid_collection!(value)
141
+ valid_value!(value) && valid_collection!(value) && valid_pattern!(value)
134
142
  end
135
143
 
136
144
  def validate_collection_range
@@ -229,6 +237,13 @@ module Lutaml
229
237
  raise StandardError,
230
238
  "Invalid options given for `#{name}` #{invalid_opts}"
231
239
  end
240
+
241
+ if options.key?(:pattern) && type != Lutaml::Model::Type::String
242
+ raise StandardError,
243
+ "Invalid option `pattern` given for `#{name}`, `pattern` is only allowed for :string type"
244
+ end
245
+
246
+ true
232
247
  end
233
248
 
234
249
  def validate_type!(type)
@@ -0,0 +1,17 @@
1
+ module Lutaml
2
+ module Model
3
+ class PatternNotMatchedError < Error
4
+ def initialize(attr_name, pattern, value)
5
+ @attr_name = attr_name
6
+ @pattern = pattern
7
+ @value = value
8
+
9
+ super()
10
+ end
11
+
12
+ def to_s
13
+ "#{@attr_name}: \"#{@value}\" does not match #{@pattern.inspect}"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  require_relative "error/invalid_value_error"
9
9
  require_relative "error/incorrect_mapping_argument_error"
10
+ require_relative "error/pattern_not_matched_error"
10
11
  require_relative "error/unknown_adapter_type_error"
11
12
  require_relative "error/collection_count_out_of_range_error"
12
13
  require_relative "error/validation_error"
@@ -28,6 +28,14 @@ module Lutaml
28
28
  @item_order = order
29
29
  end
30
30
 
31
+ def text
32
+ self["#cdata-section"] || self["text"]
33
+ end
34
+
35
+ def text?
36
+ key?("#cdata-section") || key?("text")
37
+ end
38
+
31
39
  def ordered?
32
40
  @ordered
33
41
  end
@@ -343,7 +343,7 @@ module Lutaml
343
343
  value = if rule.raw_mapping?
344
344
  doc.node.inner_xml
345
345
  elsif rule.content_mapping?
346
- doc["text"]
346
+ doc[rule.content_key]
347
347
  elsif doc.key_exist?(rule.namespaced_name(options[:default_namespace]))
348
348
  doc.fetch(rule.namespaced_name(options[:default_namespace]))
349
349
  else
@@ -399,12 +399,12 @@ module Lutaml
399
399
 
400
400
  value = if value.is_a?(Array)
401
401
  value.map do |v|
402
- text_hash?(attr, v) ? v["text"] : v
402
+ text_hash?(attr, v) ? v.text : v
403
403
  end
404
404
  elsif attr&.raw? && value
405
405
  value.node.children.map(&:to_xml).join
406
406
  elsif text_hash?(attr, value)
407
- value["text"]
407
+ value.text
408
408
  else
409
409
  value
410
410
  end
@@ -428,7 +428,7 @@ module Lutaml
428
428
 
429
429
  def text_hash?(attr, value)
430
430
  return false unless value.is_a?(Hash)
431
- return value.keys == ["text"] unless attr
431
+ return value.one? && value.text? unless attr
432
432
 
433
433
  !(attr.type <= Serialize) && attr.type != Lutaml::Model::Type::Hash
434
434
  end
@@ -8,7 +8,8 @@ module Lutaml
8
8
  begin
9
9
  attr.validate_value!(value)
10
10
  rescue Lutaml::Model::InvalidValueError,
11
- Lutaml::Model::CollectionCountOutOfRangeError => e
11
+ Lutaml::Model::CollectionCountOutOfRangeError,
12
+ PatternNotMatchedError => e
12
13
  errors << e
13
14
  end
14
15
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Model
5
- VERSION = "0.3.25"
5
+ VERSION = "0.3.27"
6
6
  end
7
7
  end
@@ -51,7 +51,9 @@ module Lutaml
51
51
  end
52
52
  end
53
53
 
54
- def add_text(element, text)
54
+ def add_text(element, text, cdata: false)
55
+ return add_cdata(element, text) if cdata
56
+
55
57
  if element.is_a?(self.class)
56
58
  element = element.xml.parent
57
59
  end
@@ -60,6 +62,10 @@ module Lutaml
60
62
  element.add_child(text_node)
61
63
  end
62
64
 
65
+ def add_cdata(element, value)
66
+ element.cdata(value)
67
+ end
68
+
63
69
  def add_namespace_prefix(prefix)
64
70
  xml[prefix] if prefix
65
71
 
@@ -66,10 +66,16 @@ module Lutaml
66
66
  xml.text(text)
67
67
  end
68
68
 
69
- def add_text(element, text)
69
+ def add_text(element, text, cdata: false)
70
+ return element.cdata(text) if cdata
71
+
70
72
  element << text
71
73
  end
72
74
 
75
+ def add_cdata(element, value)
76
+ element.cdata(value)
77
+ end
78
+
73
79
  # Add XML namespace to document
74
80
  #
75
81
  # Ox doesn't support XML namespaces so we only save the
@@ -13,7 +13,15 @@ module Lutaml
13
13
  end
14
14
 
15
15
  def to_xml(options = {})
16
- builder = Builder::Nokogiri.build(encoding: "UTF-8") do |xml|
16
+ builder_options = {}
17
+
18
+ if options.key?(:encoding)
19
+ builder_options[:encoding] = options[:encoding] unless options[:encoding].nil?
20
+ else
21
+ builder_options[:encoding] = "UTF-8"
22
+ end
23
+
24
+ builder = Builder::Nokogiri.build(builder_options) do |xml|
17
25
  if root.is_a?(Lutaml::Model::XmlAdapter::NokogiriElement)
18
26
  root.build_xml(xml)
19
27
  else
@@ -35,12 +43,11 @@ module Lutaml
35
43
 
36
44
  def prefix_xml(xml, mapping, options)
37
45
  if options.key?(:namespace_prefix)
38
- options[:namespace_prefix] ? xml[options[:namespace_prefix]] : xml
46
+ xml[options[:namespace_prefix]] if options[:namespace_prefix]
39
47
  elsif mapping.namespace_prefix
40
48
  xml[mapping.namespace_prefix]
41
- else
42
- xml
43
49
  end
50
+ xml
44
51
  end
45
52
 
46
53
  def build_ordered_element(xml, element, options = {})
@@ -74,10 +81,12 @@ module Lutaml
74
81
  value = attribute_value_for(element, element_rule)
75
82
 
76
83
  if element_rule == xml_mapping.content_mapping
84
+ next if element_rule.cdata && name == "text"
85
+
77
86
  text = xml_mapping.content_mapping.serialize(element)
78
87
  text = text[curr_index] if text.is_a?(Array)
79
88
 
80
- next prefixed_xml.text(text) if element.mixed?
89
+ next prefixed_xml.add_text(xml, text, cdata: element_rule.cdata) if element.mixed?
81
90
 
82
91
  content << text
83
92
  elsif !value.nil? || element_rule.render_nil?
@@ -14,8 +14,15 @@ module Lutaml
14
14
 
15
15
  def to_xml(options = {})
16
16
  builder = Builder::Ox.build
17
- builder.xml.instruct(:xml, encoding: options[:encoding] || "UTF-8", version: options[:version])
17
+ builder_options = { version: options[:version] }
18
18
 
19
+ if options.key?(:encoding)
20
+ builder_options[:encoding] = options[:encoding] unless options[:encoding].nil?
21
+ else
22
+ builder_options[:encoding] = "UTF-8"
23
+ end
24
+
25
+ builder.xml.instruct(:xml, builder_options)
19
26
  if @root.is_a?(Lutaml::Model::XmlAdapter::OxElement)
20
27
  @root.build_xml(builder)
21
28
  elsif ordered?(@root, options)
@@ -56,15 +63,15 @@ module Lutaml
56
63
  mapper_class: mapper_class)
57
64
  value = attribute_value_for(element, element_rule)
58
65
 
66
+ next if element_rule == xml_mapping.content_mapping && element_rule.cdata && name == "text"
67
+
59
68
  if element_rule == xml_mapping.content_mapping
60
69
  text = element.send(xml_mapping.content_mapping.to)
61
70
  text = text[curr_index] if text.is_a?(Array)
62
71
 
63
- if element.mixed?
64
- el.add_text(el, text)
65
- else
66
- content << text
67
- end
72
+ next el.add_text(el, text, cdata: element_rule.cdata) if element.mixed?
73
+
74
+ content << text
68
75
  elsif !value.nil? || element_rule.render_nil?
69
76
  value = value[curr_index] if attribute_def.collection?
70
77
 
@@ -88,10 +95,13 @@ module Lutaml
88
95
 
89
96
  class OxElement < XmlElement
90
97
  def initialize(node, root_node: nil)
91
- if node.is_a?(String)
98
+ case node
99
+ when String
92
100
  super("text", {}, [], node, parent_document: root_node)
93
- elsif node.is_a?(Ox::Comment)
101
+ when Ox::Comment
94
102
  super("comment", {}, [], node.value, parent_document: root_node)
103
+ when Ox::CData
104
+ super("#cdata-section", {}, [], node.value, parent_document: root_node)
95
105
  else
96
106
  namespace_attributes(node.attributes).each do |(name, value)|
97
107
  if root_node
@@ -66,7 +66,7 @@ module Lutaml
66
66
  options[:tag_name] = rule.name
67
67
 
68
68
  options[:mapper_class] = attribute&.type if attribute
69
- options[:namespace_set] = set_namespace?(rule)
69
+ options[:set_namespace] = set_namespace?(rule)
70
70
 
71
71
  options
72
72
  end
@@ -152,16 +152,16 @@ module Lutaml
152
152
  )
153
153
  elsif rule.prefix_set?
154
154
  xml.create_and_add_element(rule.name, prefix: prefix) do
155
- add_value(xml, value, attribute)
155
+ add_value(xml, value, attribute, cdata: rule.cdata)
156
156
  end
157
157
  else
158
158
  xml.create_and_add_element(rule.name) do
159
- add_value(xml, value, attribute)
159
+ add_value(xml, value, attribute, cdata: rule.cdata)
160
160
  end
161
161
  end
162
162
  end
163
163
 
164
- def add_value(xml, value, attribute)
164
+ def add_value(xml, value, attribute, cdata: false)
165
165
  if !value.nil?
166
166
  serialized_value = attribute.type.serialize(value)
167
167
 
@@ -172,7 +172,7 @@ module Lutaml
172
172
  end
173
173
  end
174
174
  else
175
- xml.add_text(xml, serialized_value)
175
+ xml.add_text(xml, serialized_value, cdata: cdata)
176
176
  end
177
177
  end
178
178
  end
@@ -185,6 +185,7 @@ module Lutaml
185
185
  attributes = options[:xml_attributes] ||= {}
186
186
  attributes = build_attributes(element,
187
187
  xml_mapping, options).merge(attributes)&.compact
188
+
188
189
  if element.respond_to?(:schema_location) && element.schema_location
189
190
  attributes.merge!(element.schema_location.to_xml_attributes)
190
191
  end
@@ -244,7 +245,7 @@ module Lutaml
244
245
  value = attribute_value_for(element, rule)
245
246
  return unless render_element?(rule, element, value)
246
247
 
247
- xml.add_text(xml, value)
248
+ xml.add_text(xml, value, cdata: rule.cdata)
248
249
  end
249
250
 
250
251
  def process_content_mapping(element, content_rule, xml)
@@ -261,7 +262,7 @@ module Lutaml
261
262
  text = content_rule.serialize(element)
262
263
  text = text.join if text.is_a?(Array)
263
264
 
264
- xml.add_text(xml, text)
265
+ xml.add_text(xml, text, cdata: content_rule.cdata)
265
266
  end
266
267
  end
267
268
 
@@ -275,7 +276,7 @@ module Lutaml
275
276
  end
276
277
 
277
278
  def set_namespace?(rule)
278
- rule.nil? || !rule.namespace_set? || !rule.namespace.nil?
279
+ rule.nil? || !rule.namespace_set?
279
280
  end
280
281
 
281
282
  def render_element?(rule, element, value)
@@ -336,7 +337,7 @@ module Lutaml
336
337
  end
337
338
 
338
339
  def build_attributes(element, xml_mapping, options = {})
339
- attrs = if options.fetch(:namespace_set, true)
340
+ attrs = if options.fetch(:set_namespace, true)
340
341
  namespace_attributes(xml_mapping)
341
342
  else
342
343
  {}