rng 0.1.1 → 0.1.2

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -0
  3. data/.rubocop_todo.yml +64 -0
  4. data/CODE_OF_CONDUCT.md +132 -0
  5. data/Gemfile +3 -1
  6. data/README.adoc +402 -0
  7. data/lib/rng/any_name.rb +26 -0
  8. data/lib/rng/attribute.rb +58 -4
  9. data/lib/rng/choice.rb +60 -0
  10. data/lib/rng/data.rb +32 -0
  11. data/lib/rng/define.rb +51 -3
  12. data/lib/rng/element.rb +62 -16
  13. data/lib/rng/empty.rb +23 -0
  14. data/lib/rng/except.rb +62 -0
  15. data/lib/rng/external_ref.rb +28 -0
  16. data/lib/rng/grammar.rb +36 -0
  17. data/lib/rng/group.rb +60 -0
  18. data/lib/rng/include.rb +24 -0
  19. data/lib/rng/interleave.rb +58 -0
  20. data/lib/rng/list.rb +56 -0
  21. data/lib/rng/mixed.rb +58 -0
  22. data/lib/rng/name.rb +28 -0
  23. data/lib/rng/not_allowed.rb +23 -0
  24. data/lib/rng/ns_name.rb +31 -0
  25. data/lib/rng/one_or_more.rb +58 -0
  26. data/lib/rng/optional.rb +58 -0
  27. data/lib/rng/param.rb +30 -0
  28. data/lib/rng/parent_ref.rb +28 -0
  29. data/lib/rng/parse_rnc.rb +26 -0
  30. data/lib/rng/pattern.rb +24 -0
  31. data/lib/rng/ref.rb +28 -0
  32. data/lib/rng/rnc_parser.rb +351 -94
  33. data/lib/rng/start.rb +54 -5
  34. data/lib/rng/text.rb +26 -0
  35. data/lib/rng/to_rnc.rb +55 -0
  36. data/lib/rng/value.rb +29 -0
  37. data/lib/rng/version.rb +1 -1
  38. data/lib/rng/zero_or_more.rb +58 -0
  39. data/lib/rng.rb +29 -5
  40. data/rng.gemspec +3 -2
  41. data/spec/fixtures/rnc/address_book.rnc +10 -0
  42. data/spec/fixtures/rnc/complex_example.rnc +61 -0
  43. data/spec/fixtures/rng/address_book.rng +20 -0
  44. data/spec/fixtures/rng/relaxng.rng +335 -0
  45. data/spec/fixtures/rng/testSuite.rng +163 -0
  46. data/spec/fixtures/spectest.xml +6845 -0
  47. data/spec/rng/rnc_parser_spec.rb +6 -4
  48. data/spec/rng/rnc_roundtrip_spec.rb +121 -0
  49. data/spec/rng/schema_spec.rb +115 -166
  50. data/spec/rng/spectest_spec.rb +195 -0
  51. data/spec/spec_helper.rb +33 -0
  52. metadata +54 -7
  53. data/lib/rng/builder.rb +0 -158
  54. data/lib/rng/rng_parser.rb +0 -107
  55. data/lib/rng/schema.rb +0 -18
  56. data/spec/rng/rng_parser_spec.rb +0 -102
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lutaml/model"
4
+
5
+ module Rng
6
+ class ZeroOrMore < Lutaml::Model::Serializable
7
+ attribute :id, :string
8
+ attribute :ns, :string
9
+ attribute :datatypeLibrary, :string
10
+ attribute :element, Element, collection: true, initialize_empty: true
11
+ attribute :attribute, Attribute, collection: true, initialize_empty: true
12
+ attribute :ref, Ref, collection: true, initialize_empty: true
13
+ attribute :choice, Choice, collection: true, initialize_empty: true
14
+ attribute :group, Group, collection: true, initialize_empty: true
15
+ attribute :interleave, Interleave, collection: true, initialize_empty: true
16
+ attribute :mixed, Mixed, collection: true, initialize_empty: true
17
+ attribute :optional, Optional, collection: true, initialize_empty: true
18
+ attribute :zeroOrMore, ZeroOrMore, collection: true, initialize_empty: true
19
+ attribute :oneOrMore, OneOrMore, collection: true, initialize_empty: true
20
+ attribute :text, Text, collection: true, initialize_empty: true
21
+ attribute :empty, Empty, collection: true, initialize_empty: true
22
+ attribute :value, Value, collection: true, initialize_empty: true
23
+ attribute :data, Data, collection: true, initialize_empty: true
24
+ attribute :list, List, collection: true, initialize_empty: true
25
+ attribute :notAllowed, NotAllowed, collection: true, initialize_empty: true
26
+
27
+ xml do
28
+ root "zeroOrMore", ordered: true
29
+ namespace "http://relaxng.org/ns/structure/1.0"
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.rb CHANGED
@@ -1,12 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "rng/version"
4
- require_relative "rng/rnc_parser"
5
- require_relative "rng/rng_parser"
6
- require_relative "rng/builder"
3
+ require "lutaml/model"
4
+ require "lutaml/model/xml_adapter/nokogiri_adapter"
5
+
6
+ Lutaml::Model::Config.configure do |config|
7
+ config.xml_adapter = Lutaml::Model::XmlAdapter::NokogiriAdapter
8
+ end
7
9
 
