svg_conform 0.2.6 → 0.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f10bc419be4fc98db66f773730223b021d90914c88fd6ce7421015c5a8a2be84
4
- data.tar.gz: e70f5fe9224c41bf35e02eea2fbfa8b08fac28ceb997cb58529ca6b1a521626b
3
+ metadata.gz: c570e54c0025259102584f034e789bcd18b4487d2954b858f8941c1095a7034a
4
+ data.tar.gz: 96aae95705ee4769216dd82a1b694d471f0dd348ae15228282f925006f66e558
5
5
  SHA512:
6
- metadata.gz: 8706aaee4a68d144e8edd9a5bd031eb2f5b8ca75ad5796acc85a58ff10a3fde582ea47e85cc8c41463eff42a66204148429ac3297fa2aef6bc0f022ab4a7fd5d
7
- data.tar.gz: 4de2cd0a001c640514e4d7622c2225cce1dad6f6849706d6b8bbe4b9cbab1a12ff8db609c1af3313c725729f51d92d047dc02da7b79af0ca0bb2e8d485151b42
6
+ metadata.gz: 6314a0c0a4bd5f2cdf3a04e95852173382ccb33c9f4a2683cc38809a1a0afed53ea1febb809a12803e417769f82fed9a538ea7ee3e110f50b37bb7814ab0b541
7
+ data.tar.gz: 9f3f51c1f050447a6d84506e59fc52d3efaec2616deea94eb6e596c8255969a843bd69a8feebecb318308211937a81b85d079aa43a9dc9db9dd0edd045536a52
@@ -18,4 +18,4 @@ jobs:
18
18
  # tests-passed dispatch is refused on pull_request runs; releases come from push
19
19
  cascade: ${{ github.event_name != 'pull_request' }}
20
20
  secrets:
21
- pat_token: ${{ secrets.GITHUB_TOKEN }}
21
+ pat_token: ${{ secrets.CLARICLE_CI_PAT_TOKEN }}
data/Gemfile CHANGED
@@ -9,9 +9,8 @@ gem "canon", "~>0.1.10"
9
9
  gem "leptris", ">= 1.9.399.0"
10
10
  gem "lutaml-model", "~> 0.8.155" # rubygems line; drop the git-main float
11
11
  gem "moxml", "~> 0.6.0"
12
- # Temporary pin on the lens_core v1 freeze candidate (claricle/lens_core#5 merge commit, after final-review fixes);
13
- # replace with a released gem before release.
14
- gem "lens_core", git: "https://github.com/claricle/lens_core.git", ref: "d00a6e8f7c0b5365a76b43e256a2f41ef9aee4ef"
12
+ # lens_core is optional at runtime (#121); development and CI use the released v1 gem.
13
+ gem "lens_core", "~> 0.1"
15
14
  gem "nokogiri", "~> 1.16"
16
15
  gem "openssl", "~> 3.0"
17
16
  gem "rake"
data/Gemfile.lock CHANGED
@@ -1,10 +1,3 @@
1
- GIT
2
- remote: https://github.com/claricle/lens_core.git
3
- revision: d00a6e8f7c0b5365a76b43e256a2f41ef9aee4ef
4
- ref: d00a6e8f7c0b5365a76b43e256a2f41ef9aee4ef
5
- specs:
6
- lens_core (0.1.0)
7
-
8
1
  PATH
9
2
  remote: .
10
3
  specs:
@@ -15,6 +8,7 @@ PATH
15
8
  rainbow
16
9
  table_tennis
17
10
  thor
11
+ yeptris (~> 0.6.36)
18
12
 
19
13
  GEM
20
14
  remote: https://rubygems.org/
@@ -39,72 +33,75 @@ GEM
39
33
  ffi (1.17.4-arm-linux-gnu)
40
34
  ffi (1.17.4-arm-linux-musl)
41
35
  ffi (1.17.4-arm64-darwin)
42
- ffi (1.17.4-x64-mingw-ucrt)
43
36
  ffi (1.17.4-x86_64-darwin)
44
37
  ffi (1.17.4-x86_64-linux-gnu)
45
38
  ffi (1.17.4-x86_64-linux-musl)
46
39
  json (3.1.0)
47
40
  language_server-protocol (3.17.0.6)
48
- leptris (1.9.399.0-aarch64-linux)
49
- ffi (~> 1.15)
50
- leptris (1.9.399.0-aarch64-linux-musl)
41
+ lens_core (0.1.0)
42
+ leptris (1.9.416.0-aarch64-linux)
51
43
  ffi (~> 1.15)
52
- leptris (1.9.399.0-arm-linux)
44
+ leptris (1.9.416.0-aarch64-linux-musl)
53
45
  ffi (~> 1.15)
54
- leptris (1.9.399.0-arm-linux-musl)
46
+ leptris (1.9.416.0-arm-linux)
55
47
  ffi (~> 1.15)
