lutaml-model 0.3.10 → 0.3.12

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: 5140f93f22f4b05222edc408aeca50552082e447b71fddd724b34ba9e6b82d55
4
- data.tar.gz: 0aa44a3c72b65cca0ed2b7411614d8cdb0c44b4e8293e183935cb45ba7818d7c
3
+ metadata.gz: 345649756b1331313e2ce36666a74d5d74476d4a78cc45d5e672e02d567153e6
4
+ data.tar.gz: adf1aff67862a8c6c6f8aac304dd819042c437460f3baf31625563e94c2aa73f
5
5
  SHA512:
6
- metadata.gz: 69e4d0d0a3a5bd19e11a43fd33e03566ca035d18cf948a0a2fc5abe5f880489e4a6ad347d8118a04c35c8c95be5b7eb29ca93d426643c7790ab045db2b34721c
7
- data.tar.gz: df1699ba6647f53f97735d0986b92bf8f76d6bf44430117406100b257f5934ac4a7baa6a4243bb8384db277ecb975bf64efe2f1a16b293739b245150e800cb15
6
+ metadata.gz: 35865f10010a06f9ebd4be5feb988d376d5bd9a960c2e10eb9c786dd346ab97f61fc41f8d0cb09ab5f280f75e4cbb7ab1b52ca36ee8fa45b64629e349b7ea1ea
7
+ data.tar.gz: 68d128827defc77d8e06e3b227f435ff4d3046c0f47c7570fc966adf58c830907b146f78e9baaafe3b11b719c86bb6778f10ae9e08e03af95f2e172ba392ca9c
data/.rubocop_todo.yml CHANGED
@@ -1,25 +1,18 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2024-09-10 23:53:08 UTC using RuboCop version 1.66.1.
3
+ # on 2024-10-08 13:33:09 UTC using RuboCop version 1.66.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 88
9
+ # Offense count: 108
10
10
  # This cop supports safe autocorrection (--autocorrect).
11
11
  # Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
12
12
  # URISchemes: http, https
13
13
  Layout/LineLength:
14
14
  Enabled: false
15
15
 
16
- # Offense count: 1
17
- # This cop supports safe autocorrection (--autocorrect).
18
- # Configuration parameters: AllowInHeredoc.
19
- Layout/TrailingWhitespace:
20
- Exclude:
21
- - 'lib/lutaml/model/schema_location.rb'
22
-
23
16
  # Offense count: 11
24
17
  # Configuration parameters: AllowedMethods.
25
18
  # AllowedMethods: enums
@@ -37,12 +30,13 @@ Lint/DuplicateMethods:
37
30
  Exclude:
38
31
  - 'lib/lutaml/model/attribute.rb'
39
32
 
40
- # Offense count: 31
33
+ # Offense count: 35
41
34
  # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
42
35
  Metrics/AbcSize:
43
36
  Exclude:
44
37
  - 'lib/lutaml/model/attribute.rb'
45
38
  - 'lib/lutaml/model/comparable_model.rb'
39
+ - 'lib/lutaml/model/mapping_rule.rb'
46
40
  - 'lib/lutaml/model/schema/relaxng_schema.rb'
47
41
  - 'lib/lutaml/model/schema/xsd_schema.rb'
48
42
  - 'lib/lutaml/model/serialize.rb'
@@ -51,13 +45,13 @@ Metrics/AbcSize:
51
45
  - 'lib/lutaml/model/xml_adapter/ox_adapter.rb'
52
46
  - 'lib/lutaml/model/xml_adapter/xml_document.rb'
53
47
 
54
- # Offense count: 6
48
+ # Offense count: 4
55
49
  # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
56
50
  # AllowedMethods: refine
57
51
  Metrics/BlockLength:
58
- Max: 42
52
+ Max: 47
59
53
 
60
- # Offense count: 25
54
+ # Offense count: 27
61
55
  # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
62
56
  Metrics/CyclomaticComplexity:
63
57
  Exclude:
@@ -69,17 +63,17 @@ Metrics/CyclomaticComplexity:
69
63
  - 'lib/lutaml/model/xml_adapter/ox_adapter.rb'
70
64
  - 'lib/lutaml/model/xml_adapter/xml_document.rb'
71
65
 