8
10
  module Rng
9
11
  class Error < StandardError; end
12
+ end
13
+
14
+ require "zeitwerk"
15
+ loader = Zeitwerk::Loader.for_gem
16
+ loader.setup # ready!
17
+
18
+ loader.eager_load
19
+
20
+ module Rng
21
+ module_function
22
+
23
+ def parse(rng, location: nil, nested_schema: false)
24
+ Grammar.from_xml(rng)
25
+ end
26
+
27
+ def parse_rnc(rnc)
28
+ # Parse RNC and convert to RNG
29
+ ParseRnc.parse(rnc)
30
+ end
10
31
 
11
- # Your code goes here...
32
+ def to_rnc(schema)
33
+ # Convert RNG schema to RNC
34
+ ToRnc.convert(schema)
35
+ end
12
36
  end
data/rng.gemspec CHANGED
@@ -23,15 +23,16 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  # Specify which files should be added to the gem when it is released.
25
25
  spec.files = all_files_in_git
26
- .reject { |f| f.match(%r{\A(?:test|features|bin|\.)/}) }
26
+ .reject { |f| f.match(%r{\A(?:test|features|bin|\.)/}) }
27
27
 
28
28
  spec.bindir = "exe"
29
29
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency "lutaml-model"
33
- spec.add_dependency "parslet"
34
33
  spec.add_dependency "nokogiri"
34
+ spec.add_dependency "parslet"
35
+ spec.add_dependency "zeitwerk"
35
36
 
36
37
  # spec.add_dependency "thor"
37
38
  spec.metadata["rubygems_mfa_required"] = "true"
