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
@@ -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