rng 0.1.1 → 0.3.3

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.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +63 -0
  3. data/.github/workflows/release.yml +8 -3
  4. data/.gitignore +11 -0
  5. data/.rubocop.yml +11 -6
  6. data/.rubocop_todo.yml +270 -0
  7. data/CHANGELOG.md +317 -0
  8. data/CLAUDE.md +139 -0
  9. data/CODE_OF_CONDUCT.md +132 -0
  10. data/Gemfile +11 -10
  11. data/README.adoc +1929 -0
  12. data/Rakefile +11 -3
  13. data/docs/Gemfile +8 -0
  14. data/docs/_config.yml +23 -0
  15. data/docs/getting-started/index.adoc +75 -0
  16. data/docs/guides/error-handling.adoc +137 -0
  17. data/docs/guides/external-references.adoc +128 -0
  18. data/docs/guides/index.adoc +24 -0
  19. data/docs/guides/parsing-rnc.adoc +141 -0
  20. data/docs/guides/parsing-rng-xml.adoc +81 -0
  21. data/docs/guides/rng-to-rnc.adoc +101 -0
  22. data/docs/guides/validation.adoc +85 -0
  23. data/docs/index.adoc +52 -0
  24. data/docs/reference/api.adoc +126 -0
  25. data/docs/reference/cli.adoc +182 -0
  26. data/docs/understanding/architecture.adoc +58 -0
  27. data/docs/understanding/rng-vs-rnc.adoc +118 -0
  28. data/exe/rng +5 -0
  29. data/lib/rng/any_name.rb +28 -0
  30. data/lib/rng/attribute.rb +61 -5
  31. data/lib/rng/choice.rb +60 -0
  32. data/lib/rng/cli.rb +607 -0
  33. data/lib/rng/data.rb +32 -0
  34. data/lib/rng/datatype_declaration.rb +26 -0
  35. data/lib/rng/define.rb +56 -5
  36. data/lib/rng/div.rb +36 -0
  37. data/lib/rng/documentation.rb +9 -0
  38. data/lib/rng/element.rb +66 -18
  39. data/lib/rng/empty.rb +23 -0
  40. data/lib/rng/except.rb +62 -0
  41. data/lib/rng/external_ref.rb +28 -0
  42. data/lib/rng/external_ref_resolver.rb +582 -0
  43. data/lib/rng/foreign_attribute.rb +26 -0
  44. data/lib/rng/foreign_element.rb +33 -0
  45. data/lib/rng/grammar.rb +38 -0
  46. data/lib/rng/group.rb +62 -0
  47. data/lib/rng/include.rb +23 -0
  48. data/lib/rng/include_processor.rb +461 -0
  49. data/lib/rng/interleave.rb +58 -0
  50. data/lib/rng/list.rb +56 -0
  51. data/lib/rng/mixed.rb +58 -0
  52. data/lib/rng/name.rb +28 -0
  53. data/lib/rng/namespace_declaration.rb +47 -0
  54. data/lib/rng/namespaces.rb +15 -0
  55. data/lib/rng/not_allowed.rb +23 -0
  56. data/lib/rng/ns_name.rb +31 -0
  57. data/lib/rng/one_or_more.rb +58 -0
  58. data/lib/rng/optional.rb +58 -0
  59. data/lib/rng/param.rb +30 -0
  60. data/lib/rng/parent_ref.rb +28 -0
  61. data/lib/rng/parse_rnc.rb +26 -0
  62. data/lib/rng/parse_tree_processor.rb +695 -0
  63. data/lib/rng/pattern.rb +24 -0
  64. data/lib/rng/ref.rb +28 -0
  65. data/lib/rng/rnc_builder.rb +927 -0
  66. data/lib/rng/rnc_parser.rb +672 -115
  67. data/lib/rng/rnc_to_rng_converter.rb +1408 -0
  68. data/lib/rng/schema_preamble.rb +73 -0
  69. data/lib/rng/schema_validator.rb +1622 -0
  70. data/lib/rng/start.rb +57 -6
  71. data/lib/rng/test_suite_parser.rb +168 -0
  72. data/lib/rng/text.rb +29 -0
  73. data/lib/rng/to_rnc.rb +24 -0
  74. data/lib/rng/value.rb +28 -0
  75. data/lib/rng/version.rb +1 -1
  76. data/lib/rng/zero_or_more.rb +58 -0
  77. data/lib/rng.rb +80 -5
  78. data/rng.gemspec +19 -19
  79. data/scripts/extract_spectest_resources.rb +96 -0
  80. data/spec/fixtures/compacttest.xml +2511 -0
  81. data/spec/fixtures/external/circular_a.rng +7 -0
  82. data/spec/fixtures/external/circular_b.rng +7 -0
  83. data/spec/fixtures/external/circular_main.rng +7 -0
  84. data/spec/fixtures/external/external_ref_lib.rng +7 -0
  85. data/spec/fixtures/external/external_ref_main.rng +7 -0
  86. data/spec/fixtures/external/include_lib.rng +7 -0
  87. data/spec/fixtures/external/include_main.rng +3 -0
  88. data/spec/fixtures/external/nested_chain.rng +6 -0
  89. data/spec/fixtures/external/nested_leaf.rng +7 -0
  90. data/spec/fixtures/external/nested_mid.rng +8 -0
  91. data/spec/fixtures/metanorma/3gpp.rnc +35 -0
  92. data/spec/fixtures/metanorma/3gpp.rng +105 -0
  93. data/spec/fixtures/metanorma/basicdoc.rnc +11 -0
  94. data/spec/fixtures/metanorma/bipm.rnc +148 -0
  95. data/spec/fixtures/metanorma/bipm.rng +376 -0
  96. data/spec/fixtures/metanorma/bsi.rnc +104 -0
  97. data/spec/fixtures/metanorma/bsi.rng +332 -0
  98. data/spec/fixtures/metanorma/csa.rnc +45 -0
  99. data/spec/fixtures/metanorma/csa.rng +131 -0
  100. data/spec/fixtures/metanorma/csd.rnc +43 -0
  101. data/spec/fixtures/metanorma/csd.rng +132 -0
  102. data/spec/fixtures/metanorma/gbstandard.rnc +99 -0
  103. data/spec/fixtures/metanorma/gbstandard.rng +316 -0
  104. data/spec/fixtures/metanorma/iec.rnc +49 -0
  105. data/spec/fixtures/metanorma/iec.rng +193 -0
  106. data/spec/fixtures/metanorma/ietf.rnc +275 -0
  107. data/spec/fixtures/metanorma/ietf.rng +925 -0
  108. data/spec/fixtures/metanorma/iho.rnc +58 -0
  109. data/spec/fixtures/metanorma/iho.rng +179 -0
  110. data/spec/fixtures/metanorma/isodoc.rnc +873 -0
  111. data/spec/fixtures/metanorma/isodoc.rng +2704 -0
  112. data/spec/fixtures/metanorma/isostandard-amd.rnc +43 -0
  113. data/spec/fixtures/metanorma/isostandard-amd.rng +108 -0
  114. data/spec/fixtures/metanorma/isostandard.rnc +166 -0
  115. data/spec/fixtures/metanorma/isostandard.rng +494 -0
  116. data/spec/fixtures/metanorma/itu.rnc +122 -0
  117. data/spec/fixtures/metanorma/itu.rng +377 -0
  118. data/spec/fixtures/metanorma/m3d.rnc +41 -0
  119. data/spec/fixtures/metanorma/m3d.rng +122 -0
  120. data/spec/fixtures/metanorma/mpfd.rnc +36 -0
  121. data/spec/fixtures/metanorma/mpfd.rng +95 -0
  122. data/spec/fixtures/metanorma/nist.rnc +77 -0
  123. data/spec/fixtures/metanorma/nist.rng +216 -0
  124. data/spec/fixtures/metanorma/ogc.rnc +51 -0
  125. data/spec/fixtures/metanorma/ogc.rng +151 -0
  126. data/spec/fixtures/metanorma/reqt.rnc +6 -0
  127. data/spec/fixtures/metanorma/rsd.rnc +36 -0
  128. data/spec/fixtures/metanorma/rsd.rng +95 -0
  129. data/spec/fixtures/metanorma/un.rnc +103 -0
  130. data/spec/fixtures/metanorma/un.rng +367 -0
  131. data/spec/fixtures/rnc/address_book.rnc +10 -0
  132. data/spec/fixtures/rnc/base.rnc +4 -0
  133. data/spec/fixtures/rnc/complex_example.rnc +61 -0
  134. data/spec/fixtures/rnc/grammar_with_trailing.rnc +8 -0
  135. data/spec/fixtures/rnc/main_include_trailing.rnc +3 -0
  136. data/spec/fixtures/rnc/main_with_include.rnc +5 -0
  137. data/spec/fixtures/rnc/test_augment.rnc +10 -0
  138. data/spec/fixtures/rnc/test_isodoc_simple.rnc +9 -0
  139. data/spec/fixtures/rnc/top_level_include.rnc +8 -0
  140. data/spec/fixtures/rng/address_book.rng +20 -0
  141. data/spec/fixtures/rng/relaxng.rng +335 -0
  142. data/spec/fixtures/rng/testSuite.rng +163 -0
  143. data/spec/fixtures/spectest.xml +6845 -0
  144. data/spec/fixtures/spectest_external/case_10_4.7/x +3 -0
  145. data/spec/fixtures/spectest_external/case_10_4.7/y +7 -0
  146. data/spec/fixtures/spectest_external/case_11_4.7/x +3 -0
  147. data/spec/fixtures/spectest_external/case_12_4.7/x +3 -0
  148. data/spec/fixtures/spectest_external/case_13_4.7/x +3 -0
  149. data/spec/fixtures/spectest_external/case_13_4.7/y +3 -0
  150. data/spec/fixtures/spectest_external/case_14_4.7/x +7 -0
  151. data/spec/fixtures/spectest_external/case_15_4.7/x +7 -0
  152. data/spec/fixtures/spectest_external/case_16_4.7/x +5 -0
  153. data/spec/fixtures/spectest_external/case_17_4.7/x +5 -0
  154. data/spec/fixtures/spectest_external/case_18_4.7/x +7 -0
  155. data/spec/fixtures/spectest_external/case_19_4.7/level1.rng +9 -0
  156. data/spec/fixtures/spectest_external/case_19_4.7/level2.rng +7 -0
  157. data/spec/fixtures/spectest_external/case_1_4.5/sub1/x +3 -0
  158. data/spec/fixtures/spectest_external/case_1_4.5/sub3/x +3 -0
  159. data/spec/fixtures/spectest_external/case_1_4.5/x +3 -0
  160. data/spec/fixtures/spectest_external/case_20_4.6/x +3 -0
  161. data/spec/fixtures/spectest_external/case_2_4.5/x +3 -0
  162. data/spec/fixtures/spectest_external/case_3_4.6/x +3 -0
  163. data/spec/fixtures/spectest_external/case_4_4.6/x +3 -0
  164. data/spec/fixtures/spectest_external/case_5_4.6/x +1 -0
  165. data/spec/fixtures/spectest_external/case_6_4.6/x +5 -0
  166. data/spec/fixtures/spectest_external/case_7_4.6/x +1 -0
  167. data/spec/fixtures/spectest_external/case_7_4.6/y +1 -0
  168. data/spec/fixtures/spectest_external/case_8_4.7/x +7 -0
  169. data/spec/fixtures/spectest_external/case_9_4.7/x +7 -0
  170. data/spec/fixtures/spectest_external/resources.json +149 -0
  171. data/spec/rng/advanced_rnc_spec.rb +101 -0
  172. data/spec/rng/compacttest_spec.rb +197 -0
  173. data/spec/rng/datatype_declaration_spec.rb +28 -0
  174. data/spec/rng/div_spec.rb +207 -0
  175. data/spec/rng/external_ref_resolver_spec.rb +122 -0
  176. data/spec/rng/metanorma_conversion_spec.rb +159 -0
  177. data/spec/rng/namespace_declaration_spec.rb +60 -0
  178. data/spec/rng/namespace_support_spec.rb +199 -0
  179. data/spec/rng/rnc_parser_spec.rb +501 -23
  180. data/spec/rng/rnc_roundtrip_spec.rb +135 -0
  181. data/spec/rng/rng_generation_spec.rb +288 -0
  182. data/spec/rng/roundtrip_spec.rb +342 -0
  183. data/spec/rng/schema_preamble_spec.rb +145 -0
  184. data/spec/rng/schema_spec.rb +125 -172
  185. data/spec/rng/spectest_spec.rb +273 -0
  186. data/spec/rng_spec.rb +2 -2
  187. data/spec/spec_helper.rb +7 -9
  188. metadata +188 -8
  189. data/lib/rng/builder.rb +0 -158
  190. data/lib/rng/rng_parser.rb +0 -107
  191. data/lib/rng/schema.rb +0 -18
  192. data/spec/rng/rng_parser_spec.rb +0 -102