@@ -0,0 +1,10 @@
1
+ # Address Book schema in RNC (RELAX NG Compact Syntax)
2
+ # Equivalent to address_book.rng
3
+
4
+ start = element addressBook {
5
+ element card { cardContent }*
6
+ }
7
+
8
+ cardContent =
9
+ element name { text },
10
+ element email { text }
@@ -0,0 +1,61 @@
1
+ # A more complex RNC example demonstrating various RELAX NG features
2
+
3
+ # Default namespace
4
+ default namespace = "http://example.com/complex"
5
+
6
+ # Grammar with namespace definitions
7
+ grammar {
8
+ start = element document {
9
+ attribute version { "1.0" },
10
+ attribute xmlns { "http://example.com/complex" }?,
11
+
12
+ # Mixed content with interleaved elements
13
+ mixed {
14
+ element title { text },
15
+ element metadata {
16
+ attribute created { xsd:date },
17
+ attribute modified { xsd:date }?
18
+ },
19
+
20
+ # Choice between section types
21
+ (normalSection | specialSection)+
22
+ }
23
+ }
24
+
25
+ # Define a normal section pattern
26
+ normalSection =
27
+ element section {
28
+ attribute id { xsd:ID },
29
+ element heading { text },
30
+
31
+ # Zero or more paragraphs
32
+ element para {
33
+ # Allow mixed content with formatting
34
+ mixed { formatting* }
35
+ }*
36
+ }
37
+
38
+ # Define a special section with different content model
39
+ specialSection =
40
+ element specialSection {
41
+ attribute type { "note" | "warning" | "tip" },
42
+ element heading { text },
43
+
44
+ # One or more items in a list
45
+ element list {
46
+ element item {
47
+ mixed { formatting* }
48
+ }+
49
+ }
50
+ }
51
+
52
+ # Inline formatting elements (used in mixed content)
53
+ formatting =
54
+ element em { text } |
55
+ element strong { text } |
56
+ element code { text } |
57
+ element link {
58
+ attribute href { xsd:anyURI },
59
+ text
60
+ }
61
+ }
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <grammar xmlns="http://relaxng.org/ns/structure/1.0">
3
+ <start>
4
+ <element name="addressBook">
5
+ <zeroOrMore>
6
+ <element name="card">
7
+ <ref name="cardContent"/>
8
+ </element>
9
+ </zeroOrMore>
10
+ </element>
11
+ </start>
12
+ <define name="cardContent">
13
+ <element name="name">
14
+ <text/>
15
+ </element>
16
+ <element name="email">
17
+ <text/>
18
+ </element>
19
+ </define>
20
+ </grammar>
@@ -0,0 +1,335 @@
1
+ <?xml version="1.0"?>
2
+ <!-- RELAX NG for RELAX NG -->
3
+ <!-- $Id: relaxng.rng,v 1.31 2002/05/30 06:07:43 jjc Exp $ -->
4
+ <grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
5
+ ns="http://relaxng.org/ns/structure/1.0"
6
+ xmlns="http://relaxng.org/ns/structure/1.0">
7
+ <start>
8
+ <ref name="pattern"/>
9
+ </start>
10
+
11
+ <define name="pattern">
12
+ <choice>
13
+ <element name="element">
14
+ <choice>
15
+ <attribute name="name">
16
+ <data type="QName"/>
17
+ </attribute>
18
+ <ref name="open-name-class"/>
19
+ </choice>
20
+ <ref name="common-atts"/>
21
+ <ref name="open-patterns"/>
22
+ </element>
23
+ <element name="attribute">
24
+ <ref name="common-atts"/>
25
+ <choice>
26
+ <attribute name="name">
27
+ <data type="QName"/>
28
+ </attribute>
29
+ <ref name="open-name-class"/>
30
+ </choice>
31
+ <interleave>
32
+ <ref name="other"/>
33
+ <optional>
34
+ <ref name="pattern"/>
35
+ </optional>
36
+ </interleave>
37
+ </element>
38
+ <element name="group">
39
+ <ref name="common-atts"/>
40
+ <ref name="open-patterns"/>
41
+ </element>
42
+ <element name="interleave">
43
+ <ref name="common-atts"/>
44
+ <ref name="open-patterns"/>
45
+ </element>
46
+ <element name="choice">
47
+ <ref name="common-atts"/>
48
+ <ref name="open-patterns"/>
49
+ </element>
50
+ <element name="optional">
51
+ <ref name="common-atts"/>
52
+ <ref name="open-patterns"/>
53
+ </element>
54
+ <element name="zeroOrMore">
55
+ <ref name="common-atts"/>
56
+ <ref name="open-patterns"/>
57
+ </element>
58
+ <element name="oneOrMore">
59
+ <ref name="common-atts"/>
60
+ <ref name="open-patterns"/>
61
+ </element>
62
+ <element name="list">
63
+ <ref name="common-atts"/>
64
+ <ref name="open-patterns"/>
65
+ </element>
66
+ <element name="mixed">
67
+ <ref name="common-atts"/>
68
+ <ref name="open-patterns"/>
69
+ </element>
70
+ <element name="ref">
71
+ <attribute name="name">
72
+ <data type="NCName"/>
73
+ </attribute>
74
+ <ref name="common-atts"/>
75
+ <ref name="other"/>
76
+ </element>
77
+ <element name="parentRef">
78
+ <attribute name="name">
79
+ <data type="NCName"/>
80
+ </attribute>
81
+ <ref name="common-atts"/>
82
+ <ref name="other"/>
83
+ </element>
84
+ <element name="empty">
85
+ <ref name="common-atts"/>
86
+ <ref name="other"/>
87
+ </element>
88
+ <element name="text">
89
+ <ref name="common-atts"/>
90
+ <ref name="other"/>
91
+ </element>
92
+ <element name="value">
93
+ <optional>
94
+ <attribute name="type">
95
+ <data type="NCName"/>
96
+ </attribute>
97
+ </optional>
98
+ <ref name="common-atts"/>
99
+ <text/>
100
+ </element>
101
+ <element name="data">
102
+ <attribute name="type">
103
+ <data type="NCName"/>
104
+ </attribute>
105
+ <ref name="common-atts"/>
106
+ <interleave>
107
+ <ref name="other"/>
108
+ <group>
109
+ <zeroOrMore>
110
+ <element name="param">
111
+ <attribute name="name">
112
+ <data type="NCName"/>
113
+ </attribute>
114
+ <ref name="common-atts"/>
115
+ <text/>
116
+ </element>
117
+ </zeroOrMore>
118
+ <optional>
119
+ <element name="except">
120
+ <ref name="common-atts"/>
121
+ <ref name="open-patterns"/>
122
+ </element>
123
+ </optional>
124
+ </group>
125
+ </interleave>
126
+ </element>
127
+ <element name="notAllowed">
128
+ <ref name="common-atts"/>
129
+ <ref name="other"/>
130
+ </element>
131
+ <element name="externalRef">
132
+ <attribute name="href">
133
+ <data type="anyURI"/>
134
+ </attribute>
135
+ <ref name="common-atts"/>
136
+ <ref name="other"/>
137
+ </element>
138
+ <element name="grammar">
139
+ <ref name="common-atts"/>
140
+ <ref name="grammar-content"/>
141
+ </element>
142
+ </choice>
143
+ </define>
144
+
145
+ <define name="grammar-content">
146
+ <interleave>
147
+ <ref name="other"/>
148
+ <zeroOrMore>
149
+ <choice>
150
+ <ref name="start-element"/>
151
+ <ref name="define-element"/>
152
+ <element name="div">
153
+ <ref name="common-atts"/>
154
+ <ref name="grammar-content"/>
155
+ </element>
156
+ <element name="include">
157
+ <attribute name="href">
158
+ <data type="anyURI"/>
159
+ </attribute>
160
+ <ref name="common-atts"/>
161
+ <ref name="include-content"/>
162
+ </element>
163
+ </choice>
164
+ </zeroOrMore>
165
+ </interleave>
166
+ </define>
167
+
168
+ <define name="include-content">
169
+ <interleave>
170
+ <ref name="other"/>
171
+ <zeroOrMore>
172
+ <choice>
173
+ <ref name="start-element"/>
174
+ <ref name="define-element"/>
175
+ <element name="div">
176
+ <ref name="common-atts"/>
177
+ <ref name="include-content"/>
178
+ </element>
179
+ </choice>
180
+ </zeroOrMore>
181
+ </interleave>
182
+ </define>
183
+
184
+ <define name="start-element">
185
+ <element name="start">
186
+ <ref name="combine-att"/>
187
+ <ref name="common-atts"/>
188
+ <ref name="open-pattern"/>
189
+ </element>
190
+ </define>
191
+
192
+ <define name="define-element">
193
+ <element name="define">
194
+ <attribute name="name">
195
+ <data type="NCName"/>
196
+ </attribute>
197
+ <ref name="combine-att"/>
198
+ <ref name="common-atts"/>
199
+ <ref name="open-patterns"/>
200
+ </element>
201
+ </define>
202
+
203
+ <define name="combine-att">
204
+ <optional>
205
+ <attribute name="combine">
206
+ <choice>
207
+ <value>choice</value>
208
+ <value>interleave</value>
209
+ </choice>
210
+ </attribute>
211
+ </optional>
212
+ </define>
213
+
214
+ <define name="open-patterns">
215
+ <interleave>
216
+ <ref name="other"/>
217
+ <oneOrMore>
218
+ <ref name="pattern"/>
219
+ </oneOrMore>
220
+ </interleave>
221
+ </define>
222
+
223
+ <define name="open-pattern">
224
+ <interleave>
225
+ <ref name="other"/>
226
+ <ref name="pattern"/>
227
+ </interleave>
228
+ </define>
229
+
230
+ <define name="name-class">
231
+ <choice>
232
+ <element name="name">
233
+ <ref name="common-atts"/>
234
+ <data type="QName"/>
235
+ </element>
236
+ <element name="anyName">
237
+ <ref name="common-atts"/>
238
+ <ref name="except-name-class"/>
239
+ </element>
240
+ <element name="nsName">
241
+ <ref name="common-atts"/>
242
+ <ref name="except-name-class"/>
243
+ </element>
244
+ <element name="choice">
245
+ <ref name="common-atts"/>
246
+ <ref name="open-name-classes"/>
247
+ </element>
248
+ </choice>
249
+ </define>
250
+
251
+ <define name="except-name-class">
252
+ <interleave>
253
+ <ref name="other"/>
254
+ <optional>
255
+ <element name="except">
256
+ <ref name="open-name-classes"/>
257
+ </element>
258
+ </optional>
259
+ </interleave>
260
+ </define>
261
+
262
+ <define name="open-name-classes">
263
+ <interleave>
264
+ <ref name="other"/>
265
+ <oneOrMore>
266
+ <ref name="name-class"/>
267
+ </oneOrMore>
268
+ </interleave>
269
+ </define>
270
+
271
+ <define name="open-name-class">
272
+ <interleave>
273
+ <ref name="other"/>
274
+ <ref name="name-class"/>
275
+ </interleave>
276
+ </define>
277
+
278
+ <define name="common-atts">
279
+ <optional>
280
+ <attribute name="ns"/>
281
+ </optional>
282
+ <optional>
283
+ <attribute name="datatypeLibrary">
284
+ <data type="anyURI"/>
285
+ </attribute>
286
+ </optional>
287
+ <zeroOrMore>
288
+ <attribute>
289
+ <anyName>
290
+ <except>
291
+ <nsName/>
292
+ <nsName ns=""/>
293
+ </except>
294
+ </anyName>
295
+ </attribute>
296
+ </zeroOrMore>
297
+ </define>
298
+
299
+ <define name="other">
300
+ <zeroOrMore>
301
+ <element>
302
+ <anyName>
303
+ <except>
304
+ <nsName/>
305
+ </except>
306
+ </anyName>
307
+ <zeroOrMore>
308
+ <choice>
309
+ <attribute>
310
+ <anyName/>
311
+ </attribute>
312
+ <text/>
313
+ <ref name="any"/>
314
+ </choice>
315
+ </zeroOrMore>
316
+ </element>
317
+ </zeroOrMore>
318
+ </define>
319
+
320
+ <define name="any">
321
+ <element>
322
+ <anyName/>
323
+ <zeroOrMore>
324
+ <choice>
325
+ <attribute>
326
+ <anyName/>
327
+ </attribute>
328
+ <text/>
329
+ <ref name="any"/>
330
+ </choice>
331
+ </zeroOrMore>
332
+ </element>
333
+ </define>
334
+
335
+ </grammar>