Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/code reduction generators python #4096

Merged
merged 12 commits into from
Feb 7, 2024
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Fixed mantis for bitwise enums in Go. [#3936](https://github.com/microsoft/kiota/issues/3936)
- Keyword in enum names for go should not be escaped. [#2877](https://github.com/microsoft/kiota/issues/2877)
- Generator method code reduction in Python. [#3695](https://github.com/microsoft/kiota/issues/3695)

## [1.11.1] - 2024-02-05

Expand Down
28 changes: 16 additions & 12 deletions src/Kiota.Builder/Refiners/PythonRefiner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance
_configuration.UsesBackingStore,
static s => s,
true,
$"{SerializationModuleName}.composed_type_wrapper",
$"{SerializationModuleName}",
"ComposedTypeWrapper"
);
CorrectCommonNames(generatedCode);
Expand All @@ -44,6 +44,21 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance
static x => x.ToSnakeCase(),
GenerationLanguage.Python);
RemoveCancellationParameter(generatedCode);
RemoveRequestConfigurationClasses(generatedCode,
new CodeUsing
{
Name = "RequestConfiguration",
Declaration = new CodeType
{
Name = $"{AbstractionsPackageName}.base_request_configuration",
IsExternal = true
}
},
new CodeType
{
Name = "QueryParameters",
IsExternal = true,
});
AddDefaultImports(generatedCode, defaultUsingEvaluators);
CorrectCoreType(generatedCode, CorrectMethodType, CorrectPropertyType, CorrectImplements);
cancellationToken.ThrowIfCancellationRequested();
Expand All @@ -62,17 +77,6 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance
new PythonExceptionsReservedNamesProvider(),
static x => $"{x}_"
);
RemoveRequestConfigurationClassesCommonProperties(generatedCode,
new CodeUsing
{
Name = "BaseRequestConfiguration",
Declaration = new CodeType
{
Name = $"{AbstractionsPackageName}.base_request_configuration",
IsExternal = true
}
});
cancellationToken.ThrowIfCancellationRequested();
MoveClassesWithNamespaceNamesUnderNamespace(generatedCode);
ReplacePropertyNames(generatedCode,
new() {
Expand Down
29 changes: 5 additions & 24 deletions src/Kiota.Builder/Writers/Python/CodeMethodWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -612,13 +612,11 @@ private void WriteRequestGeneratorBody(CodeMethod codeElement, RequestParams req
{
if (codeElement.HttpMethod == null) throw new InvalidOperationException("http method cannot be null");

writer.WriteLine($"{RequestInfoVarName} = RequestInformation()");
UpdateRequestInformationFromRequestConfiguration(requestParams, writer);
if (currentClass.GetPropertyOfKind(CodePropertyKind.PathParameters) is CodeProperty urlTemplateParamsProperty &&
currentClass.GetPropertyOfKind(CodePropertyKind.UrlTemplate) is CodeProperty urlTemplateProperty)
writer.WriteLines($"{RequestInfoVarName}.url_template = {GetPropertyCall(urlTemplateProperty, "''")}",
$"{RequestInfoVarName}.path_parameters = {GetPropertyCall(urlTemplateParamsProperty, "''")}");
writer.WriteLine($"{RequestInfoVarName}.http_method = Method.{codeElement.HttpMethod.Value.ToString().ToUpperInvariant()}");
if (currentClass.GetPropertyOfKind(CodePropertyKind.PathParameters) is not CodeProperty urlTemplateParamsProperty) throw new InvalidOperationException("path parameters cannot be null");
if (currentClass.GetPropertyOfKind(CodePropertyKind.UrlTemplate) is not CodeProperty urlTemplateProperty) throw new InvalidOperationException("url template cannot be null");
writer.WriteLine($"{RequestInfoVarName} = RequestInformation(Method.{codeElement.HttpMethod.Value.ToString().ToUpperInvariant()}, {GetPropertyCall(urlTemplateProperty, "''")}, {GetPropertyCall(urlTemplateParamsProperty, "''")})");
if (requestParams.requestConfiguration != null)
writer.WriteLine($"{RequestInfoVarName}.configure({requestParams.requestConfiguration.Name})");
if (codeElement.ShouldAddAcceptHeader)
writer.WriteLine($"{RequestInfoVarName}.headers.try_add(\"Accept\", \"{codeElement.AcceptHeaderValue}\")");
if (currentClass.GetPropertyOfKind(CodePropertyKind.RequestAdapter) is CodeProperty requestAdapterProperty)
Expand Down Expand Up @@ -820,23 +818,6 @@ private string GetSendRequestMethodName(bool isVoid, bool isStream, bool isColle
if (isStream || conventions.IsPrimitiveType(returnType)) return "send_primitive_async";
return "send_async";
}

private static void UpdateRequestInformationFromRequestConfiguration(RequestParams requestParams, LanguageWriter writer)
{
if (requestParams.requestConfiguration != null)
{
writer.StartBlock($"if {requestParams.requestConfiguration.Name}:");
var headers = requestParams.Headers?.Name ?? "headers";
writer.WriteLine($"{RequestInfoVarName}.headers.add_all({requestParams.requestConfiguration.Name}.{headers})");
var queryString = requestParams.QueryParameters;
if (queryString != null)
writer.WriteLines($"{RequestInfoVarName}.set_query_string_parameters_from_raw_object({requestParams.requestConfiguration.Name}.{queryString.Name})");
var options = requestParams.Options?.Name ?? "options";
writer.WriteLine($"{RequestInfoVarName}.add_request_options({requestParams.requestConfiguration.Name}.{options})");
writer.DecreaseIndent();
}
}

private void UpdateRequestInformationFromRequestBody(CodeMethod codeElement, RequestParams requestParams, CodeProperty requestAdapterProperty, LanguageWriter writer)
{
if (requestParams.requestBody != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -668,14 +668,9 @@ public void WritesRequestGeneratorBodyForScalar()
method.AcceptedResponseTypes.Add("text/plain");
writer.Write(method);
var result = tw.ToString();
Assert.Contains("request_info = RequestInformation()", result);
Assert.Contains("request_info.http_method = Method", result);
Assert.Contains("request_info.url_template = ", result);
Assert.Contains("request_info.path_parameters = ", result);
Assert.Contains("request_info = RequestInformation(Method.GET, self.url_template, self.path_parameters)", result);
Assert.Contains("request_info.headers.try_add(\"Accept\", \"application/json, text/plain\")", result);
Assert.Contains("if c:", result);
Assert.Contains("request_info.add_request_options", result);
Assert.Contains("request_info.set_query_string_parameters_from_raw_object", result);
Assert.Contains("request_info.configure(c)", result);
Assert.Contains("set_content_from_scalar", result);
Assert.Contains("return request_info", result);
AssertExtensions.CurlyBracesAreClosed(result);
Expand All @@ -692,16 +687,9 @@ public void WritesRequestGeneratorBodyForParsable()
method.AcceptedResponseTypes.Add("text/plain");
writer.Write(method);
var result = tw.ToString();
Assert.Contains("request_info = RequestInformation()", result);
Assert.Contains("request_info.http_method = Method", result);
Assert.Contains("if c:", result);
Assert.Contains("request_info.headers.add_all(c.h)", result);
Assert.Contains("request_info.url_template = ", result);
Assert.Contains("request_info.path_parameters = ", result);
Assert.Contains("request_info = RequestInformation(Method.GET, self.url_template, self.path_parameters", result);
Assert.Contains("request_info.headers.try_add(\"Accept\", \"application/json, text/plain\")", result);
Assert.Contains("if c:", result);
Assert.Contains("request_info.add_request_options", result);
Assert.Contains("request_info.set_query_string_parameters_from_raw_object", result);
Assert.Contains("request_info.configure(c)", result);
Assert.Contains("set_content_from_parsable", result);
Assert.Contains("return request_info", result);
}
Expand Down
Loading