@voxgig/sdkgen 4.8.2 → 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 +1 -1
- 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,566 @@
|
|
|
1
|
+
# VENDORED: @voxgig/omni 0.1.0 (python/voxgig_omni/runner.py)
|
|
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
|
+
"""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
|
+
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
from typing import Any, Callable, Optional
|
|
13
|
+
|
|
14
|
+
from .util import (
|
|
15
|
+
ABSENT,
|
|
16
|
+
EXISTSMARK,
|
|
17
|
+
NULLMARK,
|
|
18
|
+
UNDEFMARK,
|
|
19
|
+
clone,
|
|
20
|
+
deepequal,
|
|
21
|
+
getpath,
|
|
22
|
+
islist,
|
|
23
|
+
ismap,
|
|
24
|
+
isnode,
|
|
25
|
+
isnum,
|
|
26
|
+
pathify,
|
|
27
|
+
stringify,
|
|
28
|
+
walk,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# The newest spec format version this runner understands. A spec with no
|
|
32
|
+
# OMNI block is version 0: the original, lenient format, frozen forever.
|
|
33
|
+
# Version 1 turns on strict entry validation (see checkentry).
|
|
34
|
+
SPECVERSION = 1
|
|
35
|
+
|
|
36
|
+
# Capability strings this runner supports beyond the version baseline. A
|
|
37
|
+
# spec's OMNI.requires list is checked against this: an unknown capability
|
|
38
|
+
# refuses the spec loudly at load time, instead of a lagging port silently
|
|
39
|
+
# mis-running it. (Empty today; future format features mint a string here.)
|
|
40
|
+
CAPABILITIES: list = []
|
|
41
|
+
|
|
42
|
+
# The complete set of fields an entry may carry. Under version 1 anything
|
|
43
|
+
# else is an error: an unrecognised key is almost always a typo'd
|
|
44
|
+
# assertion, and a typo'd assertion is a test that silently stopped
|
|
45
|
+
# testing.
|
|
46
|
+
ENTRYFIELDS = ['in', 'args', 'ctx', 'out', 'err', 'match', 'client', 'id', 'doc']
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class OmniError(AssertionError):
|
|
50
|
+
"""A test failure (or a malformed spec).
|
|
51
|
+
|
|
52
|
+
Distinct from errors raised by the subject under test, which are
|
|
53
|
+
candidates for an `err` expectation.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, message: str, entry: Any = None):
|
|
57
|
+
super().__init__(message)
|
|
58
|
+
self.entry = entry
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def loadspec(specref: Any) -> Any:
|
|
62
|
+
"""Load a spec: a path to a JSON file, or an already-parsed object."""
|
|
63
|
+
if isinstance(specref, str):
|
|
64
|
+
with open(specref, encoding='utf-8') as spechandle:
|
|
65
|
+
return json.load(spechandle)
|
|
66
|
+
return specref
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def resolveversion(alltests: Any) -> int:
|
|
70
|
+
"""Read the spec's format version from its optional top-level OMNI
|
|
71
|
+
block, and refuse a spec this runner cannot faithfully run: a version
|
|
72
|
+
newer than SPECVERSION, or a required capability not in CAPABILITIES.
|
|
73
|
+
"""
|
|
74
|
+
if not ismap(alltests) or 'OMNI' not in alltests:
|
|
75
|
+
return 0
|
|
76
|
+
|
|
77
|
+
meta = alltests['OMNI']
|
|
78
|
+
version = meta.get('version') if ismap(meta) else None
|
|
79
|
+
|
|
80
|
+
if not ismap(meta) or not isnum(version) or version % 1 != 0:
|
|
81
|
+
raise OmniError('omni: malformed OMNI version block')
|
|
82
|
+
|
|
83
|
+
if version < 0 or version > SPECVERSION:
|
|
84
|
+
raise OmniError('omni: unsupported spec version: ' + stringify(version))
|
|
85
|
+
|
|
86
|
+
if 'requires' in meta:
|
|
87
|
+
requires = meta['requires']
|
|
88
|
+
if not islist(requires):
|
|
89
|
+
raise OmniError('omni: malformed OMNI requires list')
|
|
90
|
+
for cap in requires:
|
|
91
|
+
if not isinstance(cap, str) or cap not in CAPABILITIES:
|
|
92
|
+
raise OmniError('omni: spec requires unsupported capability: ' + stringify(cap))
|
|
93
|
+
|
|
94
|
+
return int(version)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def checkentry(flags: dict, index: int, entry: Any) -> None:
|
|
98
|
+
"""Strict entry validation, applied when the spec declares version 1
|
|
99
|
+
or later. The lenient format converts each of these mistakes into a
|
|
100
|
+
silent pass or a dead field; here they fail with the entry named.
|
|
101
|
+
"""
|
|
102
|
+
if not ismap(entry):
|
|
103
|
+
raise fail(flags, index, entry, 'entry is not a map')
|
|
104
|
+
|
|
105
|
+
for key in entry.keys():
|
|
106
|
+
if key not in ENTRYFIELDS:
|
|
107
|
+
raise fail(flags, index, entry, 'unknown entry field: ' + str(key))
|
|
108
|
+
|
|
109
|
+
argsources = 0
|
|
110
|
+
for key in ('in', 'args', 'ctx'):
|
|
111
|
+
if key in entry:
|
|
112
|
+
argsources += 1
|
|
113
|
+
if argsources > 1:
|
|
114
|
+
raise fail(flags, index, entry, 'entry has more than one of in, args, ctx')
|
|
115
|
+
|
|
116
|
+
if entry.get('err') is not None and 'out' in entry:
|
|
117
|
+
raise fail(flags, index, entry, 'entry has both err and out')
|
|
118
|
+
|
|
119
|
+
if 'id' in entry and not isinstance(entry['id'], str):
|
|
120
|
+
raise fail(flags, index, entry, 'entry id is not a string')
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def checkset(flags: dict, testspec: Any, normalset: list) -> None:
|
|
124
|
+
"""Validate a version-1 group up front, against the AUTHORED entries -
|
|
125
|
+
null-normalisation would otherwise rewrite an authored null (e.g.
|
|
126
|
+
id: null) into a sentinel string and hide it from validation. A
|
|
127
|
+
malformed spec is a spec error, not a test result, so it fails before
|
|
128
|
+
any subject runs.
|
|
129
|
+
"""
|
|
130
|
+
origset = testspec['set'] if ismap(testspec) and islist(testspec.get('set')) else normalset
|
|
131
|
+
|
|
132
|
+
if len(origset) == 0 and (testspec.get('empty') if ismap(testspec) else None) is not True:
|
|
133
|
+
raise OmniError('omni: empty test set: ' + str(flags['name']))
|
|
134
|
+
|
|
135
|
+
for index, entry in enumerate(origset):
|
|
136
|
+
checkentry(flags, index, entry)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def resolvespec(name: Optional[str], alltests: Any) -> Any:
|
|
140
|
+
"""Find `primary.<name>`, then `<name>`, then the whole spec."""
|
|
141
|
+
if name is None:
|
|
142
|
+
return alltests
|
|
143
|
+
|
|
144
|
+
primary = alltests.get('primary') if ismap(alltests) else None
|
|
145
|
+
if ismap(primary) and primary.get(name) is not None:
|
|
146
|
+
return primary[name]
|
|
147
|
+
|
|
148
|
+
if ismap(alltests) and alltests.get(name) is not None:
|
|
149
|
+
return alltests[name]
|
|
150
|
+
|
|
151
|
+
return alltests
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def resolveclients(provider: Any, spec: Any, store: Any) -> dict:
|
|
155
|
+
"""Build the named clients declared by the spec's DEF.client block."""
|
|
156
|
+
clients: dict = {}
|
|
157
|
+
|
|
158
|
+
defclient = spec.get('DEF', {}).get('client') if ismap(spec) else None
|
|
159
|
+
if not ismap(defclient):
|
|
160
|
+
return clients
|
|
161
|
+
|
|
162
|
+
# A spec may define clients that a given test run never references.
|
|
163
|
+
clientmaker = provider.get('client')
|
|
164
|
+
if clientmaker is None:
|
|
165
|
+
return clients
|
|
166
|
+
|
|
167
|
+
for clientname, cdef in defclient.items():
|
|
168
|
+
copts = clone((cdef.get('test', {}).get('options') if ismap(cdef) else None) or {})
|
|
169
|
+
|
|
170
|
+
injector = provider.get('inject')
|
|
171
|
+
if ismap(store) and injector is not None:
|
|
172
|
+
injector(copts, store)
|
|
173
|
+
|
|
174
|
+
clients[clientname] = clientmaker(copts)
|
|
175
|
+
|
|
176
|
+
return clients
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def resolvesubject(name: Optional[str], provider: Any) -> Optional[Callable]:
|
|
180
|
+
if name is None or provider.get('subject') is None:
|
|
181
|
+
return None
|
|
182
|
+
return provider['subject'](name) or None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def resolveflags(flags: Optional[dict]) -> dict:
|
|
186
|
+
out = {} if flags is None else dict(flags)
|
|
187
|
+
out['null'] = True if out.get('null') is None else bool(out['null'])
|
|
188
|
+
return out
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def resolveentry(entry: dict, flags: dict) -> dict:
|
|
192
|
+
"""An entry with no `out` expects a null (or absent) result."""
|
|
193
|
+
if entry.get('out') is None and flags['null']:
|
|
194
|
+
entry['out'] = NULLMARK
|
|
195
|
+
return entry
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def resolvetestpack(name, entry, subject, provider, clients) -> dict:
|
|
199
|
+
testpack = {'client': provider, 'subject': subject}
|
|
200
|
+
|
|
201
|
+
if entry.get('client') is not None:
|
|
202
|
+
client = clients.get(entry['client'])
|
|
203
|
+
if client is None:
|
|
204
|
+
raise OmniError('omni: unknown client: ' + str(entry['client']), entry)
|
|
205
|
+
testpack['client'] = client
|
|
206
|
+
testpack['subject'] = resolvesubject(name, client) or subject
|
|
207
|
+
|
|
208
|
+
return testpack
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def resolveargs(entry: dict, testpack: dict, provider: Any) -> list:
|
|
212
|
+
"""Build the argument list: `ctx`, `args`, or `in`."""
|
|
213
|
+
if 'ctx' in entry:
|
|
214
|
+
args = [entry['ctx']]
|
|
215
|
+
elif 'args' in entry:
|
|
216
|
+
args = entry['args']
|
|
217
|
+
else:
|
|
218
|
+
args = [clone(entry.get('in'))]
|
|
219
|
+
|
|
220
|
+
if ('ctx' in entry or 'args' in entry) and len(args) > 0:
|
|
221
|
+
first = args[0]
|
|
222
|
+
if ismap(first):
|
|
223
|
+
first = clone(first)
|
|
224
|
+
contextify = provider.get('contextify')
|
|
225
|
+
if contextify is not None:
|
|
226
|
+
first = contextify(first)
|
|
227
|
+
args[0] = first
|
|
228
|
+
entry['ctx'] = first
|
|
229
|
+
if ismap(first):
|
|
230
|
+
first['client'] = testpack['client']
|
|
231
|
+
|
|
232
|
+
return args
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def fixjson(val: Any, flags: Optional[dict] = None) -> Any:
|
|
236
|
+
"""Nulls become NULLMARK, errors become {name,message}. Always a copy."""
|
|
237
|
+
donull = True if flags is None or flags.get('null') is None else bool(flags['null'])
|
|
238
|
+
return fixjsonval(val, donull)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def fixjsonval(val: Any, donull: bool) -> Any:
|
|
242
|
+
if val is None or val is ABSENT:
|
|
243
|
+
return NULLMARK if donull else None
|
|
244
|
+
|
|
245
|
+
if isinstance(val, BaseException):
|
|
246
|
+
return errify(val)
|
|
247
|
+
|
|
248
|
+
if islist(val):
|
|
249
|
+
return [fixjsonval(entry, donull) for entry in val]
|
|
250
|
+
|
|
251
|
+
if ismap(val):
|
|
252
|
+
return {key: fixjsonval(subval, donull) for key, subval in val.items()}
|
|
253
|
+
|
|
254
|
+
return val
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def errify(err: Any) -> dict:
|
|
258
|
+
"""The JSON form of an error: always at least {name,message}.
|
|
259
|
+
|
|
260
|
+
An exception's own attributes survive into the base, so a library whose
|
|
261
|
+
errors carry a ``code`` can assert on it with ``match: {err: {code}}``
|
|
262
|
+
rather than pattern-matching prose. Ports whose subjects report failure
|
|
263
|
+
as a bare message string have nothing to carry; ``Provider.errify``
|
|
264
|
+
overrides this function entirely and is how they reach the same place.
|
|
265
|
+
"""
|
|
266
|
+
if isinstance(err, BaseException):
|
|
267
|
+
out = {key: val for key, val in vars(err).items() if not key.startswith('_')}
|
|
268
|
+
out['name'] = type(err).__name__
|
|
269
|
+
out['message'] = str(err)
|
|
270
|
+
return out
|
|
271
|
+
return {'name': 'Error', 'message': str(err)}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def errbase(err: Any, provider: Any) -> dict:
|
|
275
|
+
"""The error base a ``match.err`` sees: the provider's own, when it has one."""
|
|
276
|
+
hook = provider.get('errify') if isinstance(provider, dict) else None
|
|
277
|
+
return hook(err) if hook is not None else errify(err)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def errmessage(err: Any) -> str:
|
|
281
|
+
return str(err)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def entryref(flags: dict, index: int, entry: Any) -> str:
|
|
285
|
+
"""The label of one entry, for failure messages."""
|
|
286
|
+
label = flags.get('name') or 'set'
|
|
287
|
+
entryid = ''
|
|
288
|
+
if ismap(entry) and entry.get('id') is not None:
|
|
289
|
+
entryid = ' (' + str(entry['id']) + ')'
|
|
290
|
+
return '%s[%d]%s' % (label, index, entryid)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def fail(flags, index, entry, reason, expected=None, actual=None) -> OmniError:
|
|
294
|
+
msg = 'omni: ' + entryref(flags, index, entry) + ': ' + reason
|
|
295
|
+
if expected is not None:
|
|
296
|
+
msg += '\n expected: ' + expected
|
|
297
|
+
if actual is not None:
|
|
298
|
+
msg += '\n actual: ' + actual
|
|
299
|
+
msg += '\n entry: ' + stringify(entrysummary(entry))
|
|
300
|
+
return OmniError(msg, entry)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def entrysummary(entry: Any) -> Any:
|
|
304
|
+
"""The spec-defined part of an entry (drop runner bookkeeping)."""
|
|
305
|
+
if not ismap(entry):
|
|
306
|
+
return entry
|
|
307
|
+
return {key: val for key, val in entry.items() if key not in ('res', 'thrown', 'ctx')}
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def checkresult(flags: dict, index: int, entry: dict, args: list, res: Any) -> None:
|
|
311
|
+
matched = False
|
|
312
|
+
|
|
313
|
+
if entry.get('err') is not None:
|
|
314
|
+
raise fail(
|
|
315
|
+
flags,
|
|
316
|
+
index,
|
|
317
|
+
entry,
|
|
318
|
+
'expected error did not occur',
|
|
319
|
+
stringify(entry['err']),
|
|
320
|
+
stringify(res),
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
if entry.get('match') is not None:
|
|
324
|
+
match(
|
|
325
|
+
flags,
|
|
326
|
+
index,
|
|
327
|
+
entry,
|
|
328
|
+
entry['match'],
|
|
329
|
+
{
|
|
330
|
+
'in': entry.get('in'),
|
|
331
|
+
'args': args,
|
|
332
|
+
'out': entry.get('res'),
|
|
333
|
+
'ctx': entry.get('ctx'),
|
|
334
|
+
},
|
|
335
|
+
)
|
|
336
|
+
matched = True
|
|
337
|
+
|
|
338
|
+
out = entry.get('out')
|
|
339
|
+
|
|
340
|
+
if deepequal(res, out):
|
|
341
|
+
return
|
|
342
|
+
|
|
343
|
+
# NOTE: a match with no explicit out is a complete check on its own.
|
|
344
|
+
if matched and (out == NULLMARK or out is None):
|
|
345
|
+
return
|
|
346
|
+
|
|
347
|
+
raise fail(flags, index, entry, 'result mismatch', stringify(out), stringify(res))
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def handleerror(
|
|
351
|
+
flags: dict, index: int, entry: dict, err: BaseException, provider: Any = None
|
|
352
|
+
) -> None:
|
|
353
|
+
entry['thrown'] = err
|
|
354
|
+
|
|
355
|
+
entryerr = entry.get('err')
|
|
356
|
+
|
|
357
|
+
if entryerr is not None:
|
|
358
|
+
if entryerr is True or matchval(entryerr, errmessage(err)):
|
|
359
|
+
if entry.get('match') is not None:
|
|
360
|
+
match(
|
|
361
|
+
flags,
|
|
362
|
+
index,
|
|
363
|
+
entry,
|
|
364
|
+
entry['match'],
|
|
365
|
+
{
|
|
366
|
+
'in': entry.get('in'),
|
|
367
|
+
'out': entry.get('res'),
|
|
368
|
+
'ctx': entry.get('ctx'),
|
|
369
|
+
'err': errbase(err, provider),
|
|
370
|
+
},
|
|
371
|
+
)
|
|
372
|
+
return
|
|
373
|
+
|
|
374
|
+
raise fail(flags, index, entry, 'error mismatch', stringify(entryerr), errmessage(err))
|
|
375
|
+
|
|
376
|
+
raise fail(flags, index, entry, 'unexpected error', None, errmessage(err))
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def match(flags: dict, index: int, entry: dict, check: Any, base: Any) -> None:
|
|
380
|
+
"""Check that every leaf of `check` is present, and matches, in `base`."""
|
|
381
|
+
cbase = clone(base)
|
|
382
|
+
|
|
383
|
+
def at(path):
|
|
384
|
+
return '<root>' if len(path) == 0 else pathify(path)
|
|
385
|
+
|
|
386
|
+
def apply(_key, val, _parent, path):
|
|
387
|
+
# An empty container in the check is a structural placeholder: walk
|
|
388
|
+
# visits no leaves inside {} or [], so it asserts nothing about the
|
|
389
|
+
# base. (struct's corpus relies on this "map is here, contents
|
|
390
|
+
# unchecked" behaviour, so omni stays a faithful drop-in.)
|
|
391
|
+
if not isnode(val):
|
|
392
|
+
baseval = getpath(cbase, path)
|
|
393
|
+
|
|
394
|
+
# The sentinels are tested BEFORE the identity check below.
|
|
395
|
+
# Otherwise a subject returning the literal string "__UNDEF__"
|
|
396
|
+
# satisfies an assertion that the key is absent - two mutually
|
|
397
|
+
# exclusive states passing one check. A sentinel that accepts
|
|
398
|
+
# its own literal is not a sentinel. (NULLMARK still accepts
|
|
399
|
+
# NULLMARK: under the default null flag a real null has already
|
|
400
|
+
# been normalised to it, so the two are genuinely
|
|
401
|
+
# indistinguishable here - that one needs a raw-value escape,
|
|
402
|
+
# not an ordering change.)
|
|
403
|
+
|
|
404
|
+
# Explicitly absent: satisfied only by a genuinely missing key,
|
|
405
|
+
# never by a present null (the distinction the sentinels exist
|
|
406
|
+
# to keep).
|
|
407
|
+
if val == UNDEFMARK:
|
|
408
|
+
if baseval is ABSENT:
|
|
409
|
+
return val
|
|
410
|
+
raise fail(flags, index, entry, 'expected absent at ' + at(path),
|
|
411
|
+
'absent', stringify(baseval))
|
|
412
|
+
|
|
413
|
+
# Explicitly null: satisfied only by a present null.
|
|
414
|
+
if val == NULLMARK:
|
|
415
|
+
if baseval is None or baseval == NULLMARK:
|
|
416
|
+
return val
|
|
417
|
+
raise fail(flags, index, entry, 'expected null at ' + at(path),
|
|
418
|
+
'null', stringify(baseval))
|
|
419
|
+
|
|
420
|
+
# Explicitly present: any present value, including null.
|
|
421
|
+
if val == EXISTSMARK:
|
|
422
|
+
if baseval is not ABSENT:
|
|
423
|
+
return val
|
|
424
|
+
raise fail(flags, index, entry, 'expected present at ' + at(path),
|
|
425
|
+
'present', 'absent')
|
|
426
|
+
|
|
427
|
+
# Identical values match. This sits below the sentinel branches
|
|
428
|
+
# on purpose - see the note above.
|
|
429
|
+
if baseval is val:
|
|
430
|
+
return val
|
|
431
|
+
|
|
432
|
+
# A concrete expectation never matches a missing key - a match leaf
|
|
433
|
+
# against an absent value must fail, not substring-match "None".
|
|
434
|
+
if baseval is ABSENT:
|
|
435
|
+
raise fail(flags, index, entry, 'match failed at ' + at(path),
|
|
436
|
+
stringify(val), 'absent')
|
|
437
|
+
|
|
438
|
+
if not matchval(val, baseval):
|
|
439
|
+
raise fail(flags, index, entry, 'match failed at ' + at(path),
|
|
440
|
+
stringify(val), stringify(baseval))
|
|
441
|
+
|
|
442
|
+
return val
|
|
443
|
+
|
|
444
|
+
walk(clone(check), apply)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def matchval(check: Any, base: Any) -> bool:
|
|
448
|
+
"""Match one leaf: /regex/ or case-insensitive substring for strings."""
|
|
449
|
+
if check is base:
|
|
450
|
+
return True
|
|
451
|
+
|
|
452
|
+
if deepequal(check, base):
|
|
453
|
+
return True
|
|
454
|
+
|
|
455
|
+
want = check
|
|
456
|
+
if want == UNDEFMARK or want == NULLMARK:
|
|
457
|
+
want = None
|
|
458
|
+
|
|
459
|
+
if want is None:
|
|
460
|
+
return base is None or base is ABSENT or base == NULLMARK
|
|
461
|
+
|
|
462
|
+
if isinstance(want, str):
|
|
463
|
+
# An empty want is not a wildcard: the empty string is a substring of
|
|
464
|
+
# everything, so `match:{out:""}` (or `err:""`) would accept any value.
|
|
465
|
+
if want == '':
|
|
466
|
+
return base == ''
|
|
467
|
+
|
|
468
|
+
basestr = stringify(base)
|
|
469
|
+
|
|
470
|
+
rem = re.match(r'^/(.+)/$', want, re.DOTALL)
|
|
471
|
+
if rem:
|
|
472
|
+
return re.search(rem.group(1), basestr) is not None
|
|
473
|
+
|
|
474
|
+
return want.lower() in basestr.lower()
|
|
475
|
+
|
|
476
|
+
if callable(want):
|
|
477
|
+
return True
|
|
478
|
+
|
|
479
|
+
return deepequal(want, base)
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
def nullmodifier(val, key, parent, *_rest) -> None:
|
|
483
|
+
"""Convert NULLMARK sentinels back into real nulls."""
|
|
484
|
+
if val == NULLMARK:
|
|
485
|
+
parent[key] = None
|
|
486
|
+
elif isinstance(val, str):
|
|
487
|
+
parent[key] = val.replace(NULLMARK, 'null')
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def makeRunner(specref: Any, provider: Any = None) -> Callable:
|
|
491
|
+
"""Make a runner for a spec file (or spec object) and a provider."""
|
|
492
|
+
alltests = loadspec(specref)
|
|
493
|
+
specversion = resolveversion(alltests)
|
|
494
|
+
useprovider = provider or {}
|
|
495
|
+
|
|
496
|
+
def runner(name: Optional[str] = None, store: Any = None) -> dict:
|
|
497
|
+
spec = resolvespec(name, alltests)
|
|
498
|
+
clients = resolveclients(useprovider, spec, {} if store is None else store)
|
|
499
|
+
defsubject = resolvesubject(name, useprovider)
|
|
500
|
+
|
|
501
|
+
def runsetflags(testspec: Any, flags: Optional[dict], testsubject: Callable = None) -> None:
|
|
502
|
+
useflags = resolveflags(flags)
|
|
503
|
+
useflags['name'] = useflags.get('name') or name or 'set'
|
|
504
|
+
|
|
505
|
+
subject = testsubject or defsubject
|
|
506
|
+
if subject is None:
|
|
507
|
+
raise OmniError('omni: no test subject for: ' + str(useflags['name']))
|
|
508
|
+
|
|
509
|
+
testspecmap = fixjson(testspec, useflags)
|
|
510
|
+
|
|
511
|
+
if not ismap(testspecmap) or not islist(testspecmap.get('set')):
|
|
512
|
+
raise OmniError('omni: test spec has no set: ' + str(useflags['name']))
|
|
513
|
+
|
|
514
|
+
testset = testspecmap['set']
|
|
515
|
+
|
|
516
|
+
if specversion >= 1:
|
|
517
|
+
checkset(useflags, testspec, testset)
|
|
518
|
+
|
|
519
|
+
for index, entry in enumerate(testset):
|
|
520
|
+
try:
|
|
521
|
+
entry = resolveentry(entry, useflags)
|
|
522
|
+
|
|
523
|
+
testpack = resolvetestpack(name, entry, subject, useprovider, clients)
|
|
524
|
+
args = resolveargs(entry, testpack, useprovider)
|
|
525
|
+
|
|
526
|
+
res = testpack['subject'](*args)
|
|
527
|
+
res = fixjson(res, useflags)
|
|
528
|
+
entry['res'] = res
|
|
529
|
+
|
|
530
|
+
checkresult(useflags, index, entry, args, res)
|
|
531
|
+
|
|
532
|
+
except OmniError:
|
|
533
|
+
raise
|
|
534
|
+
except Exception as err: # noqa: BLE001 - subject errors are data
|
|
535
|
+
handleerror(useflags, index, entry, err, useprovider)
|
|
536
|
+
|
|
537
|
+
def runset(testspec: Any, testsubject: Callable = None) -> None:
|
|
538
|
+
return runsetflags(testspec, {}, testsubject)
|
|
539
|
+
|
|
540
|
+
return {
|
|
541
|
+
'spec': spec,
|
|
542
|
+
'runset': runset,
|
|
543
|
+
'runsetflags': runsetflags,
|
|
544
|
+
'subject': defsubject,
|
|
545
|
+
'client': useprovider,
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return runner
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
__all__ = [
|
|
552
|
+
'CAPABILITIES',
|
|
553
|
+
'EXISTSMARK',
|
|
554
|
+
'NULLMARK',
|
|
555
|
+
'SPECVERSION',
|
|
556
|
+
'UNDEFMARK',
|
|
557
|
+
'OmniError',
|
|
558
|
+
'errify',
|
|
559
|
+
'fixjson',
|
|
560
|
+
'loadspec',
|
|
561
|
+
'makeRunner',
|
|
562
|
+
'match',
|
|
563
|
+
'matchval',
|
|
564
|
+
'nullmodifier',
|
|
565
|
+
'resolvespec',
|
|
566
|
+
]
|