From 73828082f073d3b2033522c386eed620f49e2a7c Mon Sep 17 00:00:00 2001 From: Armando Belardo <11140328+armandobelardo@users.noreply.github.com> Date: Wed, 10 Apr 2024 22:51:49 -0400 Subject: [PATCH] additional ruby fixes to the 0.5.0 overhaul (#3359) --- .../ast/abstractions/SerializableObject.ts | 21 +++++-- .../codegen/src/ast/classes/ClassReference.ts | 2 +- .../codegen/src/ast/expressions/Expression.ts | 4 +- generators/ruby/sdk/VERSION | 2 +- .../ruby/sdk/src/AbstractionUtilities.ts | 6 +- .../ruby/sdk/src/utils/EndpointGenerator.ts | 37 ++++++++++-- .../fern_response_property/service/client.rb | 56 +++++++++---------- 7 files changed, 84 insertions(+), 44 deletions(-) diff --git a/generators/ruby/codegen/src/ast/abstractions/SerializableObject.ts b/generators/ruby/codegen/src/ast/abstractions/SerializableObject.ts index adbe9786c11..d84dc02386c 100644 --- a/generators/ruby/codegen/src/ast/abstractions/SerializableObject.ts +++ b/generators/ruby/codegen/src/ast/abstractions/SerializableObject.ts @@ -1,5 +1,6 @@ import { Argument } from "../Argument"; import { + AliasReference, ArrayReference, ClassReference, DateReference, @@ -102,7 +103,12 @@ export class SerializableObject extends Class_ { block: { arguments: "_k, v", expressions: [ - new Expression({ leftSide: "v", rightSide: OmittedValue, operation: "==" }) + new Expression({ + leftSide: "v", + rightSide: OmittedValue, + operation: "==", + isAssignment: false + }) ] }, onObject: propertyHash @@ -165,11 +171,18 @@ export class SerializableObject extends Class_ { }); usesParsedJson = parsedJsonVariable.fromJson() !== undefined; + const classReferenceForCast = prop.type[0]; const hasFromJson = usesParsedJson && - !(prop.type[0] instanceof ArrayReference) && - !(prop.type[0] instanceof HashReference) && - !(prop.type[0] instanceof DateReference); + !(classReferenceForCast instanceof ArrayReference) && + !(classReferenceForCast instanceof HashReference) && + !(classReferenceForCast instanceof DateReference) && + !( + classReferenceForCast instanceof AliasReference && + (classReferenceForCast.aliasOf instanceof ArrayReference || + classReferenceForCast.aliasOf instanceof HashReference || + classReferenceForCast.aliasOf instanceof DateReference) + ); if (hasFromJson) { // If there's a special fromJson, then cast the object back to JSON before proceeding const variable = new Variable({ diff --git a/generators/ruby/codegen/src/ast/classes/ClassReference.ts b/generators/ruby/codegen/src/ast/classes/ClassReference.ts index 1928822a835..caaabd62cba 100644 --- a/generators/ruby/codegen/src/ast/classes/ClassReference.ts +++ b/generators/ruby/codegen/src/ast/classes/ClassReference.ts @@ -227,7 +227,7 @@ export declare namespace AliasReference { } } export class AliasReference extends ClassReference { - private aliasOf: ClassReference; + public aliasOf: ClassReference; constructor({ aliasOf, ...rest }: AliasReference.Init) { super(rest); this.aliasOf = aliasOf; diff --git a/generators/ruby/codegen/src/ast/expressions/Expression.ts b/generators/ruby/codegen/src/ast/expressions/Expression.ts index 20d5bbf142b..9815d88346e 100644 --- a/generators/ruby/codegen/src/ast/expressions/Expression.ts +++ b/generators/ruby/codegen/src/ast/expressions/Expression.ts @@ -6,7 +6,7 @@ export declare namespace Expression { export interface Init extends AstNode.Init { leftSide?: AstNode | string; rightSide?: AstNode | string; - isAssignment?: boolean; + isAssignment: boolean; operation?: string; yardoc?: Yardoc; } @@ -18,7 +18,7 @@ export class Expression extends AstNode { public yardoc: Yardoc | undefined; public operation?: string; - constructor({ leftSide, rightSide, yardoc, operation, isAssignment = false, ...rest }: Expression.Init) { + constructor({ leftSide, rightSide, yardoc, operation, isAssignment, ...rest }: Expression.Init) { super(rest); this.leftSide = leftSide; this.rightSide = rightSide; diff --git a/generators/ruby/sdk/VERSION b/generators/ruby/sdk/VERSION index ce3afe3b996..04c1660dc75 100644 --- a/generators/ruby/sdk/VERSION +++ b/generators/ruby/sdk/VERSION @@ -1 +1 @@ -0.5.0-rc0 +0.5.0-rc1 diff --git a/generators/ruby/sdk/src/AbstractionUtilities.ts b/generators/ruby/sdk/src/AbstractionUtilities.ts index 87c90361177..a6e18c9657e 100644 --- a/generators/ruby/sdk/src/AbstractionUtilities.ts +++ b/generators/ruby/sdk/src/AbstractionUtilities.ts @@ -624,7 +624,8 @@ function generateRequestClientInitializer( rightSide: new ClassReference({ name: ":multipart", import_: new Import({ from: "faraday/multipart", isExternal: true }) - }) + }), + isAssignment: false }), isAssignment: false }) @@ -674,7 +675,8 @@ function generateRequestClientInitializer( import_: new Import({ from: "faraday/retry", isExternal: true }) }), rightSide: retryOptions, - operation: ", " + operation: ", ", + isAssignment: false }), isAssignment: false }) diff --git a/generators/ruby/sdk/src/utils/EndpointGenerator.ts b/generators/ruby/sdk/src/utils/EndpointGenerator.ts index c7cabec2485..2d4659bd607 100644 --- a/generators/ruby/sdk/src/utils/EndpointGenerator.ts +++ b/generators/ruby/sdk/src/utils/EndpointGenerator.ts @@ -1,6 +1,8 @@ import { AdditionalPropertiesProperty, + AliasReference, Argument, + ArrayReference, AstNode, B64StringClassReference, BlockConfiguration, @@ -8,6 +10,7 @@ import { ClassReferenceFactory, Class_, ConditionalStatement, + DateReference, Expression, FieldsetProperty, FileClassReference, @@ -15,6 +18,7 @@ import { Function_, GenericClassReference, HashInstance, + HashReference, JsonClassReference, Parameter, Property, @@ -512,7 +516,7 @@ export class EndpointGenerator { type: GenericClassReference, variableType: VariableType.LOCAL }); - return [ + const parsingExpressions = [ new Expression({ leftSide: "parsed_json", rightSide: new FunctionInvocation({ @@ -525,12 +529,33 @@ export class EndpointGenerator { isNamed: false }) ] + }), + isAssignment: true + }) + ]; + const hasFromJson = + responseCr.fromJson(nestedResponseValueVariable) !== undefined && + !(responseCr instanceof ArrayReference) && + !(responseCr instanceof HashReference) && + !(responseCr instanceof DateReference) && + !( + responseCr instanceof AliasReference && + (responseCr.aliasOf instanceof ArrayReference || + responseCr.aliasOf instanceof HashReference || + responseCr.aliasOf instanceof DateReference) + ); + + if (hasFromJson) { + parsingExpressions.push( + new Expression({ + leftSide: nestedResponseValueVariable, + rightSide: `parsed_json["${jrbwp.responseProperty.name.wireValue}"].to_json`, + isAssignment: true }) - }), - new Expression({ - leftSide: nestedResponseValueVariable, - rightSide: `parsed_json["${jrbwp.responseProperty.name.wireValue}"].to_json` - }), + ); + } + return [ + ...parsingExpressions, responseCr.fromJson(nestedResponseValueVariable) ?? nestedResponseValueVariable ]; } else { diff --git a/seed/ruby-sdk/response-property/lib/fern_response_property/service/client.rb b/seed/ruby-sdk/response-property/lib/fern_response_property/service/client.rb index 4336bb5a386..d0e4b20e02f 100644 --- a/seed/ruby-sdk/response-property/lib/fern_response_property/service/client.rb +++ b/seed/ruby-sdk/response-property/lib/fern_response_property/service/client.rb @@ -29,8 +29,8 @@ def get_movie(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end @@ -44,8 +44,8 @@ def get_movie_docs(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["docs"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["docs"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end @@ -59,8 +59,8 @@ def get_movie_name(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::StringResponse.from_json(json_object: nested_response_json) end @@ -74,8 +74,8 @@ def get_movie_metadata(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["metadata"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["metadata"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end @@ -89,8 +89,8 @@ def get_optional_movie(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end @@ -104,8 +104,8 @@ def get_optional_movie_docs(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["docs"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["docs"].to_json SeedResponsePropertyClient::Service::WithDocs.from_json(json_object: nested_response_json) end @@ -119,8 +119,8 @@ def get_optional_movie_name(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::StringResponse.from_json(json_object: nested_response_json) end end @@ -146,8 +146,8 @@ def get_movie(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end end @@ -163,8 +163,8 @@ def get_movie_docs(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["docs"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["docs"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end end @@ -180,8 +180,8 @@ def get_movie_name(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::StringResponse.from_json(json_object: nested_response_json) end end @@ -197,8 +197,8 @@ def get_movie_metadata(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["metadata"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["metadata"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end end @@ -214,8 +214,8 @@ def get_optional_movie(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::Service::Response.from_json(json_object: nested_response_json) end end @@ -231,8 +231,8 @@ def get_optional_movie_docs(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["docs"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["docs"].to_json SeedResponsePropertyClient::Service::WithDocs.from_json(json_object: nested_response_json) end end @@ -248,8 +248,8 @@ def get_optional_movie_name(request:, request_options: nil) req.body = { **(request || {}), **(request_options&.additional_body_parameters || {}) }.compact req.url "#{@request_client.get_url(request_options: request_options)}/movie" end - parsed_json JSON.parse(response.body) - nested_response_json parsed_json["data"].to_json + parsed_json = JSON.parse(response.body) + nested_response_json = parsed_json["data"].to_json SeedResponsePropertyClient::StringResponse.from_json(json_object: nested_response_json) end end