wovnrb 3.11.1 → 3.13.0

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: 363a963f8aa66c621e8a5a9c74e539ab34aa5b691db5b13c184d10b2a9d3bdce
4
- data.tar.gz: 6f3aad667b5a978fbb3c4df193ec25eeb567193d7b8be46ca32b4abb2d4f3257
3
+ metadata.gz: c25c86e04efab85fc760c24f2fb1905e2cb95a8636b2ad27a9f59bbef78e99e5
4
+ data.tar.gz: ab246aa58e1cb9ed5989f262ac8144eac400c77b556a5d9fb259e62534b9bac5
5
5
  SHA512:
6
- metadata.gz: d9b16d7c6fe502f7d4669f32360a7f1827ffb6b889fffc609ad1aed1a577209e56737916ced62d891116f3dcd747f69ba136850a1ca52d5aaf06e2dd30e3c3c4
7
- data.tar.gz: 633ef1dbc42ed6943b789133f0574e758bda8867101392dae272353d97d79cb308c37108740aa7aa0499ef48acfbfc59244e1c47f91c69f7781a53c96e1d93a8
6
+ metadata.gz: b5f42f8edb1b03dc3fe14d513aac9dffc97df0b62b9186fabba98b60373335579be893eddd4305c3e6cdbea9c9798e758fc73ceb8077f0f044efb36b0b6fb17c
7
+ data.tar.gz: 48431e3fba479475e39ed4a5a0f77ca2e53e8ecc4e474ae27166a613e62da176069c40e90349b2fd2764c3d6f66577651ba7b8eded732ccf23cdbb82fb6886bd
data/.rubocop.yml CHANGED
@@ -5,3 +5,6 @@ inherit_from: .rubocop_todo.yml
5
5
  AllCops:
6
6
  SuggestExtensions: false
7
7
  TargetRubyVersion: 2.5
8
+
9
+ Metrics/ParameterLists:
10
+ Enabled: false
data/README.md CHANGED
@@ -1 +1 @@
1
- ./README.ja.md
1
+ README.ja.md
@@ -24,6 +24,14 @@
24
24
  dependencies:
25
25
  "@babel/highlight" "^7.18.6"
26
26
 
27
+ "@babel/code-frame@^7.22.13":
28
+ version "7.22.13"
29
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
30
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
31
+ dependencies:
32
+ "@babel/highlight" "^7.22.13"
33
+ chalk "^2.4.2"
34
+
27
35
  "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8":
28
36
  version "7.13.15"
29
37
  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4"
@@ -55,15 +63,6 @@
55
63
  json5 "^2.2.1"
56
64
  semver "^6.3.0"
57
65
 
58
- "@babel/generator@^7.13.16":
59
- version "7.13.16"
60
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14"
61
- integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==
62
- dependencies:
63
- "@babel/types" "^7.13.16"
64
- jsesc "^2.5.1"
65
- source-map "^0.5.0"
66
-
67
66
  "@babel/generator@^7.19.0":
68
67
  version "7.19.0"
69
68
  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a"
@@ -73,6 +72,16 @@
73
72
  "@jridgewell/gen-mapping" "^0.3.2"
74
73
  jsesc "^2.5.1"
75
74
 
75
+ "@babel/generator@^7.23.0":
76
+ version "7.23.0"
77
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
78
+ integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
79
+ dependencies:
80
+ "@babel/types" "^7.23.0"
81
+ "@jridgewell/gen-mapping" "^0.3.2"
82
+ "@jridgewell/trace-mapping" "^0.3.17"
83
+ jsesc "^2.5.1"
84
+
76
85
  "@babel/helper-annotate-as-pure@^7.12.13":
77
86
  version "7.12.13"
78
87
  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
@@ -172,6 +181,11 @@
172
181
  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
173
182
  integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
174
183
 
184
+ "@babel/helper-environment-visitor@^7.22.20":
185
+ version "7.22.20"
186
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
187
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
188
+
175
189
  "@babel/helper-explode-assignable-expression@^7.18.6":
176
190
  version "7.18.6"
177
191
  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
@@ -196,6 +210,14 @@
196
210
  "@babel/template" "^7.18.10"
197
211
  "@babel/types" "^7.19.0"
198
212
 
213
+ "@babel/helper-function-name@^7.23.0":
214
+ version "7.23.0"
215
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
216
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
217
+ dependencies:
218
+ "@babel/template" "^7.22.15"
219
+ "@babel/types" "^7.23.0"
220
+
199
221
  "@babel/helper-get-function-arity@^7.12.13":
200
222
  version "7.12.13"
201
223
  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
@@ -210,6 +232,13 @@
210
232
  dependencies:
211
233
  "@babel/types" "^7.18.6"
212
234
 
235
+ "@babel/helper-hoist-variables@^7.22.5":
236
+ version "7.22.5"
237
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
238
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
239
+ dependencies:
240
+ "@babel/types" "^7.22.5"
241
+
213
242
  "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12":
214
243
  version "7.13.12"
215
244
  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
@@ -328,11 +357,23 @@
328
357
  dependencies:
329
358
  "@babel/types" "^7.18.6"
330
359
 
360
+ "@babel/helper-split-export-declaration@^7.22.6":
361
+ version "7.22.6"
362
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
363
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
364
+ dependencies:
365
+ "@babel/types" "^7.22.5"
366
+
331
367
  "@babel/helper-string-parser@^7.18.10":
332
368
  version "7.18.10"
333
369
  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
334
370
  integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
335
371
 
372
+ "@babel/helper-string-parser@^7.22.5":
373
+ version "7.22.5"
374
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
375
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
376
+
336
377
  "@babel/helper-validator-identifier@^7.12.11":
337
378
  version "7.12.11"
338
379
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
@@ -343,6 +384,11 @@
343
384
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
344
385
  integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