56
- leptris (1.9.399.0-arm64-darwin)
48
+ leptris (1.9.416.0-arm-linux-musl)
57
49
  ffi (~> 1.15)
58
- leptris (1.9.399.0-x64-mingw-ucrt)
50
+ leptris (1.9.416.0-arm64-darwin)
59
51
  ffi (~> 1.15)
60
- leptris (1.9.399.0-x86_64-darwin)
52
+ leptris (1.9.416.0-x86_64-darwin)
61
53
  ffi (~> 1.15)
62
- leptris (1.9.399.0-x86_64-linux)
54
+ leptris (1.9.416.0-x86_64-linux)
63
55
  ffi (~> 1.15)
64
- leptris (1.9.399.0-x86_64-linux-musl)
56
+ leptris (1.9.416.0-x86_64-linux-musl)
65
57
  ffi (~> 1.15)
66
58
  lint_roller (1.1.0)
67
59
  liquid (5.14.0)
68
60
  bigdecimal
69
61
  strscan (>= 3.1.1)
70
- lutaml-model (0.8.155)
62
+ lutaml-model (0.8.174)
71
63
  base64 (>= 0.1.1)
72
64
  bigdecimal
73
65
  canon
74
66
  concurrent-ruby
75
67
  liquid (>= 4.0, < 6.0)
76
- moxml (>= 0.5.139, < 0.7)
68
+ moxml (~> 0.6.1)
77
69
  ostruct
78
70
  rubyzip (~> 3.7)
79
71
  thor (~> 1.4)
80
72
  memo_wise (1.13.0)
81
- moxml (0.6.1)
82
- nokogiri (1.19.4-aarch64-linux-gnu)
83
- racc (~> 1.4)
84
- nokogiri (1.19.4-aarch64-linux-musl)
73
+ moxml (0.6.4)
74
+ nokogiri (1.19.7-aarch64-linux-gnu)
85
75
  racc (~> 1.4)
86
- nokogiri (1.19.4-arm-linux-gnu)
76
+ nokogiri (1.19.7-aarch64-linux-musl)
87
77
  racc (~> 1.4)
88
- nokogiri (1.19.4-arm-linux-musl)
78
+ nokogiri (1.19.7-arm-linux-gnu)
89
79
  racc (~> 1.4)
90
- nokogiri (1.19.4-arm64-darwin)
80
+ nokogiri (1.19.7-arm-linux-musl)
91
81
  racc (~> 1.4)
92
- nokogiri (1.19.4-x64-mingw-ucrt)
82
+ nokogiri (1.19.7-arm64-darwin)
93
83
  racc (~> 1.4)
94
- nokogiri (1.19.4-x86_64-darwin)
84
+ nokogiri (1.19.7-x86_64-darwin)
95
85
  racc (~> 1.4)
96
- nokogiri (1.19.4-x86_64-linux-gnu)
86
+ nokogiri (1.19.7-x86_64-linux-gnu)
97
87
  racc (~> 1.4)
98
- nokogiri (1.19.4-x86_64-linux-musl)
88
+ nokogiri (1.19.7-x86_64-linux-musl)
99
89
  racc (~> 1.4)
100
90
  openssl (3.3.3)
101
91
  ostruct (0.6.3)
102
92
  paint (2.3.0)
103
93
  parallel (2.3.0)
104
- parser (3.3.12.0)
94
+ parser (3.3.13.0)
105
95
  ast (~> 2.4.1)
106
96
  racc
107
- prism (1.9.0)
97
+ prism (2.1.0-aarch64-linux-gnu)
98
+ prism (2.1.0-aarch64-linux-musl)
99
+ prism (2.1.0-arm-linux-gnu)
100
+ prism (2.1.0-arm-linux-musl)
101
+ prism (2.1.0-arm64-darwin)
102
+ prism (2.1.0-x86_64-darwin)
103
+ prism (2.1.0-x86_64-linux-gnu)
104
+ prism (2.1.0-x86_64-linux-musl)
108
105
  racc (1.8.1)
109
106
  rainbow (3.1.1)
110
107
  rake (13.4.2)
@@ -113,16 +110,16 @@ GEM
113
110
  rspec-core (~> 3.13.0)
114
111
  rspec-expectations (~> 3.13.0)
115
112
  rspec-mocks (~> 3.13.0)
116
- rspec-core (3.13.6)
113
+ rspec-core (3.13.7)
117
114
  rspec-support (~> 3.13.0)
118
- rspec-expectations (3.13.5)
115
+ rspec-expectations (3.13.6)
119
116
  diff-lcs (>= 1.2.0, < 2.0)
120
117
  rspec-support (~> 3.13.0)
121
- rspec-mocks (3.13.8)
118
+ rspec-mocks (3.13.9)
122
119
  diff-lcs (>= 1.2.0, < 2.0)
