@voxgig/sdkgen 4.8.2 → 4.9.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.
Files changed (407) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/doctor.d.ts +1 -0
  3. package/dist/action/doctor.js +50 -2
  4. package/dist/action/doctor.js.map +1 -1
  5. package/dist/helpers/naming.js +4 -2
  6. package/dist/helpers/naming.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/model/sdkgen.aon +21 -0
  9. package/package.json +1 -1
  10. package/project/.sdk/model/feature/secrets.aon +120 -18
  11. package/project/.sdk/model/target/c.aon +10 -0
  12. package/project/.sdk/model/target/clojure.aon +13 -0
  13. package/project/.sdk/model/target/cpp.aon +10 -0
  14. package/project/.sdk/model/target/csharp.aon +9 -0
  15. package/project/.sdk/model/target/dart.aon +10 -0
  16. package/project/.sdk/model/target/elixir.aon +9 -0
  17. package/project/.sdk/model/target/go.aon +13 -0
  18. package/project/.sdk/model/target/java.aon +9 -0
  19. package/project/.sdk/model/target/js.aon +7 -0
  20. package/project/.sdk/model/target/kotlin.aon +9 -0
  21. package/project/.sdk/model/target/lean.aon +17 -0
  22. package/project/.sdk/model/target/lua.aon +8 -0
  23. package/project/.sdk/model/target/ocaml.aon +9 -0
  24. package/project/.sdk/model/target/perl.aon +8 -0
  25. package/project/.sdk/model/target/php.aon +8 -0
  26. package/project/.sdk/model/target/py.aon +13 -0
  27. package/project/.sdk/model/target/rb.aon +8 -0
  28. package/project/.sdk/model/target/rust.aon +10 -0
  29. package/project/.sdk/model/target/scala.aon +21 -2
  30. package/project/.sdk/model/target/swift.aon +18 -0
  31. package/project/.sdk/model/target/ts.aon +13 -0
  32. package/project/.sdk/model/target/zig.aon +9 -0
  33. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
  34. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  35. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  36. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  37. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  38. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  39. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  40. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  41. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  45. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  46. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  47. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  48. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  49. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  50. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  51. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  52. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  53. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  54. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  55. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  56. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  57. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  58. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  59. package/project/.sdk/tm/c/Makefile +38 -3
  60. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  61. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  62. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  63. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  64. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  65. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  66. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  67. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  68. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  69. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  70. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  71. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  72. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  73. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  74. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  75. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  76. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  77. package/project/.sdk/tm/cpp/Makefile +5 -1
  78. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  79. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  80. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  81. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  82. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  83. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  84. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  85. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  86. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  87. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  88. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  89. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  90. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  91. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  92. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  93. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  94. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  95. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  96. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  97. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  98. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  99. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  100. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  101. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  102. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  103. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  104. package/project/.sdk/tm/elixir/Makefile +11 -3
  105. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  106. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  107. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  108. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  109. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  110. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  111. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  112. package/project/.sdk/tm/go/core/context.go +32 -16
  113. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  133. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  134. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +208 -0
  135. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  136. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +150 -0
  137. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  138. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  139. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  140. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +442 -0
  141. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +714 -0
  142. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  143. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  144. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  145. package/project/.sdk/tm/go/test/omni/omni.go +902 -0
  146. package/project/.sdk/tm/go/test/omni/util.go +381 -0
  147. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  148. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  149. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  150. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  151. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  152. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  153. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  154. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  155. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  156. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  157. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  158. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  159. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  160. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  161. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  162. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  163. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  164. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  165. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  166. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  167. package/project/.sdk/tm/js/test/omni.js +251 -0
  168. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  169. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  170. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  171. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  172. package/project/.sdk/tm/js/test/vendor/omni/runner.js +628 -0
  173. package/project/.sdk/tm/js/test/vendor/omni/util.js +229 -0
  174. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  175. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  176. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  177. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  178. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  179. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  180. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  181. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  182. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  183. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  184. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  185. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  186. package/project/.sdk/tm/lean/Makefile +12 -5
  187. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  188. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  189. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  190. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  191. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  192. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  193. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  194. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  195. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  196. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  197. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  198. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  199. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  200. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  201. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  202. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  203. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  204. package/project/.sdk/tm/ocaml/Makefile +37 -12
  205. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  206. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  207. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  208. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  209. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  210. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  211. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  212. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  213. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  214. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  215. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  216. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  217. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  218. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  219. package/project/.sdk/tm/php/test/Omni.php +691 -0
  220. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  221. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  222. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  223. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  224. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  225. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  226. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  227. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +76 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +151 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +90 -0
  253. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  254. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  255. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  256. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  257. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +475 -0
  258. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  259. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  260. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  261. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  262. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  263. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  264. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  265. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  266. package/project/.sdk/tm/py/test/omni.py +415 -0
  267. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  268. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  269. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  270. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  271. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +580 -0
  272. package/project/.sdk/tm/py/test/voxgig_omni/util.py +252 -0
  273. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  274. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  275. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  276. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  277. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  278. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  279. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  280. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  281. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  282. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  283. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  284. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  285. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  286. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  287. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  288. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  289. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  290. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  291. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  292. package/project/.sdk/tm/scala/Makefile +16 -6
  293. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  294. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  295. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  296. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  297. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  298. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  299. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  300. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  301. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  302. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  303. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  304. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  305. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  306. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  307. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  308. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  309. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  310. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  311. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  312. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  313. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  326. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  327. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  328. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  329. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  330. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  345. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  346. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  347. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  348. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  349. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  350. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  351. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  352. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  353. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  354. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  355. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  356. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  357. package/project/.sdk/tm/zig/Makefile +15 -1
  358. package/project/.sdk/tm/zig/build.zig +23 -5
  359. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  360. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  361. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  362. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  363. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  364. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  365. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  366. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  367. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  368. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  369. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  370. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  371. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  372. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  373. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  374. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  375. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  376. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  377. package/project/.sdk/tm/zig/test/primary_utility_test.zig +145 -155
  378. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  379. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  380. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  381. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  382. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  383. package/project/sdkgen-package.json +1 -1
  384. package/src/action/doctor.ts +66 -2
  385. package/src/helpers/naming.ts +4 -2
  386. package/project/.sdk/tm/c/tests/runner.h +0 -274
  387. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  388. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  389. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  390. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  391. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  392. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  393. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  394. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  395. package/project/.sdk/tm/js/test/runner.js +0 -387
  396. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  397. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  398. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  399. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  400. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  401. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  402. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  403. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  404. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  405. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  406. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
  407. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -464