345
386
 
387
+ "@babel/helper-validator-identifier@^7.22.20":
388
+ version "7.22.20"
389
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
390
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
391
+
346
392
  "@babel/helper-validator-option@^7.12.17":
347
393
  version "7.12.17"
348
394
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
@@ -390,7 +436,16 @@
390
436
  chalk "^2.0.0"
391
437
  js-tokens "^4.0.0"
392
438
 
393
- "@babel/parser@^7.12.13", "@babel/parser@^7.13.16":
439
+ "@babel/highlight@^7.22.13":
440
+ version "7.22.20"
441
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
442
+ integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
443
+ dependencies:
444
+ "@babel/helper-validator-identifier" "^7.22.20"
445
+ chalk "^2.4.2"
446
+ js-tokens "^4.0.0"
447
+
448
+ "@babel/parser@^7.12.13":
394
449
  version "7.13.16"
395
450
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37"
396
451
  integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==
@@ -400,6 +455,11 @@
400
455
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.0.tgz#497fcafb1d5b61376959c1c338745ef0577aa02c"
401
456
  integrity sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==
402
457
 
458
+ "@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
459
+ version "7.23.0"
460
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
461
+ integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
462
+
403
463
  "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
404
464
  version "7.18.6"
405
465
  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
@@ -1088,37 +1148,32 @@
1088
1148
  "@babel/parser" "^7.18.10"
1089
1149
  "@babel/types" "^7.18.10"
1090
1150
 
1091
- "@babel/traverse@^7.13.0":
1092
- version "7.13.17"
1093
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3"
1094
- integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==
1095
- dependencies:
1096
- "@babel/code-frame" "^7.12.13"
1097
- "@babel/generator" "^7.13.16"
1098
- "@babel/helper-function-name" "^7.12.13"
1099
- "@babel/helper-split-export-declaration" "^7.12.13"
1100
- "@babel/parser" "^7.13.16"
1101
- "@babel/types" "^7.13.17"
1151
+ "@babel/template@^7.22.15":
1152
+ version "7.22.15"
1153
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
1154
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
1155
+ dependencies:
1156
+ "@babel/code-frame" "^7.22.13"
1157
+ "@babel/parser" "^7.22.15"
1158
+ "@babel/types" "^7.22.15"
1159
+
1160
+ "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.0":
1161
+ version "7.23.2"
1162
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
1163
+ integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
1164
+ dependencies:
1165
+ "@babel/code-frame" "^7.22.13"
1166
+ "@babel/generator" "^7.23.0"
1167
+ "@babel/helper-environment-visitor" "^7.22.20"
1168
+ "@babel/helper-function-name" "^7.23.0"
1169
+ "@babel/helper-hoist-variables" "^7.22.5"
1170
+ "@babel/helper-split-export-declaration" "^7.22.6"
1171
+ "@babel/parser" "^7.23.0"
1172
+ "@babel/types" "^7.23.0"
1102
1173
  debug "^4.1.0"
1103
1174
  globals "^11.1.0"
1104
1175
 
1105
- "@babel/traverse@^7.18.9", "@babel/traverse@^7.19.0":
1106
- version "7.19.0"
1107
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.0.tgz#eb9c561c7360005c592cc645abafe0c3c4548eed"
1108
- integrity sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==
1109
- dependencies:
1110
- "@babel/code-frame" "^7.18.6"
1111
- "@babel/generator" "^7.19.0"
1112
- "@babel/helper-environment-visitor" "^7.18.9"
1113
- "@babel/helper-function-name" "^7.19.0"
1114
- "@babel/helper-hoist-variables" "^7.18.6"
1115
- "@babel/helper-split-export-declaration" "^7.18.6"
1116
- "@babel/parser" "^7.19.0"
1117
- "@babel/types" "^7.19.0"
1118
- debug "^4.1.0"
1119
- globals "^11.1.0"
1120
-
1121
- "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.4.4":
1176
+ "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.4.4":
1122
1177
  version "7.13.17"
1123
1178
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4"
1124
1179
  integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==
@@ -1135,6 +1190,15 @@
1135
1190
  "@babel/helper-validator-identifier" "^7.18.6"
1136
1191
  to-fast-properties "^2.0.0"
1137
1192
 
1193
+ "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
1194
+ version "7.23.0"
1195
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
1196
+ integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
1197
+ dependencies:
1198
+ "@babel/helper-string-parser" "^7.22.5"
1199
+ "@babel/helper-validator-identifier" "^7.22.20"
1200
+ to-fast-properties "^2.0.0"
1201
+
1138
1202
  "@csstools/convert-colors@^1.4.0":
1139
1203
  version "1.4.0"
1140
1204
  resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
@@ -1162,6 +1226,11 @@
1162
1226
  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
1163
1227
  integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
1164
1228
 
1229
+ "@jridgewell/resolve-uri@^3.1.0":
1230
+ version "3.1.1"
1231
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
1232
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
1233
+
1165
1234
  "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
1166
1235
  version "1.1.2"
1167
1236
  resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
@@ -1180,6 +1249,19 @@
1180
1249
  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
1181
1250
  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
1182
1251
 
1252
+ "@jridgewell/sourcemap-codec@^1.4.14":
1253
+ version "1.4.15"
1254
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
1255
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
1256
+
1257
+ "@jridgewell/trace-mapping@^0.3.17":
1258
+ version "0.3.19"
1259
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
1260
+ integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
1261
+ dependencies:
1262
+ "@jridgewell/resolve-uri" "^3.1.0"
1263
+ "@jridgewell/sourcemap-codec" "^1.4.14"
1264
+
1183
1265
  "@jridgewell/trace-mapping@^0.3.9":
1184
1266
  version "0.3.15"
1185
1267
  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774"
