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.
- checksums.yaml +4 -4
- data/.github/workflows/docs.yml +63 -0
- data/.github/workflows/release.yml +8 -3
- data/.gitignore +11 -0
- data/.rubocop.yml +11 -6
- data/.rubocop_todo.yml +270 -0
- data/CHANGELOG.md +317 -0
- data/CLAUDE.md +139 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Gemfile +11 -10
- data/README.adoc +1929 -0
- data/Rakefile +11 -3
- data/docs/Gemfile +8 -0
- data/docs/_config.yml +23 -0
- data/docs/getting-started/index.adoc +75 -0
- data/docs/guides/error-handling.adoc +137 -0
- data/docs/guides/external-references.adoc +128 -0
- data/docs/guides/index.adoc +24 -0
- data/docs/guides/parsing-rnc.adoc +141 -0
- data/docs/guides/parsing-rng-xml.adoc +81 -0
- data/docs/guides/rng-to-rnc.adoc +101 -0
- data/docs/guides/validation.adoc +85 -0
- data/docs/index.adoc +52 -0
- data/docs/reference/api.adoc +126 -0
- data/docs/reference/cli.adoc +182 -0
- data/docs/understanding/architecture.adoc +58 -0
- data/docs/understanding/rng-vs-rnc.adoc +118 -0
- data/exe/rng +5 -0
- data/lib/rng/any_name.rb +28 -0
- data/lib/rng/attribute.rb +61 -5
- data/lib/rng/choice.rb +60 -0
- data/lib/rng/cli.rb +607 -0
- data/lib/rng/data.rb +32 -0
- data/lib/rng/datatype_declaration.rb +26 -0
- data/lib/rng/define.rb +56 -5
- data/lib/rng/div.rb +36 -0
- data/lib/rng/documentation.rb +9 -0
- data/lib/rng/element.rb +66 -18
- data/lib/rng/empty.rb +23 -0
- data/lib/rng/except.rb +62 -0
- data/lib/rng/external_ref.rb +28 -0
- data/lib/rng/external_ref_resolver.rb +582 -0
- data/lib/rng/foreign_attribute.rb +26 -0
- data/lib/rng/foreign_element.rb +33 -0
- data/lib/rng/grammar.rb +38 -0
- data/lib/rng/group.rb +62 -0
- data/lib/rng/include.rb +23 -0
- data/lib/rng/include_processor.rb +461 -0
- data/lib/rng/interleave.rb +58 -0
- data/lib/rng/list.rb +56 -0
- data/lib/rng/mixed.rb +58 -0
- data/lib/rng/name.rb +28 -0
- data/lib/rng/namespace_declaration.rb +47 -0
- data/lib/rng/namespaces.rb +15 -0
- data/lib/rng/not_allowed.rb +23 -0
- data/lib/rng/ns_name.rb +31 -0
- data/lib/rng/one_or_more.rb +58 -0
- data/lib/rng/optional.rb +58 -0
- data/lib/rng/param.rb +30 -0
- data/lib/rng/parent_ref.rb +28 -0
- data/lib/rng/parse_rnc.rb +26 -0
- data/lib/rng/parse_tree_processor.rb +695 -0
- data/lib/rng/pattern.rb +24 -0
- data/lib/rng/ref.rb +28 -0
- data/lib/rng/rnc_builder.rb +927 -0
- data/lib/rng/rnc_parser.rb +672 -115
- data/lib/rng/rnc_to_rng_converter.rb +1408 -0
- data/lib/rng/schema_preamble.rb +73 -0
- data/lib/rng/schema_validator.rb +1622 -0
- data/lib/rng/start.rb +57 -6
- data/lib/rng/test_suite_parser.rb +168 -0
- data/lib/rng/text.rb +29 -0
- data/lib/rng/to_rnc.rb +24 -0
- data/lib/rng/value.rb +28 -0
- data/lib/rng/version.rb +1 -1
- data/lib/rng/zero_or_more.rb +58 -0
- data/lib/rng.rb +80 -5
- data/rng.gemspec +19 -19
- data/scripts/extract_spectest_resources.rb +96 -0
- data/spec/fixtures/compacttest.xml +2511 -0
- data/spec/fixtures/external/circular_a.rng +7 -0
- data/spec/fixtures/external/circular_b.rng +7 -0
- data/spec/fixtures/external/circular_main.rng +7 -0
- data/spec/fixtures/external/external_ref_lib.rng +7 -0
- data/spec/fixtures/external/external_ref_main.rng +7 -0
- data/spec/fixtures/external/include_lib.rng +7 -0
- data/spec/fixtures/external/include_main.rng +3 -0
- data/spec/fixtures/external/nested_chain.rng +6 -0
- data/spec/fixtures/external/nested_leaf.rng +7 -0
- data/spec/fixtures/external/nested_mid.rng +8 -0
- data/spec/fixtures/metanorma/3gpp.rnc +35 -0
- data/spec/fixtures/metanorma/3gpp.rng +105 -0
- data/spec/fixtures/metanorma/basicdoc.rnc +11 -0
- data/spec/fixtures/metanorma/bipm.rnc +148 -0
- data/spec/fixtures/metanorma/bipm.rng +376 -0
- data/spec/fixtures/metanorma/bsi.rnc +104 -0
- data/spec/fixtures/metanorma/bsi.rng +332 -0
- data/spec/fixtures/metanorma/csa.rnc +45 -0
- data/spec/fixtures/metanorma/csa.rng +131 -0
- data/spec/fixtures/metanorma/csd.rnc +43 -0
- data/spec/fixtures/metanorma/csd.rng +132 -0
- data/spec/fixtures/metanorma/gbstandard.rnc +99 -0
- data/spec/fixtures/metanorma/gbstandard.rng +316 -0
- data/spec/fixtures/metanorma/iec.rnc +49 -0
- data/spec/fixtures/metanorma/iec.rng +193 -0
- data/spec/fixtures/metanorma/ietf.rnc +275 -0
- data/spec/fixtures/metanorma/ietf.rng +925 -0
- data/spec/fixtures/metanorma/iho.rnc +58 -0
- data/spec/fixtures/metanorma/iho.rng +179 -0
- data/spec/fixtures/metanorma/isodoc.rnc +873 -0
- data/spec/fixtures/metanorma/isodoc.rng +2704 -0
- data/spec/fixtures/metanorma/isostandard-amd.rnc +43 -0
- data/spec/fixtures/metanorma/isostandard-amd.rng +108 -0
- data/spec/fixtures/metanorma/isostandard.rnc +166 -0
- data/spec/fixtures/metanorma/isostandard.rng +494 -0
- data/spec/fixtures/metanorma/itu.rnc +122 -0
- data/spec/fixtures/metanorma/itu.rng +377 -0
- data/spec/fixtures/metanorma/m3d.rnc +41 -0
- data/spec/fixtures/metanorma/m3d.rng +122 -0
- data/spec/fixtures/metanorma/mpfd.rnc +36 -0
- data/spec/fixtures/metanorma/mpfd.rng +95 -0
- data/spec/fixtures/metanorma/nist.rnc +77 -0
- data/spec/fixtures/metanorma/nist.rng +216 -0
- data/spec/fixtures/metanorma/ogc.rnc +51 -0
- data/spec/fixtures/metanorma/ogc.rng +151 -0
- data/spec/fixtures/metanorma/reqt.rnc +6 -0
- data/spec/fixtures/metanorma/rsd.rnc +36 -0
- data/spec/fixtures/metanorma/rsd.rng +95 -0
- data/spec/fixtures/metanorma/un.rnc +103 -0
- data/spec/fixtures/metanorma/un.rng +367 -0
- data/spec/fixtures/rnc/address_book.rnc +10 -0
- data/spec/fixtures/rnc/base.rnc +4 -0
- data/spec/fixtures/rnc/complex_example.rnc +61 -0
- data/spec/fixtures/rnc/grammar_with_trailing.rnc +8 -0
- data/spec/fixtures/rnc/main_include_trailing.rnc +3 -0
- data/spec/fixtures/rnc/main_with_include.rnc +5 -0
- data/spec/fixtures/rnc/test_augment.rnc +10 -0
- data/spec/fixtures/rnc/test_isodoc_simple.rnc +9 -0
- data/spec/fixtures/rnc/top_level_include.rnc +8 -0
- data/spec/fixtures/rng/address_book.rng +20 -0
- data/spec/fixtures/rng/relaxng.rng +335 -0
- data/spec/fixtures/rng/testSuite.rng +163 -0
- data/spec/fixtures/spectest.xml +6845 -0
- data/spec/fixtures/spectest_external/case_10_4.7/x +3 -0
- data/spec/fixtures/spectest_external/case_10_4.7/y +7 -0
- data/spec/fixtures/spectest_external/case_11_4.7/x +3 -0
- data/spec/fixtures/spectest_external/case_12_4.7/x +3 -0
- data/spec/fixtures/spectest_external/case_13_4.7/x +3 -0
- data/spec/fixtures/spectest_external/case_13_4.7/y +3 -0
- data/spec/fixtures/spectest_external/case_14_4.7/x +7 -0
- data/spec/fixtures/spectest_external/case_15_4.7/x +7 -0
- data/spec/fixtures/spectest_external/case_16_4.7/x +5 -0
- data/spec/fixtures/spectest_external/case_17_4.7/x +5 -0
- data/spec/fixtures/spectest_external/case_18_4.7/x +7 -0
- data/spec/fixtures/spectest_external/case_19_4.7/level1.rng +9 -0
- data/spec/fixtures/spectest_external/case_19_4.7/level2.rng +7 -0
- data/spec/fixtures/spectest_external/case_1_4.5/sub1/x +3 -0
- data/spec/fixtures/spectest_external/case_1_4.5/sub3/x +3 -0
- data/spec/fixtures/spectest_external/case_1_4.5/x +3 -0
- data/spec/fixtures/spectest_external/case_20_4.6/x +3 -0
- data/spec/fixtures/spectest_external/case_2_4.5/x +3 -0
- data/spec/fixtures/spectest_external/case_3_4.6/x +3 -0
- data/spec/fixtures/spectest_external/case_4_4.6/x +3 -0
- data/spec/fixtures/spectest_external/case_5_4.6/x +1 -0
- data/spec/fixtures/spectest_external/case_6_4.6/x +5 -0
- data/spec/fixtures/spectest_external/case_7_4.6/x +1 -0
- data/spec/fixtures/spectest_external/case_7_4.6/y +1 -0
- data/spec/fixtures/spectest_external/case_8_4.7/x +7 -0
- data/spec/fixtures/spectest_external/case_9_4.7/x +7 -0
- data/spec/fixtures/spectest_external/resources.json +149 -0
- data/spec/rng/advanced_rnc_spec.rb +101 -0
- data/spec/rng/compacttest_spec.rb +197 -0
- data/spec/rng/datatype_declaration_spec.rb +28 -0
- data/spec/rng/div_spec.rb +207 -0
- data/spec/rng/external_ref_resolver_spec.rb +122 -0
- data/spec/rng/metanorma_conversion_spec.rb +159 -0
- data/spec/rng/namespace_declaration_spec.rb +60 -0
- data/spec/rng/namespace_support_spec.rb +199 -0
- data/spec/rng/rnc_parser_spec.rb +501 -23
- data/spec/rng/rnc_roundtrip_spec.rb +135 -0
- data/spec/rng/rng_generation_spec.rb +288 -0
- data/spec/rng/roundtrip_spec.rb +342 -0
- data/spec/rng/schema_preamble_spec.rb +145 -0
- data/spec/rng/schema_spec.rb +125 -172
- data/spec/rng/spectest_spec.rb +273 -0
- data/spec/rng_spec.rb +2 -2
- data/spec/spec_helper.rb +7 -9
- metadata +188 -8
- data/lib/rng/builder.rb +0 -158
- data/lib/rng/rng_parser.rb +0 -107
- data/lib/rng/schema.rb +0 -18
- data/spec/rng/rng_parser_spec.rb +0 -102
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe 'Namespace Support' do
|
|
6
|
+
describe 'legacy compatibility' do
|
|
7
|
+
it 'parses default namespace (old format)' do
|
|
8
|
+
rnc = 'default namespace = "http://example.com"
|
|
9
|
+
element foo { empty }'
|
|
10
|
+
grammar = Rng.parse_rnc(rnc)
|
|
11
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
12
|
+
expect(grammar.start).not_to be_nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'generates RNG XML with default namespace' do
|
|
16
|
+
rnc = 'default namespace = "http://example.com"
|
|
17
|
+
element foo { empty }'
|
|
18
|
+
grammar = Rng.parse_rnc(rnc)
|
|
19
|
+
xml = grammar.to_xml
|
|
20
|
+
|
|
21
|
+
expect(xml).to include('ns="http://example.com"')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'preserves namespace in element' do
|
|
25
|
+
rnc = 'default namespace = "http://example.com"
|
|
26
|
+
element foo { empty }'
|
|
27
|
+
grammar = Rng.parse_rnc(rnc)
|
|
28
|
+
xml = grammar.to_xml
|
|
29
|
+
|
|
30
|
+
expect(xml).to include('<grammar')
|
|
31
|
+
expect(xml).to include('ns="http://example.com"')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe 'new namespace declarations' do
|
|
36
|
+
it 'parses prefixed namespace' do
|
|
37
|
+
rnc = 'namespace eg = "http://example.com"
|
|
38
|
+
element foo { empty }'
|
|
39
|
+
grammar = Rng.parse_rnc(rnc)
|
|
40
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'parses default namespace with prefix' do
|
|
44
|
+
rnc = 'default namespace rng = "http://relaxng.org/ns/structure/1.0"
|
|
45
|
+
element foo { empty }'
|
|
46
|
+
grammar = Rng.parse_rnc(rnc)
|
|
47
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'parses multiple namespace declarations' do
|
|
51
|
+
rnc = <<~RNC
|
|
52
|
+
default namespace rng = "http://relaxng.org/ns/structure/1.0"
|
|
53
|
+
namespace local = ""
|
|
54
|
+
namespace eg = "http://example.com"
|
|
55
|
+
|
|
56
|
+
start = element foo { empty }
|
|
57
|
+
RNC
|
|
58
|
+
grammar = Rng.parse_rnc(rnc)
|
|
59
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
60
|
+
expect(grammar.start).not_to be_nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'generates RNG XML with prefixed namespaces' do
|
|
64
|
+
rnc = 'namespace eg = "http://example.com"
|
|
65
|
+
element eg:foo { empty }'
|
|
66
|
+
grammar = Rng.parse_rnc(rnc)
|
|
67
|
+
xml = grammar.to_xml
|
|
68
|
+
|
|
69
|
+
expect(xml).to include('ns="http://example.com"')
|
|
70
|
+
expect(xml).to include('name="foo"')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'resolves namespace prefix to URI in elements' do
|
|
74
|
+
rnc = 'namespace eg = "http://example.com"
|
|
75
|
+
element eg:bar { empty }'
|
|
76
|
+
grammar = Rng.parse_rnc(rnc)
|
|
77
|
+
xml = grammar.to_xml
|
|
78
|
+
|
|
79
|
+
expect(xml).to include('ns="http://example.com"')
|
|
80
|
+
expect(xml).not_to include('ns="eg"')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'resolves namespace prefix to URI in attributes' do
|
|
84
|
+
rnc = 'namespace eg = "http://example.com"
|
|
85
|
+
element foo { attribute eg:bar { text } }'
|
|
86
|
+
grammar = Rng.parse_rnc(rnc)
|
|
87
|
+
xml = grammar.to_xml
|
|
88
|
+
|
|
89
|
+
expect(xml).to include('ns="http://example.com"')
|
|
90
|
+
expect(xml).to include('name="bar"')
|
|
91
|
+
expect(xml).not_to include('ns="eg"')
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
describe 'datatype library support' do
|
|
96
|
+
it 'parses datatype library declaration' do
|
|
97
|
+
rnc = 'datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
98
|
+
element foo { xsd:string }'
|
|
99
|
+
grammar = Rng.parse_rnc(rnc)
|
|
100
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'generates RNG XML with datatype library' do
|
|
104
|
+
rnc = 'datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
105
|
+
element foo { xsd:string }'
|
|
106
|
+
grammar = Rng.parse_rnc(rnc)
|
|
107
|
+
xml = grammar.to_xml
|
|
108
|
+
|
|
109
|
+
expect(xml).to include('datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"')
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'applies datatype library to data elements' do
|
|
113
|
+
rnc = 'datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
114
|
+
element foo { attribute bar { xsd:integer } }'
|
|
115
|
+
grammar = Rng.parse_rnc(rnc)
|
|
116
|
+
xml = grammar.to_xml
|
|
117
|
+
|
|
118
|
+
expect(xml).to include('type="integer"')
|
|
119
|
+
expect(xml).to include('datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"')
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
describe 'combined declarations' do
|
|
124
|
+
it 'handles namespace and datatype together' do
|
|
125
|
+
rnc = <<~RNC
|
|
126
|
+
namespace eg = "http://example.com"
|
|
127
|
+
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
128
|
+
|
|
129
|
+
start = element eg:person {
|
|
130
|
+
attribute age { xsd:integer }
|
|
131
|
+
}
|
|
132
|
+
RNC
|
|
133
|
+
grammar = Rng.parse_rnc(rnc)
|
|
134
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
135
|
+
expect(grammar.start).not_to be_nil
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it 'generates complete RNG XML with multiple declarations' do
|
|
139
|
+
rnc = <<~RNC
|
|
140
|
+
namespace eg = "http://example.com"
|
|
141
|
+
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
142
|
+
|
|
143
|
+
start = element eg:person { empty }
|
|
144
|
+
RNC
|
|
145
|
+
grammar = Rng.parse_rnc(rnc)
|
|
146
|
+
xml = grammar.to_xml
|
|
147
|
+
|
|
148
|
+
expect(xml).to include('ns="http://example.com"')
|
|
149
|
+
expect(xml).to include('datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it 'handles multiple prefixed namespaces' do
|
|
153
|
+
rnc = <<~RNC
|
|
154
|
+
namespace eg1 = "http://example.com/ns1"
|
|
155
|
+
namespace eg2 = "http://example.com/ns2"
|
|
156
|
+
|
|
157
|
+
start = element eg1:foo {
|
|
158
|
+
element eg2:bar { empty }
|
|
159
|
+
}
|
|
160
|
+
RNC
|
|
161
|
+
grammar = Rng.parse_rnc(rnc)
|
|
162
|
+
xml = grammar.to_xml
|
|
163
|
+
|
|
164
|
+
expect(xml).to include('ns="http://example.com/ns1"')
|
|
165
|
+
expect(xml).to include('ns="http://example.com/ns2"')
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
describe 'edge cases' do
|
|
170
|
+
it 'handles empty namespace URI' do
|
|
171
|
+
rnc = 'namespace local = ""
|
|
172
|
+
element local:foo { empty }'
|
|
173
|
+
grammar = Rng.parse_rnc(rnc)
|
|
174
|
+
xml = grammar.to_xml
|
|
175
|
+
|
|
176
|
+
expect(xml).to include('ns=""')
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it 'handles schemas with only preamble' do
|
|
180
|
+
rnc = <<~RNC
|
|
181
|
+
namespace eg = "http://example.com"
|
|
182
|
+
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
|
|
183
|
+
|
|
184
|
+
element foo { empty }
|
|
185
|
+
RNC
|
|
186
|
+
grammar = Rng.parse_rnc(rnc)
|
|
187
|
+
expect(grammar).to be_a(Rng::Grammar)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it 'handles default namespace without elements using prefix' do
|
|
191
|
+
rnc = 'default namespace = "http://example.com"
|
|
192
|
+
element foo { attribute bar { text } }'
|
|
193
|
+
grammar = Rng.parse_rnc(rnc)
|
|
194
|
+
xml = grammar.to_xml
|
|
195
|
+
|
|
196
|
+
expect(xml).to include('ns="http://example.com"')
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|