@voxgig/sdkgen 4.8.1 → 4.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/doctor.d.ts +1 -0
- package/dist/action/doctor.js +50 -2
- package/dist/action/doctor.js.map +1 -1
- package/dist/helpers/naming.js +4 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/model/sdkgen.aon +21 -0
- package/package.json +2 -2
- package/project/.sdk/model/feature/secrets.aon +120 -18
- package/project/.sdk/model/target/c.aon +10 -0
- package/project/.sdk/model/target/clojure.aon +13 -0
- package/project/.sdk/model/target/cpp.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +9 -0
- package/project/.sdk/model/target/dart.aon +10 -0
- package/project/.sdk/model/target/elixir.aon +9 -0
- package/project/.sdk/model/target/go.aon +13 -0
- package/project/.sdk/model/target/java.aon +9 -0
- package/project/.sdk/model/target/js.aon +7 -0
- package/project/.sdk/model/target/kotlin.aon +9 -0
- package/project/.sdk/model/target/lean.aon +17 -0
- package/project/.sdk/model/target/lua.aon +8 -0
- package/project/.sdk/model/target/ocaml.aon +9 -0
- package/project/.sdk/model/target/perl.aon +8 -0
- package/project/.sdk/model/target/php.aon +8 -0
- package/project/.sdk/model/target/py.aon +13 -0
- package/project/.sdk/model/target/rb.aon +8 -0
- package/project/.sdk/model/target/rust.aon +10 -0
- package/project/.sdk/model/target/scala.aon +21 -2
- package/project/.sdk/model/target/swift.aon +18 -0
- package/project/.sdk/model/target/ts.aon +13 -0
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
- package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
- package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
- package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
- package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
- package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
- package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
- package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
- package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
- package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
- package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
- package/project/.sdk/tm/c/Makefile +38 -3
- package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
- package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
- package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
- package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
- package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
- package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
- package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
- package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
- package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
- package/project/.sdk/tm/cpp/Makefile +5 -1
- package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
- package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
- package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
- package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
- package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
- package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
- package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
- package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
- package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
- package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
- package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
- package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
- package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
- package/project/.sdk/tm/dart/test/omni.dart +520 -0
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
- package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
- package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
- package/project/.sdk/tm/elixir/Makefile +11 -3
- package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
- package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
- package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
- package/project/.sdk/tm/go/core/context.go +32 -16
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
- package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
- package/project/.sdk/tm/go/test/omni/omni.go +897 -0
- package/project/.sdk/tm/go/test/omni/util.go +360 -0
- package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
- package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
- package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
- package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
- package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
- package/project/.sdk/tm/go/utility/make_options.go +8 -1
- package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
- package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
- package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
- package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
- package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
- package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
- package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
- package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
- package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
- package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
- package/project/.sdk/tm/js/test/omni.js +251 -0
- package/project/.sdk/tm/js/test/omni.test.js +105 -0
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
- package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
- package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
- package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
- package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
- package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
- package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
- package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
- package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
- package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
- package/project/.sdk/tm/lean/Makefile +12 -5
- package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
- package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
- package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
- package/project/.sdk/tm/lua/test/omni.lua +456 -0
- package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
- package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
- package/project/.sdk/tm/ocaml/Makefile +37 -12
- package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
- package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
- package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
- package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
- package/project/.sdk/tm/perl/t/omni.pm +647 -0
- package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
- package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
- package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
- package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
- package/project/.sdk/tm/php/test/Omni.php +691 -0
- package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
- package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
- package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
- package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
- package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
- package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
- package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
- package/project/.sdk/tm/py/test/omni.py +415 -0
- package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
- package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
- package/project/.sdk/tm/rb/test/omni.rb +505 -0
- package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
- package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
- package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
- package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
- package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
- package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
- package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
- package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
- package/project/.sdk/tm/scala/Makefile +16 -6
- package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
- package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
- package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
- package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
- package/project/.sdk/tm/ts/test/omni.ts +104 -32
- package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
- package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
- package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
- package/project/sdkgen-package.json +1 -1
- package/src/action/doctor.ts +66 -2
- package/src/helpers/naming.ts +4 -2
- package/project/.sdk/tm/c/tests/runner.h +0 -274
- package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
- package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
- package/project/.sdk/tm/dart/test/runner.dart +0 -406
- package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
- package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
- package/project/.sdk/tm/go/test/runner_test.go +0 -629
- package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
- package/project/.sdk/tm/java/test/StructRunner.java +0 -281
- package/project/.sdk/tm/js/test/runner.js +0 -387
- package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
- package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
- package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
- package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
- package/project/.sdk/tm/php/test/StructRunner.php +0 -275
- package/project/.sdk/tm/py/test/struct_runner.py +0 -411
- package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
- package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
- package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
# VENDORED: @voxgig/omni 0.1.0 (perl/lib/Voxgig/Omni/Runner.pm)
|
|
2
|
+
# Source: https://github.com/voxgig/omni @ 8c3e1b573a8d35796f7fc45e3226b977023cabf7 [tag: sdk-20260904-1610-0]
|
|
3
|
+
# License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
package Voxgig::Omni::Runner;
|
|
5
|
+
|
|
6
|
+
# Omni: the shared multi-language test runner.
|
|
7
|
+
#
|
|
8
|
+
# Port of the canonical TypeScript implementation
|
|
9
|
+
# (typescript/src/Runner.ts). Behaviour must match, case for case.
|
|
10
|
+
|
|
11
|
+
use strict;
|
|
12
|
+
use warnings;
|
|
13
|
+
|
|
14
|
+
use JSON::PP ();
|
|
15
|
+
use Scalar::Util qw(blessed reftype);
|
|
16
|
+
|
|
17
|
+
use Voxgig::Omni::Util qw(
|
|
18
|
+
ABSENT NULLMARK UNDEFMARK EXISTSMARK
|
|
19
|
+
clone deepequal getpath isabsent isbool islist ismap isnode isnum
|
|
20
|
+
jsonstr pathify stringify walk
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
use Exporter 'import';
|
|
24
|
+
our @EXPORT_OK = qw(
|
|
25
|
+
makeRunner loadspec resolvespec matchval match fixjson errify nullmodifier
|
|
26
|
+
SPECVERSION CAPABILITIES
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
# The newest spec format version this runner understands. A spec with no
|
|
30
|
+
# OMNI block is version 0: the original, lenient format, frozen forever.
|
|
31
|
+
# Version 1 turns on strict entry validation (see checkentry).
|
|
32
|
+
use constant SPECVERSION => 1;
|
|
33
|
+
|
|
34
|
+
# Capability strings this runner supports beyond the version baseline. A
|
|
35
|
+
# spec's OMNI.requires list is checked against this: an unknown capability
|
|
36
|
+
# refuses the spec loudly at load time, instead of a lagging port silently
|
|
37
|
+
# mis-running it. (Empty today; future format features mint a string here.)
|
|
38
|
+
use constant CAPABILITIES => [];
|
|
39
|
+
|
|
40
|
+
# The complete set of fields an entry may carry. Under version 1 anything
|
|
41
|
+
# else is an error: an unrecognised key is almost always a typo'd
|
|
42
|
+
# assertion, and a typo'd assertion is a test that silently stopped
|
|
43
|
+
# testing.
|
|
44
|
+
use constant ENTRYFIELDS => [qw(in args ctx out err match client id doc)];
|
|
45
|
+
|
|
46
|
+
# A test failure (or a malformed spec). Distinct from errors thrown by the
|
|
47
|
+
# subject under test, which are candidates for an `err` expectation.
|
|
48
|
+
{
|
|
49
|
+
package Voxgig::Omni::OmniError;
|
|
50
|
+
use overload '""' => sub { $_[0]->{message} }, fallback => 1;
|
|
51
|
+
|
|
52
|
+
sub new {
|
|
53
|
+
my ( $class, $message, $entry ) = @_;
|
|
54
|
+
return bless { message => $message, entry => $entry }, $class;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
sub message { return $_[0]->{message} }
|
|
58
|
+
sub entry { return $_[0]->{entry} }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
sub is_omni_error {
|
|
62
|
+
my ($err) = @_;
|
|
63
|
+
return ( blessed($err) && $err->isa('Voxgig::Omni::OmniError') ) ? 1 : 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Load a spec: a path to a JSON file, or an already-parsed structure.
|
|
67
|
+
sub loadspec {
|
|
68
|
+
my ($specref) = @_;
|
|
69
|
+
|
|
70
|
+
if ( !ref $specref ) {
|
|
71
|
+
open( my $handle, '<', $specref )
|
|
72
|
+
or die Voxgig::Omni::OmniError->new( 'omni: cannot read spec: ' . $specref );
|
|
73
|
+
local $/ = undef;
|
|
74
|
+
my $text = <$handle>;
|
|
75
|
+
close($handle);
|
|
76
|
+
return JSON::PP->new->decode($text);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return $specref;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# Read the spec's format version from its optional top-level OMNI block,
|
|
83
|
+
# and refuse a spec this runner cannot faithfully run: a version newer
|
|
84
|
+
# than SPECVERSION, or a required capability not in CAPABILITIES.
|
|
85
|
+
sub resolveversion {
|
|
86
|
+
my ($alltests) = @_;
|
|
87
|
+
|
|
88
|
+
# JSON null decodes to undef, so `defined` cannot tell a null OMNI
|
|
89
|
+
# block from an absent one - only `exists` can. A present-but-null
|
|
90
|
+
# block is malformed, exactly as in canonical.
|
|
91
|
+
return 0 if !ismap($alltests) || !exists $alltests->{OMNI};
|
|
92
|
+
my $meta = $alltests->{OMNI};
|
|
93
|
+
|
|
94
|
+
# Perl scalars are untyped: a JSON number is told apart from anything
|
|
95
|
+
# else with isnum, and "integer" is int()-equality rather than typeof.
|
|
96
|
+
if ( !ismap($meta)
|
|
97
|
+
|| !isnum( $meta->{version} )
|
|
98
|
+
|| 0 != ( $meta->{version} - int( $meta->{version} ) ) )
|
|
99
|
+
{
|
|
100
|
+
die Voxgig::Omni::OmniError->new('omni: malformed OMNI version block');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
my $version = $meta->{version};
|
|
104
|
+
|
|
105
|
+
if ( $version < 0 || SPECVERSION() < $version ) {
|
|
106
|
+
die Voxgig::Omni::OmniError->new( 'omni: unsupported spec version: ' . $version );
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if ( exists $meta->{requires} ) {
|
|
110
|
+
my $requires = $meta->{requires};
|
|
111
|
+
die Voxgig::Omni::OmniError->new('omni: malformed OMNI requires list')
|
|
112
|
+
if !islist($requires);
|
|
113
|
+
|
|
114
|
+
for my $cap (@$requires) {
|
|
115
|
+
my $isstring = !ref($cap) && !isbool($cap);
|
|
116
|
+
die Voxgig::Omni::OmniError->new(
|
|
117
|
+
'omni: spec requires unsupported capability: ' . stringify($cap) )
|
|
118
|
+
if !$isstring || !grep { $_ eq $cap } @{ CAPABILITIES() };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return $version;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Strict entry validation, applied when the spec declares version 1 or
|
|
126
|
+
# later. The lenient format converts each of these mistakes into a silent
|
|
127
|
+
# pass or a dead field; here they fail with the entry named.
|
|
128
|
+
sub checkentry {
|
|
129
|
+
my ( $flags, $index, $entry ) = @_;
|
|
130
|
+
|
|
131
|
+
die fail( $flags, $index, $entry, 'entry is not a map' ) if !ismap($entry);
|
|
132
|
+
|
|
133
|
+
for my $key ( keys %$entry ) {
|
|
134
|
+
die fail( $flags, $index, $entry, 'unknown entry field: ' . $key )
|
|
135
|
+
if !grep { $_ eq $key } @{ ENTRYFIELDS() };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
my $argsources = grep { exists $entry->{$_} } qw(in args ctx);
|
|
139
|
+
die fail( $flags, $index, $entry, 'entry has more than one of in, args, ctx' )
|
|
140
|
+
if 1 < $argsources;
|
|
141
|
+
|
|
142
|
+
die fail( $flags, $index, $entry, 'entry has both err and out' )
|
|
143
|
+
if defined $entry->{err} && exists $entry->{out};
|
|
144
|
+
|
|
145
|
+
die fail( $flags, $index, $entry, 'entry id is not a string' )
|
|
146
|
+
if exists $entry->{id}
|
|
147
|
+
&& ( !defined $entry->{id} || ref( $entry->{id} ) || isbool( $entry->{id} ) );
|
|
148
|
+
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Validate a version-1 group up front, against the AUTHORED entries -
|
|
153
|
+
# null-normalisation would otherwise rewrite an authored null (e.g.
|
|
154
|
+
# id: null) into a sentinel string and hide it from validation. A
|
|
155
|
+
# malformed spec is a spec error, not a test result, so it fails before
|
|
156
|
+
# any subject runs.
|
|
157
|
+
sub checkset {
|
|
158
|
+
my ( $flags, $testspec, $normalset ) = @_;
|
|
159
|
+
|
|
160
|
+
my $origset =
|
|
161
|
+
( ismap($testspec) && islist( $testspec->{set} ) ) ? $testspec->{set} : $normalset;
|
|
162
|
+
|
|
163
|
+
my $empty = ismap($testspec) ? $testspec->{empty} : undef;
|
|
164
|
+
my $isemptyok = ( isbool($empty) && $empty ) ? 1 : 0;
|
|
165
|
+
die Voxgig::Omni::OmniError->new( 'omni: empty test set: ' . $flags->{name} )
|
|
166
|
+
if 0 == scalar(@$origset) && !$isemptyok;
|
|
167
|
+
|
|
168
|
+
for my $index ( 0 .. $#$origset ) {
|
|
169
|
+
checkentry( $flags, $index, $origset->[$index] );
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
# Find `primary.<name>`, then `<name>`, then the whole spec.
|
|
176
|
+
sub resolvespec {
|
|
177
|
+
my ( $name, $alltests ) = @_;
|
|
178
|
+
|
|
179
|
+
return $alltests if !defined $name;
|
|
180
|
+
|
|
181
|
+
my $primary = ismap($alltests) ? $alltests->{primary} : undef;
|
|
182
|
+
return $primary->{$name} if ismap($primary) && defined $primary->{$name};
|
|
183
|
+
|
|
184
|
+
return $alltests->{$name} if ismap($alltests) && defined $alltests->{$name};
|
|
185
|
+
|
|
186
|
+
return $alltests;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Build the named clients declared by the spec's DEF.client block.
|
|
190
|
+
sub resolveclients {
|
|
191
|
+
my ( $provider, $spec, $store ) = @_;
|
|
192
|
+
my %clients;
|
|
193
|
+
|
|
194
|
+
my $defclient =
|
|
195
|
+
( ismap($spec) && ismap( $spec->{DEF} ) ) ? $spec->{DEF}{client} : undef;
|
|
196
|
+
return \%clients if !ismap($defclient);
|
|
197
|
+
|
|
198
|
+
# A spec may define clients that a given test run never references.
|
|
199
|
+
my $clientmaker = $provider->{client};
|
|
200
|
+
return \%clients if !defined $clientmaker;
|
|
201
|
+
|
|
202
|
+
for my $clientname ( keys %$defclient ) {
|
|
203
|
+
my $cdef = $defclient->{$clientname};
|
|
204
|
+
my $copts =
|
|
205
|
+
clone( ( ismap($cdef) && ismap( $cdef->{test} ) ? $cdef->{test}{options} : undef ) || {} );
|
|
206
|
+
|
|
207
|
+
my $injector = $provider->{inject};
|
|
208
|
+
$injector->( $copts, $store ) if ismap($store) && defined $injector;
|
|
209
|
+
|
|
210
|
+
$clients{$clientname} = $clientmaker->($copts);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return \%clients;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
sub resolvesubject {
|
|
217
|
+
my ( $name, $provider ) = @_;
|
|
218
|
+
return undef if !defined $name || !defined $provider->{subject};
|
|
219
|
+
return $provider->{subject}->($name);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
sub resolveflags {
|
|
223
|
+
my ($flags) = @_;
|
|
224
|
+
my %out = %{ $flags || {} };
|
|
225
|
+
$out{null} = !defined $out{null} ? 1 : ( $out{null} ? 1 : 0 );
|
|
226
|
+
return \%out;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
# An entry with no `out` expects a null (or absent) result.
|
|
230
|
+
sub resolveentry {
|
|
231
|
+
my ( $entry, $flags ) = @_;
|
|
232
|
+
$entry->{out} = NULLMARK if !defined $entry->{out} && $flags->{null};
|
|
233
|
+
return $entry;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
sub resolvetestpack {
|
|
237
|
+
my ( $name, $entry, $subject, $provider, $clients ) = @_;
|
|
238
|
+
my $testpack = { client => $provider, subject => $subject };
|
|
239
|
+
|
|
240
|
+
if ( defined $entry->{client} ) {
|
|
241
|
+
my $client = $clients->{ $entry->{client} };
|
|
242
|
+
die Voxgig::Omni::OmniError->new( 'omni: unknown client: ' . $entry->{client}, $entry )
|
|
243
|
+
if !defined $client;
|
|
244
|
+
$testpack->{client} = $client;
|
|
245
|
+
$testpack->{subject} = resolvesubject( $name, $client ) || $subject;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return $testpack;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
# Build the argument list: `ctx`, `args`, or `in`.
|
|
252
|
+
sub resolveargs {
|
|
253
|
+
my ( $entry, $testpack, $provider ) = @_;
|
|
254
|
+
my $args;
|
|
255
|
+
|
|
256
|
+
if ( exists $entry->{ctx} ) {
|
|
257
|
+
$args = [ $entry->{ctx} ];
|
|
258
|
+
}
|
|
259
|
+
elsif ( exists $entry->{args} ) {
|
|
260
|
+
$args = $entry->{args};
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
# exists, not truth: an entry carrying none of `in`/`args`/`ctx` is
|
|
264
|
+
# called with one ABSENT argument, not undef. `typify()` is
|
|
265
|
+
# 1073741824 where `typify(null)` is 4194432.
|
|
266
|
+
$args = [ exists $entry->{in} ? clone( $entry->{in} ) : ABSENT ];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if ( ( exists $entry->{ctx} || exists $entry->{args} ) && 0 < scalar(@$args) ) {
|
|
270
|
+
my $first = $args->[0];
|
|
271
|
+
if ( ismap($first) ) {
|
|
272
|
+
$first = clone($first);
|
|
273
|
+
my $contextify = $provider->{contextify};
|
|
274
|
+
$first = $contextify->($first) if defined $contextify;
|
|
275
|
+
$args->[0] = $first;
|
|
276
|
+
$entry->{ctx} = $first;
|
|
277
|
+
$first->{client} = $testpack->{client} if ismap($first);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return $args;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
# Nulls become NULLMARK, errors become {name,message}. Always a copy.
|
|
285
|
+
sub fixjson {
|
|
286
|
+
my ( $val, $flags ) = @_;
|
|
287
|
+
my $donull = ( !defined $flags || !defined $flags->{null} ) ? 1 : ( $flags->{null} ? 1 : 0 );
|
|
288
|
+
return fixjsonval( $val, $donull );
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
sub fixjsonval {
|
|
292
|
+
my ( $val, $donull ) = @_;
|
|
293
|
+
|
|
294
|
+
if ( !defined $val || isabsent($val) ) {
|
|
295
|
+
# Canonical returns the value UNCHANGED when donull is false
|
|
296
|
+
# (typescript/src/Runner.ts): absent stays absent and undef stays
|
|
297
|
+
# undef. Answering undef for both collapsed two states the corpus
|
|
298
|
+
# distinguishes. Same defect omni-lua and omni-rust carried
|
|
299
|
+
# (voxgig/omni#17, #23).
|
|
300
|
+
return $donull ? NULLMARK : $val;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return errify($val) if blessed($val) && $val->isa('Voxgig::Omni::OmniError');
|
|
304
|
+
|
|
305
|
+
if ( islist($val) ) {
|
|
306
|
+
return [ map { fixjsonval( $_, $donull ) } @$val ];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if ( ismap($val) ) {
|
|
310
|
+
my %out;
|
|
311
|
+
for my $key ( keys %$val ) {
|
|
312
|
+
$out{$key} = fixjsonval( $val->{$key}, $donull );
|
|
313
|
+
}
|
|
314
|
+
return \%out;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return $val;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
# The JSON form of an error: always at least {name,message}.
|
|
321
|
+
sub errify {
|
|
322
|
+
my ($err) = @_;
|
|
323
|
+
my $name = blessed($err) ? ref($err) : 'Error';
|
|
324
|
+
return { name => $name, message => errmessage($err) };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
# The error base a `match.err` sees: the provider's own, when it has one.
|
|
328
|
+
# A library whose errors carry a `code` reaches `match: {err: {code}}`
|
|
329
|
+
# through `Provider.errify`, which REPLACES this rather than adding to it.
|
|
330
|
+
sub errbase {
|
|
331
|
+
my ( $err, $provider ) = @_;
|
|
332
|
+
my $hook = ref($provider) eq 'HASH' ? $provider->{errify} : undef;
|
|
333
|
+
return defined $hook ? $hook->($err) : errify($err);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
# Perl's `die` decorates the message: `die "msg"` becomes "msg at FILE line
|
|
337
|
+
# N.\n", and `die "msg\n"` keeps the newline. Both are removed so that a
|
|
338
|
+
# message reads the same here as in every other port.
|
|
339
|
+
#
|
|
340
|
+
# Only that decoration is removed. A message whose own last character is a
|
|
341
|
+
# space keeps it - stripping trailing whitespace wholesale made Perl the one
|
|
342
|
+
# port where `err` could not pin such a message.
|
|
343
|
+
sub errmessage {
|
|
344
|
+
my ($err) = @_;
|
|
345
|
+
my $msg = "$err";
|
|
346
|
+
$msg =~ s/ at \S+ line \d+\.?\n?$//;
|
|
347
|
+
$msg =~ s/\n$//;
|
|
348
|
+
return $msg;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
# The label of one entry, for failure messages.
|
|
352
|
+
sub entryref {
|
|
353
|
+
my ( $flags, $index, $entry ) = @_;
|
|
354
|
+
my $label = $flags->{name} || 'set';
|
|
355
|
+
my $entryid =
|
|
356
|
+
( ismap($entry) && defined $entry->{id} ) ? ' (' . $entry->{id} . ')' : '';
|
|
357
|
+
return $label . '[' . $index . ']' . $entryid;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
sub fail {
|
|
361
|
+
my ( $flags, $index, $entry, $reason, $expected, $actual ) = @_;
|
|
362
|
+
my $msg = 'omni: ' . entryref( $flags, $index, $entry ) . ': ' . $reason;
|
|
363
|
+
$msg .= "\n expected: " . $expected if defined $expected;
|
|
364
|
+
$msg .= "\n actual: " . $actual if defined $actual;
|
|
365
|
+
$msg .= "\n entry: " . stringify( entrysummary($entry) );
|
|
366
|
+
return Voxgig::Omni::OmniError->new( $msg, $entry );
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
# The spec-defined part of an entry (drop runner bookkeeping).
|
|
370
|
+
sub entrysummary {
|
|
371
|
+
my ($entry) = @_;
|
|
372
|
+
return $entry if !ismap($entry);
|
|
373
|
+
my %out;
|
|
374
|
+
for my $key ( keys %$entry ) {
|
|
375
|
+
$out{$key} = $entry->{$key} if $key ne 'res' && $key ne 'thrown' && $key ne 'ctx';
|
|
376
|
+
}
|
|
377
|
+
return \%out;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
sub checkresult {
|
|
381
|
+
my ( $flags, $index, $entry, $args, $res ) = @_;
|
|
382
|
+
my $matched = 0;
|
|
383
|
+
|
|
384
|
+
if ( defined $entry->{err} ) {
|
|
385
|
+
die fail( $flags, $index, $entry, 'expected error did not occur',
|
|
386
|
+
stringify( $entry->{err} ), stringify($res) );
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if ( defined $entry->{match} ) {
|
|
390
|
+
match(
|
|
391
|
+
$flags, $index, $entry,
|
|
392
|
+
$entry->{match},
|
|
393
|
+
{
|
|
394
|
+
'in' => $entry->{in},
|
|
395
|
+
args => $args,
|
|
396
|
+
out => $entry->{res},
|
|
397
|
+
ctx => $entry->{ctx},
|
|
398
|
+
}
|
|
399
|
+
);
|
|
400
|
+
$matched = 1;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
# Same conflation as resolveargs: an entry with NO `out` expects an ABSENT
|
|
404
|
+
# result, and one with `out: null` expects a null. Reading the key without
|
|
405
|
+
# asking whether it exists made both undef, so a subject that correctly
|
|
406
|
+
# returned nothing was compared against null and marked wrong. Canonical
|
|
407
|
+
# gets this for free - `entry.out` on a missing key IS undefined, which is
|
|
408
|
+
# also how TypeScript spells absent.
|
|
409
|
+
#
|
|
410
|
+
# (Under `null: true` this never fires - resolveentry has already put
|
|
411
|
+
# NULLMARK there.)
|
|
412
|
+
my $out = exists $entry->{out} ? $entry->{out} : ABSENT;
|
|
413
|
+
|
|
414
|
+
return if deepequal( $res, $out );
|
|
415
|
+
|
|
416
|
+
# NOTE: a match with no explicit out is a complete check on its own.
|
|
417
|
+
# `null == out` in canonical is true of undefined too, so absent counts.
|
|
418
|
+
return if $matched
|
|
419
|
+
&& ( !defined $out || isabsent($out) || ( !ref($out) && $out eq NULLMARK ) );
|
|
420
|
+
|
|
421
|
+
die fail( $flags, $index, $entry, 'result mismatch', stringify($out), stringify($res) );
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
sub handleerror {
|
|
425
|
+
my ( $flags, $index, $entry, $err, $provider ) = @_;
|
|
426
|
+
|
|
427
|
+
my $entryerr = $entry->{err};
|
|
428
|
+
|
|
429
|
+
if ( defined $entryerr ) {
|
|
430
|
+
my $istrue = ( JSON::PP::is_bool($entryerr) && $entryerr ) ? 1 : 0;
|
|
431
|
+
if ( $istrue || matchval( $entryerr, errmessage($err) ) ) {
|
|
432
|
+
if ( defined $entry->{match} ) {
|
|
433
|
+
match(
|
|
434
|
+
$flags, $index, $entry,
|
|
435
|
+
$entry->{match},
|
|
436
|
+
{
|
|
437
|
+
'in' => $entry->{in},
|
|
438
|
+
out => $entry->{res},
|
|
439
|
+
ctx => $entry->{ctx},
|
|
440
|
+
err => errbase( $err, $provider ),
|
|
441
|
+
}
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
die fail( $flags, $index, $entry, 'error mismatch', stringify($entryerr),
|
|
448
|
+
errmessage($err) );
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
die fail( $flags, $index, $entry, 'unexpected error', undef, errmessage($err) );
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
# Check that every leaf of `check` is present, and matches, in `base`.
|
|
455
|
+
sub match {
|
|
456
|
+
my ( $flags, $index, $entry, $check, $base ) = @_;
|
|
457
|
+
my $cbase = clone($base);
|
|
458
|
+
|
|
459
|
+
my $apply = sub {
|
|
460
|
+
my ( $_key, $val, $_parent, $path ) = @_;
|
|
461
|
+
|
|
462
|
+
my $where = 0 == scalar(@$path) ? '<root>' : pathify($path);
|
|
463
|
+
|
|
464
|
+
return $val if isnode($val);
|
|
465
|
+
|
|
466
|
+
my $baseval = getpath( $cbase, $path );
|
|
467
|
+
|
|
468
|
+
my $isleafstr = !ref($val) && defined($val);
|
|
469
|
+
|
|
470
|
+
# The sentinels are tested BEFORE the identity check below. Otherwise
|
|
471
|
+
# a subject returning the literal string "__UNDEF__" satisfies an
|
|
472
|
+
# assertion that the key is absent - two mutually exclusive states
|
|
473
|
+
# passing one check. A sentinel that accepts its own literal is not a
|
|
474
|
+
# sentinel. (NULLMARK still accepts NULLMARK: under the default null
|
|
475
|
+
# flag a real null has already been normalised to it, so the two are
|
|
476
|
+
# genuinely indistinguishable here - that one needs a raw-value
|
|
477
|
+
# escape, not an ordering change.)
|
|
478
|
+
|
|
479
|
+
# Explicitly absent: satisfied only by a genuinely missing key, never
|
|
480
|
+
# by a present null (the distinction the sentinels exist to keep).
|
|
481
|
+
if ( $isleafstr && $val eq UNDEFMARK ) {
|
|
482
|
+
return $val if isabsent($baseval);
|
|
483
|
+
die fail( $flags, $index, $entry, 'expected absent at ' . $where,
|
|
484
|
+
'absent', stringify($baseval) );
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
# Explicitly null: satisfied only by a present null.
|
|
488
|
+
if ( $isleafstr && $val eq NULLMARK ) {
|
|
489
|
+
return $val
|
|
490
|
+
if !defined($baseval)
|
|
491
|
+
|| ( !ref($baseval) && $baseval eq NULLMARK );
|
|
492
|
+
die fail( $flags, $index, $entry, 'expected null at ' . $where,
|
|
493
|
+
'null', stringify($baseval) );
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
# Explicitly present: any present value, including null.
|
|
497
|
+
if ( $isleafstr && $val eq EXISTSMARK ) {
|
|
498
|
+
return $val if !isabsent($baseval);
|
|
499
|
+
die fail( $flags, $index, $entry, 'expected present at ' . $where,
|
|
500
|
+
'present', 'absent' );
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
# Identical values match. This sits below the sentinel branches on
|
|
504
|
+
# purpose - see the note above.
|
|
505
|
+
return $val if deepequal( $val, $baseval );
|
|
506
|
+
|
|
507
|
+
# A concrete expectation never matches a missing key - a match leaf
|
|
508
|
+
# against an absent value must fail, not substring-match "undefined".
|
|
509
|
+
if ( isabsent($baseval) ) {
|
|
510
|
+
die fail( $flags, $index, $entry, 'match failed at ' . $where,
|
|
511
|
+
stringify($val), 'absent' );
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if ( !matchval( $val, $baseval ) ) {
|
|
515
|
+
die fail( $flags, $index, $entry, 'match failed at ' . $where,
|
|
516
|
+
stringify($val), stringify($baseval) );
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return $val;
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
walk( clone($check), $apply );
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
# Match one leaf: /regex/ or case-insensitive substring for strings.
|
|
526
|
+
sub matchval {
|
|
527
|
+
my ( $check, $base ) = @_;
|
|
528
|
+
|
|
529
|
+
return 1 if deepequal( $check, $base );
|
|
530
|
+
|
|
531
|
+
my $want = $check;
|
|
532
|
+
|
|
533
|
+
if ( !defined $want ) {
|
|
534
|
+
return 1 if !defined $base || isabsent($base);
|
|
535
|
+
return ( !ref($base) && $base eq NULLMARK ) ? 1 : 0;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
return 1 if ref($want) eq 'CODE';
|
|
539
|
+
|
|
540
|
+
if ( !ref($want) && !Voxgig::Omni::Util::isnum($want) ) {
|
|
541
|
+
|
|
542
|
+
# An empty want would substring-match anything: reject it.
|
|
543
|
+
return 0 if '' eq $want;
|
|
544
|
+
|
|
545
|
+
my $basestr = stringify($base);
|
|
546
|
+
|
|
547
|
+
if ( $want =~ m{^/(.+)/$}s ) {
|
|
548
|
+
my $pattern = $1;
|
|
549
|
+
return ( $basestr =~ /$pattern/ ) ? 1 : 0;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
return ( index( lc($basestr), lc($want) ) >= 0 ) ? 1 : 0;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
return deepequal( $want, $base );
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
# Convert NULLMARK sentinels back into real nulls.
|
|
559
|
+
sub nullmodifier {
|
|
560
|
+
my ( $val, $key, $parent ) = @_;
|
|
561
|
+
if ( !ref($val) && defined($val) && $val eq NULLMARK ) {
|
|
562
|
+
if ( islist($parent) ) { $parent->[$key] = undef }
|
|
563
|
+
else { $parent->{$key} = undef }
|
|
564
|
+
}
|
|
565
|
+
elsif ( !ref($val) && defined($val) ) {
|
|
566
|
+
my $text = $val;
|
|
567
|
+
$text =~ s/__NULL__/null/g;
|
|
568
|
+
if ( islist($parent) ) { $parent->[$key] = $text }
|
|
569
|
+
else { $parent->{$key} = $text }
|
|
570
|
+
}
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
# Make a runner for a spec file (or spec structure) and a provider.
|
|
575
|
+
sub makeRunner {
|
|
576
|
+
my ( $specref, $provider ) = @_;
|
|
577
|
+
my $alltests = loadspec($specref);
|
|
578
|
+
my $specversion = resolveversion($alltests);
|
|
579
|
+
my $useprovider = $provider || {};
|
|
580
|
+
|
|
581
|
+
return sub {
|
|
582
|
+
my ( $name, $store ) = @_;
|
|
583
|
+
|
|
584
|
+
my $spec = resolvespec( $name, $alltests );
|
|
585
|
+
my $clients = resolveclients( $useprovider, $spec, defined $store ? $store : {} );
|
|
586
|
+
my $defsubject = resolvesubject( $name, $useprovider );
|
|
587
|
+
|
|
588
|
+
my $runsetflags = sub {
|
|
589
|
+
my ( $testspec, $flags, $testsubject ) = @_;
|
|
590
|
+
|
|
591
|
+
my $useflags = resolveflags($flags);
|
|
592
|
+
$useflags->{name} = $useflags->{name} || $name || 'set';
|
|
593
|
+
|
|
594
|
+
my $subject = $testsubject || $defsubject;
|
|
595
|
+
die Voxgig::Omni::OmniError->new( 'omni: no test subject for: ' . $useflags->{name} )
|
|
596
|
+
if !defined $subject;
|
|
597
|
+
|
|
598
|
+
my $testspecmap = fixjson( $testspec, $useflags );
|
|
599
|
+
|
|
600
|
+
die Voxgig::Omni::OmniError->new( 'omni: test spec has no set: ' . $useflags->{name} )
|
|
601
|
+
if !ismap($testspecmap) || !islist( $testspecmap->{set} );
|
|
602
|
+
|
|
603
|
+
my $testset = $testspecmap->{set};
|
|
604
|
+
|
|
605
|
+
checkset( $useflags, $testspec, $testset ) if 1 <= $specversion;
|
|
606
|
+
|
|
607
|
+
for my $index ( 0 .. $#$testset ) {
|
|
608
|
+
my $entry = $testset->[$index];
|
|
609
|
+
|
|
610
|
+
my $ok = eval {
|
|
611
|
+
$entry = resolveentry( $entry, $useflags );
|
|
612
|
+
|
|
613
|
+
my $testpack = resolvetestpack( $name, $entry, $subject, $useprovider, $clients );
|
|
614
|
+
my $args = resolveargs( $entry, $testpack, $useprovider );
|
|
615
|
+
|
|
616
|
+
my $res = $testpack->{subject}->(@$args);
|
|
617
|
+
$res = fixjson( $res, $useflags );
|
|
618
|
+
$entry->{res} = $res;
|
|
619
|
+
|
|
620
|
+
checkresult( $useflags, $index, $entry, $args, $res );
|
|
621
|
+
1;
|
|
622
|
+
};
|
|
623
|
+
|
|
624
|
+
if ( !$ok ) {
|
|
625
|
+
my $err = $@;
|
|
626
|
+
die $err if is_omni_error($err);
|
|
627
|
+
handleerror( $useflags, $index, $entry, $err, $useprovider );
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return;
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
my $runset = sub {
|
|
635
|
+
my ( $testspec, $testsubject ) = @_;
|
|
636
|
+
return $runsetflags->( $testspec, {}, $testsubject );
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
return {
|
|
640
|
+
spec => $spec,
|
|
641
|
+
runset => $runset,
|
|
642
|
+
runsetflags => $runsetflags,
|
|
643
|
+
subject => $defsubject,
|
|
644
|
+
client => $useprovider,
|
|
645
|
+
};
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
1;
|