@@ -1766,11 +1848,16 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
1766
1848
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
1767
1849
  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
1768
1850
 
1769
- bn.js@^5.0.0, bn.js@^5.1.1:
1851
+ bn.js@^5.0.0:
1770
1852
  version "5.2.0"
1771
1853
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
1772
1854
  integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
1773
1855
 
1856
+ bn.js@^5.2.1:
1857
+ version "5.2.1"
1858
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
1859
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
1860
+
1774
1861
  body-parser@1.20.1:
1775
1862
  version "1.20.1"
1776
1863
  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
@@ -1873,7 +1960,7 @@ browserify-des@^1.0.0:
1873
1960
  inherits "^2.0.1"
1874
1961
  safe-buffer "^5.1.2"
1875
1962
 
1876
- browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
1963
+ browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
1877
1964
  version "4.1.0"
1878
1965
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
1879
1966
  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
@@ -1882,19 +1969,19 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
1882
1969
  randombytes "^2.0.1"
1883
1970
 
1884
1971
  browserify-sign@^4.0.0:
1885
- version "4.2.1"
1886
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
1887
- integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
1972
+ version "4.2.2"
1973
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e"
1974
+ integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==
1888
1975
  dependencies:
1889
- bn.js "^5.1.1"
1890
- browserify-rsa "^4.0.1"
1976
+ bn.js "^5.2.1"
1977
+ browserify-rsa "^4.1.0"
1891
1978
  create-hash "^1.2.0"
1892
1979
  create-hmac "^1.1.7"
1893
- elliptic "^6.5.3"
1980
+ elliptic "^6.5.4"
1894
1981
  inherits "^2.0.4"
1895
- parse-asn1 "^5.1.5"
1896
- readable-stream "^3.6.0"
1897
- safe-buffer "^5.2.0"
1982
+ parse-asn1 "^5.1.6"
1983
+ readable-stream "^3.6.2"
1984
+ safe-buffer "^5.2.1"
1898
1985
 
1899
1986
  browserify-zlib@^0.2.0:
1900
1987
  version "0.2.0"
@@ -2866,7 +2953,7 @@ electron-to-chromium@^1.4.202:
2866
2953
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.244.tgz#ae9b56ed4ae2107e3a860dad80ed662c936e369e"
2867
2954
  integrity sha512-E21saXLt2eTDaTxgUtiJtBUqanF9A32wZasAwDZ8gvrqXoxrBrbwtDCx7c/PQTLp81wj4X0OLDeoGQg7eMo3+w==
2868
2955
 
2869
- elliptic@^6.5.3:
2956
+ elliptic@^6.5.3, elliptic@^6.5.4:
2870
2957
  version "6.5.4"
2871
2958
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
2872
2959
  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
@@ -4899,7 +4986,7 @@ parent-module@^1.0.0:
4899
4986
  dependencies:
4900
4987
  callsites "^3.0.0"
4901
4988
 
4902
- parse-asn1@^5.0.0, parse-asn1@^5.1.5:
4989
+ parse-asn1@^5.0.0, parse-asn1@^5.1.6:
4903
4990
  version "5.1.6"
4904
4991
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
4905
4992
  integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
@@ -5896,6 +5983,15 @@ readable-stream@^3.0.6, readable-stream@^3.6.0:
5896
5983
  string_decoder "^1.1.1"
5897
5984
  util-deprecate "^1.0.1"
5898
5985
 
5986
+ readable-stream@^3.6.2:
5987
+ version "3.6.2"
5988
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
5989
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
5990
+ dependencies:
5991
+ inherits "^2.0.3"
5992
+ string_decoder "^1.1.1"
5993
+ util-deprecate "^1.0.1"
5994
+
5899
5995
  readdirp@^2.2.1:
5900
5996
  version "2.2.1"
5901
5997
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@@ -6148,7 +6244,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
6148
6244
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
6149
6245
  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
6150
6246
 
6151
- safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
6247
+ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
6152
6248
  version "5.2.1"
6153
6249
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
6154
6250
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -6465,7 +6561,7 @@ source-map-url@^0.4.0:
6465
6561
  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
6466
6562
  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
6467
6563
 
6468
- source-map@^0.5.0, source-map@^0.5.6:
6564
+ source-map@^0.5.6:
6469
6565
  version "0.5.7"
6470
6566
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
6471
6567
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -5,10 +5,11 @@ require 'zlib'
5
5
 
6
6
  module Wovnrb
7
7
  class ApiTranslator
8
- def initialize(store, headers, uuid)
8
+ def initialize(store, headers, uuid, response_status_code)
9
9
  @store = store
10
10
  @headers = headers
11
11
  @uuid = uuid
12
+ @response_status_code = response_status_code
12
13
  end
13
14
 
14
15
  def translate(body)
@@ -113,8 +114,10 @@ module Wovnrb
113
114
  'lang_param_name' => lang_param_name,
114
115
  'translate_canonical_tag' => translate_canonical_tag,
115
116
  'insert_hreflangs' => insert_hreflangs,
117
+ 'hreflang_x_default_lang' => @store.settings['hreflang_x_default_lang'], # should not use fallback, so html swapper can calculate the default lang from js_data
116
118
  'product' => 'WOVN.rb',
117
119
  'version' => VERSION,
120
+ 'page_status_code' => @response_status_code,
118
121
  'body' => body
119
122
  }
120
123
 
data/lib/wovnrb/lang.rb CHANGED
@@ -102,7 +102,7 @@ module Wovnrb
102
102
  custom_lang = LANG[custom_lang_aliases.invert[lang_name]]
103
103
  return custom_lang[:code] if custom_lang
104
104
 
