Client feature parity¶
The six remote clients wrap every RPC of sysml-grpc with a typed API. This page records,
per client, the request options and cross-cutting features that distinguish a complete
wrapper from a thin one, and links the test that proves each cell. The Go package
client/opensysml is the reference wrapper. The Jupyter kernel is a consumer of the
Python client and is not a separate row.
Legend: typed — a typed wrapper with a test; raw — reachable only through the raw
response (wire(), the decoded dictionary); — — absent, listed under Open gaps.
RPC coverage¶
Every client exposes all 31 RPCs (GetServerInfo, ParseFile, ParseSources, GetSymbol,
GetDiagnostics, Evaluate, Instantiate, ExecuteAction, ExecuteState, Convert,
Migrate, ApplyEdits, VerifyConstraint, VerifyRequirement, VerifySatisfaction,
ValidateInstance, EvaluateCalc, RunAnalysis, CheckBehavior, RunSweep, RunRuns,
SelfCheck, RecordRun, ListEngines, Query, RunDocumentQuery, RenderDocument,
RenderView, ExportGraphs, ImportData, CompareResults) as typed calls, and each runs
the shared conformance suite
over them. The service has no streaming RPC. Capability preflight (GetServerInfo
capabilities checked before a call) is typed in every client.
Request options¶
| Option | Python | Node | Java | Rust | Julia | MATLAB |
|---|---|---|---|---|---|---|
Convert.id_form |
typed | typed | typed | typed | typed | typed |
Convert.include_library_stubs |
typed | typed | typed | typed | typed | typed |
ConvertResponse.library_references |
typed | typed | typed | typed | typed | typed |
Convert.documents |
typed | typed | typed | typed | typed | typed |
Convert.compact, omit_derived, keep_derived |
typed | typed | typed | typed | typed | typed |
Convert.include_check_diagnostics |
typed | typed | typed | typed | typed | typed |
Query.oslc_query |
typed | typed | typed | typed | typed | typed |
Query.order_by (capability gated) |
typed | typed | typed | typed | typed | typed |
ParseSources.base_model_hash / affected |
typed | typed | typed | typed | typed | typed |
RunSweep.samples |
typed | typed | typed | typed | typed | typed |
RenderView.compartments |
typed | typed | typed | typed | typed | typed |
RenderView.show, depth, ports |
typed | typed | typed | typed | typed | typed |
ImportData.import_as |
typed | typed | typed | typed | typed | typed |
RenderDocument.form (markdown, html, asciidoc) |
typed | typed | typed | typed | typed | typed |
Cross-cutting features¶
| Feature | Python | Node | Java | Rust | Julia | MATLAB |
|---|---|---|---|---|---|---|
Bearer token (OPENSYSML_GRPC_TOKEN, explicit) |
typed | typed | typed | typed | typed | typed |
| TLS to a remote service | typed | typed | typed | typed | typed | typed |
| Transport: Connect protobuf / JSON | typed | typed | typed | typed | typed | typed |
| In-process WebAssembly engine | — | typed (connectWasm) |
— | — | — | — |
| Deadlines / timeouts | typed | typed | typed | typed | typed | typed |
Typed UNAUTHENTICATED error |
typed | typed | typed | typed | typed | typed |
Typed NOT_FOUND split (model / file / symbol) |
typed | typed | typed | typed | typed | typed |
Typed INVALID_ARGUMENT, DEADLINE_EXCEEDED, UNAVAILABLE, UNIMPLEMENTED |
typed | typed | typed | typed | typed | typed |
| Missing-capability error carrying the capability | typed | typed | typed | typed | typed | typed |
| Stale-service (version mismatch) error | typed | typed | typed | typed | typed | typed |
| Private child service lifecycle | typed | typed | typed | typed | typed | typed |
| Streaming / observe a run | — (no streaming RPC exists) | — | — | — | — | — |
Error typing: every client distinguishes the statuses the Python client's errors.py
distinguishes (NOT_FOUND by subject, INVALID_ARGUMENT/FAILED_PRECONDITION/OUT_OF_RANGE,
DEADLINE_EXCEEDED/CANCELLED, UNAVAILABLE, UNIMPLEMENTED, UNAUTHENTICATED) and
carries structured details (diagnostics, symbol suggestions, capability names).
Open gaps¶
| Gap | Where | Estimate |
|---|---|---|
RunSweep.samples in the Go package |
client/opensysml |
about one day: the package has no typed RunSweep wrapper at all, so the option means a typed sweep request, result rows and their evaluations, and tests |
| In-process engine without a service | Python, Java, Rust, Julia, MATLAB | large; Node's connectWasm is the only one, and the others would need a wasm host each |
Proving tests¶
Each linked cell above points at one of these files; the test names are the ones to search for.
py-conv:client/python/tests/test_conversion.pypy-query:client/python/tests/test_query.pypy-doc:client/python/tests/test_document.pypy-import:client/python/tests/test_import_compare.pynode-conv:client/node/test/convert.test.tsnode-query:client/node/test/query.test.tsnode-doc:client/node/test/document.test.tsnode-import:client/node/test/importCompare.test.tsnode-err:client/node/test/errors.test.tspy-parse:client/python/tests/test_parse_sources.py(base_model_hashandModel.affected)node-conv-options:client/node/test/convert-options.test.ts(compact,omitDerived,keepDerived,includeCheckDiagnostics)node-sources:client/node/test/sources.test.ts(baseModelHashandmodel.affected)java-compact:client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java(compactApiJsonTrimsDerivedPropertiesAndKeepsTheNamedOnes,checkDiagnosticsReportTheSemanticCheckBesideTheConversion,aBaseModelNamesTheDocumentsAnEditReaches) andclient/java/opensysml-client/src/test/java/org/openmbee/opensysml/PublicTypesTest.java(capability refusals)rust-compact:client/rust/opensysml/tests/compact_affected.rsgo-options:client/opensysml/parity_options_test.go(WithIDForm,WithLibraryStubs,WithBaseModel,ImportAs)java-conv:client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java(apiJsonNamesLibraryReferencesSeparatelyAndOptsIntoLegacyStubs,convertSpellsDerivedIdsInTheFormAskedFor) andclient/java/opensysml-client/src/test/java/org/openmbee/opensysml/EditorTest.javajava-view:client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java(renderViewFoldsMembersIntoCompartmentRowsOnRequest)java-import:client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java(importDataNamesWhatEachRowIsMadeIntoAndRefusesAnUnknownForm)rust-conv:client/rust/opensysml/tests/surface.rs(api_json_names_library_references_separately_and_opts_into_legacy_stubs,a_model_of_several_documents_converts_only_the_named_ones) andclient/rust/opensysml/src/conversion.rsunit testsrust-view:client/rust/opensysml/tests/surface.rs(render view tests)rust-import:client/rust/opensysml/tests/surface.rs(import_data_sets_the_values_and_answers_the_edited_model)julia-conv:client/julia/OpenSysML/test/extended_client.jl(offline request-shape and error-mapping testsets)julia-live:client/julia/OpenSysML/test/extended_client.jl(live section againstsysml-grpc)matlab-conv:client/matlab/tests/test_surface_live.mandtest_surface_offline.mmatlab-live:client/matlab/tests/test_surface_live.mmatlab-err:client/matlab/tests/test_errors_capabilities.m