@@ -1,9 +1,14 @@
1
- # Vendored from voxgig/struct/rb
1
+ # ProjectName SDK struct utility test
2
+ #
3
+ # Corpus sections run through the vendored omni runner, via the resolver
4
+ # in test/omni.rb (struct-runner shape over native voxgig_omni;
5
+ # test/struct_runner.rb is retired - see
6
+ # docs/design/vendor-tag-rollout.md).
2
7
 
3
8
  require 'minitest/autorun'
4
9
  require 'json'
5
- require_relative '../utility/struct/voxgig_struct'
6
- require_relative 'struct_runner'
10
+ require_relative '../ProjectName_sdk'
11
+ require_relative 'omni'
7
12
 
8
13
  # A helper for deep equality comparison using JSON round-trip.
9
14
  def deep_equal(a, b)
@@ -29,13 +34,14 @@ STRUCT_TEST_JSON_FILE = File.join(__dir__, '../../.sdk/test/test.json')
29
34
 
30
35
  class StructUtilityTest < Minitest::Test
31
36
  def setup
32
- @client = StructTestClient.new
33
- @runner = StructRunner.make_runner(STRUCT_TEST_JSON_FILE, @client)
37
+ # The struct corpus drives the LIVE SDK's struct utilities, as ts does.
38
+ @client = ProjectNameSDK.test(nil, nil)
39
+ @runner = ProjectNameOmni.make_runner(STRUCT_TEST_JSON_FILE, @client)
34
40
  @runpack = @runner.call('struct')
35
41
  @spec = @runpack[:spec]
36
42
  @runset = @runpack[:runset]
37
43
  @runsetflags = @runpack[:runsetflags]
38
- @struct = @client.utility.struct
44
+ @struct = VoxgigStruct
39
45
  @minor_spec = @spec["minor"]