105
- LANG.each do |_k, l|
105
+ LANG.each_value do |l|
106
106
  return l[:code] if lang_name.casecmp(l[:name]).zero? || lang_name.casecmp(l[:en]).zero? || lang_name.casecmp(l[:code]).zero?
107
107
  end
108
108
  nil
@@ -243,8 +243,8 @@ module Wovnrb
243
243
 
244
244
  def get_langs(values)
245
245
  langs = Set.new
246
- (values['text_vals'] || {}).merge(values['img_vals'] || {}).each do |_key, index|
247
- index.each do |l, _val|
246
+ (values['text_vals'] || {}).merge(values['img_vals'] || {}).each_value do |index|
247
+ index.each_key do |l|
248
248
  langs.add(l)
249
249
  end
250
250
  end
@@ -151,6 +151,24 @@ module Wovnrb
151
151
 
152
152
  parent_node.add_child(insert_node.to_s)
153
153
  end
154
+
155
+ unless existing_x_default_hreflang?
156
+ insert_node = Nokogiri::XML::Node.new('link', @dom)
157
+ insert_node['rel'] = 'alternate'
158
+ insert_node['hreflang'] = 'x-default'
159
+ insert_node['data-wovn'] = 'true'
160
+ x_default_lang_code = @store.hreflang_x_default_lang_or_default
161
+ insert_node['href'] = @headers.redirect_location(x_default_lang_code)
162
+ parent_node.add_child(insert_node.to_s)
163
+ end
164
+ end
165
+
166
+ def existing_x_default_hreflang?
167
+ @dom.xpath('//link').each do |node|
168
+ return true if node['rel'].casecmp('alternate').zero? && node['hreflang'] && node['hreflang'].casecmp('x-default').zero?
169
+ end
170
+
171
+ false
154
172
  end
155
173
 
156
174
  def translate_canonical_tag
@@ -1,7 +1,7 @@
1
1
  module Wovnrb
2
2
  class Settings < Hash
3
3
  def initialize(*args, **kwargs)
4
- super(*args, **kwargs)
4
+ super
5
5
  @dynamic_settings = {}
6
6
  end
7
7
 
@@ -9,7 +9,7 @@ module Wovnrb
9
9
  return @dynamic_settings[key] if @dynamic_settings.key?(key)
10
10
  return IgnoreGlobsWrapper.new(ignore_globs) if key == 'ignore_globs'
11
11
 
12
- super(key)
12
+ super
13
13
  end
14
14
 
15
15
  def ignore_globs
data/lib/wovnrb/store.rb CHANGED
@@ -32,6 +32,7 @@ module Wovnrb
32
32
  'test_mode' => false,
33
33
  'test_url' => '',
34
34
  'cache_megabytes' => nil,
35
+ 'hreflang_x_default_lang' => nil,
35
36
  'ttl_seconds' => nil,
36
37
  'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
37
38
  'custom_lang_aliases' => {},
@@ -64,7 +65,7 @@ module Wovnrb
64
65
  #
65
66
  # @return [Boolean] Returns true if the token is valid, and false if it is not
66
67
  def valid_token?(token)
67
- !token.nil? && (token.length == 5 || token.length == 6)
68
+ !token.nil? && [5, 6].include?(token.length)
68
69
  end
69
70
 
70
71
  # Returns true or false based on whether the settings are valid or not, logs any invalid settings to ../error.log
@@ -141,6 +142,7 @@ module Wovnrb
141
142
  end
142
143
 
143
144
  @settings['default_lang'] = Lang.get_code(@settings['default_lang'])
145
+
144
146
  if !@settings.has_key?('supported_langs')
145
147
  @settings['supported_langs'] = [@settings['default_lang']]
146
148
  end
@@ -172,12 +174,18 @@ module Wovnrb
172
174
  @settings['api_timeout_seconds'] = 3.0
173
175
  end
174
176
  end
177
+
178
+ @settings['hreflang_x_default_lang'] = Lang.get_code(@settings['hreflang_x_default_lang'])
175
179
  end
176
180
 
177
181
  def custom_lang_aliases
178
182
  @settings['custom_lang_aliases'] || {}
179
183
  end
180
184
 
185
+ def hreflang_x_default_lang_or_default
186
+ @settings['hreflang_x_default_lang'] || default_lang
187
+ end
188
+
181
189
  def default_lang
182
190
  @settings['default_lang']
183
191
  end
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = '3.11.1'.freeze
2
+ VERSION = '3.13.0'.freeze
3
3
  end
data/lib/wovnrb.rb CHANGED
@@ -68,7 +68,7 @@ module Wovnrb
68
68
  @store.settings.update_dynamic_settings!(request.params)
69
69
  return output(headers, status, res_headers, body) if ignore_path?(headers.pathname)
70
70
 
71
- body = switch_lang(headers, body) unless /^1|302/.match?(status.to_s)
71
+ body = switch_lang(headers, body, status) unless /^1|302/.match?(status.to_s)
72
72
 
73
73
  content_length = 0
74
74
  body.each { |b| content_length += b.respond_to?(:bytesize) ? b.bytesize : 0 }
@@ -77,7 +77,7 @@ module Wovnrb
77
77
  output(headers, status, res_headers, body)
78
78
  end
79
79
 
80
- def switch_lang(headers, body)
80
+ def switch_lang(headers, body, response_status_code)
81
81
  translated_body = []
82
82
 
83
83
  # Must use `.each` for to support multiple-chunks in Sinatra
@@ -91,7 +91,7 @@ module Wovnrb
91
91
 
92
92
  if needs_api?(html_body, headers)
93
93
  converted_html, marker = html_converter.build_api_compatible_html
94
- translated_content = ApiTranslator.new(@store, headers, WovnLogger.uuid).translate(converted_html)
94
+ translated_content = ApiTranslator.new(@store, headers, WovnLogger.uuid, response_status_code).translate(converted_html)
95
95
  translated_body.push(marker.revert(translated_content))