72
- # Offense count: 39
66
+ # Offense count: 46
73
67
  # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
74
68
  Metrics/MethodLength:
75
- Max: 49
69
+ Max: 51
76
70
 
77
71
  # Offense count: 4
78
72
  # Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
79
73
  Metrics/ParameterLists:
80
- Max: 9
74
+ Max: 11
81
75
 
82
- # Offense count: 21
76
+ # Offense count: 22
83
77
  # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
84
78
  Metrics/PerceivedComplexity:
85
79
  Exclude:
@@ -100,10 +94,10 @@ RSpec/ContextWording:
100
94
  - 'spec/lutaml/model/xml_adapter/ox_adapter_spec.rb'
101
95
  - 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
102
96
 
103
- # Offense count: 101
97
+ # Offense count: 105
104
98
  # Configuration parameters: CountAsOne.
105
99
  RSpec/ExampleLength:
106
- Max: 57
100
+ Max: 54
107
101
 
108
102
  # Offense count: 2
109
103
  # Configuration parameters: Max, AllowedIdentifiers, AllowedPatterns.
@@ -129,11 +123,11 @@ RSpec/MultipleDescribes:
129
123
  - 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
130
124
  - 'spec/lutaml/model/xml_adapter_spec.rb'
131
125
 
132
- # Offense count: 88
126
+ # Offense count: 99
133
127
  RSpec/MultipleExpectations:
134
- Max: 11
128
+ Max: 14
135
129
 
136
- # Offense count: 17
130
+ # Offense count: 18
137
131
  # Configuration parameters: AllowSubject.
138
132
  RSpec/MultipleMemoizedHelpers:
139
133
  Max: 9
@@ -147,18 +141,24 @@ RSpec/PendingWithoutReason:
147
141
  - 'spec/lutaml/model/xml_adapter/xml_namespace_spec.rb'
148
142
  - 'spec/lutaml/model/xml_adapter_spec.rb'
149
143
 
144
+ # Offense count: 1
145
+ RSpec/RemoveConst:
146
+ Exclude:
147
+ - 'spec/lutaml/model/type/decimal_spec.rb'
148
+
150
149
  # Offense count: 2
151
150
  RSpec/RepeatedExampleGroupDescription:
152
151
  Exclude:
153
152
  - 'spec/lutaml/model/collection_spec.rb'
154
153
 
155
- # Offense count: 1
154
+ # Offense count: 2
156
155
  # Configuration parameters: Include, CustomTransform, IgnoreMethods, IgnoreMetadata.
157
156
  # Include: **/*_spec.rb
158
157
  RSpec/SpecFilePathFormat:
159
158
  Exclude:
160
159
  - '**/spec/routing/**/*'
161
160
  - 'spec/lutaml/model/collection_spec.rb'
161
+ - 'spec/lutaml/model/type/decimal_spec.rb'
162
162
 
163
163
  # Offense count: 1
164
164
  Security/CompoundHash:
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in lutaml-model.gemspec
6
6
  gemspec
7
7
 
8
+ gem "bigdecimal"
8
9
  gem "equivalent-xml"
9
10
  gem "multi_json"
10
11
  gem "nokogiri"