123
120
  rspec-support (~> 3.13.0)
124
- rspec-support (3.13.7)
125
- rubocop (1.92.1)
121
+ rspec-support (3.13.8)
122
+ rubocop (1.92.2)
126
123
  json (>= 2.3)
127
124
  language_server-protocol (~> 3.17.0.2)
128
125
  lint_roller (~> 1.1.0)
@@ -133,9 +130,9 @@ GEM
133
130
  rubocop-ast (>= 1.49.0, < 2.0)
134
131
  ruby-progressbar (~> 1.7)
135
132
  unicode-display_width (>= 2.4.0, < 4.0)
136
- rubocop-ast (1.50.0)
133
+ rubocop-ast (1.51.0)
137
134
  parser (>= 3.3.7.2)
138
- prism (~> 1.7)
135
+ prism (>= 1.7)
139
136
  rubocop-performance (1.27.0)
140
137
  lint_roller (~> 1.1)
141
138
  rubocop (>= 1.89.0, < 2.0)
@@ -163,24 +160,40 @@ GEM
163
160
  unicode-name (1.15.1)
164
161
  unicode-types (~> 1.12)
165
162
  unicode-types (1.12.0)
163
+ yeptris (0.6.61.1-aarch64-linux)
164
+ ffi (~> 1.15)
165
+ yeptris (0.6.61.1-aarch64-linux-musl)
166
+ ffi (~> 1.15)
167
+ yeptris (0.6.61.1-arm-linux-eabihf)
168
+ ffi (~> 1.15)
169
+ yeptris (0.6.61.1-arm-linux-musleabihf)
170
+ ffi (~> 1.15)
171
+ yeptris (0.6.61.1-arm64-darwin)
172
+ ffi (~> 1.15)
173
+ yeptris (0.6.61.1-x86_64-darwin)
174
+ ffi (~> 1.15)
175
+ yeptris (0.6.61.1-x86_64-linux)
176
+ ffi (~> 1.15)
177
+ yeptris (0.6.61.1-x86_64-linux-musl)
178
+ ffi (~> 1.15)
166
179
 
167
180
  PLATFORMS
168
181
  aarch64-linux
169
182
  aarch64-linux-gnu
170
183
  aarch64-linux-musl
171
184
  arm-linux
185
+ arm-linux-eabihf
172
186
  arm-linux-gnu
173
187
  arm-linux-musl
188
+ arm-linux-musleabihf
174
189
  arm64-darwin
175
- x64-mingw-ucrt
176
190
  x86_64-darwin
177
- x86_64-linux
178
191
  x86_64-linux-gnu
179
192
  x86_64-linux-musl
180
193
 
181
194
  DEPENDENCIES
182
195
  canon (~> 0.1.10)
183
- lens_core!
196
+ lens_core (~> 0.1)
184
197
  leptris (>= 1.9.399.0)
185
198
  lutaml-model (~> 0.8.155)
186
199
  moxml (~> 0.6.0)
@@ -194,79 +207,5 @@ DEPENDENCIES
194
207
  rubocop-rspec
195
208
  svg_conform!
196
209
 