96
96
  else
97
97
  string_body = html_converter.build if html_body.html?
@@ -10,29 +10,30 @@ module Wovnrb
10
10
 
11
11
  def test_translate_falls_back_to_original_body_if_exception
12
12
  Net::HTTP.any_instance.expects(:request).raises
13
- assert_translation('test.html', 'test_translated.html', false, response: nil)
13
+ assert_translation('test.html', 'test_translated.html', false, api_response: nil)
14
14
  end
15
15
 
16
16
  def test_translate_falls_back_to_original_body_if_api_error
17
- assert_translation('test.html', 'test_translated.html', false, response: { encoding: 'text/json', status_code: 500 })
17
+ assert_translation('test.html', 'test_translated.html', false, api_response: { encoding: 'text/json', status: 500 })
18
18
  end
19
19
 
20
20
  def test_translate_continues_if_api_response_is_not_compressed
21
- assert_translation('test.html', 'test_translated.html', true, response: { encoding: 'unknown', status: 200 }, compress_data: false)
21
+ assert_translation('test.html', 'test_translated.html', true, api_response: { encoding: 'unknown', status: 200 }, compress_data: false)
22
22
  end
23
23
 
24
24
  def test_translate_continues_if_api_response_is_compressed
25
- assert_translation('test.html', 'test_translated.html', true, response: { encoding: 'unknown', status: 200 })
25
+ assert_translation('test.html', 'test_translated.html', true, api_response: { encoding: 'unknown', status: 200 })
26
26
  end
27
27
 
28
28
  def test_translate_accepts_uncompressed_response_from_api_in_dev_mode
29
29
  Wovnrb::Store.instance.update_settings('wovn_dev_mode' => true)
30
- assert_translation('test.html', 'test_translated.html', true, response: { encoding: 'text/json', status: 200 }, compress_data: false)
30
+ assert_translation('test.html', 'test_translated.html', true, api_response: { encoding: 'text/json', status: 200 }, compress_data: false)
31
31
  end
32
32
 
33
33
  def test_translate_without_api_compression_sends_json
34
34
  Wovnrb::Store.instance.update_settings('compress_api_requests' => false)
35
- sut, _store, _headers = create_sut
35
+ original_status_code = 201
36
+ sut, _store, _headers = create_sut(status: original_status_code)
36
37
  html_body = 'foo'
37
38
 
38
39
  stub_request(:post, %r{http://wovn\.global\.ssl\.fastly\.net/v0/translation\?cache_key=.*})
@@ -56,8 +57,10 @@ module Wovnrb
56
57
  'lang_param_name' => 'lang',
57
58
  'translate_canonical_tag' => true,
58
59
  'insert_hreflangs' => true,
60
+ 'hreflang_x_default_lang' => nil,
59
61
  'product' => 'WOVN.rb',
60
62
  'version' => VERSION,
63
+ 'page_status_code' => original_status_code,
61
64
  'body' => 'foo',
62
65
  'custom_lang_aliases' => { 'ja' => 'Japanese' }.to_json
63
66
  }.to_json,
@@ -80,7 +83,7 @@ module Wovnrb
80
83
  Wovnrb.get_settings(settings),
81
84
  UrlLanguageSwitcher.new(store)
82
85
  )
83
- api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
86
+ api_translator = ApiTranslator.new(store, headers, REQUEST_UUID, 200)
84
87
  assert_equal(5.0, api_translator.send(:api_timeout))
85
88
  end
86
89
 
@@ -102,16 +105,16 @@ module Wovnrb
102
105
  Wovnrb.get_settings(settings),
103
106
  UrlLanguageSwitcher.new(store)
104
107
  )
105
- api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
108
+ api_translator = ApiTranslator.new(store, headers, REQUEST_UUID, 200)
106
109
  assert_equal(1.0, api_translator.send(:api_timeout))
107
110
  end
108
111
 
109
112
  private
110
113
 
111
- def assert_translation(original_html_fixture, translated_html_fixture, success_expected, response: { encoding: 'gzip', status_code: 200 }, compress_data: true)
114
+ def assert_translation(original_html_fixture, translated_html_fixture, success_expected, original_response: { status: 200 }, api_response: { encoding: 'gzip', status: 200 }, compress_data: true)
112
115
  original_html = File.read("test/fixtures/html/#{original_html_fixture}")
113
116
  translated_html = File.read("test/fixtures/html/#{translated_html_fixture}")
114
- actual_translated_html = translate(original_html, translated_html, response, compress_data: compress_data)
117
+ actual_translated_html = translate(original_html, translated_html, original_response, api_response, compress_data: compress_data)
115
118
 
116
119
  if success_expected
117
120
  assert_equal(actual_translated_html, translated_html)
@@ -120,9 +123,9 @@ module Wovnrb
120
123
  end
121
124
  end
122
125
 
123
- def translate(original_html, translated_html, response, compress_data: true)
124
- api_translator, store, _headers = create_sut
125
- translation_request_stub = stub_translation_api_request(store, original_html, translated_html, response, compress_data: compress_data)
126
+ def translate(original_html, translated_html, original_response, api_response, compress_data: true)
127
+ api_translator, store, _headers = create_sut(original_response)
128
+ translation_request_stub = stub_translation_api_request(store, original_html, translated_html, original_response, api_response, compress_data: compress_data)
126
129
 
127
130
  expected_api_timeout = store.settings['api_timeout_seconds']
128
131
  assert_equal(expected_api_timeout, api_translator.send(:api_timeout))
@@ -131,7 +134,7 @@ module Wovnrb
131
134
  actual_translated_html
132
135
  end
133
136
 