data/lib/rng/mixed.rb ADDED
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class Mixed < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :element, Element, collection: true, initialize_empty: true
9
+ attribute :attribute, Attribute, collection: true, initialize_empty: true
10
+ attribute :ref, Ref, collection: true, initialize_empty: true
11
+ attribute :choice, Choice, collection: true, initialize_empty: true
12
+ attribute :group, Group, collection: true, initialize_empty: true
13
+ attribute :interleave, Interleave, collection: true, initialize_empty: true
14
+ attribute :mixed, Mixed, collection: true, initialize_empty: true
15
+ attribute :optional, Optional, collection: true, initialize_empty: true
16
+ attribute :zeroOrMore, ZeroOrMore, collection: true, initialize_empty: true
17
+ attribute :oneOrMore, OneOrMore, collection: true, initialize_empty: true
18
+ attribute :text, Text, collection: true, initialize_empty: true
19
+ attribute :empty, Empty, collection: true, initialize_empty: true
20
+ attribute :value, Value, collection: true, initialize_empty: true
21
+ attribute :data, Data, collection: true, initialize_empty: true
22
+ attribute :list, List, collection: true, initialize_empty: true
23
+ attribute :notAllowed, NotAllowed, collection: true, initialize_empty: true
24
+
25
+ xml do
26
+ element 'mixed'
27
+ ordered
28
+
29
+ namespace ::Rng::Namespaces::RngNamespace
30
+
31
+ map_attribute 'id', to: :id
32
+ map_attribute 'ns', to: :ns, value_map: {
33
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
34
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
35
+ }
36
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
37
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
38
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
39
+ }
40
+ map_element 'element', to: :element
41
+ map_element 'attribute', to: :attribute
42
+ map_element 'ref', to: :ref
43
+ map_element 'choice', to: :choice
44
+ map_element 'group', to: :group
45
+ map_element 'interleave', to: :interleave
46
+ map_element 'mixed', to: :mixed
47
+ map_element 'optional', to: :optional
48
+ map_element 'zeroOrMore', to: :zeroOrMore
49
+ map_element 'oneOrMore', to: :oneOrMore
50
+ map_element 'text', to: :text
51
+ map_element 'empty', to: :empty
52
+ map_element 'value', to: :value
53
+ map_element 'data', to: :data
54
+ map_element 'list', to: :list
55
+ map_element 'notAllowed', to: :notAllowed
56
+ end
57
+ end
58
+ end
data/lib/rng/name.rb ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class Name < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :value, :string
9
+
10
+ xml do
11
+ element 'name'
12
+ ordered
13
+
14
+ namespace ::Rng::Namespaces::RngNamespace
15
+
16
+ map_attribute 'id', to: :id
17
+ map_attribute 'ns', to: :ns, value_map: {
18
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
19
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
20
+ }
21
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
22
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
23
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
24
+ }
25
+ map_content to: :value
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ # Represents a namespace declaration in RNC
5
+ #
6
+ # Supports both default and prefixed namespace declarations:
7
+ # - default namespace = "uri"
8
+ # - default namespace prefix = "uri"
9
+ # - namespace prefix = "uri"
10
+ #
11
+ # @example Default namespace
12
+ # decl = NamespaceDeclaration.new(uri: "http://example.com", is_default: true)
13
+ # decl.default? #=> true
14
+ #
15
+ # @example Prefixed namespace
16
+ # decl = NamespaceDeclaration.new(prefix: "eg", uri: "http://example.com")
17
+ # decl.prefixed? #=> true
18
+ #
19
+ class NamespaceDeclaration
20
+ attr_reader :prefix, :uri, :is_default
21
+
22
+ # Initialize a namespace declaration
23
+ #
24
+ # @param prefix [String, nil] Namespace prefix (nil for unprefixed default)
25
+ # @param uri [String] Namespace URI
26
+ # @param is_default [Boolean] Whether this is the default namespace
27
+ def initialize(uri:, prefix: nil, is_default: false)
28
+ @prefix = prefix
29
+ @uri = uri
30
+ @is_default = is_default
31
+ end
32
+
33
+ # Check if this is the default namespace
34
+ #
35
+ # @return [Boolean]
36
+ def default?
37
+ @is_default
38
+ end
39
+
40
+ # Check if this namespace has a prefix
41
+ #
42
+ # @return [Boolean]
43
+ def prefixed?
44
+ !@prefix.nil?
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ module Namespaces
5
+ class RngNamespace < Lutaml::Xml::Namespace
6
+ uri 'http://relaxng.org/ns/structure/1.0'
7
+ prefix_default 'rng'
8
+ end
9
+
10
+ class AnnotationNamespace < Lutaml::Xml::Namespace
11
+ uri 'http://relaxng.org/ns/compatibility/annotations/1.0'
12
+ prefix_default 'a'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class NotAllowed < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+
9
+ xml do
10
+ element 'notAllowed'
11
+ ordered
12
+
13
+ namespace ::Rng::Namespaces::RngNamespace
14
+
15
+ map_attribute 'id', to: :id
16
+ map_attribute 'ns', to: :ns, value_map: {
17
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
18
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
19
+ }
20
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class NsName < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :name, :string
9
+ attribute :except, Except
10
+
11
+ xml do
12
+ element 'nsName'
13
+ ordered
14
+
15
+ namespace ::Rng::Namespaces::RngNamespace
16
+
17
+ map_attribute 'id', to: :id
18
+ map_attribute 'ns', to: :ns, value_map: {
19
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
20
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
21
+ }
22
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
23
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
24
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
25
+ }
26
+ map_attribute 'name', to: :name
27
+
28
+ map_element 'except', to: :except
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class OneOrMore < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :element, Element, collection: true, initialize_empty: true
9
+ attribute :attribute, Attribute, collection: true, initialize_empty: true
10
+ attribute :ref, Ref, collection: true, initialize_empty: true
11
+ attribute :choice, Choice, collection: true, initialize_empty: true
12
+ attribute :group, Group, collection: true, initialize_empty: true
13
+ attribute :interleave, Interleave, collection: true, initialize_empty: true
14
+ attribute :mixed, Mixed, collection: true, initialize_empty: true
15
+ attribute :optional, Optional, collection: true, initialize_empty: true
16
+ attribute :zeroOrMore, ZeroOrMore, collection: true, initialize_empty: true
17
+ attribute :oneOrMore, OneOrMore, collection: true, initialize_empty: true
18
+ attribute :text, Text, collection: true, initialize_empty: true
19
+ attribute :empty, Empty, collection: true, initialize_empty: true
20
+ attribute :value, Value, collection: true, initialize_empty: true
21
+ attribute :data, Data, collection: true, initialize_empty: true
22
+ attribute :list, List, collection: true, initialize_empty: true
23
+ attribute :notAllowed, NotAllowed, collection: true, initialize_empty: true
24
+
25
+ xml do
26
+ element 'oneOrMore'
27
+ ordered
28
+
29
+ namespace ::Rng::Namespaces::RngNamespace
30
+
31
+ map_attribute 'id', to: :id
32
+ map_attribute 'ns', to: :ns, value_map: {
33
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
34
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
35
+ }
36
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
37
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
38
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
39
+ }
40
+ map_element 'element', to: :element
41
+ map_element 'attribute', to: :attribute
42
+ map_element 'ref', to: :ref
43
+ map_element 'choice', to: :choice
44
+ map_element 'group', to: :group
45
+ map_element 'interleave', to: :interleave
46
+ map_element 'mixed', to: :mixed
47
+ map_element 'optional', to: :optional
48
+ map_element 'zeroOrMore', to: :zeroOrMore
49
+ map_element 'oneOrMore', to: :oneOrMore
50
+ map_element 'text', to: :text
51
+ map_element 'empty', to: :empty
52
+ map_element 'value', to: :value
53
+ map_element 'data', to: :data
54
+ map_element 'list', to: :list
55
+ map_element 'notAllowed', to: :notAllowed
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class Optional < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :element, Element, collection: true, initialize_empty: true
9
+ attribute :attribute, Attribute, collection: true, initialize_empty: true
10
+ attribute :ref, Ref, collection: true, initialize_empty: true
11
+ attribute :choice, Choice, collection: true, initialize_empty: true
12
+ attribute :group, Group, collection: true, initialize_empty: true
13
+ attribute :interleave, Interleave, collection: true, initialize_empty: true
14
+ attribute :mixed, Mixed, collection: true, initialize_empty: true
15
+ attribute :optional, Optional, collection: true, initialize_empty: true
16
+ attribute :zeroOrMore, ZeroOrMore, collection: true, initialize_empty: true
17
+ attribute :oneOrMore, OneOrMore, collection: true, initialize_empty: true
18
+ attribute :text, Text, collection: true, initialize_empty: true
19
+ attribute :empty, Empty, collection: true, initialize_empty: true
20
+ attribute :value, Value, collection: true, initialize_empty: true
21
+ attribute :data, Data, collection: true, initialize_empty: true
22
+ attribute :list, List, collection: true, initialize_empty: true
23
+ attribute :notAllowed, NotAllowed, collection: true, initialize_empty: true
24
+
25
+ xml do
26
+ element 'optional'
27
+ ordered
28
+
29
+ namespace ::Rng::Namespaces::RngNamespace
30
+
31
+ map_attribute 'id', to: :id
32
+ map_attribute 'ns', to: :ns, value_map: {
33
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
34
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
35
+ }
36
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
37
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
38
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
39
+ }
40
+ map_element 'element', to: :element
41
+ map_element 'attribute', to: :attribute
42
+ map_element 'ref', to: :ref
43
+ map_element 'choice', to: :choice
44
+ map_element 'group', to: :group
45
+ map_element 'interleave', to: :interleave
46
+ map_element 'mixed', to: :mixed
47
+ map_element 'optional', to: :optional
48
+ map_element 'zeroOrMore', to: :zeroOrMore
49
+ map_element 'oneOrMore', to: :oneOrMore
50
+ map_element 'text', to: :text
51
+ map_element 'empty', to: :empty
52
+ map_element 'value', to: :value
53
+ map_element 'data', to: :data
54
+ map_element 'list', to: :list
55
+ map_element 'notAllowed', to: :notAllowed
56
+ end
57
+ end
58
+ end
data/lib/rng/param.rb ADDED
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class Param < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :name, :string
9
+ attribute :value, :string
10
+
11
+ xml do
12
+ element 'param'
13
+ ordered
14
+
15
+ namespace ::Rng::Namespaces::RngNamespace
16
+
17
+ map_attribute 'id', to: :id
18
+ map_attribute 'ns', to: :ns, value_map: {
19
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
20
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
21
+ }
22
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
23
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
24
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
25
+ }
26
+ map_attribute 'name', to: :name
27
+ map_content to: :value
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ class ParentRef < Lutaml::Model::Serializable
5
+ attribute :id, :string
6
+ attribute :ns, :string
7
+ attribute :datatypeLibrary, :string
8
+ attribute :name, :string
9
+
10
+ xml do
11
+ element 'parentRef'
12
+ ordered
13
+
14
+ namespace ::Rng::Namespaces::RngNamespace
15
+
16
+ map_attribute 'id', to: :id
17
+ map_attribute 'ns', to: :ns, value_map: {
18
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
19
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
20
+ }
21
+ map_attribute 'datatypeLibrary', to: :datatypeLibrary, value_map: {
22
+ from: { empty: :empty, omitted: :omitted, nil: :nil },
23
+ to: { empty: :empty, omitted: :omitted, nil: :nil }
24
+ }
25
+ map_attribute 'name', to: :name
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rng
4
+ # RNC Parser module
5
+ # Provides functionality to parse RELAX NG Compact Syntax (RNC) files
6
+ module ParseRnc
7
+ class << self
8
+ # Parse RNC syntax and return an RNG schema object
9
+ # @param rnc_string [String] The RNC content to parse
10
+ # @return [Rng::Grammar] The parsed schema object
11
+ def parse(rnc_string)
12
+ # This is a placeholder implementation
13
+ # The actual parsing logic would need to be implemented
14
+
15
+ # For now, we delegate to RncParser which is our internal implementation
16
+ # In the future, this could be expanded with additional functionality
17
+ RncParser.parse(rnc_string)
18
+ end
19
+ end
20
+ end
21
+
22
+ # Add class-level parsing method
23
+ def self.parse_rnc(rnc_string)
24
+ ParseRnc.parse(rnc_string)
25
+ end
26
+ end