40
46
  @walk_spec = @spec["walk"]
41
47
  @merge_spec = @spec["merge"]
@@ -105,7 +111,7 @@ class StructUtilityTest < Minitest::Test
105
111
 
106
112
  def test_minor_stringify
107
113
  @runsetflags.call(@minor_spec["stringify"], {}, lambda { |vin|
108
- value = vin.key?("val") ? (vin["val"] == StructRunner::NULLMARK ? "null" : vin["val"]) : ""
114
+ value = vin.key?("val") ? (vin["val"] == ProjectNameOmni::NULLMARK ? "null" : vin["val"]) : ""
109
115
  VoxgigStruct.stringify(value, vin["max"])
110
116
  })
111
117
  end
@@ -0,0 +1,493 @@
1
+ # VENDORED: @voxgig/omni sdk-20260907-0029-0 (ruby/lib/voxgig_omni/runner.rb)
2
+ # Source: https://github.com/voxgig/omni @ 274708cc2d12b21707d975543953f845f8444be0 [tag: sdk-20260907-0029-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ # Omni: the shared multi-language test runner.
5
+ #
6
+ # Port of the canonical TypeScript implementation
7
+ # (typescript/src/Runner.ts). Behaviour must match, case for case.
8
+
9
+ require 'json'
10
+
11
+ require_relative 'util'
12
+
13
+ module VoxgigOmni
14
+ # The newest spec format version this runner understands. A spec with no
15
+ # OMNI block is version 0: the original, lenient format, frozen forever.
16
+ # Version 1 turns on strict entry validation (see checkentry).
17
+ SPECVERSION = 1
18
+
19
+ # Capability strings this runner supports beyond the version baseline. A
20
+ # spec's OMNI.requires list is checked against this: an unknown capability
21
+ # refuses the spec loudly at load time, instead of a lagging port silently
22
+ # mis-running it. (Empty today; future format features mint a string here.)
23
+ CAPABILITIES = []
24
+
25
+ # A test failure (or a malformed spec). Distinct from errors raised by
26
+ # the subject under test, which are candidates for an `err` expectation.
27
+ class OmniError < StandardError
28
+ attr_reader :entry
29
+
30
+ def initialize(message, entry = nil)
31
+ super(message)
32
+ @entry = entry
33
+ end
34
+ end
35
+
36
+ module Runner
37
+ module_function
38
+
39
+ U = VoxgigOmni::Util
40
+
41
+ # The complete set of fields an entry may carry. Under version 1
42
+ # anything else is an error: an unrecognised key is almost always a
43
+ # typo'd assertion, and a typo'd assertion is a test that silently
44
+ # stopped testing.
45
+ ENTRYFIELDS = %w[in args ctx out err match client id doc]
46
+
47
+ # Load a spec: a path to a JSON file, or an already-parsed object.
48
+ def loadspec(specref)
49
+ return JSON.parse(File.read(specref)) if specref.is_a?(String)
50
+
51
+ specref
52
+ end
53
+
54
+ # Read the spec's format version from its optional top-level OMNI
55
+ # block, and refuse a spec this runner cannot faithfully run: a version
56
+ # newer than SPECVERSION, or a required capability not in CAPABILITIES.
57
+ def resolveversion(alltests)
58
+ return 0 unless U.ismap(alltests) && alltests.key?('OMNI')
59
+
60
+ meta = alltests['OMNI']
61
+ version = U.ismap(meta) ? meta['version'] : nil
62
+
63
+ if !U.ismap(meta) || !U.isnum(version) || version % 1 != 0
64
+ raise OmniError, 'omni: malformed OMNI version block'
65
+ end
66
+
67
+ if version.negative? || SPECVERSION < version
68
+ raise OmniError, 'omni: unsupported spec version: ' + U.stringify(version)
69
+ end
70
+
71
+ if meta.key?('requires')
72
+ requires = meta['requires']
73
+ raise OmniError, 'omni: malformed OMNI requires list' unless U.islist(requires)
74
+
75
+ requires.each do |cap|
76
+ unless cap.is_a?(String) && CAPABILITIES.include?(cap)
77
+ raise OmniError, 'omni: spec requires unsupported capability: ' + U.stringify(cap)
78
+ end
79
+ end
80
+ end
81
+
82
+ version
83
+ end
84
+
85
+ # Strict entry validation, applied when the spec declares version 1 or
86
+ # later. The lenient format converts each of these mistakes into a
87
+ # silent pass or a dead field; here they fail with the entry named.
88
+ def checkentry(flags, index, entry)
89
+ raise fail(flags, index, entry, 'entry is not a map') unless U.ismap(entry)
90
+
91
+ entry.each_key do |key|
92
+ raise fail(flags, index, entry, 'unknown entry field: ' + key.to_s) unless ENTRYFIELDS.include?(key)
93
+ end
94
+
95
+ argsources = %w[in args ctx].count { |key| entry.key?(key) }
96
+ raise fail(flags, index, entry, 'entry has more than one of in, args, ctx') if argsources > 1
97
+
98
+ raise fail(flags, index, entry, 'entry has both err and out') if !entry['err'].nil? && entry.key?('out')
99
+
100
+ raise fail(flags, index, entry, 'entry id is not a string') if entry.key?('id') && !entry['id'].is_a?(String)
101
+ end
102
+
103
+ # Validate a version-1 group up front, against the AUTHORED entries -
104
+ # null-normalisation would otherwise rewrite an authored null (e.g.
105
+ # id: null) into a sentinel string and hide it from validation. A
106
+ # malformed spec is a spec error, not a test result, so it fails
107
+ # before any subject runs.
108
+ def checkset(flags, testspec, normalset)
109
+ origset = U.ismap(testspec) && U.islist(testspec['set']) ? testspec['set'] : normalset
110
+
111
+ if origset.empty? && (U.ismap(testspec) ? testspec['empty'] : nil) != true
112
+ raise OmniError, 'omni: empty test set: ' + flags[:name].to_s
113
+ end
114
+
115
+ origset.each_with_index do |entry, index|
116
+ checkentry(flags, index, entry)
117
+ end
118
+ end
119
+
120
+ # Find `primary.<name>`, then `<name>`, then the whole spec.
121
+ def resolvespec(name, alltests)
122
+ return alltests if name.nil?
123
+
124
+ primary = U.ismap(alltests) ? alltests['primary'] : nil
125
+ return primary[name] if U.ismap(primary) && !primary[name].nil?
126
+
127
+ return alltests[name] if U.ismap(alltests) && !alltests[name].nil?
128
+
129
+ alltests
130
+ end
131
+
132
+ # Build the named clients declared by the spec's DEF.client block.
133
+ def resolveclients(provider, spec, store)
134
+ clients = {}
135
+
136
+ defclient = U.ismap(spec) && U.ismap(spec['DEF']) ? spec['DEF']['client'] : nil
137
+ return clients unless U.ismap(defclient)
138
+
139
+ # A spec may define clients that a given test run never references.
140
+ clientmaker = provider[:client]
141
+ return clients if clientmaker.nil?
142
+
143
+ defclient.each do |clientname, cdef|
144
+ copts = U.clone((U.ismap(cdef) && U.ismap(cdef['test']) ? cdef['test']['options'] : nil) || {})
145
+
146
+ injector = provider[:inject]
147
+ injector.call(copts, store) if U.ismap(store) && !injector.nil?
148
+
149
+ clients[clientname] = clientmaker.call(copts)
150
+ end
151
+
152
+ clients
153
+ end
154
+
155
+ def resolvesubject(name, provider)
156
+ return nil if name.nil? || provider[:subject].nil?
157
+
158
+ provider[:subject].call(name)
159
+ end
160
+
161
+ def resolveflags(flags)
162
+ out = flags.nil? ? {} : flags.dup
163
+ out[:null] = out[:null].nil? ? true : !!out[:null]
164
+ out
165
+ end
166
+
167
+ # An entry with no `out` expects a null (or absent) result.
168
+ def resolveentry(entry, flags)
169
+ entry['out'] = NULLMARK if entry['out'].nil? && flags[:null]
170
+ entry
171
+ end
172
+
173
+ def resolvetestpack(name, entry, subject, provider, clients)
174
+ testpack = { client: provider, subject: subject }
175
+
176
+ unless entry['client'].nil?
177
+ client = clients[entry['client']]
178
+ raise OmniError.new('omni: unknown client: ' + entry['client'].to_s, entry) if client.nil?
179
+
180
+ testpack[:client] = client
181
+ testpack[:subject] = resolvesubject(name, client) || subject
182
+ end
183
+
184
+ testpack
185
+ end
186
+
187
+ # Build the argument list: `ctx`, `args`, or `in`.
188
+ def resolveargs(entry, testpack, provider)
189
+ args = if entry.key?('ctx')
190
+ [entry['ctx']]
191
+ elsif entry.key?('args')
192
+ entry['args']
193
+ else
194
+ [U.clone(entry['in'])]
195
+ end
196
+
197
+ if (entry.key?('ctx') || entry.key?('args')) && !args.empty?
198
+ first = args[0]
199
+ if U.ismap(first)
200
+ first = U.clone(first)
201
+ contextify = provider[:contextify]
202
+ first = contextify.call(first) unless contextify.nil?
203
+ args[0] = first
204
+ entry['ctx'] = first
205
+ first['client'] = testpack[:client] if U.ismap(first)
206
+ end
207
+ end
208
+
209
+ args
210
+ end
211
+
212
+ # Nulls become NULLMARK, errors become {name,message}. Always a copy.
213
+ def fixjson(val, flags = nil)
214
+ donull = flags.nil? || flags[:null].nil? ? true : !!flags[:null]
215
+ fixjsonval(val, donull)
216
+ end
217
+
218
+ def fixjsonval(val, donull)
219
+ return donull ? NULLMARK : nil if val.nil? || val.equal?(ABSENT)
220
+
221
+ return errify(val) if val.is_a?(Exception)
222
+
223
+ return val.map { |entry| fixjsonval(entry, donull) } if U.islist(val)
224
+
225
+ if U.ismap(val)
226
+ out = {}
227
+ val.each { |key, subval| out[key] = fixjsonval(subval, donull) }
228
+ return out
229
+ end
230
+
231
+ val
232
+ end
233
+
234
+ # The JSON form of an error: always at least {name,message}.
235
+ # An exception collapses to {name, message} here. A library whose errors
236
+ # carry a `code` reaches `match: {err: {code}}` through
237
+ # `Provider.errify`, which replaces this entirely.
238
+ def errify(err)
239
+ return { 'name' => 'Error', 'message' => err.to_s } unless err.is_a?(Exception)
240
+
241
+ { 'name' => err.class.name, 'message' => err.message }
242
+ end
243
+
244
+ # The error base a `match.err` sees: the provider's own, when it has one.
245
+ def errbase(err, provider)
246
+ hook = provider.is_a?(Hash) ? provider[:errify] : nil
247
+ hook.nil? ? errify(err) : hook.call(err)
248
+ end
249
+
250
+ def errmessage(err)
251
+ err.is_a?(Exception) ? err.message : err.to_s
252
+ end
253
+
254
+ # The label of one entry, for failure messages.
255
+ def entryref(flags, index, entry)
256
+ label = flags[:name] || 'set'
257
+ entryid = U.ismap(entry) && !entry['id'].nil? ? ' (' + entry['id'].to_s + ')' : ''
258
+ "#{label}[#{index}]#{entryid}"
259
+ end
260
+
261
+ def fail(flags, index, entry, reason, expected = nil, actual = nil)
262
+ msg = 'omni: ' + entryref(flags, index, entry) + ': ' + reason
263
+ msg += "\n expected: " + expected unless expected.nil?
264
+ msg += "\n actual: " + actual unless actual.nil?
265
+ msg += "\n entry: " + U.stringify(entrysummary(entry))
266
+ OmniError.new(msg, entry)
267
+ end
268
+
269
+ # The spec-defined part of an entry (drop runner bookkeeping).
270
+ def entrysummary(entry)
271
+ return entry unless U.ismap(entry)
272
+
273
+ out = {}
274
+ entry.each { |key, val| out[key] = val unless %w[res thrown ctx].include?(key) }
275
+ out
276
+ end
277
+
278
+ def checkresult(flags, index, entry, args, res)
279
+ matched = false
280
+
281
+ unless entry['err'].nil?
282
+ raise fail(flags, index, entry, 'expected error did not occur',
283
+ U.stringify(entry['err']), U.stringify(res))
284
+ end
285
+
286
+ unless entry['match'].nil?
287
+ match(flags, index, entry, entry['match'],
288
+ { 'in' => entry['in'], 'args' => args, 'out' => entry['res'], 'ctx' => entry['ctx'] })
289
+ matched = true
290
+ end
291
+
292
+ out = entry['out']
293
+
294
+ return if U.deepequal(res, out)
295
+
296
+ # NOTE: a match with no explicit out is a complete check on its own.
297
+ return if matched && (out == NULLMARK || out.nil?)
298
+
299
+ raise fail(flags, index, entry, 'result mismatch', U.stringify(out), U.stringify(res))
300
+ end
301
+
302
+ def handleerror(flags, index, entry, err, provider = nil)
303
+ entry['thrown'] = err
304
+
305
+ entryerr = entry['err']
306
+
307
+ unless entryerr.nil?
308
+ if entryerr == true || matchval(entryerr, errmessage(err))
309
+ unless entry['match'].nil?
310
+ match(flags, index, entry, entry['match'],
311
+ { 'in' => entry['in'], 'out' => entry['res'], 'ctx' => entry['ctx'],
312
+ 'err' => errbase(err, provider) })
313
+ end
314
+ return
315
+ end
316
+
317
+ raise fail(flags, index, entry, 'error mismatch', U.stringify(entryerr), errmessage(err))
318
+ end
319
+
320
+ raise fail(flags, index, entry, 'unexpected error', nil, errmessage(err))
321
+ end
322
+
323
+ # Check that every leaf of `check` is present, and matches, in `base`.
324
+ def match(flags, index, entry, check, base)
325
+ cbase = U.clone(base)
326
+
327
+ at = ->(path) { path.empty? ? '<root>' : U.pathify(path) }
328
+
329
+ apply = lambda do |_key, val, _parent, path|
330
+ # An empty container in the check is a structural placeholder: walk
331
+ # visits no leaves inside {} or [], so it asserts nothing about the
332
+ # base. (struct's corpus relies on this "map is here, contents
333
+ # unchecked" behaviour, so omni stays a faithful drop-in.)
334
+ unless U.isnode(val)
335
+ baseval = U.getpath(cbase, path)
336
+
337
+ # The sentinels are tested BEFORE the identity check below.
338
+ # Otherwise a subject returning the literal string "__UNDEF__"
339
+ # satisfies an assertion that the key is absent - two mutually
340
+ # exclusive states passing one check. A sentinel that accepts its
341
+ # own literal is not a sentinel. (NULLMARK still accepts NULLMARK:
342
+ # under the default null flag a real null has already been
343
+ # normalised to it, so the two are genuinely indistinguishable
344
+ # here - that one needs a raw-value escape, not an ordering
345
+ # change.)
346
+
347
+ # Explicitly absent: satisfied only by a genuinely missing key,
348
+ # never by a present null (the distinction the sentinels exist
349
+ # to keep).
350
+ if val == UNDEFMARK
351
+ next val if baseval.equal?(ABSENT)
352
+
353
+ raise fail(flags, index, entry, 'expected absent at ' + at.call(path),
354
+ 'absent', U.stringify(baseval))
355
+ end
356
+
357
+ # Explicitly null: satisfied only by a present null.
358
+ if val == NULLMARK
359
+ next val if baseval.nil? || baseval == NULLMARK
360
+
361
+ raise fail(flags, index, entry, 'expected null at ' + at.call(path),
362
+ 'null', U.stringify(baseval))
363
+ end
364
+
365
+ # Explicitly present: any present value, including null.
366
+ if val == EXISTSMARK
367
+ next val unless baseval.equal?(ABSENT)
368
+
369
+ raise fail(flags, index, entry, 'expected present at ' + at.call(path),
370
+ 'present', 'absent')
371
+ end
372
+
373
+ # Identical values match. This sits below the sentinel branches on
374
+ # purpose - see the note above.
375
+ next val if U.deepequal(baseval, val)
376
+
377
+ # A concrete expectation never matches a missing key - a match leaf
378
+ # against an absent value must fail, not substring-match the
379
+ # stringified absent value.
380
+ if baseval.equal?(ABSENT)
381
+ raise fail(flags, index, entry, 'match failed at ' + at.call(path),
382
+ U.stringify(val), 'absent')
383
+ end
384
+
385
+ unless matchval(val, baseval)
386
+ raise fail(flags, index, entry, 'match failed at ' + at.call(path),
387
+ U.stringify(val), U.stringify(baseval))
388
+ end
389
+ end
390
+
391
+ val
392
+ end
393
+
394
+ U.walk(U.clone(check), apply)
395
+ end
396
+
397
+ # Match one leaf: /regex/ or case-insensitive substring for strings.
398
+ def matchval(check, base)
399
+ return true if U.deepequal(check, base)
400
+
401
+ want = check
402
+ want = nil if want == UNDEFMARK || want == NULLMARK
403
+
404
+ return base.nil? || base.equal?(ABSENT) || base == NULLMARK if want.nil?
405
+
406
+ if want.is_a?(String)
407
+ # An empty want is not a wildcard: the empty string is a substring of
408
+ # everything, so `match:{out:""}` (or `err:""`) would accept any value.
409
+ return base == '' if want == ''
410
+
411
+ basestr = U.stringify(base)
412
+
413
+ rem = want.match(%r{^/(.+)/$}m)
414
+ return !Regexp.new(rem[1]).match(basestr).nil? if rem
415
+
416
+ return basestr.downcase.include?(want.downcase)
417
+ end
418
+
419
+ return true if want.is_a?(Proc) || want.is_a?(Method)
420
+
421
+ U.deepequal(want, base)
422
+ end
423
+
424
+ # Convert NULLMARK sentinels back into real nulls.
425
+ def nullmodifier(val, key, parent, *_rest)
426
+ if val == NULLMARK
427
+ parent[key] = nil
428
+ elsif val.is_a?(String)
429
+ parent[key] = val.gsub(NULLMARK, 'null')
430
+ end
431
+ end
432
+
433
+ # Make a runner for a spec file (or spec object) and a provider.
434
+ def make_runner(specref, provider = nil)
435
+ alltests = loadspec(specref)
436
+ specversion = resolveversion(alltests)
437
+ useprovider = provider || {}
438
+
439
+ lambda do |name = nil, store = nil|
440
+ spec = resolvespec(name, alltests)
441
+ clients = resolveclients(useprovider, spec, store.nil? ? {} : store)
442
+ defsubject = resolvesubject(name, useprovider)
443
+
444
+ runsetflags = lambda do |testspec, flags, testsubject = nil|
445
+ useflags = resolveflags(flags)
446
+ useflags[:name] = useflags[:name] || name || 'set'
447
+
448
+ subject = testsubject || defsubject
449
+ raise OmniError, 'omni: no test subject for: ' + useflags[:name].to_s if subject.nil?
450
+
451
+ testspecmap = fixjson(testspec, useflags)
452
+
453
+ unless U.ismap(testspecmap) && U.islist(testspecmap['set'])
454
+ raise OmniError, 'omni: test spec has no set: ' + useflags[:name].to_s
455
+ end
456
+
457
+ testset = testspecmap['set']
458
+
459
+ checkset(useflags, testspec, testset) if 1 <= specversion
460
+
461
+ testset.each_with_index do |entry, index|
462
+ begin
463
+ entry = resolveentry(entry, useflags)
464
+
465
+ testpack = resolvetestpack(name, entry, subject, useprovider, clients)
466
+ args = resolveargs(entry, testpack, useprovider)
467
+
468
+ res = testpack[:subject].call(*args)
469
+ res = fixjson(res, useflags)
470
+ entry['res'] = res
471
+
472
+ checkresult(useflags, index, entry, args, res)
473
+ rescue OmniError
474
+ raise
475
+ rescue StandardError => e
476
+ handleerror(useflags, index, entry, e, useprovider)
477
+ end
478
+ end
479
+ end
480
+
481
+ runset = ->(testspec, testsubject = nil) { runsetflags.call(testspec, {}, testsubject) }
482
+
483
+ {
484
+ spec: spec,
485
+ runset: runset,
486
+ runsetflags: runsetflags,
487
+ subject: defsubject,
488
+ client: useprovider
489
+ }
490
+ end
491
+ end
492
+ end
493
+ end