134
- def create_sut
137
+ def create_sut(response)
135
138
  settings = {
136
139
  'project_token' => '123456',
137
140
  'custom_lang_aliases' => { 'ja' => 'Japanese' },
@@ -147,13 +150,18 @@ module Wovnrb
147
150
  Wovnrb.get_settings(settings),
148
151
  UrlLanguageSwitcher.new(store)
149
152
  )
150
- api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
153
+ status = if response
154
+ response[:status]
155
+ else
156
+ 200
157
+ end
158
+ api_translator = ApiTranslator.new(store, headers, REQUEST_UUID, status)
151
159
 
152
160
  [api_translator, store, headers]
153
161
  end
154
162
 
155
- def stub_translation_api_request(store, original_html, translated_html, response, compress_data: true)
156
- if response
163
+ def stub_translation_api_request(store, original_html, translated_html, original_response, api_response, compress_data: true)
164
+ if api_response
157
165
  cache_key = generate_cache_key(store, original_html)
158
166
  api_host = if store.dev_mode?
159
167
  'dev-wovn.io:3001'
@@ -161,7 +169,8 @@ module Wovnrb
161
169
  'wovn.global.ssl.fastly.net'
162
170
  end
163
171
  api_url = "http://#{api_host}/v0/translation?cache_key=#{cache_key}"
164
- compressed_data = compress(generate_data(original_html))
172
+ expected_data = generate_data(original_html, original_response[:status])
173
+ compressed_data = compress(expected_data)
165
174
  headers = {
166
175
  'Accept' => '*/*',
167
176
  'Accept-Encoding' => 'gzip',
@@ -176,10 +185,10 @@ module Wovnrb
176
185
  else
177
186
  stub_response_json
178
187
  end
179
- response_headers = { 'Content-Encoding' => response[:encoding] || 'gzip' }
188
+ response_headers = { 'Content-Encoding' => api_response[:encoding] || 'gzip' }
180
189
  stub_request(:post, api_url)
181
190
  .with(body: compressed_data, headers: headers)
182
- .to_return(status: response[:status_code] || 200, body: stub_response, headers: response_headers)
191
+ .to_return(status: api_response[:status] || 200, body: stub_response, headers: response_headers)
183
192
 
184
193
  end
185
194
  end
@@ -192,7 +201,7 @@ module Wovnrb
192
201
  "(#{escaped_key})"
193
202
  end
194
203
 
195
- def generate_data(original_html)
204
+ def generate_data(original_html, expected_status)
196
205
  data = {
197
206
  'url' => 'http://wovn.io/test',
198
207
  'token' => '123456',
@@ -201,8 +210,10 @@ module Wovnrb
201
210
  'lang_param_name' => 'lang',
202
211
  'translate_canonical_tag' => true,
203
212
  'insert_hreflangs' => true,
213
+ 'hreflang_x_default_lang' => nil,
204
214
  'product' => 'WOVN.rb',
205
215
  'version' => VERSION,
216
+ 'page_status_code' => expected_status,
206
217
  'body' => original_html,
207
218
  'custom_lang_aliases' => '{"ja":"Japanese"}'
208
219
  }
@@ -66,7 +66,7 @@ module Wovnrb
66
66
  'english.foo.com' => 'en'
67
67
  }
68
68
 
69
- assert(hash_equals(expected, @custom_domain_langs.to_html_swapper_hash))
69
+ assert(hash_equals?(expected, @custom_domain_langs.to_html_swapper_hash))
70
70
  end
71
71
 
72
72
  private
@@ -75,7 +75,7 @@ module Wovnrb
75
75
  custom_domain_lang.lang
76
76
  end
77
77
 
78
- def hash_equals(orig_hash, test_hash)
78
+ def hash_equals?(orig_hash, test_hash)
79
79
  (orig_hash <=> test_hash) == 0
80
80
  end
81
81
  end
@@ -16,7 +16,7 @@ module Wovnrb
16
16
  end
17
17
 
18
18
  def test_iso_639_1_normalization
19
- Wovnrb::Lang::LANG.each do |_, l|
19
+ Wovnrb::Lang::LANG.each_value do |l|
20
20
  case l[:code]
21
21
  when 'zh-CHS'
22
22
  assert_equal('zh-Hans', Lang.iso_639_1_normalization('zh-CHS'))
@@ -6,7 +6,7 @@ module Wovnrb
6
6
  converter = prepare_html_converter('<html><body><a class="test">hello</a></body></html>', supported_langs: %w[en vi])
7
7
  converted_html, = converter.build_api_compatible_html
8
8
 
9
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><a class=\"test\">hello</a></body></html>"
9
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a class=\"test\">hello</a></body></html>"
10
10
  assert_equal(expected_html, converted_html)
11
11
  end
12
12
 
@@ -19,7 +19,7 @@ module Wovnrb
19
19
  converter = prepare_html_converter('<html><body><a class="test">hello</a></body></html>', settings)
20
20
  converted_html, = converter.build_api_compatible_html
21
21
 
22
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=lang&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?lang=vi\"></head><body><a class=\"test\">hello</a></body></html>"
22
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=lang&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?lang=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a class=\"test\">hello</a></body></html>"
23
23
  assert_equal(expected_html, converted_html)
24
24
  end
25
25
 
@@ -28,7 +28,7 @@ module Wovnrb
28
28
  converter = prepare_html_converter("<html><body><p>#{long_string}</p></body></html>", supported_langs: %w[en vi])
29
29
  converted_html, = converter.build_api_compatible_html
30
30
 
31
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><p>#{long_string}</p></body></html>"
31
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><p>#{long_string}</p></body></html>"
32
32
  assert_equal(expected_html, converted_html)
33
33
  end
34
34
 
@@ -45,7 +45,7 @@ module Wovnrb
45
45
  converter = prepare_html_converter(html, ignore_class: ['ignore-me'])
46
46
  converted_html, = converter.build_api_compatible_html