data/LICENSE.md ADDED
@@ -0,0 +1,33 @@
1
+ Licenses & Copyright
2
+ ====================
3
+
4
+ This license file adheres to the formatting guidelines of
5
+ [readable-licenses](https://github.com/nevir/readable-licenses).
6
+
7
+
8
+ Ribose's BSD 2-Clause License
9
+ -----------------------------
10
+
11
+ Copyright (c) 2024, [Ribose Inc](https://www.ribose.com).
12
+ All rights reserved.
13
+
14
+ Redistribution and use in source and binary forms, with or without modification,
15
+ are permitted provided that the following conditions are met:
16
+
17
+ 1. Redistributions of source code must retain the above copyright notice,
18
+ this list of conditions and the following disclaimer.
19
+
20
+ 2. Redistributions in binary form must reproduce the above copyright notice,
21
+ this list of conditions and the following disclaimer in the documentation
22
+ and/or other materials provided with the distribution.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
28
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.adoc CHANGED
@@ -145,6 +145,8 @@ same class and all their attributes are equal.
145
145
 
146
146
  === Supported attribute value types
147
147
 
148
+ ==== General types
149
+
148
150
  Lutaml::Model supports the following attribute types, they can be
149
151
  referred by a string, a symbol, or their class constant.
150
152
 
@@ -166,12 +168,11 @@ attribute :name_of_attribute, {symbol | string | class}
166
168
  | `DateTime` | `:date_time` | `Lutaml::Model::Type::DateTime` | `::DateTime`
167
169
  | `TimeWithoutDate` | `:time_without_date` | `Lutaml::Model::Type::TimeWithoutDate` | `::Time`
168
170
  | `Boolean` | `:boolean` | `Lutaml::Model::Type::Boolean` | `Boolean`
169
- | `Decimal` | `:decimal` | `Lutaml::Model::Type::Decimal` | `::BigDecimal`
171
+ | `Decimal` (optional) | `:decimal` | `Lutaml::Model::Type::Decimal` | `::BigDecimal`
170
172
  | `Hash` | `:hash` | `Lutaml::Model::Type::Hash` | `::Hash`
171
173
 
172
174
  |===
173
175
 
174
-
175
176
  .Defining attributes with supported types via symbol, string and class
176
177
  [example]
177
178
  ====
@@ -198,6 +199,23 @@ end
198
199
  ----
199
200
  ====
200
201
 
202
+ ==== (optional) Decimal type
203
+
204
+ The `BigDecimal` class is no longer part of the standard Ruby library from Ruby
205
+ 3.4 onwards, hence the `Decimal` type is only enabled when the `bigdecimal`
206
+ library is loaded.
207
+
208
+ This means that the following code needs to be run before using (and parsing)
209
+ the `Decimal` type:
210
+
211
+ [source,ruby]
212
+ ----
213
+ require 'bigdecimal'
214
+ ----
215
+
216
+ If the `bigdecimal` library is not loaded, usage of the `Decimal` type will
217
+ raise a `Lutaml::Model::TypeNotSupportedError`.
218
+
201
219
 
202
220
  === Attribute as a collection
203
221
 
@@ -405,6 +423,51 @@ end
405
423
  ----
406
424
  ====
407
425
 
426
+ === Attribute as raw string
427
+
428
+ An attribute can be set to read the value as raw string for XML, by using the `raw: true` option.
429
+
430
+ Syntax:
431
+
432
+ [source,ruby]
433
+ ----
434
+ attribute :name_of_attribute, :string, raw: true
435
+ ----
436
+
437
+ .Using the `raw` option to read raw value for an XML attribute
438
+ [example]
439
+ ====
440
+ [source,ruby]
441
+ ----
442
+ class Person < Lutaml::Model::Serializable
443
+ attribute :name, :string
444
+ attribute :description, :string, raw: true
445
+ end
446
+ ----
447
+
448
+ For the following xml
449
+ [source,xml]
450
+ ----
451
+ <Person>
452
+ <name>John Doe</name>
453
+ <description>
454
+ A <b>fictional person</b> commonly used as a <i>placeholder name</i>.
455
+ </description>
456
+ </Person>
457
+ ----
458
+
459
+ [source,ruby]
460
+ ----
461
+ > Person.from_xml(xml)
462
+ > # <Person:0x0000000107a3ca70
463
+ @description="\n A <b>fictional person</b> commonly used as a <i>placeholder name</i>.\n ",
464
+ @element_order=["text", "name", "text", "description", "text"],
465
+ @name="John Doe",
466
+ @ordered=nil,
467
+ @validate_on_set=false>
468
+ ----
469
+ ====
470
+
408
471
  == Serialization model mappings
409
472
 
410
473
  === General
@@ -989,7 +1052,7 @@ end
989
1052
 
990
1053
  TODO: How to create mixed content from `#new`?
991
1054
 
992
-
1055
+ [[xml-schema-location]]
993
1056
  ==== Automatic support of `xsi:schemaLocation`
994
1057
 
995
1058
  The
@@ -1444,9 +1507,14 @@ NOTE: The corresponding keyword used by Shale is `receiver:` instead of
1444
1507
 
1445
1508
  ==== Attribute serialization with custom methods
1446
1509
 
1510
+ ===== General
1511
+
1447
1512
  Define custom methods for specific attribute mappings using the `with:` key for
1448
1513
  each serialization mapping block for `from` and `to`.
1449
1514
 
1515
+
1516
+ ===== XML serialization with custom methods
1517
+
1450
1518
  Syntax:
1451
1519
 
1452
1520
  .XML serialization with custom methods
@@ -1468,6 +1536,81 @@ xml do
1468
1536
  end
1469
1537
  ----
1470
1538
 
1539
+ .Using the `with:` key to define custom serialization methods for XML
1540
+ [example]
1541
+ ====
1542
+ The following class will parse the XML snippet below:
1543
+
1544
+ [source,ruby]
1545
+ ----
1546
+ class CustomCeramic < Lutaml::Model::Serializable
1547
+ attribute :name, :string
1548
+ attribute :size, :integer
1549
+ attribute :description, :string
1550
+
1551
+ xml do
1552
+ map_element "Name", to: :name, with: { to: :name_to_xml, from: :name_from_xml }
1553
+ map_attribute "Size", to: :size, with: { to: :size_to_xml, from: :size_from_xml }
1554
+ map_content with: { to: :description_to_xml, from: :description_from_xml }
1555
+ end
1556
+
1557
+ def name_to_xml(model, parent, doc)
1558
+ el = doc.create_element("Name")
1559
+ doc.add_text(el, "XML Masterpiece: #{model.name}")
1560
+ doc.add_element(parent, el)
1561
+ end
1562
+
1563
+ def name_from_xml(model, value)
1564
+ model.name = value.sub(/^XML Masterpiece: /, "")
1565
+ end
1566
+
1567
+ def size_to_xml(model, parent, doc)
1568
+ doc.add_attribute(parent, "Size", model.size + 3)
1569
+ end
1570
+
1571
+ def size_from_xml(model, value)
1572
+ model.size = value.to_i - 3
1573
+ end
1574
+
1575
+ def description_to_xml(model, parent, doc)
1576
+ doc.add_text(parent, "XML Description: #{model.description}")
1577
+ end
1578
+
1579
+ def description_from_xml(model, value)
1580
+ model.description = value.join.strip.sub(/^XML Description: /, "")
1581
+ end
1582
+ end
1583
+ ----
1584
+
1585
+ [source,xml]
1586
+ ----
1587
+ <CustomCeramic Size="15">
1588
+ <Name>XML Masterpiece: Vase</Name>
1589
+ XML Description: A beautiful ceramic vase
1590
+ </CustomCeramic>
1591
+ ----
1592
+
1593
+ [source,ruby]
1594
+ ----
1595
+ > CustomCeramic.from_xml(xml)
1596
+ > #<CustomCeramic:0x0000000108d0e1f8
1597
+ @element_order=["text", "Name", "text", "Size", "text"],
1598
+ @name="Masterpiece: Vase",
1599
+ @ordered=nil,
1600
+ @size=12,
1601
+ @description="A beautiful ceramic vase",
1602
+ @validate_on_set=false>
1603
+ > puts CustomCeramic.new(name: "Vase", size: 12, description: "A beautiful vase").to_xml
1604
+ # <CustomCeramic Size="15">
1605
+ # <Name>XML Masterpiece: Vase</Name>
1606
+ # XML Description: A beautiful vase
1607
+ # </CustomCeramic>
1608
+ ----
1609
+ ====
1610
+
1611
+
1612
+ ===== Key-value data model serialization with custom methods
1613
+
1471
1614
  .Key-value data model serialization with custom methods
1472
1615
  [source,ruby]
1473
1616
  ----
@@ -1524,7 +1667,7 @@ end
1524
1667
 
1525
1668
 
1526
1669
  [[attribute-extraction]]
1527
- ==== Attribute extraction
1670
+ ==== Attribute extraction (for key-value data models only)
1528
1671
 
1529
1672
  NOTE: This feature is for key-value data model serialization only.
1530
1673
 
@@ -1992,9 +2135,9 @@ differences in implementation.
1992
2135
  |
1993
2136
 
1994
2137
  | Value types
1995
- | `Lutaml::Model::Type` includes: `Integer`, `String`, `Float`, `Boolean`, `Date`, `DateTime`, `Time`, `Hash`.
2138
+ | `Lutaml::Model::Type` includes: `Integer`, `String`, `Float`, `Boolean`, `Date`, `DateTime`, `Time`, `Decimal`, `Hash`.
1996
2139
  | `Shale::Type` includes: `Integer`, `String`, `Float`, `Boolean`, `Date`, `Time`.
1997
- | Lutaml::Model supports the additional value types `DateTime` and `Hash`.
2140
+ | Lutaml::Model supports additional value types `Decimal`, `DateTime` and `Hash`.
1998
2141
 
1999
2142
  | Configuration
2000
2143
  | `Lutaml::Model::Config`
@@ -2011,6 +2154,11 @@ differences in implementation.
2011
2154
  | XML, YAML, JSON, TOML, CSV
2012
2155
  | Lutaml::Model does not support CSV.
2013
2156
 
2157
+ | Validation
2158
+ | Supports collection range, fixed values, and custom validation
2159
+ | Requires implementation
2160
+ |
2161
+
2014
2162
  | Adapter support
2015
2163
  | XML (Nokogiri, Ox, Oga), YAML, JSON (JSON, MultiJson), TOML (Toml-rb, Tomlib)
2016
2164
  | XML (Nokogiri, Ox), YAML, JSON (JSON, MultiJson), TOML (Toml-rb, Tomlib), CSV
@@ -2042,6 +2190,12 @@ namespace from the root element.
2042
2190
  | No.
2043
2191
  |
2044
2192
 
2193
+ | Support for `xsi:schemaLocation`
2194
+ | Yes. Automatically supports the <<xml-schema-location,`xsi:schemaLocation`>>
2195
+ attribute for every element.
2196
+ | Requires manual specification on every XML element that uses it.
2197
+ |
2198
+
2045
2199
  4+h| Attribute features
2046
2200
 
2047
2201
  | Attribute delegation
@@ -2061,7 +2215,6 @@ data models.
2061
2215
  | No.
2062
2216
  | Lutaml::Model supports attribute extraction from key-value data models.
2063
2217
 
2064
-
2065
2218
  |===
2066
2219
 
2067
2220
 
@@ -2114,25 +2267,26 @@ Actions:
2114
2267
 
2115
2268
  === Step 2: Replace value type definitions
2116
2269
 
2117
- Value types in `Lutaml::Model` are under the `Lutaml::Model::Type` module.
2270
+ Value types in `Lutaml::Model` are under the `Lutaml::Model::Type` module,
2271
+ or use the LutaML type symbols.
2118
2272
 
2119
2273
  [source,ruby]
2120
2274
  ----
2121
2275
  class Example < Lutaml::Model::Serializable
2122
- attribute :length, Lutaml::Model::Type::Integer
2123
- attribute :description, Lutaml::Model::Type::String
2276
+ attribute :length, :integer
2277
+ attribute :description, :string
2124
2278
  end
2125
2279
  ----
2126
2280
 
2127
2281
  [NOTE]
2128
2282
  ====
2129
- `Lutaml::Model` also supports specifying predefined value types as strings or
2283
+ `Lutaml::Model` supports specifying predefined value types as strings or
2130
2284
  symbols, which is not supported by Shale.
2131
2285
 
2132
2286
  [source,ruby]
2133
2287
  ----
2134
2288
  class Example < Lutaml::Model::Serializable
2135
- attribute :length, :integer
2289
+ attribute :length, Lutaml::Model::Type::Integer
2136
2290
  attribute :description, "String"
2137
2291
  end
2138
2292
  ----
@@ -2369,6 +2523,6 @@ allowing you to shape and structure your data into useful forms.
2369
2523
  == License and Copyright
2370
2524
 
2371
2525
  This project is licensed under the BSD 2-clause License.
2372
- See the LICENSE file for details.
2526
+ See the link:LICENSE.md[] file for details.
2373
2527
 
2374
2528
  Copyright Ribose.
@@ -7,6 +7,7 @@ module Lutaml
7
7
  @name = name
8
8
  @type = cast_type(type)
9
9
  @options = options
10
+ @raw = !!options[:raw]
10
11
 
11
12
  if collection?
12
13
  validate_collection_range
@@ -14,6 +15,10 @@ module Lutaml
14
15
  end
15
16
  end
16
17
 
18
+ def delegate
19
+ @options[:delegate]
20
+ end
21
+
17
22
  def cast_type(type)
18
23
  case type
19
24
  when Class
@@ -27,6 +32,16 @@ module Lutaml
27
32
  raise ArgumentError, "Unknown Lutaml::Model::Type: #{type}"
28
33
  end
29
34
 
35
+ def cast_value(value)
36
+ return type.cast(value) unless value.is_a?(Array)
37
+
38
+ value.map { |v| type.cast(v) }
39
+ end
40
+
41
+ def setter
42
+ :"#{@name}="
43
+ end
44
+
30
45
  def collection?
31
46
  options[:collection] || false
32
47
  end
@@ -35,10 +50,20 @@ module Lutaml
35
50
  !collection?
36
51
  end
37
52
 
38
- def default
39
- return options[:default].call if options[:default].is_a?(Proc)
53
+ def raw?
54
+ @raw
55
+ end
40
56
 
41
- options[:default]
57
+ def default
58
+ value = if delegate
59
+ type.attributes[to].default
60
+ elsif options[:default].is_a?(Proc)
61
+ options[:default].call
62
+ else
63
+ options[:default]
64
+ end
65
+
66
+ cast_value(value)
42
67
  end
43
68
 
44
69
  def render_nil?
@@ -0,0 +1,6 @@
1
+ module Lutaml
2
+ module Model
3
+ class IncorrectMappingArgumentsError < Error
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ module Lutaml
2
+ module Model
3
+ class TypeNotEnabledError < Error
4
+ def initialize(type_name, value)
5
+ super("#{type_name} type is not enabled. Value: #{value}")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -6,6 +6,8 @@ module Lutaml
6
6
  end
7
7
 
8
8
  require_relative "error/invalid_value_error"
9
+ require_relative "error/incorrect_mapping_argument_error"
9
10
  require_relative "error/unknown_adapter_type_error"
10
11
  require_relative "error/collection_count_out_of_range_error"
11
12
  require_relative "error/validation_error"
13
+ require_relative "error/type_not_enabled_error"
@@ -6,8 +6,7 @@ module Lutaml
6
6
  module JsonAdapter
7
7
  class StandardJsonAdapter < JsonDocument
8
8
  def self.parse(json)
9
- attributes = JSON.parse(json, create_additions: false)
10
- new(attributes)
9
+ JSON.parse(json, create_additions: false)
11
10
  end
12
11
 
13
12
  def to_json(*args)
@@ -11,12 +11,14 @@ module Lutaml
11
11
 
12
12
  def map(
13
13
  name,
14
- to:,
14
+ to: nil,
15
15
  render_nil: false,
16
16
  with: {},
17
17
  delegate: nil,
18
18
  child_mappings: nil
19
19
  )
20
+ validate!(name, to, with)
21
+
20
22
  @mappings << KeyValueMappingRule.new(
21
23
  name,
22
24
  to: to,
@@ -28,6 +30,18 @@ module Lutaml
28
30
  end
29
31
 
30
32
  alias map_element map
33
+
34
+ def validate!(key, to, with)
35
+ if to.nil? && with.empty?
36
+ msg = ":to or :with argument is required for mapping '#{key}'"
37
+ raise IncorrectMappingArgumentsError.new(msg)
38
+ end
39
+
40
+ if !with.empty? && (with[:from].nil? || with[:to].nil?)
41
+ msg = ":with argument for mapping '#{key}' requires :to and :from keys"
42
+ raise IncorrectMappingArgumentsError.new(msg)
43
+ end
44
+ end
31
45
  end
32
46
  end
33
47
  end
@@ -24,6 +24,20 @@ module Lutaml
24
24
  @ordered
25
25
  end
26
26
 
27
+ def method_missing(method_name, *args)
28
+ value = self[method_name] || self[method_name.to_s]
29
+ return value if value
30
+
31
+ super
32
+ end
33
+
34
+ def respond_to_missing?(method_name, include_private = false)
35
+ key_present = key?(method_name) || key?(method_name.to_s)
36
+ return true if key_present
37
+
38
+ super
39
+ end
40
+
27
41
  private
28
42
 
29
43
  def normalize(key)