diff --git a/anysdk/address_space.go b/anysdk/address_space.go index 381b7c7..9ce6a80 100644 --- a/anysdk/address_space.go +++ b/anysdk/address_space.go @@ -1,6 +1,7 @@ package anysdk type AddressSpaceExpansionConfig interface { + IsAsync() bool IsLegacy() bool IsAllowNilResponse() bool } diff --git a/anysdk/request.go b/anysdk/request.go index 796f8a0..f4f0ede 100644 --- a/anysdk/request.go +++ b/anysdk/request.go @@ -13,9 +13,27 @@ import ( "github.com/stackql/any-sdk/pkg/streaming" ) +type HTTPPreparatorConfig interface { + IsFromAnnotation() bool +} + +type standardHTTPPreparatorConfig struct { + isFromAnnotation bool +} + +func (cfg *standardHTTPPreparatorConfig) IsFromAnnotation() bool { + return cfg.isFromAnnotation +} + +func NewHTTPPreparatorConfig(isFromAnnotation bool) HTTPPreparatorConfig { + return &standardHTTPPreparatorConfig{ + isFromAnnotation: isFromAnnotation, + } +} + type HTTPPreparator interface { - BuildHTTPRequestCtx() (HTTPArmoury, error) - BuildHTTPRequestCtxFromAnnotation() (HTTPArmoury, error) + BuildHTTPRequestCtx(HTTPPreparatorConfig) (HTTPArmoury, error) + // BuildHTTPRequestCtxFromAnnotation() (HTTPArmoury, error) } type standardHTTPPreparator struct { @@ -65,7 +83,10 @@ func newHTTPPreparator( } //nolint:funlen,gocognit // TODO: review -func (pr *standardHTTPPreparator) BuildHTTPRequestCtx() (HTTPArmoury, error) { +func (pr *standardHTTPPreparator) BuildHTTPRequestCtx(cfg HTTPPreparatorConfig) (HTTPArmoury, error) { + if cfg.IsFromAnnotation() { + return pr.buildHTTPRequestCtxFromAnnotation() + } method, methodOk := pr.m.(StandardOperationStore) if !methodOk { return nil, fmt.Errorf("operation store is not a standard operation store") @@ -209,7 +230,7 @@ func getRequest( } //nolint:funlen,gocognit // acceptable -func (pr *standardHTTPPreparator) BuildHTTPRequestCtxFromAnnotation() (HTTPArmoury, error) { +func (pr *standardHTTPPreparator) buildHTTPRequestCtxFromAnnotation() (HTTPArmoury, error) { var err error httpArmoury := NewHTTPArmoury() var requestSchema, responseSchema Schema diff --git a/cmd/argparse/query.go b/cmd/argparse/query.go index 71f21e2..90b0da2 100644 --- a/cmd/argparse/query.go +++ b/cmd/argparse/query.go @@ -195,6 +195,7 @@ func runQueryCommand(authCtx *dto.AuthCtx, payload *queryCmdPayload) error { } return nil case client.HTTP: + var isFromAnnotation bool = false // TODO: publish something meaningful here prep := anysdk.NewHTTPPreparator( prov, svc, @@ -206,7 +207,7 @@ func runQueryCommand(authCtx *dto.AuthCtx, payload *queryCmdPayload) error { execCtx, getLogger(), ) - armoury, err := prep.BuildHTTPRequestCtx() + armoury, err := prep.BuildHTTPRequestCtx(anysdk.NewHTTPPreparatorConfig(isFromAnnotation)) if err != nil { return err } diff --git a/docs/protocol_agnostic/gRPC.md b/docs/protocol_agnostic/gRPC.md new file mode 100644 index 0000000..a7ac38b --- /dev/null +++ b/docs/protocol_agnostic/gRPC.md @@ -0,0 +1,134 @@ + + +# gRPC + +At this point in time, this is not implemented. However, it will be; gRPC is fully tractable with the requisite `.proto` files; compilation is not required. Effectively, the RPC concept is ignored and it becomes an abstraction on protocol buffer communication. + +This is based upon [grpcurl](https://github.com/fullstorydev/grpcurl). + +For convenience following examples, please clone `fullstorydev/grpcurl` into `${HOME}/stackql/grpcurl`, eg with `mkdir -p ${HOME}/stackql/grpcurl && git clone https://github.com/fullstorydev/grpcurl`. + +## Bankdemo example + + +Build bankdemo to current dir: + +```bash + +go build -o bankdemo "${HOME}/stackql/grpcurl/internal/testing/cmd/bankdemo" + + +``` + + +Basic request response: + + + +```bash +grpcurl -plaintext -H 'Authorization: token joeblow' -d '{ "initial_deposit_cents": 20, "type": 2 }' 127.0.0.1:12345 Bank/OpenAccount +``` + +```json +{ + "accountNumber": "1", + "type": "SAVING", + "balanceCents": 20 +} +``` + +```bash +grpcurl -plaintext -H 'Authorization: token joeblow' 127.0.0.1:12345 Bank/GetAccounts +``` + +```json +{ + "accounts": [ + { + "accountNumber": "1", + "type": "SAVING", + "balanceCents": 20 + } + ] +} +``` + +Results in: + +```json + +{ + "accountNumber": "1", + "type": "SAVING", + "balanceCents": 20 +} + +``` + +Then: + +```bash + + + +``` + + +Full Duplex streaming: + + +```bash + +grpcurl -plaintext -H 'Authorization: token joeblow' -d '{ "init": {} }' -import-path ${HOME}/stackql/grpcurl/internal/testing/cmd/bankdemo -proto support.proto 127.0.0.1:12345 Support/ChatCustomer + +``` + +When starting a new session, server writes: + +```json +{ + "session": { + "sessionId": "000002", + "customerName": "joeblow" + } +} +``` + +When rejoining an existing session, eg: + +Eg + +```bash + +grpcurl -plaintext -H 'Authorization: token joeblow' -d '{ "init": { "resume_session_id": "000002" } } { "msg": "Hello I am angry!" } {"hang_up": 0 } { "init": { "resume_session_id": "000002" } } ' -import-path ${HOME}/stackql/grpcurl/internal/testing/cmd/bankdemo -proto support.proto 127.0.0.1:12345 Support/ChatCustomer + +``` + +Server writes: + +```json + + +{ + "session": { + "sessionId": "000006", + "customerName": "joeblow", + "history": [ + { + "date": "2025-09-17T07:29:37.764312Z", + "customerMsg": "Hello I am angry!" + }, + { + "date": "2025-09-17T07:29:37.764314Z", + "customerMsg": "Can you please fix my account?" + }, + { + "date": "2025-09-17T07:31:13.941966Z", + "customerMsg": "Hello again I am now somewhat calm." + } + ] + } +} + +``` + diff --git a/public/discovery/static_analyzer.go b/public/discovery/static_analyzer.go index 4919b70..2085df0 100644 --- a/public/discovery/static_analyzer.go +++ b/public/discovery/static_analyzer.go @@ -9,6 +9,7 @@ import ( "github.com/stackql/any-sdk/pkg/client" "github.com/stackql/any-sdk/pkg/db/sqlcontrol" "github.com/stackql/any-sdk/pkg/dto" + "github.com/stackql/any-sdk/pkg/logging" "github.com/stackql/any-sdk/public/persistence" "github.com/stackql/any-sdk/public/radix_tree_address_space" "github.com/stackql/any-sdk/public/sqlengine" @@ -347,6 +348,9 @@ type standardMethodAggregateStaticAnalyzer struct { methodSelectorName string isFuzzy bool fullHierarchy AnalyzedFullHierarchy + warnings []string + errors []error + affirmatives []string } func (asa *standardMethodAggregateStaticAnalyzer) GetFullHierarchy() (AnalyzedFullHierarchy, bool) { @@ -354,21 +358,30 @@ func (asa *standardMethodAggregateStaticAnalyzer) GetFullHierarchy() (AnalyzedFu } func (asa *standardMethodAggregateStaticAnalyzer) GetErrors() []error { - return asa.psrAnalyzer.GetErrors() + return asa.errors } func (asa *standardMethodAggregateStaticAnalyzer) GetWarnings() []string { - return asa.psrAnalyzer.GetWarnings() + return asa.warnings } func (asa *standardMethodAggregateStaticAnalyzer) GetAffirmatives() []string { - return asa.psrAnalyzer.GetAffirmatives() + return asa.affirmatives } func (asa *standardMethodAggregateStaticAnalyzer) GetRegistryAPI() (anysdk.RegistryAPI, bool) { return asa.psrAnalyzer.GetRegistryAPI() } +func (asa *standardMethodAggregateStaticAnalyzer) generateDummyRequiredMap(method anysdk.StandardOperationStore) (map[string]any, error) { + requiredDummy := method.GetRequiredParameters() + rv := make(map[string]any, len(requiredDummy)) + for k, v := range requiredDummy { + rv[k] = v + } + return rv, nil +} + func (asa *standardMethodAggregateStaticAnalyzer) Analyze() error { staticAnalyzer := asa.psrAnalyzer err := staticAnalyzer.Analyze() @@ -442,27 +455,138 @@ func (asa *standardMethodAggregateStaticAnalyzer) Analyze() error { return fmt.Errorf("static analysis failed: expected '%s' method to exist on '%s' resource", asa.methodSelectorName, asa.resourceName) } } - addressSpaceFormulator := radix_tree_address_space.NewAddressSpaceFormulator( - radix_tree_address_space.NewAddressSpaceGrammar(), + asa.fullHierarchy = &standardAnalyzedHierarchy{ + provider: prov, + service: providerService, + resource: resource, + method: method, + registryAPI: registryAPI, + } + methodLevelAnalyzer := newStandardMethodPreparedAnalyzer( prov, svc, resource, method, - method.GetProjections(), + registryAPI, + ) + analysisErr := methodLevelAnalyzer.Analyze() + asa.warnings = append(asa.warnings, methodLevelAnalyzer.GetWarnings()...) + asa.errors = append(asa.errors, methodLevelAnalyzer.GetErrors()...) + asa.affirmatives = append(asa.affirmatives, methodLevelAnalyzer.GetAffirmatives()...) + if analysisErr != nil { + return analysisErr + } + return nil +} + +type standardMethodPreparedAnalyzer struct { + provider anysdk.Provider + service anysdk.Service + resource anysdk.Resource + method anysdk.StandardOperationStore + registrAPI anysdk.RegistryAPI + errors []error + warnings []string + affirmatives []string +} + +func newStandardMethodPreparedAnalyzer( + provider anysdk.Provider, + service anysdk.Service, + resource anysdk.Resource, + method anysdk.StandardOperationStore, + registryAPI anysdk.RegistryAPI, +) StaticAnalyzer { + return &standardMethodPreparedAnalyzer{ + provider: provider, + service: service, + resource: resource, + method: method, + errors: []error{}, + warnings: []string{}, + affirmatives: []string{}, + registrAPI: registryAPI, + } +} + +func (asa *standardMethodPreparedAnalyzer) GetRegistryAPI() (anysdk.RegistryAPI, bool) { + return asa.registrAPI, true +} + +func (asa *standardMethodPreparedAnalyzer) GetErrors() []error { + return asa.errors +} + +func (asa *standardMethodPreparedAnalyzer) GetWarnings() []string { + return asa.warnings +} + +func (asa *standardMethodPreparedAnalyzer) GetAffirmatives() []string { + return asa.affirmatives +} + +func (asa *standardMethodPreparedAnalyzer) generateDummyRequiredMap(method anysdk.StandardOperationStore) (map[string]any, error) { + requiredDummy := method.GetRequiredParameters() + rv := make(map[string]any, len(requiredDummy)) + for k, v := range requiredDummy { + rv[k] = v + } + return rv, nil +} + +func (asa *standardMethodPreparedAnalyzer) Analyze() error { + addressSpaceFormulator := radix_tree_address_space.NewAddressSpaceFormulator( + radix_tree_address_space.NewAddressSpaceGrammar(), + asa.provider, + asa.service, + asa.resource, + asa.method, + asa.method.GetProjections(), false, // TODO: isAwait (handle later) 2 x possible shcemas for await ) - err = addressSpaceFormulator.Formulate() + err := addressSpaceFormulator.Formulate() if err != nil { - return fmt.Errorf("static analysis failed: could not formulate address space for method '%s' on resource '%s': %w", asa.methodSelectorName, asa.resourceName, err) + return fmt.Errorf("static analysis failed: could not formulate address space for method '%s' on resource '%s': %w", asa.method.GetName(), asa.resource.GetName(), err) } addressSpace := addressSpaceFormulator.GetAddressSpace() - method.SetAddressSpace(addressSpace) - asa.fullHierarchy = &standardAnalyzedHierarchy{ - provider: prov, - service: providerService, - resource: resource, - method: method, - registryAPI: registryAPI, + asa.method.SetAddressSpace(addressSpace) + // asa.fullHierarchy = &standardAnalyzedHierarchy{ + // provider: prov, + // service: providerService, + // resource: resource, + // method: method, + // registryAPI: registryAPI, + // } + dummyParameters, dummyParametersErr := asa.generateDummyRequiredMap(asa.method) + if dummyParametersErr != nil { + return fmt.Errorf("static analysis failed: could not generate dummy parameters for method '%s' on resource '%s': %w", asa.method.GetName(), asa.resource.GetName(), dummyParametersErr) + } + protocolType, protocolTypeErr := asa.provider.GetProtocolType() + if protocolTypeErr != nil { + asa.errors = append(asa.errors, fmt.Errorf("warning: could not determine protocol type for method '%s' on resource '%s': %w", asa.method.GetName(), asa.resource.GetName(), protocolTypeErr)) + } + switch protocolType { + case client.HTTP: + preparator := anysdk.NewHTTPPreparator( + asa.provider, + asa.service, + asa.method, + map[int]map[string]interface{}{ + 0: dummyParameters, + }, + nil, + nil, + logging.GetLogger(), + ) + armoury, armouryErr := preparator.BuildHTTPRequestCtx(anysdk.NewHTTPPreparatorConfig(false)) + if armouryErr != nil { + asa.errors = append(asa.errors, fmt.Errorf("warning: could not build HTTP request context for method '%s' on resource '%s': %w", asa.method.GetName(), asa.resource.GetName(), armouryErr)) + } else { + if armoury == nil { + asa.errors = append(asa.errors, fmt.Errorf("warning: could not build HTTP request context for method '%s' on resource '%s': got nil armoury", asa.method.GetName(), asa.resource.GetName())) + } + } + default: } return nil } @@ -985,6 +1109,7 @@ func (srf *standardProviderServiceResourceAnalyzer) Analyze() error { srf.errors = append(srf.errors, fmt.Errorf("service fragment is nil for svc name = %s", key)) continue } + srf.resourceServiceFragments[resKey] = svcFrag deepResources, deepResourcesErr := svcFrag.GetResources() if deepResourcesErr != nil { srf.errors = append(srf.errors, fmt.Errorf("failed to get resources for svc name = %s: %v", key, deepResourcesErr)) @@ -1014,6 +1139,9 @@ func (srf *standardProviderServiceResourceAnalyzer) Analyze() error { srf.errors = append(srf.errors, err) return err } + for resourceKey := range resources { + srf.resourceServiceFragments[resourceKey] = svc + } } srf.resources = resources return nil @@ -1110,6 +1238,15 @@ func (osa *serviceLevelStaticAnalyzer) Analyze() error { osa.errors = append(osa.errors, err) return err } + svcFragments := providerServiceResourceAnalyzer.GetServiceFragments() + if len(svcFragments) == 0 { + if !osa.cfg.IsProviderServicesMustExpand() { + return nil + } + err := fmt.Errorf("no service fragments found for provider %s", k) + osa.errors = append(osa.errors, err) + return err + } for resourceKey, resource := range resources { // Loader.mergeResource() dereferences interesting stuff including: // - operation store attributes dereference: @@ -1124,6 +1261,26 @@ func (osa *serviceLevelStaticAnalyzer) Analyze() error { if !osa.cfg.IsProviderServicesMustExpand() { continue } + svc := svcFragments[resourceKey] + if svc == nil { + osa.errors = append(osa.errors, fmt.Errorf("service fragment is nil for resource %s", resourceKey)) + } else { + methodAnalyzer := newStandardMethodPreparedAnalyzer( + osa.provider, + svc, + resource, + &method, + osa.registryAPI, + ) + + methodAnalyzerErr := methodAnalyzer.Analyze() + osa.affirmatives = append(osa.affirmatives, methodAnalyzer.GetAffirmatives()...) + osa.warnings = append(osa.warnings, methodAnalyzer.GetWarnings()...) + osa.errors = append(osa.errors, methodAnalyzer.GetErrors()...) + if methodAnalyzerErr != nil { + osa.errors = append(osa.errors, fmt.Errorf("static analysis found errors for method %s on resource %s: %v", methodName, resourceKey, methodAnalyzerErr)) + } + } switch protocolType { case client.HTTP: diff --git a/public/radix_tree_address_space/address_space.go b/public/radix_tree_address_space/address_space.go index db4f2a2..b9aff3f 100644 --- a/public/radix_tree_address_space/address_space.go +++ b/public/radix_tree_address_space/address_space.go @@ -44,15 +44,18 @@ const ( ) type standardAddressSpaceExpansionConfig struct { + isAsync bool isLegacy bool isAllowNilResponse bool } func NewStandardAddressSpaceExpansionConfig( + isAsync bool, isLegacy bool, isAllowNilResponse bool, ) anysdk.AddressSpaceExpansionConfig { return &standardAddressSpaceExpansionConfig{ + isAsync: isAsync, isLegacy: isLegacy, isAllowNilResponse: isAllowNilResponse, } @@ -62,6 +65,10 @@ func (aec *standardAddressSpaceExpansionConfig) IsLegacy() bool { return aec.isLegacy } +func (aec *standardAddressSpaceExpansionConfig) IsAsync() bool { + return aec.isAsync +} + func (aec *standardAddressSpaceExpansionConfig) IsAllowNilResponse() bool { return aec.isAllowNilResponse } @@ -195,28 +202,29 @@ type AddressSpaceFormulator interface { } type standardNamespace struct { - serverVars map[string]string - requestBodyParams map[string]anysdk.Addressable - server *openapi3.Server - prov anysdk.Provider - svc anysdk.Service - method anysdk.StandardOperationStore - simpleSelectKey string - simpleSelectSchema anysdk.Schema - legacySelectSchema anysdk.Schema - responseBodySchema anysdk.Schema - requestBodySchema anysdk.Schema - finalResponseMediaType string - responseBodyMediaType string - requestBodyMediaType string - serverUrlString string - request *http.Request - response *http.Response - unionSelectSchemas map[string]anysdk.Schema - globalSelectSchemas map[string]anysdk.Schema - explicitAliasMap AliasMap - globalAliasMap AliasMap - shadowQuery RadixTree + serverVars map[string]string + requestBodyParams map[string]anysdk.Addressable + server *openapi3.Server + prov anysdk.Provider + svc anysdk.Service + method anysdk.StandardOperationStore + simpleSelectKey string + simpleSelectSchema anysdk.Schema + legacySelectSchema anysdk.Schema + legacyFinalSelectSchema anysdk.Schema + responseBodySchema anysdk.Schema + requestBodySchema anysdk.Schema + finalResponseMediaType string + responseBodyMediaType string + requestBodyMediaType string + serverUrlString string + request *http.Request + response *http.Response + unionSelectSchemas map[string]anysdk.Schema + globalSelectSchemas map[string]anysdk.Schema + explicitAliasMap AliasMap + globalAliasMap AliasMap + shadowQuery RadixTree } func selectServer(servers openapi3.Servers, inputParams map[string]interface{}) (string, error) { @@ -234,26 +242,6 @@ func selectServer(servers openapi3.Servers, inputParams map[string]interface{}) return urltranslate.SanitiseServerURL(srvs[0]) } -func (ns *standardNamespace) Analyze() error { - var err error - // idea here is to poulate the request object from the shadow query - // e.g. if shadow query has "query.project" = "my-project" - req := &http.Request{} - serverVarsSuplied := ns.shadowQuery.ToFlatMap("server") - ns.serverUrlString, err = selectServer([]*openapi3.Server{ns.server}, serverVarsSuplied) - if err != nil { - return err - } - matureURL, err := url.Parse(ns.serverUrlString) - if err != nil { - return err - } - - req.URL = matureURL - ns.request = req - return nil -} - func (ns *standardNamespace) ResolveSignature(params map[string]any) (bool, map[string]any) { copyParams := make(map[string]any, len(params)) for k, v := range params { @@ -360,13 +348,14 @@ func (ns *standardNamespace) Invoke(argList ...any) error { reuestBodyMap := make(map[string]any) requestContentType := ns.method.GetRequestBodyMediaTypeNormalised() for k, v := range reuestBodyMapVerbose { - if requestContentType == media.MediaTypeJson || requestContentType == "" { + switch requestContentType { + case media.MediaTypeJson, "": trimmedKey := strings.TrimPrefix(k, "$.") reuestBodyMap[trimmedKey] = v - } else if requestContentType == media.MediaTypeXML { + case media.MediaTypeXML: trimmedKey := strings.TrimPrefix(k, "/") reuestBodyMap[trimmedKey] = v - } else { + default: return fmt.Errorf("unsupported request content type: %s", requestContentType) } } @@ -480,6 +469,9 @@ func (ns *standardNamespace) ToRelation(cfg anysdk.AddressSpaceExpansionConfig) return nil, fmt.Errorf("nil config") } if cfg.IsLegacy() { + if cfg.IsAsync() { + return ns.getLegacyRelation(cfg, ns.legacyFinalSelectSchema, ns.method) + } return ns.getLegacyRelation(cfg, ns.legacySelectSchema, ns.method) } return ns.globalAliasesToRelation() @@ -695,15 +687,14 @@ func (asa *standardAddressSpaceFormulator) Formulate() error { legacySelectKey := asa.method.LookupSelectItemsKey() legacySelectSchema, _ := asa.method.GetSchemaAtPath(legacySelectKey) + legacyFinalSelectSchema := legacySelectSchema var finalSelectErr error + var asyncFinalSelectSchema anysdk.Schema - finalSelectSchema := legacySelectSchema - if asa.isAwait { - finalSelectSchema, _, finalSelectErr = asa.method.GetFinalSelectSchemaAndObjectPath() - if finalSelectErr == nil { - legacySelectSchema = finalSelectSchema - } + asyncFinalSelectSchema, _, finalSelectErr = asa.method.GetFinalSelectSchemaAndObjectPath() + if finalSelectErr == nil { + legacyFinalSelectSchema = asyncFinalSelectSchema } simpleSelectKey := asa.method.GetSelectItemsKeySimple() @@ -760,24 +751,25 @@ func (asa *standardAddressSpaceFormulator) Formulate() error { // } responseSchema, responseMediaType, _ := asa.method.GetResponseBodySchemaAndMediaType() addressSpace := &standardNamespace{ - server: selectedServer, - serverVars: serverVars, - requestBodyParams: requestBodyParams, - simpleSelectKey: simpleSelectKey, - legacySelectSchema: legacySelectSchema, - simpleSelectSchema: simpleSelectSchema, - unionSelectSchemas: unionSelectSchemas, - globalSelectSchemas: globalSelectSchemas, - responseBodySchema: responseSchema, - requestBodySchema: requestBodySchema, - responseBodyMediaType: responseMediaType, - requestBodyMediaType: requestBodyMediaType, - explicitAliasMap: explicitAliasMap, - globalAliasMap: globalAliasMap, - prov: asa.provider, - svc: asa.service, - method: asa.method, - shadowQuery: NewRadixTree(), + server: selectedServer, + serverVars: serverVars, + requestBodyParams: requestBodyParams, + simpleSelectKey: simpleSelectKey, + legacySelectSchema: legacySelectSchema, + legacyFinalSelectSchema: legacyFinalSelectSchema, + simpleSelectSchema: simpleSelectSchema, + unionSelectSchemas: unionSelectSchemas, + globalSelectSchemas: globalSelectSchemas, + responseBodySchema: responseSchema, + requestBodySchema: requestBodySchema, + responseBodyMediaType: responseMediaType, + requestBodyMediaType: requestBodyMediaType, + explicitAliasMap: explicitAliasMap, + globalAliasMap: globalAliasMap, + prov: asa.provider, + svc: asa.service, + method: asa.method, + shadowQuery: NewRadixTree(), } if addressSpace == nil { return fmt.Errorf("failed to create address space for operation %s", asa.method.GetName()) diff --git a/public/radix_tree_address_space/address_space_test.go b/public/radix_tree_address_space/address_space_test.go index 8aa81a1..f222e9e 100644 --- a/public/radix_tree_address_space/address_space_test.go +++ b/public/radix_tree_address_space/address_space_test.go @@ -224,7 +224,7 @@ func TestBasicAddressSpaceGoogleCurrent(t *testing.T) { if invocationErr != nil { t.Fatalf("Address space analysis failed: expected invocation to succeed: %v", invocationErr) } - mappedNamsespace, mapErr := addressSpace.ToMap(radix_tree_address_space.NewStandardAddressSpaceExpansionConfig(true, true)) + mappedNamsespace, mapErr := addressSpace.ToMap(radix_tree_address_space.NewStandardAddressSpaceExpansionConfig(false, true, true)) if mapErr != nil { t.Fatalf("Address space analysis failed: expected to map namespace: %v", mapErr) } @@ -1031,7 +1031,7 @@ func TestFatConfigDrivenAliasedAddressSpaceGoogleCurrent(t *testing.T) { if invocationErr != nil { t.Fatalf("Address space analysis failed: expected invocation to succeed: %v", invocationErr) } - mappedNamsespace, mapErr := addressSpace.ToMap(radix_tree_address_space.NewStandardAddressSpaceExpansionConfig(true, true)) + mappedNamsespace, mapErr := addressSpace.ToMap(radix_tree_address_space.NewStandardAddressSpaceExpansionConfig(false, true, true)) if mappedNamsespace["short_name"] != "my-short-name" { t.Fatalf("Address space analysis failed: expected 'my-short-name' for 'short_name' but got '%v'", mappedNamsespace["short_name"]) } diff --git a/public/radix_tree_address_space/legacy_address_space.go b/public/radix_tree_address_space/legacy_address_space.go index 5f5b94e..a1375ea 100644 --- a/public/radix_tree_address_space/legacy_address_space.go +++ b/public/radix_tree_address_space/legacy_address_space.go @@ -45,66 +45,6 @@ func TrimSelectItemsKey(selectItemsKey string) string { return splitSet[len(splitSet)-1] } -// func (ta *simpleLegacyTableSchemaAnalyzer) Analyze() error { -// var rv []anysdk.Column -// // This will be a function of method not schema -// // addressSpace, hasAddressSpace := ta.m.GetAddressSpace() -// // if !hasAddressSpace || addressSpace == nil { -// // return nil, fmt.Errorf("no address space found for method %s", ta.m.GetName()) -// // } -// if ta.s == nil { -// if ta.isNilResponseAllowed { -// return nil -// } -// return fmt.Errorf("no schema found for method %s", ta.m.GetName()) -// } -// var defaultColName string -// if ta.selectItemsKey != "" { -// defaultColName = TrimSelectItemsKey(ta.selectItemsKey) -// } -// tab := ta.s.Tabulate(false, defaultColName) -// _, mediaType, err := ta.m.GetResponseBodySchemaAndMediaType() -// if err != nil { -// return nil, err -// } -// switch mediaType { -// case media.MediaTypeTextXML, media.MediaTypeXML: -// tab = tab.RenameColumnsToXml() -// } -// tableColumns := tab.GetColumns() -// existingColumns := make(map[string]struct{}) -// for _, col := range tableColumns { -// existingColumns[col.GetName()] = struct{}{} -// rv = append(rv, newSimpleColumn(col.GetName(), col.GetSchema())) -// } -// unionedRequiredParams, err := ta.m.GetUnionRequiredParameters() -// if err != nil && !ta.isNilResponseAllowed { -// return err -// } -// for k, col := range unionedRequiredParams { -// if _, ok := existingColumns[k]; ok { -// continue -// } -// schema, _ := col.GetSchema() -// existingColumns[col.GetName()] = struct{}{} -// rv = append(rv, newSimpleColumn(k, schema)) -// } -// servers, serversDoExist := ta.m.GetServers() -// if serversDoExist { -// for _, srv := range servers { -// for k := range srv.Variables { -// if _, ok := existingColumns[k]; ok { -// continue -// } -// existingColumns[k] = struct{}{} -// rv = append(rv, newSimpleStringColumn(k, ta.m)) -// } -// } -// } -// ta.columns = rv -// return nil -// } - // TODO: operate on namespace func (ta *simpleLegacyTableSchemaAnalyzer) GetColumns() ([]anysdk.Column, error) { var rv []anysdk.Column diff --git a/test/robot/cli/aot/aot_adhoc.robot b/test/robot/cli/aot/aot_adhoc.robot index 59e3d6f..6897102 100644 --- a/test/robot/cli/aot/aot_adhoc.robot +++ b/test/robot/cli/aot/aot_adhoc.robot @@ -18,7 +18,7 @@ Simple AOT Analysis Google Provider with CLI Log Stdout = ${result.stdout} Log RC = ${result.rc} Should Contain ${result.stderr} - ... error count 600 + ... error count 633 Should Be Equal As Strings ${result.rc} 1 Simple AOT Analysis AWS Provider with CLI