47
47
 
48
- expected_convert_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><p>Hello <span wovn-ignore=\"\"><!-- __wovn-backend-ignored-key-0 --></span></p><p></p><p>Hello <span data-wovn-ignore=\"\"><!-- __wovn-backend-ignored-key-1 --></span></p><p></p><div><span class=\"ignore-me\"><!-- __wovn-backend-ignored-key-2 --></span></div><span>Have a nice day!</span></body></html>"
48
+ expected_convert_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><p>Hello <span wovn-ignore=\"\"><!-- __wovn-backend-ignored-key-0 --></span></p><p></p><p>Hello <span data-wovn-ignore=\"\"><!-- __wovn-backend-ignored-key-1 --></span></p><p></p><div><span class=\"ignore-me\"><!-- __wovn-backend-ignored-key-2 --></span></div><span>Have a nice day!</span></body></html>"
49
49
  assert_equal(expected_convert_html, converted_html)
50
50
  end
51
51
 
@@ -62,7 +62,7 @@ module Wovnrb
62
62
  converter = prepare_html_converter(html, ignore_class: [])
63
63
  converted_html, = converter.build_api_compatible_html
64
64
 
65
- expected_convert_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><form action=\"/test\" method=\"POST\"><!-- __wovn-backend-ignored-key-0 --></form></body></html>"
65
+ expected_convert_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><form action=\"/test\" method=\"POST\"><!-- __wovn-backend-ignored-key-0 --></form></body></html>"
66
66
  assert_equal(expected_convert_html, converted_html)
67
67
  end
68
68
 
@@ -81,7 +81,7 @@ module Wovnrb
81
81
 
82
82
  expected_convert_html = [
83
83
  '<html lang="en"><head>',
84
- "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body>",
84
+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body>",
85
85
  '<input id="user-id" type="hidden" value="__wovn-backend-ignored-key-0">',
86
86
  '<input id="password" type="hidden" value="__wovn-backend-ignored-key-1">',
87
87
  '<input id="something" type="hidden" value="__wovn-backend-ignored-key-2">',
@@ -95,7 +95,7 @@ module Wovnrb
95
95
  converter = prepare_html_converter('<html><body><a>hello</a></body></html>', supported_langs: %w[en vi])
96
96
  translated_html = converter.build
97
97
 
98
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><a>hello</a></body></html>"
98
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a>hello</a></body></html>"
99
99
  assert_equal(expected_html, translated_html)
100
100
  end
101
101
 
@@ -103,7 +103,7 @@ module Wovnrb
103
103
  converter = prepare_html_converter('<html><body><a>hello</a></body></html>', supported_langs: [])
104
104
  translated_html = converter.build
105
105
 
106
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script></head><body><a>hello</a></body></html>"
106
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a>hello</a></body></html>"
107
107
  assert_equal(expected_html, translated_html)
108
108
  end
109
109
 
@@ -111,7 +111,7 @@ module Wovnrb
111
111
  converter = prepare_html_converter('<html><head><title>TITLE</title></head><body><a>hello</a></body></html>', supported_langs: %w[en vi])
112
112
  translated_html = converter.build
113
113
 
114
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><title>TITLE</title><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body><a>hello</a></body></html>"
114
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><title>TITLE</title><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a>hello</a></body></html>"
115
115
  assert_equal(expected_html, translated_html)
116
116
  end
117
117
 
@@ -119,7 +119,7 @@ module Wovnrb
119
119
  converter = prepare_html_converter('<html>hello<a>world</a></html>', supported_langs: [])
120
120
  translated_html = converter.build
121
121
 
122
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script></head><body>hello<a>world</a></body></html>"
122
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body>hello<a>world</a></body></html>"
123
123
  assert_equal(expected_html, translated_html)
124
124
  end
125
125
 
@@ -135,7 +135,7 @@ module Wovnrb
135
135
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
136
136
  translated_html = converter.build
137
137
 
138
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body>hello<a>world</a></body></html>"
138
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body>hello<a>world</a></body></html>"
139
139
  assert_equal(expected_html, translated_html)
140
140
  end
141
141
 
@@ -152,7 +152,7 @@ module Wovnrb
152
152
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
153
153
  translated_html = converter.build
154
154
 
155
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
155
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
156
156
  assert_equal(expected_html, translated_html)
157
157
  end
158
158
 
@@ -169,7 +169,7 @@ module Wovnrb
169
169
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
170
170
  translated_html = converter.build
171
171
 
172
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
172
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
173
173
  assert_equal(expected_html, translated_html)
174
174
  end
175
175
 
@@ -186,7 +186,7 @@ module Wovnrb
186
186
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
187
187
  translated_html = converter.build
188
188
 
189
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body></body></html>"
189
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
190
190
  assert_equal(expected_html, translated_html)
191
191
  end
192
192
 
@@ -204,7 +204,7 @@ module Wovnrb
204
204
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
205
205
  translated_html = converter.build
206
206
 
207
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={&quot;en&quot;:&quot;english&quot;}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/?wovn=english\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body></body></html>"
207
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={&quot;en&quot;:&quot;english&quot;}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/?wovn=english\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
208
208
  assert_equal(expected_html, translated_html)
209
209
  end
210
210
 
@@ -221,7 +221,7 @@ module Wovnrb
221
221
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
222
222
  translated_html = converter.build
223
223
 
224
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
224
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
225
225
  assert_equal(expected_html, translated_html)
226
226
  end
227
227
 
@@ -237,7 +237,7 @@ module Wovnrb
237
237
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
238
238
  translated_html = converter.build
239
239
 
240
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body>hello<a>world</a></body></html>"
240
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body>hello<a>world</a></body></html>"
241
241
  assert_equal(expected_html, translated_html)
242
242
  end
243
243
 
@@ -254,7 +254,7 @@ module Wovnrb
254
254
  converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
255
255
  translated_html = converter.build
256
256
 
257
- expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=custom_domain&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}&amp;customDomainLangs={&quot;my-site.com&quot;:&quot;en&quot;,&quot;french.com/fr&quot;:&quot;fr&quot;}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://french.com/fr/\"></head><body><a>hello</a></body></html>"
257
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=custom_domain&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}&amp;customDomainLangs={&quot;my-site.com&quot;:&quot;en&quot;,&quot;french.com/fr&quot;:&quot;fr&quot;}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://french.com/fr/\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body><a>hello</a></body></html>"
258
258
  assert_equal(expected_html, translated_html)