197
- CHECKSUMS
198
- ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
199
- base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
200
- bigdecimal (4.1.3) sha256=61ebe1e5e559bdc3cc6f2c0ee7f427321fc838f59611c294356eb04d6e21cf66
201
- canon (0.1.23) sha256=502646c0d50cd9e17c8867d24e5808b4adb85230482ad02157f4d4f161f74cc0
202
- concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1
203
- csv (3.3.7) sha256=15a3f16f6628da8664d455eb634e7f22031bcf53044923caf56975109e71b9f8
204
- diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
205
- ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df
206
- ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39
207
- ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564
208
- ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95
209
- ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b
210
- ffi (1.17.4-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35
211
- ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496
212
- ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
213
- ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e
214
- json (3.1.0) sha256=3ce7ccf8fde58960177a3a756c31f292a4c1e1dedee884547096a5b0604e3bd8
215
- language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
216
- lens_core (0.1.0)
217
- leptris (1.9.399.0-aarch64-linux) sha256=f96125c2ceb69a48c9576dbba33d20466fd27b017ab7f54041f6bf37f0d3dc78
218
- leptris (1.9.399.0-aarch64-linux-musl) sha256=feede158d84c3a46ac11da49e99ba2108a0b85a3e7113e056fa33e88f1dc694f
219
- leptris (1.9.399.0-arm-linux) sha256=39046099c3d16e429966a79e5d509e120ad839bb41f3a1ed8183f0174f5a22fb
220
- leptris (1.9.399.0-arm-linux-musl) sha256=b7526a73a8b06843228010fc03c00c801241ca591b1504aaf09fae8a12bb7bdb
221
- leptris (1.9.399.0-arm64-darwin) sha256=f2c3e513cc31026307d4a28a92d97624fdb9dc1a67ef098a9586e0e76f250097
222
- leptris (1.9.399.0-x64-mingw-ucrt) sha256=b3aced983a662307e930eed3d408d844b82d947d63f80dc6e4c48fec962d6a7b
223
- leptris (1.9.399.0-x86_64-darwin) sha256=428c84f7c2e763bc2db614b1cafb49792852cd781d2c353e27206bf4aea3ce1c
224
- leptris (1.9.399.0-x86_64-linux) sha256=ae235c244456b8949920d10c21bf9d8f01cf05fb6900c41bc2ef2531e01e86a8
225
- leptris (1.9.399.0-x86_64-linux-musl) sha256=f7cf698c4858e132a19bf00667587ad96add7c35b3c629cbe97fdb20ef8099ce
226
- lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
227
- liquid (5.14.0) sha256=e1020c2b2ee58c7a4d3bfdc7a331537bd27a783353748bff0bf27c6ac0c17065
228
- lutaml-model (0.8.155) sha256=3d90f2fb4fdf41a42d4a05b62b3f6644b433070b82291a9371deaa8e68a1e02d
229
- memo_wise (1.13.0) sha256=30220c38c4cef410849bc73553c58664dc2c91c6379e4a1df22aea02358b716b
230
- moxml (0.6.1) sha256=5b7677258bbad372f0725a421f8adeae37b65d6f7871da2747e2c1906cdac7ea
231
- nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
232
- nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
233
- nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca
234
- nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb
235
- nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527
236
- nokogiri (1.19.4-x64-mingw-ucrt) sha256=051da97b8eccfdb5444fed40246a35e10d7298b9efe759b4cd25455ea04c587e
237
- nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551
238
- nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
239
- nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
240
- openssl (3.3.3) sha256=d46902138f2987c13122fab826030a11c2bb9b8a16394215cbfc5062c5e2d335
241
- ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
242
- paint (2.3.0) sha256=327d623e4038619d5bd99ae5db07973859cd78400c7f0329eea283cef8e83be5
243
- parallel (2.3.0) sha256=f75a3e904101ce6a1ccb6b8dc800cbafd42166d83330192438dcf29395167a6f
244
- parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
245
- prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
246
- racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
247
- rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
248
- rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
249
- regexp_parser (2.13.1) sha256=5aedb6b7c35688f51e86eef17a15374dfd287c83f4ca644b2c5f3ec50a33b44b
250
- rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
251
- rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
252
- rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
253
- rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
254
- rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
255
- rubocop (1.92.1) sha256=a905381a5344215a79abcfe80f6c94366447e6a55347c9a525b5a24990e33f62
256
- rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
257
- rubocop-performance (1.27.0) sha256=eeeb1374d062a368ee1c787b70eb0b0cc4b184cb1f8565f424760946146d61ce
258
- rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d
259
- rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
260
- ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
261
- rubyzip (3.7.0) sha256=65c19294da75297a939006f3516deacc33185fbd721ff1954f7a231db6d3e121
262
- strscan (3.1.8) sha256=aae2db611a225559f21ffbb71765c9a4e60fd262534a9ea84f4f11c7f32f679e
263
- svg_conform (0.2.6)
264
- table_tennis (1.0.0) sha256=955f76ca4debd42ee88682af8d4554a74d533c89de4f1581bc37855b15faa956
265
- thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
266
- unicode-display_width (3.3.0) sha256=4b7aa66a4b11db50f6f7e98411215cd0dd10eaecb665d36eec5bcacb3fa0b613
267
- unicode-emoji (4.3.0) sha256=11c02fa73290378c066bb0562cd4c87d8e1b706fbbe0059ca12746a4244de8ce
268
- unicode-name (1.15.1) sha256=b8f2e3ca14bc24799f84a4f74d43a3612d02a051700d88bc6ca8e3bd53cda3f6
269
- unicode-types (1.12.0) sha256=7e26a4352cecc2a50325a3793df834b732581ca9f25c5e29f46f3378934363f6
270
-
271
210
  BUNDLED WITH
272
211
  2.7.2
@@ -67,7 +67,7 @@ requirements:
67
67
  attributes: ["label", "class", "id", "role", "fill", "style", "transform", "fill-rule", "visibility", "base", "lang", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "data-name", "clip-path", "mask"]
68
68
  allowed_children: ["title", "path", "rect", "circle", "line", "ellipse", "polyline", "polygon", "solidColor", "textArea", "text", "g", "defs", "use", "a", "tspan", "desc", "image"]
69
69
  - tag: "defs"
70
- attributes: ["id", "role", "fill", "fill-rule", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space"]
70
+ attributes: ["id", "role", "fill", "fill-rule", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "clip-path", "mask"]
71
71
  allowed_children: ["title", "path", "rect", "circle", "line", "ellipse", "polyline", "polygon", "solidColor", "textArea", "text", "g", "defs", "use", "a", "tspan", "desc", "style", "clipPath", "linearGradient", "radialGradient", "pattern", "marker", "mask", "filter", "image"]
72
72
  - tag: "clipPath"
73
73
  attributes: ["id", "clipPathUnits", "class", "style"]
@@ -100,7 +100,7 @@ requirements:
100
100
  attributes: ["x", "y", "href", "xlink:href", "id", "role", "fill", "transform", "fill-rule", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "clip-path", "mask"]
101
101
  allowed_children: ["title", "desc"]
102
102
  - tag: "a"
103
- attributes: ["id", "role", "fill", "transform", "fill-rule", "target", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "title"]
103
+ attributes: ["id", "role", "fill", "transform", "fill-rule", "target", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "title", "clip-path", "mask"]
104
104
  allowed_children: ["title", "path", "rect", "circle", "line", "ellipse", "polyline", "polygon", "solidColor", "textArea", "text", "g", "defs", "use", "a", "tspan", "desc"]
105
105
  - tag: "tspan"
106
106
  attributes: ["x", "y", "id", "role", "fill", "fill-rule", "base", "lang", "class", "rel", "rev", "typeof", "content", "datatype", "resource", "about", "property", "space", "letter-spacing"]
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "thor"
4
4
  require "json"
5
- require "yaml"
6
5
  require "paint"
7
6
  require_relative "commands/check"
8
7
  require_relative "commands/svgcheck"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "yaml"
4
-
5
3
  module SvgConform
6
4
  module ExternalCheckers
7
5
  module Svgcheck
@@ -26,7 +24,7 @@ module SvgConform
26
24
 
27
25
  def load_mapping_config
28
26
  @mapping_config = if File.exist?(@mapping_config_path)
29
- YAML.load_file(@mapping_config_path)
27
+ SvgConform::YamlIO.load_file(@mapping_config_path)
30
28
  else
31
29
  # Fallback to empty config if file doesn't exist
32
30
  {
@@ -39,8 +39,10 @@ module SvgConform
39
39
  raise ArgumentError, "Configuration file not found: #{path}"
40
40
  end
41
41
 
42
- hash = YAML.safe_load_file(path, permitted_classes: [Symbol],
43
- permitted_symbols: [], aliases: true)
42
+ hash = SvgConform::YamlIO.safe_load_file(
43
+ path, permitted_classes: [Symbol], permitted_symbols: [],
44
+ aliases: true
45
+ )
44
46
  new(hash)
45
47
  end
46
48
 
@@ -115,8 +115,7 @@ column_number: nil)
115
115
 
116
116
  # Export as YAML for easy inspection
117
117
  def to_yaml
118
- require "yaml"
119
- to_h.to_yaml
118
+ SvgConform::YamlIO.dump(to_h)
120
119
  end
121
120
 
122
121
  # Export as JSON for programmatic processing
@@ -18,13 +18,38 @@ module SvgConform
18
18
  end
19
19
 
20
20
  # Add an error to the context
21
+ #
22
+ # A declared severity of :warning is a quality advisory (see
23
+ # TextAsPathRequirement) and must surface as a warning, not an error:
24
+ # otherwise schema-valid documents are reported as corrupt by consumers
25
+ # that log result.errors (metanorma, metanorma-pdfa#106). Other
26
+ # severities keep their existing routing: :validity_error stays out of
27
+ # the main error bucket, and :info remains in errors because the style
28
+ # remediation flow consumes it there.
21
29
  def add_error(node:, message:, rule: nil, requirement: nil,
22
30
  requirement_id: nil, severity: nil, fix: nil, data: {})
23
31
  # Support both old rule system and new requirements system
24
32
  rule_or_requirement = requirement || rule
25
33
 
26
- error = ::SvgConform::Errors::ValidationIssue.new(
27
- type: :error,
34
+ if severity == :warning
35
+ warning = ::SvgConform::Errors::ValidationIssue.new(
36
+ type: :warning,
37
+ rule: rule_or_requirement,
38
+ node: node,
39
+ message: message,
40
+ fix: fix,
41
+ data: data,
42
+ requirement_id: requirement_id,
43
+ severity: severity,
44
+ )
45
+ @warnings << warning
46
+ return warning
47
+ end
48
+
49
+ type, bucket = severity_bucket(severity)
50
+
51
+ issue = ::SvgConform::Errors::ValidationIssue.new(
52
+ type: type,
28
53
  rule: rule_or_requirement,
29
54
  node: node,
30
55
  message: message,
@@ -34,14 +59,18 @@ module SvgConform
34
59
  severity: severity,
35
60
  )
36
61
 
37
- # Handle special severity types
38
- if severity == :validity_error
39
- @validity_errors << error
62
+ bucket << issue
63
+ issue
64
+ end
65
+
66
+ # Map a declared severity to the issue type and tracker bucket
67
+ def severity_bucket(severity)
68
+ case severity
69
+ when :validity_error
70
+ [:error, @validity_errors]
40
71
  else
41
- @errors << error
72
+ [:error, @errors]
42
73
  end
43
-
44
- error
45
74
  end
46
75
 
47
76
  # Add a warning to the context
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "nokogiri"
4
- require "yaml"
5
4
 
6
5
  module SvgConform
7
6
  module Validation
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SvgConform
4
- VERSION = "0.2.6"
4
+ VERSION = "0.2.7"
5
5
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yeptris/psych"
4
+
5
+ module SvgConform
6
+ # YAML operations through Yeptris without installing its global drop-in.
7
+ module YamlIO
8
+ def self.load_file(...)
9
+ Yeptris::Psych.load_file(...)
10
+ end
11
+
12
+ def self.safe_load_file(...)
13
+ Yeptris::Psych.safe_load_file(...)
14
+ end
15
+
16
+ def self.dump(...)
17
+ Yeptris::Psych.dump(...)
18
+ end
19
+ end
20
+ end
data/lib/svg_conform.rb CHANGED
@@ -64,6 +64,7 @@ module SvgConform
64
64
  require_relative "svg_conform/diagnostics/lens_core_adapter"
65
65
 
66
66
  # Autoload core classes
67
+ autoload :YamlIO, File.expand_path("svg_conform/yaml_io", __dir__)
67
68
  autoload :Validator, File.expand_path("svg_conform/validator", __dir__)
68
69
  autoload :Fixer, "svg_conform/fixer"
69
70
  autoload :RemediationEngine, "svg_conform/remediation_engine"
@@ -0,0 +1,7 @@
1
+ remediable_types: &violation_types
2
+ - :reference_violation
3
+ severity_levels:
4
+ critical:
5
+ violation_types: *violation_types
6
+ default_weight: 5
7
+ max_penalty: 20
@@ -14,6 +14,19 @@ RSpec.describe "svg_conform.gemspec" do # rubocop:disable RSpec/DescribeClass
14
14
  expect(File.read("lib/svg_conform.rb")).to include("rescue LoadError")
15
15
  end
16
16
 
17
+ it "declares yeptris as a runtime dependency" do
18
+ dependency = specification.runtime_dependencies.find { |d| d.name == "yeptris" }
19
+
20
+ expect(dependency).not_to be_nil
21
+ expect(dependency.requirement).to eq(Gem::Requirement.new("~> 0.6.36"))
22
+ end
23
+
24
+ it "loads the Psych-compatible yeptris API" do
25
+ require "yeptris/psych"
26
+
27
+ expect(defined?(Yeptris::Psych)).to be_truthy
28
+ end
29
+
17
30
  it "exposes the lens_core availability probe" do
18
31
  expect(SvgConform).to respond_to(:lens_core_available?)
19
32
  expect(SvgConform.lens_core_available?).to be_truthy.or be_falsey
@@ -2,6 +2,11 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ # Container elements take the clip-path and mask presentation attributes
6
+ # per SVG (metanorma-pdfa#106).
7
+ METANORMA_PROFILE_CONTAINER_TAGS = %w[g a defs].freeze
8
+ METANORMA_PROFILE_CLIP_ATTRIBUTES = %w[clip-path mask].freeze
9
+
5
10
  RSpec.describe "Metanorma Profile" do
6
11
  let(:metanorma_profile_path) { "config/profiles/metanorma.yml" }
7
12
 
@@ -59,4 +64,47 @@ RSpec.describe "Metanorma Profile" do
59
64
  expect(result).to respond_to(:valid?)
60
65
  end
61
66
  end
67
+
68
+ describe "clip-path and mask on container elements" do
69
+ # SVG applies the clip-path and mask properties to container elements and
70
+ # graphics elements alike; rejecting them on containers rejects
71
+ # schema-valid documents (metanorma-pdfa#106).
72
+ let(:profile) { SvgConform::Profile.load_from_file(metanorma_profile_path) }
73
+ let(:validator) { SvgConform::Validator.new(mode: :sax) }
74
+
75
+ def svg_with_clip_assets(inner)
76
+ <<~SVG
77
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" viewBox="0 0 100 100">
78
+ <defs>
79
+ <clipPath id="clip1">
80
+ <rect x="0" y="0" width="50" height="50"/>
81
+ </clipPath>
82
+ <mask id="mask1">
83
+ <rect x="0" y="0" width="50" height="50" fill="white"/>
84
+ </mask>
85
+ </defs>
86
+ #{inner}
87
+ </svg>
88
+ SVG
89
+ end
90
+
91
+ METANORMA_PROFILE_CONTAINER_TAGS.each do |tag|
92
+ METANORMA_PROFILE_CLIP_ATTRIBUTES.each do |attribute|
93
+ it "allows #{attribute} on #{tag}" do
94
+ svg = svg_with_clip_assets(
95
+ "<#{tag} #{attribute}=\"url(##{attribute == 'clip-path' ? 'clip1' : 'mask1'})\">" \
96
+ "<rect x=\"10\" y=\"10\" width=\"30\" height=\"30\" fill=\"red\"/>" \
97
+ "</#{tag}>",
98
+ )
99
+
100
+ result = validator.validate(svg, profile: profile)
101
+ attribute_errors = result.errors.select do |e|
102
+ e.message.include?("'#{attribute}'")
103
+ end
104
+ expect(attribute_errors).to be_empty
105
+ expect(result).to be_valid
106
+ end
107
+ end
108
+ end
109
+ end
62
110
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "svg_conform/quality_metrics/configuration"
5
+ require "psych"
6
+ require "tempfile"
7
+
8
+ RSpec.describe SvgConform::QualityMetrics::Configuration do
9
+ describe ".default" do
10
+ let(:hash) { described_class.default.instance_variable_get(:@hash) }
11
+
12
+ it "loads bundled violation types as Symbols" do
13
+ types = hash.fetch("severity_levels").values.flat_map do |level|
14
+ level.fetch("violation_types")
15
+ end
16
+
17
+ expect(types).to include(:reference_violation)
18
+ expect(types).to all(be_a(Symbol))
19
+ end
20
+
21
+ it "preserves the entire Psych-loaded configuration" do
22
+ expected = Psych.safe_load_file(described_class::DEFAULT_CONFIG_PATH,
23
+ permitted_classes: [Symbol],
24
+ permitted_symbols: [], aliases: true)
25
+
26
+ expect(hash).to eq(expected)
27
+ end
28
+ end
29
+
30
+ describe ".from_yaml" do
31
+ def load_yaml(source)
32
+ Tempfile.create(["quality_metrics", ".yml"]) do |file|
33
+ file.write(source)
34
+ file.flush
35
+ described_class.from_yaml(file.path)
36
+ end
37
+ end
38
+
39
+ it "preserves quoted Symbol values" do
40
+ pending "yeptris differs from Psych: quoted Symbols retain quotes; upstream issue to be filed, see PR description"
41
+
42
+ config = load_yaml('a: :"x y"')
43
+
44
+ expect(config.instance_variable_get(:@hash)).to eq("a" => :"x y")
45
+ end
46
+
47
+ it "rejects disallowed dates with the yeptris error naming Date" do
48
+ expect { load_yaml("f: 2024-01-02\n") }
49
+ .to raise_error(Yeptris::Psych::DisallowedClass, /Date/)
50
+ end
51
+
52
+ it "rejects disallowed times with the yeptris error naming Time" do
53
+ pending "yeptris differs from Psych: disallowed Time is reported as Date; upstream issue to be filed, see PR description"
54
+
55
+ expect { load_yaml("f: 2024-01-02 10:00:00\n") }
56
+ .to raise_error(Yeptris::Psych::DisallowedClass, /Time/)
57
+ end
58
+
59
+ it "rejects invalid YAML with the yeptris syntax error" do
60
+ expect { load_yaml("a: [\n") }.to raise_error(Yeptris::Psych::SyntaxError)
61
+ end
62
+
63
+ it "resolves anchors and aliases" do
64
+ path = File.expand_path("../../fixtures/quality_metrics/aliases.yml", __dir__)
65
+ hash = described_class.from_yaml(path).instance_variable_get(:@hash)
66
+
67
+ expect(hash.fetch("remediable_types")).to eq([:reference_violation])
68
+ expect(hash.dig("severity_levels", "critical", "violation_types"))
69
+ .to eq(hash.fetch("remediable_types"))
70
+ end
71
+
72
+ it "rejects a non-permitted class with the yeptris error" do
73
+ Tempfile.create(["quality_metrics", ".yml"]) do |file|
74
+ file.write("--- !ruby/object:Object {}\n")
75
+ file.flush
76
+
77
+ expect { described_class.from_yaml(file.path) }
78
+ .to raise_error(Yeptris::Psych::DisallowedClass)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -56,12 +56,16 @@ RSpec.describe SvgConform::Requirements::TextAsPathRequirement do
56
56
  SVG
57
57
 
58
58
  result = validator.validate(svg, profile: :metanorma)
59
- text_as_path_errors = result.errors.select do |e|
60
- e.message.include?("rendered as paths")
61
- end
62
59
 
63
- expect(text_as_path_errors).not_to be_empty
64
- expect(text_as_path_errors.first.severity).to eq(:warning)
60
+ # Text-as-path is a quality advisory declared with severity: warning:
61
+ # it must surface as a warning, never as an error, so that schema-valid
62
+ # documents are not reported as invalid (metanorma-pdfa#106).
63
+ expect(result.errors).to be_empty
64
+ expect(result.warnings.map(&:message)).to include(
65
+ a_string_including("rendered as paths"),
66
+ )
67
+ expect(result.warnings.first.severity).to eq(:warning)
68
+ expect(result).to be_valid
65
69
  end
66
70
 
67
71
  it "does not flag SVG with native text elements" do
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "tmpdir"
5
+
6
+ RSpec.describe SvgConform::YamlIO do
7
+ def with_yaml(text)
8
+ Dir.mktmpdir do |dir|
9
+ path = File.join(dir, "t.yml")
10
+ File.write(path, text)
11
+ yield path
12
+ end
13
+ end
14
+
15
+ let(:aliased) { "a: &x {k: 1}\nb: *x\nc: :sym\n" }
16
+
17
+ it "loads aliases and permitted Symbols like Psych" do
18
+ with_yaml(aliased) do |path|
19
+ expect(described_class.safe_load_file(
20
+ path, permitted_classes: [Symbol], aliases: true
21
+ )).to eq("a" => { "k" => 1 }, "b" => { "k" => 1 }, "c" => :sym)
22
+ end
23
+ end
24
+
25
+ it "rejects aliases unless aliases: true" do
26
+ with_yaml(aliased) do |path|
27
+ expect do
28
+ described_class.safe_load_file(path, permitted_classes: [Symbol])
29
+ end.to raise_error(Yeptris::Psych::AliasesError)
30
+ end
31
+ end
32
+
33
+ it "loads the bundled quality config through Configuration" do
34
+ expect(SvgConform::QualityMetrics::Configuration.default).not_to be_nil
35
+ end
36
+
37
+ it "dumps byte-identical to Psych for a manifest-like hash" do
38
+ h = { "a" => :b, "c" => [1, "x: y", nil], "d" => { "e" => 1.5 } }
39
+ expect(described_class.dump(h)).to eq(Psych.dump(h))
40
+ end
41
+ end
data/svg_conform.gemspec CHANGED
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_dependency "rainbow"
36
36
  spec.add_dependency "table_tennis"
37
37
  spec.add_dependency "thor"
38
+ spec.add_dependency "yeptris", "~> 0.6.36"
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svg_conform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-11-01 00:00:00.000000000 Z
11
+ date: 2026-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yeptris
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.6.36
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.6.36
97
111
  description:
98
112
  email:
99
113
  - open.source@ribose.com
@@ -272,6 +286,7 @@ files:
272
286
  - lib/svg_conform/validation_result.rb
273
287
  - lib/svg_conform/validator.rb
274
288
  - lib/svg_conform/version.rb
289
+ - lib/svg_conform/yaml_io.rb
275
290
  - lib/tasks/fixtures.rake
276
291
  - lib/tasks/svgcheck.rake
277
292
  - reference-docs/SVG-1.2-RFC.rnc.txt
@@ -346,6 +361,7 @@ files:
346
361
  - spec/fixtures/profiles/svg_2_secure_static/valid/same-document-fragment.svg
347
362
  - spec/fixtures/profiles/svg_2_secure_static/valid/svg-base64.svg
348
363
  - spec/fixtures/profiles/svg_2_secure_static/valid/svg-percent.svg
364
+ - spec/fixtures/quality_metrics/aliases.yml
349
365
  - spec/fixtures/style/inputs/basic_violations.svg
350
366
  - spec/fixtures/style/repair/basic_violations.svg
351
367
  - spec/fixtures/style_promotion/inputs/basic_test.svg
@@ -533,6 +549,7 @@ files:
533
549
  - spec/svg_conform/profiles/svg_1_2_rfc_with_rdf_profile_spec.rb
534
550
  - spec/svg_conform/profiles/svg_2_secure_static_profile_spec.rb
535
551
  - spec/svg_conform/profiles_plantuml_spec.rb
552
+ - spec/svg_conform/quality_metrics/configuration_spec.rb
536
553
  - spec/svg_conform/references/data_uri_reference_spec.rb
537
554
  - spec/svg_conform/references/integration_spec.rb
538
555
  - spec/svg_conform/references/reference_classifier_spec.rb
@@ -573,6 +590,7 @@ files:
573
590
  - spec/svg_conform/validation_context_spec.rb
574
591
  - spec/svg_conform/validation_result_spec.rb
575
592
  - spec/svg_conform/validator_input_types_spec.rb
593
+ - spec/svg_conform/yaml_io_spec.rb
576
594
  - spec/svg_conform_spec.rb
577
595
  - spec/svgcheck_compatibility_spec.rb
578
596
  - svg_conform.gemspec