259
259
  end
260
260
 
@@ -279,7 +279,7 @@ module Wovnrb
279
279
  translated_html = converter.build
280
280
  dom = Helpers::NokogumboHelper.parse_html(translated_html)
281
281
  href_langs = dom.css('link[rel="alternate"]')
282
- assert_equal(4, href_langs.length)
282
+ assert_equal(5, href_langs.length)
283
283
  expected_href_langs = {
284
284
  'en' =>
285
285
  {
@@ -296,12 +296,21 @@ module Wovnrb
296
296
  'vi' =>
297
297
  {
298
298
  'href' => 'http://my-site.com/?wovn=vi'
299
+ },
300
+ 'x-default' =>
301
+ {
302
+ 'href' => 'http://my-site.com/'
299
303
  }
300
304
  }
301
305
  href_langs.each do |node|
302
306
  assertions = expected_href_langs[node['hreflang']]
303
307
  assert_not_nil(assertions)
304
308
  assert_equal(assertions['href'], node['href'])
309
+ if node['hreflang'] == 'x-default'
310
+ assert_equal('true', node['data-wovn'])
311
+ else
312
+ assert_nil(node['data-wovn'])
313
+ end
305
314
  end
306
315
  end
307
316
 
@@ -492,6 +501,35 @@ module Wovnrb
492
501
  assert_equal(expected_html, translated_html)
493
502
  end
494
503
 
504
+ test 'Transform HTML - no x-default hreflang - no config - generates using default lang' do
505
+ settings = default_store_settings
506
+ converter = prepare_html_converter('<html><head></head></html>', settings)
507
+ translated_html = converter.build
508
+
509
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/\"></head><body></body></html>"
510
+ assert_equal(expected_html, translated_html)
511
+ end
512
+
513
+ test 'Transform HTML - no x-default hreflang - has config - generates using specified lang' do
514
+ settings = default_store_settings
515
+ settings['hreflang_x_default_lang'] = 'fr'
516
+ converter = prepare_html_converter('<html><head></head></html>', settings)
517
+ translated_html = converter.build
518
+
519
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"><link rel=\"alternate\" hreflang=\"x-default\" data-wovn=\"true\" href=\"http://my-site.com/?wovn=fr\"></head><body></body></html>"
520
+ assert_equal(expected_html, translated_html)
521
+ end
522
+
523
+ test 'Transform HTML - has x-default hreflang - does not modify' do
524
+ settings = default_store_settings
525
+ settings['hreflang_x_default_lang'] = 'fr'
526
+ converter = prepare_html_converter('<html><head><link rel="alternate" hreflang="X-Default" href="https://my-site.com/?from=customer"></head></html>', settings)
527
+ translated_html = converter.build
528
+
529
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"X-Default\" href=\"https://my-site.com/?from=customer\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"fr\" href=\"http://my-site.com/?wovn=fr\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body></body></html>"
530
+ assert_equal(expected_html, translated_html)
531
+ end
532
+
495
533
  private
496
534
 
497
535
  def prepare_html_converter(input_html, store_options = {})
@@ -395,7 +395,7 @@ HTML
395
395
  assert_equal(unaffected_env != app_mock.env, affected)
396
396
  end
397
397
 
398
- def assert_switch_lang(original_lang, target_lang, body, expected_body, api_expected: true)
398
+ def assert_switch_lang(original_lang, target_lang, body, expected_body, api_expected: true, expected_status_code: 200)
399
399
  subdomain = target_lang == original_lang ? '' : "#{target_lang}."
400
400
  interceptor = Wovnrb::Interceptor.new(get_app)
401
401
 
@@ -408,7 +408,7 @@ HTML
408
408
  mock_translation_api_response(apified_body, expected_body)
409
409
  end
410
410
 
411
- actual_bodies = interceptor.switch_lang(headers, [body])
411
+ actual_bodies = interceptor.switch_lang(headers, [body], expected_status_code)
412
412
 
413
413
  assert_same_elements([expected_body], actual_bodies)
414
414
  end
data/test/test_helper.rb CHANGED
@@ -15,6 +15,7 @@ SimpleCov.start do
15
15
  track_files 'lib/**/*.rb'
16
16
  end
17
17
 
18
+ require 'logger'
18
19
  require 'nokogiri'
19
20
  require 'rack'
20
21
  require 'minitest/autorun'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wovnrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.11.1
4
+ version: 3.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wovn Technologies, Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-19 00:00:00.000000000 Z
11
+ date: 2025-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -262,7 +262,7 @@ licenses:
262
262
  - MIT
263
263
  metadata:
264
264
  rubygems_mfa_required: 'true'
265
- post_install_message:
265
+ post_install_message:
266
266
  rdoc_options: []
267
267
  require_paths:
268
268
  - lib
@@ -277,8 +277,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
277
277
  - !ruby/object:Gem::Version
278
278
  version: '0'
279
279
  requirements: []
280
- rubygems_version: 3.1.4
281
- signing_key:
280
+ rubygems_version: 3.5.11
281
+ signing_key:
282
282
  specification_version: 4
283
283
  summary: Gem for WOVN.io
284
284
  test_files: []